diff --git a/README.md b/README.md index 2f4e16270c3..93bb70efc80 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,8 @@ The SQL backend for the library and stats tracking requires a MySQL server. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/paradise_schema.sql or /SQL/paradise_schema_prefix.sql, depending on if you want table prefixes. -More detailed setup instructions are located on /tg/station's wiki: http://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database +More detailed setup instructions are located on our wiki: +https://nanotrasen.se/wiki/index.php/Setting_up_the_Database --- diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index 0379517190f..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,6 +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', + `afk_watch` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) ) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1; @@ -523,15 +526,41 @@ CREATE TABLE `memo` ( /*!40101 SET character_set_client = @saved_cs_client */; -- --- Table structure for table `discord` +-- Table structure for table `ipintel` -- -DROP TABLE IF EXISTS `discord`; +DROP TABLE IF EXISTS `ipintel`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE IF NOT EXISTS `discord` ( +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; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `vpn_whitelist` +-- +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, - `discord_id` bigint(20) NOT NULL, - `notify` int(11) NOT NULL, + `reason` text, PRIMARY KEY (`ckey`) ) 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 e9a622cf037..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,6 +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', + `afk_watch` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) ) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1; @@ -522,15 +525,41 @@ CREATE TABLE `SS13_memo` ( /*!40101 SET character_set_client = @saved_cs_client */; -- --- Table structure for table `SS13_discord` +-- Table structure for table `SS13_ipintel` -- -DROP TABLE IF EXISTS `SS13_discord`; +DROP TABLE IF EXISTS `SS13_ipintel`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE IF NOT EXISTS `SS13_discord` ( +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 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `SS13_vpn_whitelist` +-- +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, - `discord_id` bigint(20) NOT NULL, - `notify` int(11) NOT NULL, + `reason` text, PRIMARY KEY (`ckey`) ) 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 new file mode 100644 index 00000000000..ac3be8f8ef8 --- /dev/null +++ b/SQL/updates/5-6.sql @@ -0,0 +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) +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, + `reason` text, + PRIMARY KEY (`ckey`) +) 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; +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; +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, + PRIMARY KEY (`token`) +) 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_DEFINES.dm b/_maps/__MAP_DEFINES.dm index a3a14443cda..f2c68ca4986 100644 --- a/_maps/__MAP_DEFINES.dm +++ b/_maps/__MAP_DEFINES.dm @@ -31,7 +31,7 @@ #define CENTCOMM "CentComm" #define TELECOMMS "Telecomms Satellite" #define DERELICT "Derelicted Station" - #define MINING "Mining Asteroid" + #define MINING "Lavaland" #define CONSTRUCTION "Construction Area" #define EMPTY_AREA "Empty Area" #define EMPTY_AREA_2 "Empty Area 2" diff --git a/_maps/cyberiad.dm b/_maps/cyberiad.dm index e21be9f1940..44090ba3faa 100644 --- a/_maps/cyberiad.dm +++ b/_maps/cyberiad.dm @@ -17,16 +17,17 @@ z7 = empty #include "map_files\cyberiad\z2.dmm" #include "map_files\cyberiad\z3.dmm" #include "map_files\cyberiad\z4.dmm" - #include "map_files\generic\z5.dmm" + #include "map_files\generic\Lavaland.dmm" #include "map_files\cyberiad\z6.dmm" #include "map_files\generic\z7.dmm" + #define MINETYPE "lavaland" #define MAP_TRANSITION_CONFIG list(\ -DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL,STATION_CONTACT,REACHABLE,AI_OK)),\ +DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE, BOOSTS_SIGNAL, AI_OK)),\ DECLARE_LEVEL(CONSTRUCTION, CROSSLINKED, list(REACHABLE)),\ -DECLARE_LEVEL(MINING, CROSSLINKED, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\ +DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\ DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\ DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE))) diff --git a/_maps/delta.dm b/_maps/delta.dm index 5ee84d3d0cd..c6db5e18750 100644 --- a/_maps/delta.dm +++ b/_maps/delta.dm @@ -26,12 +26,13 @@ Lovingly ported by Purpose2 to Paradise #define MAP_FILE "delta.dmm" #define MAP_NAME "Kerberos" + #define MINETYPE "lavaland" #define MAP_TRANSITION_CONFIG list(\ -DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL,STATION_CONTACT,REACHABLE,AI_OK)),\ +DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE, BOOSTS_SIGNAL, AI_OK)),\ DECLARE_LEVEL(CONSTRUCTION, CROSSLINKED, list(REACHABLE)),\ -DECLARE_LEVEL(MINING, CROSSLINKED, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\ +DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\ DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\ DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE))) diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index 7e54cfe3e58..447889d17a1 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -80,7 +80,7 @@ icon_state = "burst_r"; tag = "icon-burst_r (WEST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/abandoned) "aal" = ( /turf/simulated/shuttle/wall{ @@ -128,7 +128,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/abandoned) "aar" = ( /obj/structure/shuttle/engine/propulsion{ @@ -136,7 +136,7 @@ icon_state = "propulsion"; tag = "icon-propulsion (WEST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/abandoned) "aas" = ( /turf/simulated/shuttle/floor{ @@ -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{ @@ -260,7 +260,7 @@ icon_state = "burst_l"; tag = "icon-burst_l (WEST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/abandoned) "aaK" = ( /obj/structure/window/full/shuttle{ @@ -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" }, @@ -451,11 +451,11 @@ "abi" = ( /obj/structure/grille, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "abj" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "abk" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -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 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /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 = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "acf" = ( /obj/structure/cable{ @@ -880,29 +880,29 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "acg" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "ach" = ( /obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "aci" = ( /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "acj" = ( /obj/structure/cable{ @@ -921,8 +921,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "ack" = ( /obj/structure/spacepoddoor, @@ -967,8 +967,8 @@ }, /area/maintenance/auxsolarstarboard) "acp" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /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{ @@ -1021,7 +1021,7 @@ icon_state = "propulsion_r"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_elite) "acx" = ( /obj/structure/closet/syndicate/suits, @@ -1048,7 +1048,7 @@ icon_state = "propulsion"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/administration) "acB" = ( /turf/space, @@ -1081,21 +1081,21 @@ d2 = 8; icon_state = "0-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "acF" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "acG" = ( /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "acH" = ( /obj/structure/chair/stool, /turf/simulated/shuttle/floor{ @@ -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" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "aed" = ( /obj/docking_port/mobile/pod{ @@ -1795,7 +1795,7 @@ icon_state = "propulsion"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/arrival/station) "aef" = ( /obj/machinery/door/airlock/external{ @@ -2782,7 +2782,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate) "afW" = ( /obj/structure/computerframe, @@ -2921,7 +2921,7 @@ dir = 1 }, /obj/effect/decal/warning_stripes/north, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/arrival/station) "agl" = ( /turf/space, @@ -2998,18 +2998,18 @@ tag = "icon-propulsion_l"; icon_state = "propulsion_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate) "ags" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate) "agt" = ( /obj/structure/shuttle/engine/propulsion{ tag = "icon-propulsion_r"; icon_state = "propulsion_r" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate) "agu" = ( /obj/structure/table, @@ -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" = ( @@ -4162,7 +4162,7 @@ dir = 8; icon_state = "burst_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/specops) "aja" = ( /turf/simulated/shuttle/wall{ @@ -4316,7 +4316,7 @@ dir = 8; icon_state = "propulsion" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/specops) "ajq" = ( /obj/structure/window/reinforced{ @@ -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, @@ -5098,7 +5100,7 @@ dir = 8; icon_state = "burst_r" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/specops) "akU" = ( /obj/machinery/door/airlock/external{ @@ -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" = ( @@ -5619,7 +5621,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "alX" = ( /obj/structure/cable{ d1 = 1; @@ -5678,7 +5680,7 @@ }, /area/maintenance/fsmaint) "amf" = ( -/obj/effect/decal/cleanable/deadcockroach, +/obj/effect/decal/cleanable/insectguts, /turf/simulated/floor/plasteel{ icon_state = "redyellowfull" }, @@ -5692,9 +5694,6 @@ /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, /area/maintenance/fsmaint) -"ami" = ( -/turf/simulated/floor/plating/airless/catwalk, -/area/space) "amj" = ( /obj/machinery/door/poddoor/shutters{ density = 0; @@ -6301,7 +6300,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/vox) "anE" = ( /obj/structure/rack, @@ -6633,7 +6632,7 @@ tag = "icon-propulsion_l"; icon_state = "propulsion_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/vox) "aol" = ( /obj/structure/rack, @@ -6889,7 +6888,7 @@ icon_state = "propulsion_l"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_elite) "aoP" = ( /obj/docking_port/stationary{ @@ -7279,7 +7278,7 @@ icon_state = "propulsion"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_elite) "apC" = ( /turf/space, @@ -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 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "asV" = ( /obj/structure/cable{ @@ -8943,8 +8942,8 @@ icon_state = "1-4"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "asW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -9001,21 +9000,21 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "atb" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "atc" = ( /obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "atd" = ( /turf/simulated/wall/r_wall, @@ -9354,8 +9353,8 @@ icon_state = "0-4"; d2 = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "atL" = ( /obj/structure/cable{ @@ -9374,8 +9373,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "atM" = ( /obj/structure/cable{ @@ -9495,8 +9494,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "atV" = ( /obj/structure/disposalpipe/segment{ @@ -9546,8 +9545,8 @@ }, /area/maintenance/auxsolarport) "atZ" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "aua" = ( /obj/effect/decal/cleanable/dirt, @@ -12161,7 +12160,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "ayH" = ( /obj/machinery/conveyor{ dir = 4; @@ -12728,7 +12727,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "azS" = ( /obj/effect/decal/warning_stripes/southeast, /obj/effect/decal/warning_stripes/northwestcorner, @@ -12858,9 +12857,9 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 6 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aAf" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/unary/heat_reservoir/heater{ @@ -12907,9 +12906,9 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aAj" = ( /obj/structure/cable{ d1 = 1; @@ -13822,9 +13821,9 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 5 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aBW" = ( /obj/structure/cable{ d1 = 1; @@ -14708,9 +14707,9 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 10 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aDD" = ( /obj/structure/cable{ d1 = 2; @@ -14982,23 +14981,23 @@ /obj/machinery/atmospherics/unary/outlet_injector/on{ dir = 8 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/engine/controlroom) "aEa" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 9 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aEb" = ( /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "aEc" = ( /obj/structure/cable{ @@ -15006,8 +15005,8 @@ d2 = 2; icon_state = "1-2" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "aEd" = ( /obj/machinery/atmospherics/trinary/filter{ @@ -15123,7 +15122,7 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/yellow, /turf/space, -/area/space) +/area/space/nearstation) "aEq" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -15772,9 +15771,9 @@ /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 10 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aFA" = ( /turf/simulated/wall, /area/crew_quarters/bar) @@ -16598,7 +16597,7 @@ icon_state = "brokengrille" }, /turf/space, -/area/space) +/area/space/nearstation) "aGX" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -17778,7 +17777,7 @@ dir = 6 }, /turf/space, -/area/space) +/area/space/nearstation) "aIU" = ( /obj/structure/cable{ d1 = 1; @@ -18103,14 +18102,14 @@ /area/security/prison) "aJy" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/space) "aJz" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aJA" = ( /obj/structure/cable{ d1 = 4; @@ -19474,8 +19473,8 @@ d2 = 4; icon_state = "0-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "aLR" = ( /obj/structure/chair/stool, @@ -19494,9 +19493,9 @@ /area/crew_quarters/bar/atrium) "aLT" = ( /obj/item/wrench, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aLU" = ( /turf/simulated/wall, /area/crew_quarters/bar/atrium) @@ -19506,11 +19505,6 @@ dir = 4; location = "QM #4" }, -/obj/machinery/camera{ - c_tag = "Cargo Office SouthWest"; - dir = 4; - network = list("SS13") - }, /obj/effect/decal/warning_stripes/yellow, /mob/living/simple_animal/bot/mulebot{ home_destination = "QM #4"; @@ -19711,7 +19705,7 @@ dir = 1 }, /obj/structure/shuttle/engine/heater, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/supply) "aMp" = ( /turf/space, @@ -20353,18 +20347,18 @@ tag = "icon-burst_l"; icon_state = "burst_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/supply) "aNA" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/supply) "aNB" = ( /obj/structure/shuttle/engine/propulsion{ tag = "icon-burst_r"; icon_state = "burst_r" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/supply) "aNC" = ( /obj/machinery/atmospherics/unary/vent_pump{ @@ -20753,7 +20747,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aOp" = ( /obj/structure/table/wood, /obj/item/clothing/glasses/sunglasses, @@ -21051,9 +21045,9 @@ /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 5 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aOV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4; @@ -21065,14 +21059,10 @@ /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aOX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/cleanliness{ pixel_y = 32 @@ -21238,10 +21228,8 @@ tag = "" }, /obj/machinery/igniter{ - icon_state = "igniter0"; id = "Incinerator"; - luminosity = 2; - on = 0 + luminosity = 2 }, /turf/simulated/floor/engine, /area/maintenance/incinerator) @@ -23876,7 +23864,7 @@ icon_state = "pipe-c" }, /turf/space, -/area/space) +/area/space/nearstation) "aTT" = ( /obj/structure/cable{ d1 = 1; @@ -23899,7 +23887,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aTV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5; @@ -25724,8 +25712,8 @@ /obj/structure/disposaloutlet{ dir = 8 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/incinerator) "aWS" = ( /obj/structure/table/reinforced, @@ -27685,9 +27673,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aZZ" = ( /obj/item/radio/intercom{ dir = 4; @@ -27707,9 +27695,9 @@ dir = 8; icon_state = "pipe-c" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bab" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -28083,8 +28071,8 @@ dir = 4; level = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/atmos) "baO" = ( /obj/machinery/access_button{ @@ -28097,7 +28085,7 @@ req_access_txt = "67" }, /turf/space, -/area/space) +/area/space/nearstation) "baP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -28616,8 +28604,8 @@ dir = 4; level = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/atmos) "bbG" = ( /turf/simulated/floor/plating, @@ -28643,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; @@ -28665,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" = ( @@ -30770,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, @@ -33123,7 +33111,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/mining) "bjX" = ( /obj/structure/ore_box, @@ -33395,12 +33383,12 @@ "bkt" = ( /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "bku" = ( /obj/structure/lattice, /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "bkv" = ( /obj/machinery/light/small{ dir = 8 @@ -33632,8 +33620,8 @@ }, /area/atmos) "bkQ" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/atmos) "bkR" = ( /obj/structure/reagent_dispensers/fueltank, @@ -34129,7 +34117,7 @@ /area/shuttle/mining) "blQ" = ( /obj/structure/shuttle/engine/propulsion/burst, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/mining) "blR" = ( /turf/space, @@ -34368,7 +34356,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bmp" = ( /obj/structure/window/reinforced{ dir = 1; @@ -34409,7 +34397,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bmt" = ( /obj/machinery/atmospherics/unary/outlet_injector/on{ dir = 4; @@ -35184,7 +35172,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bnN" = ( /obj/structure/window/reinforced{ dir = 8 @@ -35229,7 +35217,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bnS" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/atmospherics/pipe/manifold/visible/cyan{ @@ -36084,7 +36072,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bpn" = ( /obj/structure/window/reinforced{ dir = 1; @@ -36156,7 +36144,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bpv" = ( /turf/simulated/floor/engine/insulated/vacuum, /area/atmos) @@ -36944,7 +36932,7 @@ pixel_y = 0 }, /turf/space, -/area/space) +/area/space/nearstation) "bqJ" = ( /obj/machinery/hologram/holopad, /obj/effect/decal/warning_stripes/yellow/hollow, @@ -37321,7 +37309,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "brr" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -37329,14 +37317,14 @@ layer = 2.9 }, /turf/space, -/area/space) +/area/space/nearstation) "brs" = ( /obj/structure/window/reinforced{ dir = 1; layer = 2.9 }, /turf/space, -/area/space) +/area/space/nearstation) "brt" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -37345,7 +37333,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/space, -/area/space) +/area/space/nearstation) "bru" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ dir = 4; @@ -37362,7 +37350,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/space, -/area/space) +/area/space/nearstation) "brw" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -37373,7 +37361,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "brx" = ( /obj/machinery/light/small{ dir = 8 @@ -37940,7 +37928,7 @@ }, /area/shuttle/siberia) "bsy" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -38788,12 +38776,12 @@ /obj/structure/closet/emcloset, /obj/effect/decal/warning_stripes/yellow, /turf/simulated/floor/plasteel, -/area/space) +/area/space/nearstation) "btJ" = ( /obj/structure/closet/firecloset, /obj/effect/decal/warning_stripes/yellow, /turf/simulated/floor/plasteel, -/area/space) +/area/space/nearstation) "btK" = ( /obj/structure/cable{ d1 = 1; @@ -39479,8 +39467,8 @@ dir = 4; level = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/atmos) "buY" = ( /obj/structure/cable{ @@ -39582,7 +39570,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "bvi" = ( /obj/machinery/door/airlock/external{ name = "Labor Shuttle Airlock"; @@ -41023,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 @@ -41040,6 +41025,9 @@ dir = 4; icon_state = "tube1" }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/shuttle/siberia) "bxJ" = ( @@ -42844,7 +42832,7 @@ dir = 1; layer = 2.9 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/siberia) "bAM" = ( /obj/structure/cable{ @@ -44196,7 +44184,7 @@ /area/shuttle/siberia) "bCG" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/siberia) "bCH" = ( /turf/space, @@ -44212,7 +44200,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bCJ" = ( /turf/simulated/wall, /area/security/prisonershuttle) @@ -49717,7 +49705,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bLN" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5; @@ -49769,7 +49757,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bLS" = ( /obj/structure/window/reinforced{ dir = 1; @@ -49779,7 +49767,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bLT" = ( /obj/structure/window/reinforced{ dir = 8 @@ -49810,7 +49798,7 @@ /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/space) +/area/space/nearstation) "bLV" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -49836,7 +49824,7 @@ /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/space) +/area/space/nearstation) "bLW" = ( /obj/structure/cable{ d1 = 4; @@ -51873,7 +51861,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bPD" = ( /obj/structure/cable{ d1 = 4; @@ -52078,10 +52066,10 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bPS" = ( /turf/simulated/wall, -/area/space) +/area/space/nearstation) "bPT" = ( /obj/structure/lattice, /obj/structure/window/reinforced, @@ -52090,7 +52078,7 @@ icon_state = "D-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bPU" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -52098,12 +52086,12 @@ icon_state = "E-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bPV" = ( /obj/structure/lattice, /obj/structure/transit_tube, /turf/space, -/area/space) +/area/space/nearstation) "bPW" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -52111,7 +52099,7 @@ icon_state = "W-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bPX" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -52119,7 +52107,7 @@ icon_state = "D-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bPY" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, @@ -52897,9 +52885,9 @@ /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 9 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bRn" = ( /obj/structure/rack, /obj/item/ammo_box/shotgun/rubbershot, @@ -53134,9 +53122,9 @@ dir = 1; layer = 2.9 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bRH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4; @@ -53241,28 +53229,28 @@ icon_state = "D-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bRP" = ( /obj/structure/transit_tube{ tag = "icon-D-NE"; icon_state = "D-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "bRQ" = ( /obj/structure/lattice, /obj/structure/transit_tube{ icon_state = "NW-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bRR" = ( /obj/structure/transit_tube{ tag = "icon-D-SW"; icon_state = "D-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bRS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light/small{ @@ -54804,9 +54792,9 @@ pixel_y = -20; req_access_txt = "32" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bUc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -55198,9 +55186,9 @@ dir = 4; level = 1 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bUK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/navbeacon{ @@ -55456,9 +55444,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bVg" = ( /obj/structure/cable{ d1 = 4; @@ -55673,9 +55661,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bVt" = ( /obj/structure/sign/vacuum{ pixel_x = -32; @@ -56126,28 +56114,28 @@ icon_state = "D-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bWa" = ( /obj/structure/transit_tube{ tag = "icon-D-SE"; icon_state = "D-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bWb" = ( /obj/structure/lattice, /obj/structure/transit_tube{ icon_state = "NE-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bWc" = ( /obj/structure/transit_tube{ tag = "icon-D-NW"; icon_state = "D-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bWd" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -56155,7 +56143,7 @@ icon_state = "D-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "bWe" = ( /obj/structure/cable{ d1 = 4; @@ -56502,7 +56490,7 @@ pixel_y = -22 }, /turf/space, -/area/space) +/area/space/nearstation) "bWD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -57188,9 +57176,9 @@ pixel_y = 20; req_access_txt = "10;13" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bXG" = ( /obj/structure/cable{ d1 = 1; @@ -57198,9 +57186,9 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bXH" = ( /obj/item/twohanded/required/kirbyplants, /obj/machinery/light, @@ -57308,7 +57296,7 @@ icon_state = "D-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "bXR" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -57316,7 +57304,7 @@ icon_state = "E-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bXS" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -57324,7 +57312,7 @@ icon_state = "W-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "bXT" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -57332,7 +57320,7 @@ icon_state = "D-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bXU" = ( /turf/simulated/wall/r_wall, /area/engine/engineering) @@ -57391,9 +57379,9 @@ tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bYb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/sign/securearea{ @@ -57474,9 +57462,9 @@ dir = 5; level = 1 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bYm" = ( /obj/structure/cable{ d1 = 4; @@ -57488,9 +57476,9 @@ dir = 4; level = 1 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bYn" = ( /obj/structure/sign/directions/evac{ pixel_y = -8 @@ -57697,9 +57685,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bYK" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -57918,9 +57906,9 @@ /obj/structure/window/reinforced{ dir = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bZg" = ( /obj/structure/table/reinforced, /obj/structure/reagent_dispensers/peppertank{ @@ -58093,9 +58081,9 @@ dir = 4; level = 1 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bZx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58980,7 +58968,7 @@ /obj/effect/decal/warning_stripes/west, /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cbb" = ( /turf/simulated/floor/plating/airless, /area/engine/engineering) @@ -59728,7 +59716,7 @@ req_access_txt = "63" }, /obj/structure/safe/floor{ - knownby = list("captain") + known_by = list("captain") }, /obj/item/gun/projectile/revolver/russian, /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, @@ -62779,9 +62767,9 @@ dir = 4; level = 1 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "chx" = ( /obj/structure/cable{ d1 = 4; @@ -63157,10 +63145,10 @@ /obj/effect/decal/warning_stripes/east, /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cif" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cig" = ( /obj/structure/table/reinforced, /obj/item/book/manual/engineering_guide{ @@ -63830,9 +63818,9 @@ tag = "icon-D-SE"; icon_state = "D-SE" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cjm" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance{ @@ -64010,11 +63998,11 @@ "cjH" = ( /obj/effect/decal/warning_stripes/northwestcorner, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cjI" = ( /obj/effect/decal/warning_stripes/north, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cjJ" = ( /obj/machinery/power/tesla_coil{ anchored = 1 @@ -64022,7 +64010,7 @@ /obj/structure/cable/yellow, /obj/effect/decal/warning_stripes/north, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cjK" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -64031,7 +64019,7 @@ }, /obj/effect/decal/warning_stripes/northeastcorner, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cjL" = ( /obj/machinery/door/poddoor{ density = 0; @@ -65079,7 +65067,7 @@ "clp" = ( /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "clq" = ( /obj/structure/sign/securearea{ desc = "A warning sign which reads 'RADIOACTIVE AREA'"; @@ -66343,9 +66331,9 @@ tag = "icon-E-SW-NW"; icon_state = "E-SW-NW" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cnI" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/item/twohanded/required/kirbyplants, @@ -66468,7 +66456,7 @@ /obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/space, -/area/space) +/area/space/nearstation) "cnW" = ( /obj/effect/decal/warning_stripes/yellow/hollow, /turf/simulated/floor/plasteel, @@ -66478,7 +66466,7 @@ /obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/space, -/area/space) +/area/space/nearstation) "cnY" = ( /obj/structure/lattice, /obj/structure/window/reinforced, @@ -66486,7 +66474,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "cnZ" = ( /obj/machinery/field/generator{ anchored = 1; @@ -66494,7 +66482,7 @@ }, /obj/effect/decal/warning_stripes/northwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "coa" = ( /obj/machinery/field/generator{ anchored = 1; @@ -66502,7 +66490,7 @@ }, /obj/effect/decal/warning_stripes/north, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cob" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -66511,7 +66499,7 @@ }, /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "coc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable/yellow{ @@ -66566,9 +66554,9 @@ /obj/structure/transit_tube{ icon_state = "E-W-Pass" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "coj" = ( /obj/structure/cable/yellow{ d1 = 2; @@ -67042,7 +67030,7 @@ "cpg" = ( /obj/item/wrench, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cph" = ( /obj/effect/decal/warning_stripes/yellow, /turf/simulated/floor/plasteel, @@ -68035,11 +68023,11 @@ }, /obj/effect/decal/warning_stripes/northeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cqO" = ( /obj/effect/decal/warning_stripes/northeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cqP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -68051,7 +68039,7 @@ "cqQ" = ( /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cqR" = ( /obj/structure/particle_accelerator/particle_emitter/right{ dir = 8 @@ -69033,9 +69021,9 @@ level = 1 }, /obj/structure/transit_tube, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "css" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, @@ -69094,9 +69082,9 @@ tag = "icon-W-SE"; icon_state = "W-SE" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "csz" = ( /obj/structure/closet/crate{ name = "solar pack crate" @@ -69741,9 +69729,9 @@ /obj/structure/window/reinforced{ dir = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ctJ" = ( /obj/structure/transit_tube{ tag = "icon-E-NW"; @@ -69752,9 +69740,9 @@ /obj/structure/window/reinforced{ dir = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ctK" = ( /obj/structure/table/wood, /obj/item/storage/fancy/crayons, @@ -69901,9 +69889,9 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ctZ" = ( /obj/effect/spawner/window/reinforced, /obj/structure/cable{ @@ -70407,7 +70395,7 @@ }, /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cuP" = ( /obj/structure/cable/yellow{ d1 = 2; @@ -70421,7 +70409,7 @@ }, /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cuQ" = ( /obj/machinery/field/generator{ anchored = 1; @@ -70429,7 +70417,7 @@ }, /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cuR" = ( /obj/machinery/pipedispenser, /obj/effect/decal/warning_stripes/yellow/hollow, @@ -71280,15 +71268,15 @@ "cwt" = ( /obj/effect/decal/warning_stripes/northwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cwu" = ( /obj/effect/decal/warning_stripes/southeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cwv" = ( /obj/effect/decal/warning_stripes/southwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cww" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -72854,7 +72842,7 @@ }, /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "czj" = ( /obj/structure/closet/secure_closet/engineering_welding, /obj/machinery/light_switch{ @@ -73000,9 +72988,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "czx" = ( /obj/structure/cable{ d1 = 1; @@ -74442,9 +74430,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cBV" = ( /obj/structure/chair/office/dark, /obj/machinery/newscaster{ @@ -77535,9 +77523,9 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cHu" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, @@ -78382,9 +78370,9 @@ d2 = 2; icon_state = "1-2" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cJf" = ( /obj/structure/sign/directions/evac{ pixel_y = -8 @@ -78829,9 +78817,9 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cKk" = ( /obj/structure/cable{ d1 = 4; @@ -78844,9 +78832,9 @@ /area/toxins/xenobiology) "cKl" = ( /obj/structure/window/reinforced, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cKm" = ( /obj/structure/cable{ d1 = 2; @@ -80280,9 +80268,9 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cNo" = ( /obj/structure/cable{ d1 = 1; @@ -80749,9 +80737,9 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cOa" = ( /obj/structure/table/reinforced, /obj/item/book/manual/security_space_law, @@ -80925,9 +80913,9 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cOn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9; @@ -81684,9 +81672,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cPL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -81852,9 +81840,9 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cPY" = ( /obj/machinery/access_button{ command = "cycle_exterior"; @@ -81865,9 +81853,9 @@ pixel_y = 24; req_access_txt = "0" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cPZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/wall, @@ -84105,7 +84093,7 @@ /turf/simulated/floor/plating, /area/medical/medbay) "cTZ" = ( -/obj/machinery/smartfridge/chemistry, +/obj/machinery/smartfridge/secure/chemistry, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -89452,7 +89440,7 @@ }, /area/hallway/primary/aft) "ddL" = ( -/obj/machinery/smartfridge/chemistry, +/obj/machinery/smartfridge/secure/chemistry, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -99561,7 +99549,7 @@ "dvU" = ( /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dvV" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -104257,7 +104245,7 @@ }, /obj/effect/decal/warning_stripes/southwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dEy" = ( /obj/structure/cable{ d1 = 1; @@ -107537,8 +107525,8 @@ pixel_y = 25; req_access_txt = "13" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "dKy" = ( /obj/structure/grille, @@ -109785,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" = ( @@ -110243,8 +110231,8 @@ icon_state = "0-2"; pixel_y = 0 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "dPo" = ( /obj/structure/bed/roller, @@ -110930,8 +110918,8 @@ }, /area/medical/virology) "dQB" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dQC" = ( /obj/machinery/field/generator{ @@ -110940,7 +110928,7 @@ }, /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dQD" = ( /obj/machinery/field/generator{ anchored = 1; @@ -110948,11 +110936,11 @@ }, /obj/effect/decal/warning_stripes/southeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dQE" = ( /obj/effect/decal/warning_stripes/southwestcorner, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dQF" = ( /obj/structure/table, /obj/item/storage/firstaid/regular, @@ -112657,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" = ( @@ -112680,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" = ( @@ -112707,7 +112695,7 @@ width = 11 }, /turf/space, -/area/space) +/area/space/nearstation) "dTV" = ( /obj/machinery/power/solar{ name = "Aft Starboard Solar Panel" @@ -113024,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, @@ -113083,7 +113071,7 @@ }, /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dUF" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -113092,7 +113080,7 @@ }, /obj/effect/decal/warning_stripes/southeastcorner, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dUG" = ( /obj/structure/grille, /obj/structure/cable/yellow{ @@ -113440,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, @@ -113526,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" = ( @@ -113672,7 +113660,7 @@ }, /area/shuttle/escape) "dVJ" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/plasteel{ @@ -113691,7 +113679,7 @@ }, /area/shuttle/escape) "dVL" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -113717,7 +113705,7 @@ }, /area/shuttle/escape) "dVO" = ( -/obj/structure/chair/office/dark, +/obj/structure/chair/comfy/shuttle, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -114158,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" = ( @@ -115001,9 +114989,9 @@ pixel_y = 24; req_access_txt = "0" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "dXY" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/iv_bag/blood/random, @@ -115065,7 +115053,7 @@ icon_state = "propulsion"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "dYf" = ( /obj/structure/window/reinforced, @@ -115074,7 +115062,7 @@ icon_state = "heater"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "dYg" = ( /obj/structure/bed/roller, @@ -115339,8 +115327,8 @@ icon_state = "0-4"; d2 = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYJ" = ( /obj/structure/cable{ @@ -115348,8 +115336,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYK" = ( /obj/structure/cable{ @@ -115366,8 +115354,8 @@ pixel_y = 25; req_access_txt = "13" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYL" = ( /obj/structure/cable{ @@ -115382,8 +115370,8 @@ icon_state = "1-4"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYM" = ( /obj/structure/cable{ @@ -115403,16 +115391,16 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYN" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYO" = ( /obj/structure/cable{ @@ -115431,8 +115419,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYP" = ( /obj/structure/cable{ @@ -115446,8 +115434,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYQ" = ( /obj/machinery/access_button{ @@ -115459,17 +115447,17 @@ pixel_y = 24; req_access_txt = "10;13" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "dYR" = ( /obj/structure/cable{ d2 = 2; icon_state = "0-2"; pixel_y = 0 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYS" = ( /obj/structure/cable{ @@ -115478,8 +115466,8 @@ icon_state = "1-2"; pixel_y = 0 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYT" = ( /turf/simulated/floor/carpet, @@ -115548,7 +115536,7 @@ icon_state = "heater"; dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_elite) "dYY" = ( /turf/simulated/shuttle/wall{ @@ -115576,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{ @@ -115597,7 +115585,7 @@ }, /area/shuttle/syndicate_elite) "dZe" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -115666,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" }, @@ -115735,7 +115723,7 @@ icon_state = "propulsion"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_sit) "dZs" = ( /obj/structure/shuttle/engine/propulsion{ @@ -115743,7 +115731,7 @@ icon_state = "propulsion_r"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_sit) "dZt" = ( /turf/space, @@ -115758,7 +115746,7 @@ icon_state = "propulsion_l"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_sit) "dZv" = ( /turf/simulated/shuttle/wall{ @@ -115773,7 +115761,7 @@ icon_state = "heater"; dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_sit) "dZx" = ( /obj/effect/decal/remains/human, @@ -115793,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" }, @@ -115823,7 +115811,7 @@ }, /area/shuttle/syndicate_sit) "dZD" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -115831,7 +115819,7 @@ }, /area/shuttle/syndicate_sit) "dZE" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -115844,7 +115832,7 @@ icon_state = "tube1"; dir = 8 }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -115902,7 +115890,7 @@ }, /area/shuttle/syndicate_sit) "dZI" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -116021,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 @@ -129834,7 +129828,7 @@ dyn dyn abj abj -ami +acF aaa aaa aaa @@ -130348,7 +130342,7 @@ dyn dyn abj abj -ami +acF aaa aaa aaa @@ -175956,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 c1740c983de..8bf89da81b2 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -13,7 +13,7 @@ width = 18 }, /turf/space, -/area/space) +/area/space/nearstation) "aac" = ( /obj/machinery/porta_turret/syndicate, /turf/space, @@ -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{ @@ -549,17 +549,17 @@ "abd" = ( /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "abe" = ( /obj/structure/grille/broken, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "abf" = ( /obj/structure/grille, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "abg" = ( /obj/machinery/recharge_station/upgraded, /turf/simulated/shuttle/floor{ @@ -654,7 +654,7 @@ "abq" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "abr" = ( /obj/machinery/door/window{ dir = 4; @@ -765,8 +765,8 @@ d2 = 2; icon_state = "1-2" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abB" = ( /turf/simulated/wall/r_wall, @@ -868,8 +868,8 @@ /area/shuttle/syndicate) "abL" = ( /obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abM" = ( /obj/structure/cable{ @@ -882,8 +882,8 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abN" = ( /obj/structure/table, @@ -921,7 +921,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate) "abR" = ( /obj/structure/computerframe, @@ -958,28 +958,28 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abV" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abW" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abX" = ( /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abY" = ( /obj/structure/cable{ @@ -997,8 +997,8 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abZ" = ( /obj/structure/cable{ @@ -1011,8 +1011,8 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "aca" = ( /obj/structure/cable/yellow{ @@ -1030,18 +1030,18 @@ tag = "icon-propulsion_l"; icon_state = "propulsion_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate) "acc" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate) "acd" = ( /obj/structure/shuttle/engine/propulsion{ tag = "icon-propulsion_r"; icon_state = "propulsion_r" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate) "ace" = ( /obj/structure/cable, @@ -1055,8 +1055,8 @@ /area/solar/auxport) "acf" = ( /obj/item/stack/cable_coil, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "acg" = ( /obj/effect/spawner/window/reinforced, @@ -1269,8 +1269,8 @@ name = "xeno_spawn"; pixel_x = -1 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "acA" = ( /turf/simulated/floor/plasteel, @@ -1324,7 +1324,7 @@ dir = 8; icon_state = "diagonalWall3" }, -/area/space) +/area/space/nearstation) "acH" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall3"; @@ -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" = ( @@ -1352,7 +1352,7 @@ dir = 1; icon_state = "diagonalWall3" }, -/area/space) +/area/space/nearstation) "acK" = ( /obj/item/beach_ball/holoball, /obj/structure/holohoop{ @@ -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 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "adj" = ( /obj/structure/cable{ @@ -1636,8 +1636,8 @@ d2 = 2; icon_state = "1-2" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "adk" = ( /obj/machinery/light/small{ @@ -1990,8 +1990,8 @@ /area/shuttle/vox) "adP" = ( /obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "adQ" = ( /obj/structure/table, @@ -2117,13 +2117,13 @@ }, /area/security/permabrig) "aee" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "aef" = ( -/turf/simulated/floor/plating/airless/catwalk, +/obj/structure/lattice/catwalk, /turf/space, -/area/space) +/area/space/nearstation) "aeg" = ( /obj/structure/cable{ d1 = 1; @@ -2135,8 +2135,8 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "aeh" = ( /turf/simulated/shuttle/wall{ @@ -2419,8 +2419,8 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /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" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "afp" = ( /obj/structure/chair/stool, @@ -2918,8 +2920,8 @@ icon_state = "0-4"; d2 = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "afr" = ( /obj/effect/spawner/window/reinforced, @@ -3124,8 +3126,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "afH" = ( /turf/simulated/shuttle/wall{ @@ -3385,8 +3387,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /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 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "ago" = ( /obj/structure/cable, @@ -3654,8 +3656,8 @@ }) "agH" = ( /obj/item/stack/cable_coil, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "agI" = ( /turf/space, @@ -3699,8 +3701,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "agN" = ( /obj/machinery/atmospherics/unary/portables_connector{ @@ -5105,8 +5107,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "aiR" = ( /obj/structure/cable{ @@ -5114,8 +5116,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /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" = ( @@ -5910,7 +5912,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/vox) "akr" = ( /obj/machinery/door/firedoor, @@ -6296,8 +6298,8 @@ name = "xeno_spawn"; pixel_x = -1 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "akY" = ( /obj/effect/spawner/window/reinforced, @@ -6466,7 +6468,7 @@ tag = "icon-propulsion_l"; icon_state = "propulsion_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/vox) "alm" = ( /obj/structure/closet/l3closet/security, @@ -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" = ( @@ -9928,12 +9930,12 @@ /area/shuttle/vox) "arA" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "arB" = ( /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "arC" = ( /obj/structure/cable{ d1 = 1; @@ -10885,7 +10887,7 @@ "ata" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "atb" = ( /obj/item/flashlight/lamp, /obj/structure/extinguisher_cabinet{ @@ -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" = ( @@ -11587,7 +11589,7 @@ /obj/structure/lattice, /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "auq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -11642,8 +11644,8 @@ icon_state = "0-2"; d2 = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "auw" = ( /obj/structure/disposalpipe/segment, @@ -11703,7 +11705,7 @@ }) "auD" = ( /obj/machinery/light_construct/small, -/obj/item/toolbox_tiles_sensor, +/obj/item/toolbox_tiles/sensor, /turf/simulated/floor/plating, /area/maintenance/fpmaint2{ name = "Port Maintenance" @@ -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" = ( @@ -13911,7 +13913,7 @@ opened = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ayz" = ( /obj/structure/cable{ d1 = 1; @@ -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{ @@ -14600,7 +14602,7 @@ pixel_y = 2 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "azJ" = ( /obj/machinery/door/airlock/external, /turf/simulated/floor/plating, @@ -16074,7 +16076,7 @@ }, /obj/item/stack/rods, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aCo" = ( /turf/simulated/shuttle/wall{ icon_state = "swall3"; @@ -16673,16 +16675,16 @@ "aDo" = ( /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aDp" = ( /obj/item/stack/cable_coil, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aDq" = ( /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, @@ -18331,7 +18333,7 @@ network = list("Singulo") }, /turf/space, -/area/space) +/area/space/nearstation) "aGa" = ( /obj/effect/spawner/window/reinforced, /obj/structure/cable/yellow{ @@ -20306,7 +20308,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aJu" = ( /obj/machinery/door/airlock/maintenance{ name = "Law Office Maintenance"; @@ -20345,7 +20347,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aJy" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -20493,7 +20495,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aJK" = ( /obj/structure/sign/securearea{ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; @@ -20632,7 +20634,7 @@ state = 2 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aJX" = ( /turf/simulated/floor/wood, /area/lawoffice) @@ -20663,7 +20665,7 @@ icon_state = "2-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aKb" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -21569,7 +21571,7 @@ /obj/item/wirecutters, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "aLy" = ( /obj/machinery/computer/guestpass{ pixel_x = 30 @@ -21688,7 +21690,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aLO" = ( /obj/machinery/power/grounding_rod{ anchored = 1 @@ -22185,7 +22187,7 @@ anchored = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aMJ" = ( /obj/machinery/door/window{ dir = 1; @@ -23083,7 +23085,7 @@ "aOj" = ( /obj/item/crowbar, /turf/space, -/area/space) +/area/space/nearstation) "aOk" = ( /obj/machinery/alarm{ dir = 4; @@ -23102,7 +23104,7 @@ "aOm" = ( /obj/effect/decal/warning_stripes/northwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aOn" = ( /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; @@ -23131,7 +23133,7 @@ "aOq" = ( /obj/effect/decal/warning_stripes/northeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aOr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -23518,7 +23520,7 @@ }, /obj/effect/decal/warning_stripes/north, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aPe" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/warning_stripes/west, @@ -23545,7 +23547,7 @@ icon_state = "2-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aPh" = ( /obj/structure/table, /obj/item/hatchet, @@ -23712,7 +23714,7 @@ }, /obj/structure/cable, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aPz" = ( /obj/item/seeds/apple, /obj/item/seeds/banana, @@ -24085,7 +24087,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aQg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -24167,7 +24169,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aQo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -24580,7 +24582,7 @@ "aRe" = ( /obj/item/weldingtool, /turf/space, -/area/space) +/area/space/nearstation) "aRf" = ( /obj/item/wirecutters, /obj/structure/cable{ @@ -24608,7 +24610,7 @@ "aRh" = ( /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aRi" = ( /obj/machinery/pipedispenser, /turf/simulated/floor/plating, @@ -25199,7 +25201,7 @@ "aSk" = ( /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aSl" = ( /obj/machinery/navbeacon{ codes_txt = "delivery"; @@ -25233,7 +25235,7 @@ "aSp" = ( /obj/effect/decal/warning_stripes/southwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aSq" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -25990,7 +25992,7 @@ "aTG" = ( /obj/effect/decal/warning_stripes/southeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aTH" = ( /obj/machinery/power/apc{ dir = 4; @@ -26024,7 +26026,7 @@ }, /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aTJ" = ( /obj/structure/cable{ d1 = 1; @@ -26059,7 +26061,7 @@ d2 = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aTN" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall3"; @@ -26646,7 +26648,7 @@ icon_state = "2-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aUN" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -26724,19 +26726,19 @@ "aUU" = ( /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "aUV" = ( /obj/structure/window/reinforced, /obj/structure/lattice, /turf/space, -/area/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, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) "aWx" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room"; @@ -27712,7 +27710,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "aWD" = ( /turf/simulated/wall, /area/hallway/secondary/entry{ @@ -28311,7 +28309,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aXI" = ( /obj/structure/window/reinforced{ dir = 1; @@ -28369,13 +28367,13 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aXO" = ( /obj/structure/window/reinforced{ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "aXP" = ( /obj/item/crowbar, /turf/simulated/floor/plating, @@ -29805,7 +29803,7 @@ icon_state = "1-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "baq" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -31844,8 +31842,8 @@ }) "bdO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/construction/hallway{ name = "\improper MiniSat Exterior" }) @@ -32575,7 +32573,7 @@ anchored = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bfa" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5; @@ -33702,7 +33700,7 @@ }, /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "bgN" = ( /obj/structure/lattice, /turf/space, @@ -33807,7 +33805,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bgV" = ( /obj/machinery/conveyor_switch/oneway{ id = "packageSort2"; @@ -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" = ( @@ -37724,7 +37722,7 @@ /area/security/brig) "bnv" = ( /obj/structure/safe{ - knownby = list("captain") + known_by = list("captain") }, /obj/item/clothing/head/bearpelt, /obj/item/folder/documents, @@ -38279,7 +38277,7 @@ name = "EXTERNAL AIRLOCK" }, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bop" = ( /obj/machinery/computer/med_data, /turf/simulated/floor/plasteel{ @@ -38945,7 +38943,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bps" = ( /obj/structure/window/reinforced{ dir = 1 @@ -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, @@ -39972,7 +39970,7 @@ icon_state = "D-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bqZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -40029,10 +40027,10 @@ }, /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "bre" = ( /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "brf" = ( /obj/structure/window/reinforced{ dir = 8 @@ -40618,7 +40616,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "bse" = ( /obj/structure/window/reinforced{ dir = 1 @@ -40627,7 +40625,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bsf" = ( /obj/structure/window/reinforced{ dir = 4 @@ -40971,12 +40969,12 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bsJ" = ( /obj/structure/transit_tube, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bsK" = ( /obj/structure/transit_tube{ tag = "icon-W-SE"; @@ -40984,14 +40982,14 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bsL" = ( /obj/structure/transit_tube{ tag = "icon-D-SW"; icon_state = "D-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bsM" = ( /turf/simulated/wall/r_wall, /area/turret_protected/tcomfoyer{ @@ -41003,7 +41001,7 @@ icon_state = "D-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bsO" = ( /obj/structure/table/reinforced, /obj/structure/cable/yellow{ @@ -41041,7 +41039,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bsQ" = ( /obj/structure/transit_tube{ icon_state = "E-W-Pass" @@ -41049,7 +41047,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bsR" = ( /obj/structure/transit_tube{ icon_state = "E-SW"; @@ -41057,13 +41055,13 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bsS" = ( /obj/structure/transit_tube{ icon_state = "W-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bsT" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -41842,7 +41840,7 @@ icon_state = "NE-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bue" = ( /obj/structure/sign/double/map/left{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; @@ -42205,14 +42203,14 @@ tag = "icon-D-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "buM" = ( /obj/structure/transit_tube{ icon_state = "D-NW"; tag = "icon-D-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "buN" = ( /obj/structure/transit_tube{ icon_state = "S-NW" @@ -42239,7 +42237,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "buP" = ( /obj/structure/window/reinforced{ dir = 1 @@ -42760,7 +42758,7 @@ /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/space) +/area/space/nearstation) "bvw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -43601,7 +43599,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bwM" = ( /obj/structure/transit_tube{ tag = "icon-S-NE"; @@ -43622,7 +43620,7 @@ icon_state = "vault"; dir = 8 }, -/area/space) +/area/space/nearstation) "bwN" = ( /obj/item/assembly/prox_sensor, /obj/structure/cable/yellow{ @@ -43729,7 +43727,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bwV" = ( /obj/machinery/vending/coffee, /turf/simulated/floor/plasteel{ @@ -43752,7 +43750,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bwX" = ( /obj/structure/transit_tube{ tag = "icon-D-SE"; @@ -43771,7 +43769,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bwY" = ( /obj/structure/transit_tube, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -43783,7 +43781,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bwZ" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -43909,7 +43907,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bxj" = ( /obj/structure/transit_tube{ tag = "icon-S-NE"; @@ -43917,14 +43915,14 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bxk" = ( /obj/structure/transit_tube{ tag = "icon-D-NE"; icon_state = "D-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "bxl" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -43936,7 +43934,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bxm" = ( /obj/structure/transit_tube{ icon_state = "W-NE-SE" @@ -43950,9 +43948,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bxn" = ( /obj/structure/transit_tube{ tag = "icon-D-SW"; @@ -43971,9 +43969,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bxo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4; @@ -43984,14 +43982,10 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bxp" = ( -/obj/structure/transit_tube/station{ - icon_state = "closed"; - dir = 4 - }, /obj/structure/transit_tube_pod, /obj/structure/window/reinforced{ dir = 8 @@ -44025,9 +44019,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bxr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ req_access_txt = 1 @@ -44634,7 +44628,7 @@ /area/crew_quarters/heads) "byk" = ( /obj/structure/safe/floor{ - knownby = list("captain") + known_by = list("captain") }, /obj/item/gun/projectile/revolver/russian, /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, @@ -45168,7 +45162,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bzd" = ( /obj/structure/transit_tube{ tag = "icon-N-SW"; @@ -45176,7 +45170,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bze" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/ai_slipper{ @@ -45403,7 +45397,7 @@ icon_state = "NW-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bzu" = ( /obj/structure/transit_tube{ icon_state = "N-SW" @@ -45963,7 +45957,7 @@ icon_state = "vault"; dir = 8 }, -/area/space) +/area/space/nearstation) "bAu" = ( /obj/machinery/vending/boozeomat, /turf/simulated/wall, @@ -46292,7 +46286,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bAY" = ( /obj/structure/transit_tube{ tag = "icon-W-NE"; @@ -46300,7 +46294,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bAZ" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -46308,14 +46302,14 @@ icon_state = "D-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bBa" = ( /obj/structure/transit_tube{ tag = "icon-E-NW"; icon_state = "E-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bBb" = ( /obj/structure/transit_tube{ icon_state = "D-SE"; @@ -46325,7 +46319,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bBc" = ( /obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, @@ -47212,7 +47206,7 @@ /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/space) +/area/space/nearstation) "bCx" = ( /obj/structure/sign/securearea{ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; @@ -47502,7 +47496,7 @@ /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/space) +/area/space/nearstation) "bCZ" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -48824,12 +48818,12 @@ /obj/structure/lattice, /obj/structure/grille, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bFc" = ( /obj/structure/grille, /obj/structure/lattice, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bFd" = ( /obj/machinery/computer/security/telescreen{ dir = 8; @@ -48932,7 +48926,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bFl" = ( /turf/simulated/floor/plasteel{ icon_state = "grimy" @@ -49802,13 +49796,13 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "bGN" = ( /obj/structure/transit_tube{ icon_state = "W-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "bGO" = ( /obj/structure/window/reinforced{ dir = 1 @@ -50623,7 +50617,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bIv" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ @@ -50742,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" = ( @@ -50757,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" = ( @@ -51768,7 +51762,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/insulated, /turf/space, -/area/space) +/area/space/nearstation) "bKy" = ( /obj/machinery/atmospherics/unary/portables_connector{ dir = 1 @@ -53038,7 +53032,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bMk" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/visible/green{ @@ -53087,7 +53081,7 @@ }, /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "bMo" = ( /obj/machinery/telecomms/processor/preset_one, /turf/simulated/floor/bluegrid{ @@ -53211,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" = ( @@ -54076,7 +54070,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "bNZ" = ( /obj/machinery/telecomms/bus/preset_one, /turf/simulated/floor/bluegrid{ @@ -54973,20 +54967,20 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bPG" = ( /obj/structure/lattice, /obj/structure/grille, /obj/structure/lattice, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bPH" = ( /obj/structure/window/reinforced{ dir = 1 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bPI" = ( /obj/machinery/light/small{ dir = 8 @@ -55794,7 +55788,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bRn" = ( /obj/machinery/message_server, /turf/simulated/floor/bluegrid{ @@ -55829,7 +55823,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "bRq" = ( /obj/machinery/door/airlock/hatch{ name = "Telecoms Server Room" @@ -59662,7 +59656,7 @@ dir = 5 }, /turf/space, -/area/space) +/area/space/nearstation) "bXP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/extinguisher_cabinet{ @@ -63185,7 +63179,7 @@ }, /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/engine/vacuum, -/area/space) +/area/space/nearstation) "cdS" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - CO2"; @@ -65913,8 +65907,8 @@ /area/hydroponics) "ciB" = ( /obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "ciC" = ( /obj/effect/decal/warning_stripes/northeast, @@ -66274,8 +66268,8 @@ /turf/simulated/floor/plating, /area/atmos) "cjc" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cjd" = ( /obj/effect/spawner/window/reinforced, @@ -67010,7 +67004,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ckp" = ( /obj/structure/window/reinforced{ dir = 4 @@ -67020,7 +67014,7 @@ layer = 2.9 }, /turf/space, -/area/space) +/area/space/nearstation) "ckq" = ( /obj/structure/window/reinforced{ dir = 1; @@ -67030,14 +67024,14 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "ckr" = ( /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cks" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -67942,7 +67936,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "clI" = ( /obj/machinery/requests_console{ announcementConsole = 0; @@ -68471,8 +68465,8 @@ d2 = 2; icon_state = "1-2" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cmI" = ( /obj/machinery/vending/wallmed1{ @@ -68501,31 +68495,31 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/green, /turf/space, -/area/space) +/area/space/nearstation) "cmL" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/yellow, /turf/space, -/area/space) +/area/space/nearstation) "cmM" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "cmN" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 9 }, /turf/space, -/area/space) +/area/space/nearstation) "cmO" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/cyan, /turf/space, -/area/space) +/area/space/nearstation) "cmP" = ( /obj/structure/window/reinforced{ dir = 1 @@ -71960,11 +71954,11 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/binary/pump/on, /turf/space, -/area/space) +/area/space/nearstation) "csp" = ( /obj/item/wrench, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "csq" = ( /obj/machinery/light/small, /turf/simulated/floor/engine{ @@ -72780,7 +72774,7 @@ icon_state = "pipe-c" }, /turf/space, -/area/space) +/area/space/nearstation) "ctt" = ( /obj/structure/disposaloutlet{ dir = 2 @@ -72789,7 +72783,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ctu" = ( /turf/simulated/wall/r_wall/coated, /area/maintenance/incinerator) @@ -73654,10 +73648,8 @@ /area/medical/reception) "cuQ" = ( /obj/machinery/igniter{ - icon_state = "igniter0"; id = "Turbine_igniter"; - luminosity = 2; - on = 0 + luminosity = 2 }, /obj/structure/cable{ d1 = 1; @@ -74382,8 +74374,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cvR" = ( /obj/structure/chair/office/light, @@ -75747,7 +75739,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cyo" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/door/poddoor/shutters{ @@ -76392,7 +76384,7 @@ "czm" = ( /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "czn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4; @@ -76937,8 +76929,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cAg" = ( /obj/structure/closet, @@ -77556,8 +77548,8 @@ d2 = 8; icon_state = "0-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cBf" = ( /obj/machinery/computer/security/telescreen{ @@ -77579,8 +77571,8 @@ icon_state = "0-4"; d2 = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cBh" = ( /obj/item/storage/secure/safe{ @@ -78229,8 +78221,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cCg" = ( /obj/item/reagent_containers/glass/beaker/large, @@ -78312,8 +78304,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cCk" = ( /obj/structure/table, @@ -78463,8 +78455,8 @@ /area/medical/surgeryobs) "cCw" = ( /obj/item/stack/cable_coil, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cCx" = ( /obj/structure/cable/yellow{ @@ -78497,9 +78489,9 @@ d2 = 4; icon_state = "0-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cCA" = ( /turf/simulated/floor/plasteel{ dir = 8; @@ -78814,9 +78806,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cDa" = ( /obj/machinery/door/airlock/maintenance{ name = "airlock access"; @@ -78950,7 +78942,7 @@ "cDn" = ( /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/engine/vacuum, -/area/space) +/area/space/nearstation) "cDo" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden{ @@ -81330,7 +81322,7 @@ "cHf" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "cHg" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -82336,8 +82328,8 @@ pixel_x = -1 }, /obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cIO" = ( /obj/item/flashlight/lamp, @@ -83393,7 +83385,7 @@ /area/medical/surgery2) "cKI" = ( /turf/simulated/wall, -/area/space) +/area/space/nearstation) "cKJ" = ( /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, @@ -86872,9 +86864,9 @@ d2 = 8; icon_state = "0-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cPV" = ( /obj/structure/closet/wardrobe/robotics_black{ pixel_x = 2 @@ -88571,13 +88563,13 @@ icon_state = "pipe-c" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cSA" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cSB" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ @@ -89153,7 +89145,7 @@ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cTy" = ( /obj/structure/morgue, /turf/simulated/floor/plasteel{ @@ -91763,8 +91755,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cXO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -92029,8 +92021,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cYj" = ( /obj/structure/chair, @@ -92226,8 +92218,8 @@ d2 = 2; icon_state = "1-2" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cYB" = ( /obj/machinery/light/small{ @@ -92414,7 +92406,7 @@ pixel_y = 24 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/binary/pump/highcap{ +/obj/machinery/atmospherics/binary/pump{ dir = 4 }, /turf/simulated/floor/plasteel, @@ -92426,7 +92418,7 @@ /obj/structure/sign/fire{ pixel_y = -32 }, -/obj/machinery/atmospherics/binary/pump/highcap{ +/obj/machinery/atmospherics/binary/pump{ dir = 8 }, /turf/simulated/floor/plasteel, @@ -92483,12 +92475,12 @@ }) "cYY" = ( /obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cYZ" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cZa" = ( /obj/machinery/light_switch{ @@ -92533,8 +92525,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cZd" = ( /obj/structure/cable{ @@ -92552,8 +92544,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cZe" = ( /turf/simulated/shuttle/wall{ @@ -92600,8 +92592,8 @@ d2 = 8; icon_state = "0-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cZk" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -92808,8 +92800,8 @@ }) "cZA" = ( /obj/item/stack/cable_coil, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cZB" = ( /turf/simulated/shuttle/floor, @@ -93006,8 +92998,8 @@ icon_state = "0-4"; d2 = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cZX" = ( /obj/machinery/light{ @@ -93375,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" }, @@ -94201,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{ @@ -94340,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" }, @@ -94574,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" }, @@ -94647,8 +94639,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "dcw" = ( /obj/structure/window/reinforced, @@ -94855,8 +94847,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "dcO" = ( /obj/docking_port/stationary{ @@ -94875,9 +94867,6 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "dcQ" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/item/radio/intercom{ broadcasting = 0; listening = 1; @@ -94885,6 +94874,9 @@ pixel_y = -28 }, /obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -94965,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{ @@ -94979,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, @@ -95020,7 +95012,7 @@ name = "\improper Secure Lab" }) "ddi" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -95028,7 +95020,7 @@ }, /area/shuttle/escape) "ddj" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -95132,8 +95124,8 @@ name = "xeno_spawn"; pixel_x = -1 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddx" = ( /turf/simulated/shuttle/wall{ @@ -95204,8 +95196,8 @@ icon_state = "0-2"; d2 = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddE" = ( /turf/simulated/shuttle/wall{ @@ -95220,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" }, @@ -95237,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" }, @@ -95292,14 +95284,14 @@ "ddO" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ddP" = ( /obj/structure/disposalpipe/trunk{ dir = 1 }, /obj/structure/disposaloutlet, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ddQ" = ( /obj/docking_port/stationary{ dheight = 9; @@ -95388,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" }, @@ -95426,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" }, @@ -95445,7 +95437,7 @@ d2 = 2 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dea" = ( /obj/structure/cable{ d1 = 1; @@ -95453,7 +95445,7 @@ icon_state = "1-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "deb" = ( /obj/machinery/vending/wallmed1{ name = "Emergency NanoMed"; @@ -95472,7 +95464,7 @@ icon_state = "1-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ded" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -95658,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{ @@ -95673,7 +95665,7 @@ dir = 6 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dex" = ( /obj/structure/rack{ dir = 1 @@ -95692,7 +95684,7 @@ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dez" = ( /obj/structure/disposalpipe/segment{ dir = 8; @@ -97514,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 @@ -112055,7 +112053,7 @@ apf abq aaa abq -aWw +aef abq aaa aaa @@ -112312,7 +112310,7 @@ apf aaa aaa aaa -aWw +aef aaa bZU bZU @@ -134184,9 +134182,9 @@ cHf abq aaa aaa -aWw +aef cPU -aWw +aef aaa abq aaa @@ -134944,7 +134942,7 @@ aaa abq aaa abq -aWw +aef abq abq aaa @@ -135201,7 +135199,7 @@ abq abq abq abq -aWw +aef aaa aaa aaa @@ -143634,8 +143632,8 @@ aCg bjT aTR bgL -aWw -aWw +aef +aef abq abq aaa @@ -144121,7 +144119,7 @@ aaa aaa aaa abq -aWw +aef aCj aDm aFm @@ -144378,7 +144376,7 @@ aaa abq abq abq -aWw +aef bre aCg aDn @@ -147700,8 +147698,8 @@ aaa aaa adM aeF -afi -afi +tXL +tXL aeF agJ aeh @@ -148517,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 5533ba2af8d..f27926e04f9 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -10,9 +10,6 @@ dir = 8 }, /area/space) -"ad" = ( -/turf/space/transit, -/area/syndicate_station/transit) "ae" = ( /turf/unsimulated/wall{ tag = "icon-iron6"; @@ -1284,7 +1281,7 @@ width = 18 }, /turf/space/transit, -/area/syndicate_station/transit) +/area/space) "dy" = ( /obj/docking_port/stationary/transit{ dir = 8; @@ -1501,7 +1498,7 @@ /turf/unsimulated/wall, /area/tdome/arena_source) "eb" = ( -/obj/machinery/igniter, +/obj/machinery/igniter/on, /turf/simulated/floor/plasteel, /area/tdome/arena_source) "ec" = ( @@ -1774,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{ @@ -3754,7 +3744,7 @@ icon_state = "propulsion"; tag = "icon-propulsion (EAST)" }, -/turf/space/transit, +/turf/simulated/shuttle/plating, /area/wizard_station) "kr" = ( /obj/structure/flora/tree/pine, @@ -3769,7 +3759,7 @@ icon_state = "heater"; dir = 8 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/wizard_station) "kt" = ( /obj/structure/flora/grass/brown, @@ -4627,14 +4617,14 @@ dir = 4; icon_state = "propulsion" }, -/turf/space/transit, +/turf/simulated/shuttle/plating, /area/wizard_station) "mP" = ( /obj/structure/shuttle/engine/heater{ icon_state = "heater"; dir = 4 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/wizard_station) "mQ" = ( /obj/machinery/light{ @@ -5052,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" }, @@ -5808,7 +5798,7 @@ /turf/unsimulated/wall, /area/tdome/arena) "qu" = ( -/obj/machinery/igniter, +/obj/machinery/igniter/on, /turf/simulated/floor/plasteel, /area/tdome/arena) "qv" = ( @@ -5975,7 +5965,7 @@ /obj/structure/shuttle/engine/propulsion{ icon_state = "propulsion_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/wizard_station) "tq" = ( /obj/structure/rack, @@ -6049,7 +6039,7 @@ /area/centcom/holding) "tP" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/space) "tQ" = ( /turf/unsimulated/beach/coastline, @@ -6116,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{ @@ -6124,7 +6114,7 @@ }, /area/centcom/evac) "xG" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -6132,7 +6122,7 @@ }, /area/centcom/evac) "xW" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -6142,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" = ( @@ -6163,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{ @@ -6268,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{ @@ -6294,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) @@ -6354,6 +6344,10 @@ /obj/structure/bed/abductor, /turf/unsimulated/floor/abductor, /area/abductor_ship) +"Ur" = ( +/obj/machinery/poolcontroller/invisible, +/turf/unsimulated/beach/water, +/area/centcom/holding) (1,1,1) = {" aa @@ -14886,15 +14880,15 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -15137,21 +15131,21 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -15394,21 +15388,21 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -15651,21 +15645,21 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -15901,28 +15895,28 @@ aa aa aa aa -ad -ad -ad -ad -ad aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -16158,25 +16152,25 @@ aa aa aa aa -ad -ad -ad -ad -ad aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -16415,27 +16409,27 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -16672,27 +16666,27 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -16929,27 +16923,27 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17186,27 +17180,27 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17443,27 +17437,27 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17700,25 +17694,25 @@ aa aa aa aa -ad -ad -ad -ad -ad aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17957,28 +17951,28 @@ aa aa aa aa -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa aa aa aa aa dx -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18223,19 +18217,19 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18480,19 +18474,19 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18741,15 +18735,15 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18998,15 +18992,15 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -27557,7 +27551,7 @@ fe fd fG eh -eP +xW fd fT fC @@ -35867,7 +35861,7 @@ tv tu tu tQ -tU +Ur th ab ab @@ -47107,7 +47101,7 @@ ab ab ab fi -yk +Gw jE jE jE @@ -47364,7 +47358,7 @@ ab ab ab fi -yl +jE jE jE jE diff --git a/_maps/map_files/MetaStation/z3.dmm b/_maps/map_files/MetaStation/z3.dmm index c1e20ddacaa..6784ca8ceca 100644 --- a/_maps/map_files/MetaStation/z3.dmm +++ b/_maps/map_files/MetaStation/z3.dmm @@ -145,7 +145,7 @@ "ay" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "az" = ( /obj/effect/landmark/damageturf, /turf/simulated/floor/plating/airless{ @@ -156,31 +156,31 @@ "be" = ( /obj/item/trash/cheesie, /turf/space, -/area/space) +/area/space/nearstation) "bj" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bk" = ( /obj/structure/lattice, /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "bl" = ( /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "bm" = ( /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bn" = ( /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bo" = ( /obj/structure/girder, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bp" = ( /turf/simulated/wall/r_wall, /area/tcommsat/chamber) @@ -198,7 +198,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bt" = ( /obj/structure/window/reinforced{ dir = 8 @@ -258,7 +258,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bE" = ( /obj/structure/cable{ d1 = 1; @@ -285,7 +285,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bI" = ( /turf/simulated/floor/plating/airless, /area/tcommsat/chamber) @@ -355,7 +355,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bV" = ( /obj/item/folder/yellow, /turf/simulated/floor/plating/airless, @@ -372,7 +372,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bY" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -383,7 +383,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bZ" = ( /obj/structure/window/reinforced{ dir = 8 @@ -399,18 +399,18 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "cb" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "cc" = ( /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "cd" = ( /obj/structure/sign/securearea, /turf/simulated/wall/r_wall, @@ -520,20 +520,20 @@ dir = 4 }, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "cv" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/structure/grille/broken, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cw" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cx" = ( /obj/structure/disposaloutlet{ dir = 4 @@ -542,7 +542,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cy" = ( /obj/structure/window/reinforced{ dir = 8 @@ -562,20 +562,20 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "cA" = ( /obj/structure/window/reinforced{ dir = 1 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "cB" = ( /obj/structure/window/reinforced{ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "cC" = ( /obj/structure/table, /obj/item/radio/off, @@ -606,14 +606,14 @@ /turf/simulated/floor/plasteel{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "cI" = ( /obj/structure/window/reinforced{ dir = 4 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "cJ" = ( /obj/structure/window/reinforced{ dir = 8 @@ -679,7 +679,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "cQ" = ( /obj/structure/window/reinforced{ dir = 4 @@ -846,19 +846,19 @@ }, /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "du" = ( /obj/structure/window/reinforced, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dz" = ( /obj/structure/window/reinforced{ dir = 4 }, /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "dA" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -886,7 +886,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "dJ" = ( /obj/structure/lattice, /obj/item/stack/rods, @@ -894,7 +894,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "dK" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -906,7 +906,7 @@ "dM" = ( /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "dO" = ( /obj/machinery/door/airlock/hatch, /turf/simulated/floor/plasteel, @@ -943,7 +943,7 @@ "ed" = ( /obj/item/crowbar, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ej" = ( /obj/structure/computerframe, /turf/simulated/floor/plating, diff --git a/_maps/map_files/MetaStation/z4.dmm b/_maps/map_files/MetaStation/z4.dmm index 95277b92bf9..6b7523f801d 100644 --- a/_maps/map_files/MetaStation/z4.dmm +++ b/_maps/map_files/MetaStation/z4.dmm @@ -5,7 +5,7 @@ "ab" = ( /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ac" = ( /obj/machinery/power/solar/fake, /turf/simulated/floor/plating/airless{ @@ -18,7 +18,7 @@ "ae" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "af" = ( /turf/simulated/wall, /area/djstation) @@ -350,7 +350,7 @@ "aY" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aZ" = ( /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" @@ -452,7 +452,7 @@ d2 = 2; icon_state = "1-2" }, -/turf/simulated/floor/plating/airless/catwalk, +/obj/structure/lattice/catwalk, /area/solar/derelict_starboard) "bk" = ( /obj/structure/disposalpipe/trunk{ @@ -460,7 +460,7 @@ }, /obj/structure/disposaloutlet, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bl" = ( /turf/simulated/floor/plating/airless{ tag = "icon-platingdmg2"; @@ -489,7 +489,7 @@ }, /area/solar/derelict_starboard) "bo" = ( -/turf/simulated/floor/plating/airless/catwalk, +/obj/structure/lattice/catwalk, /area/solar/derelict_starboard) "bp" = ( /obj/structure/cable{ @@ -502,7 +502,7 @@ d2 = 4; icon_state = "1-4" }, -/turf/simulated/floor/plating/airless/catwalk, +/obj/structure/lattice/catwalk, /area/solar/derelict_starboard) "bq" = ( /obj/structure/cable{ @@ -520,7 +520,7 @@ d2 = 4; icon_state = "1-4" }, -/turf/simulated/floor/plating/airless/catwalk, +/obj/structure/lattice/catwalk, /area/solar/derelict_starboard) "br" = ( /obj/structure/cable{ @@ -528,7 +528,7 @@ d2 = 8; icon_state = "4-8" }, -/turf/simulated/floor/plating/airless/catwalk, +/obj/structure/lattice/catwalk, /area/solar/derelict_starboard) "bs" = ( /obj/structure/cable{ @@ -546,7 +546,7 @@ d2 = 8; icon_state = "2-8" }, -/turf/simulated/floor/plating/airless/catwalk, +/obj/structure/lattice/catwalk, /area/solar/derelict_starboard) "bt" = ( /obj/structure/cable{ @@ -559,7 +559,7 @@ d2 = 8; icon_state = "2-8" }, -/turf/simulated/floor/plating/airless/catwalk, +/obj/structure/lattice/catwalk, /area/solar/derelict_starboard) "bu" = ( /obj/structure/cable{ @@ -572,7 +572,7 @@ d2 = 8; icon_state = "2-8" }, -/turf/simulated/floor/plating/airless/catwalk, +/obj/structure/lattice/catwalk, /area/solar/derelict_starboard) "bv" = ( /obj/machinery/power/solar{ @@ -584,14 +584,14 @@ /area/solar/derelict_starboard) "bw" = ( /obj/structure/cable, -/turf/simulated/floor/plating/airless/catwalk, +/obj/structure/lattice/catwalk, /area/solar/derelict_starboard) "bx" = ( /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, -/turf/simulated/floor/plating/airless/catwalk, +/obj/structure/lattice/catwalk, /area/solar/derelict_starboard) "by" = ( /turf/simulated/wall, @@ -646,7 +646,7 @@ /area/derelict/bridge/ai_upload) "bE" = ( /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "bF" = ( /turf/simulated/floor/plasteel, /area/derelict/solar_control) @@ -843,7 +843,7 @@ /area/derelict/solar_control) "ce" = ( /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "cf" = ( /obj/machinery/porta_turret, /turf/simulated/floor/plasteel, @@ -877,7 +877,7 @@ "cj" = ( /obj/structure/grille/broken, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ck" = ( /obj/machinery/light/small, /turf/simulated/floor/plasteel, @@ -908,7 +908,7 @@ "co" = ( /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "cp" = ( /obj/structure/grille, /turf/simulated/floor/plating/airless, @@ -1019,7 +1019,7 @@ "cH" = ( /obj/structure/closet/crate, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cI" = ( /turf/simulated/floor/plating/airless{ icon_state = "damaged4" @@ -1115,7 +1115,7 @@ /turf/simulated/floor/plating/airless{ icon_state = "damaged4" }, -/area/space) +/area/space/nearstation) "cZ" = ( /obj/structure/cable{ d1 = 1; @@ -1167,7 +1167,7 @@ /area/derelict/bridge/ai_upload) "df" = ( /turf/simulated/wall, -/area/space) +/area/space/nearstation) "dg" = ( /obj/structure/cable{ d1 = 1; @@ -1197,7 +1197,7 @@ /obj/item/stack/ore/iron, /obj/item/stack/ore/iron, /turf/space, -/area/space) +/area/space/nearstation) "dl" = ( /turf/simulated/floor/plating/airless{ icon_state = "damaged2" @@ -1309,7 +1309,7 @@ "dE" = ( /obj/item/stack/ore/slag, /turf/space, -/area/space) +/area/space/nearstation) "dF" = ( /obj/structure/cable{ d1 = 1; @@ -1490,7 +1490,7 @@ /turf/simulated/floor/plating/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "eb" = ( /obj/structure/cable{ d1 = 4; @@ -1536,7 +1536,7 @@ "ef" = ( /obj/item/stack/cable_coil/cut, /turf/space, -/area/space) +/area/space/nearstation) "eg" = ( /obj/machinery/light/small{ dir = 8 @@ -1893,7 +1893,7 @@ "fk" = ( /obj/item/stack/rods, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "fl" = ( /obj/structure/grille, /obj/structure/window/reinforced, @@ -2088,7 +2088,7 @@ "fK" = ( /obj/item/stack/rods, /turf/space, -/area/space) +/area/space/nearstation) "fL" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -2283,7 +2283,7 @@ /area/derelict/bridge/access) "gp" = ( /turf/simulated/wall/mineral/bananium, -/area/space) +/area/space/nearstation) "gq" = ( /obj/structure/window/reinforced{ dir = 4 @@ -2460,7 +2460,7 @@ "gO" = ( /obj/machinery/door/airlock/bananium, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "gP" = ( /obj/structure/cable{ d1 = 2; @@ -2513,28 +2513,28 @@ "gX" = ( /obj/item/flag/clown, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "gY" = ( /obj/effect/landmark/damageturf, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "gZ" = ( /obj/effect/landmark/burnturf, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ha" = ( /obj/effect/mob_spawn/human/corpse/clownmili{ name = "Clown Pilot" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hb" = ( /obj/effect/mob_spawn/human/corpse/clownmili, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hc" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hd" = ( /obj/machinery/light/small{ dir = 4 @@ -2627,7 +2627,7 @@ /turf/simulated/floor/plating/airless{ icon_state = "floorscorched2" }, -/area/space) +/area/space/nearstation) "hp" = ( /obj/structure/computerframe, /obj/effect/landmark/damageturf, @@ -2648,7 +2648,7 @@ name = "Clown Pilot" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hs" = ( /obj/structure/closet, /obj/structure/window/reinforced{ @@ -2707,7 +2707,7 @@ "hB" = ( /obj/item/shard, /turf/space, -/area/space) +/area/space/nearstation) "hC" = ( /obj/structure/window/reinforced, /turf/simulated/floor/plating/airless, @@ -2738,7 +2738,7 @@ dir = 5 }, /turf/space, -/area/space) +/area/space/nearstation) "hG" = ( /turf/simulated/wall/r_wall, /area/derelict/arrival) @@ -2769,7 +2769,7 @@ /obj/structure/lattice, /obj/structure/window/basic, /turf/space, -/area/space) +/area/space/nearstation) "hN" = ( /obj/structure/table, /turf/simulated/floor/plasteel, @@ -2901,7 +2901,7 @@ name = "External Engineering" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "il" = ( /obj/machinery/light{ icon_state = "tube1"; @@ -2970,7 +2970,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "iv" = ( /obj/structure/table, /turf/simulated/floor/plasteel{ @@ -2996,7 +2996,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "iz" = ( /obj/structure/lattice, /obj/structure/lattice, @@ -3004,7 +3004,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "iA" = ( /turf/simulated/floor/plating, /area/derelict/arrival) @@ -3014,7 +3014,7 @@ }, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "iC" = ( /turf/simulated/floor/plasteel{ dir = 8; @@ -3106,7 +3106,7 @@ "iN" = ( /obj/item/stack/cable_coil/cut, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iO" = ( /obj/structure/table, /obj/structure/window/reinforced{ @@ -3204,7 +3204,7 @@ "jb" = ( /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "jc" = ( /obj/structure/window/reinforced{ dir = 4 @@ -3212,7 +3212,7 @@ /obj/structure/window/reinforced, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "jd" = ( /obj/structure/window/reinforced{ dir = 1 @@ -3283,13 +3283,13 @@ "jl" = ( /obj/item/shard, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jm" = ( /obj/structure/window/reinforced, /turf/simulated/floor/plating/airless{ icon_state = "white" }, -/area/space) +/area/space/nearstation) "jn" = ( /obj/structure/cable{ d1 = 4; @@ -3337,7 +3337,7 @@ icon_state = "medium" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jt" = ( /obj/structure/cable{ d1 = 4; @@ -3380,13 +3380,13 @@ "jw" = ( /obj/structure/closet/l3closet, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jx" = ( /obj/structure/window/reinforced{ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jy" = ( /obj/item/pen, /turf/simulated/floor/plasteel, @@ -3396,7 +3396,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "jA" = ( /obj/structure/window/reinforced{ dir = 4 @@ -3406,7 +3406,7 @@ }, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "jB" = ( /obj/structure/cable{ d1 = 2; @@ -3453,7 +3453,7 @@ "jG" = ( /obj/item/cigbutt, /turf/space, -/area/space) +/area/space/nearstation) "jH" = ( /obj/structure/table, /obj/item/stock_parts/cell, @@ -3496,7 +3496,7 @@ /turf/simulated/floor/plating/airless{ icon_state = "white" }, -/area/space) +/area/space/nearstation) "jN" = ( /obj/machinery/light{ icon_state = "tube1"; @@ -3554,7 +3554,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jT" = ( /obj/structure/cable{ d1 = 2; @@ -3562,7 +3562,7 @@ icon_state = "2-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jU" = ( /obj/structure/closet/wardrobe/genetics_white, /turf/simulated/floor/plating/airless{ @@ -3577,7 +3577,7 @@ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jW" = ( /obj/machinery/light/small{ dir = 4 @@ -3593,12 +3593,12 @@ icon_state = "medium" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jY" = ( /turf/simulated/floor/plating/airless{ icon_state = "white" }, -/area/space) +/area/space/nearstation) "jZ" = ( /obj/structure/cable{ d1 = 1; @@ -3606,7 +3606,7 @@ icon_state = "1-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ka" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -3615,7 +3615,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "kb" = ( /obj/machinery/light/small{ dir = 4 @@ -3629,7 +3629,7 @@ icon_state = "medium" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "kd" = ( /obj/structure/window/basic{ dir = 1 @@ -3640,7 +3640,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ke" = ( /obj/machinery/door/window{ dir = 8 @@ -3652,7 +3652,7 @@ icon_state = "small" }, /turf/space, -/area/space) +/area/space/nearstation) "kg" = ( /obj/machinery/light/small{ dir = 1 @@ -3667,7 +3667,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ki" = ( /obj/structure/cable{ d1 = 4; @@ -3728,13 +3728,13 @@ "kp" = ( /obj/structure/window/basic, /turf/space, -/area/space) +/area/space/nearstation) "kq" = ( /obj/structure/window/basic{ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "kr" = ( /obj/structure/cable{ d1 = 4; @@ -3827,12 +3827,12 @@ }, /obj/structure/window/basic, /turf/space, -/area/space) +/area/space/nearstation) "kE" = ( /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "kF" = ( /obj/machinery/door/airlock/external{ name = "Arrivals Docking Bay 1" @@ -3972,7 +3972,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "kV" = ( /obj/machinery/door/airlock/maintenance{ name = "Atmospherics Access"; @@ -4017,7 +4017,7 @@ }, /obj/structure/window/reinforced, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ld" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ tag = "icon-manifold-b-f (EAST)"; @@ -4038,26 +4038,26 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "lg" = ( /obj/structure/window/basic{ dir = 5 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lh" = ( /obj/structure/grille, /obj/structure/window/basic{ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "li" = ( /obj/structure/window/basic{ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lj" = ( /obj/machinery/door/airlock/maintenance{ name = "Atmospherics Access"; @@ -4114,7 +4114,7 @@ icon_state = "4-8" }, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "lt" = ( /obj/structure/cable{ d1 = 4; @@ -4130,14 +4130,14 @@ "lv" = ( /obj/structure/girder, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lw" = ( /obj/structure/lattice, /obj/structure/window/basic{ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "lx" = ( /obj/structure/girder, /obj/structure/window/basic, @@ -4191,13 +4191,13 @@ "lD" = ( /obj/machinery/door/window, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lE" = ( /obj/item/shard{ icon_state = "small" }, -/turf/simulated/floor/plating/airless/asteroid, -/area/space) +/turf/simulated/floor/plating/asteroid/airless, +/area/space/nearstation) "lF" = ( /obj/structure/window/basic{ dir = 1 @@ -4222,8 +4222,8 @@ /obj/structure/chair{ dir = 8 }, -/turf/simulated/floor/plating/airless/asteroid, -/area/space) +/turf/simulated/floor/plating/asteroid/airless, +/area/space/nearstation) "lJ" = ( /obj/machinery/vending/sovietsoda, /turf/simulated/floor/plating/airless, @@ -4235,24 +4235,24 @@ "lL" = ( /obj/structure/table, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lM" = ( /obj/structure/window/reinforced{ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lN" = ( /obj/item/paper{ info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lO" = ( /obj/structure/lattice, /obj/item/stack/cable_coil/cut, /turf/space, -/area/space) +/area/space/nearstation) "lP" = ( /obj/structure/girder, /turf/simulated/floor/plating, @@ -4273,13 +4273,13 @@ "lS" = ( /obj/structure/closet/wardrobe/orange, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lT" = ( /obj/structure/window/basic{ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "lU" = ( /obj/structure/grille, /turf/simulated/floor/plating, @@ -4328,7 +4328,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "me" = ( /turf/simulated/wall/r_wall, /area/derelict/atmospherics) @@ -4343,7 +4343,7 @@ "mg" = ( /obj/structure/window/reinforced, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mh" = ( /obj/structure/grille, /obj/structure/grille, @@ -4354,11 +4354,11 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mi" = ( /obj/structure/bed, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mj" = ( /turf/simulated/floor/plating/airless{ icon_state = "floorgrime" @@ -4403,7 +4403,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mr" = ( /obj/structure/closet/wardrobe/mixed, /turf/simulated/floor/plasteel, @@ -4411,7 +4411,7 @@ "ms" = ( /obj/item/pickaxe, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mt" = ( /obj/machinery/atmospherics/unary/portables_connector{ dir = 4 @@ -4458,7 +4458,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "my" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -4515,7 +4515,7 @@ dir = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mH" = ( /obj/machinery/light/small{ dir = 1 @@ -4601,7 +4601,7 @@ dir = 5 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mP" = ( /obj/structure/window/reinforced, /turf/simulated/floor/plasteel, @@ -4782,7 +4782,7 @@ icon_state = "right" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "nl" = ( /obj/machinery/door/window{ base_state = "right"; @@ -4864,8 +4864,8 @@ /area/derelict/se_solar) "nv" = ( /obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nw" = ( /obj/structure/grille, @@ -4900,8 +4900,8 @@ icon_state = "0-2"; d2 = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nB" = ( /obj/structure/cable{ @@ -4921,8 +4921,8 @@ icon_state = "1-2"; pixel_y = 0 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nD" = ( /obj/structure/cable{ @@ -4956,8 +4956,8 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nG" = ( /obj/structure/cable{ @@ -4970,8 +4970,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nH" = ( /obj/structure/cable{ @@ -4979,8 +4979,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nI" = ( /obj/structure/cable{ @@ -4999,8 +4999,8 @@ icon_state = "1-2"; pixel_y = 0 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nJ" = ( /obj/structure/cable{ @@ -5013,8 +5013,8 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nK" = ( /obj/structure/cable{ @@ -5032,14 +5032,14 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nL" = ( /obj/item/stack/cable_coil/cut, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "nM" = ( /turf/simulated/floor/plating/airless{ icon_state = "derelict1" @@ -5120,8 +5120,8 @@ /turf/simulated/wall/r_wall, /area/derelict/se_solar) "oa" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "ob" = ( /obj/machinery/door/airlock/external{ @@ -5156,8 +5156,8 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "og" = ( /obj/structure/closet/emcloset, @@ -5173,7 +5173,7 @@ "oi" = ( /obj/structure/girder/reinforced, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "oj" = ( /obj/structure/cable{ d1 = 1; @@ -5185,8 +5185,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "ok" = ( /obj/effect/landmark/damageturf, @@ -5238,7 +5238,7 @@ req_access_txt = "46" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "os" = ( /obj/structure/table, /obj/item/stack/sheet/metal{ @@ -5264,7 +5264,7 @@ opened = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ou" = ( /obj/structure/shuttle/engine/propulsion{ color = "#FFFF00"; @@ -5272,7 +5272,7 @@ icon_state = "propulsion_l" }, /turf/space, -/area/space) +/area/space/nearstation) "ov" = ( /obj/machinery/atmospherics/unary/vent_pump{ on = 1 @@ -5292,7 +5292,7 @@ /turf/simulated/floor/plating/airless{ color = "#FFFF00" }, -/area/space) +/area/space/nearstation) "ox" = ( /turf/simulated/floor/plating/airless, /area/derelict/se_solar) @@ -5314,7 +5314,7 @@ /turf/simulated/floor/plating/airless{ color = "#FFFF00" }, -/area/space) +/area/space/nearstation) "oB" = ( /obj/machinery/light/small{ dir = 4 @@ -5373,10 +5373,10 @@ /area/derelict/teleporter) "pr" = ( /turf/simulated/mineral/random, -/area/space) +/area/space/nearstation) "ps" = ( -/turf/simulated/floor/plating/airless/asteroid, -/area/space) +/turf/simulated/floor/plating/asteroid/airless, +/area/space/nearstation) (1,1,1) = {" aa diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm new file mode 100644 index 00000000000..7d505d64a28 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -0,0 +1,1571 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/obj/structure/weightmachine/stacklifter, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"ac" = ( +/obj/structure/weightmachine/weightlifter, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"ad" = ( +/obj/structure/flora/ausbushes/leafybush, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"ae" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/item/stack/cable_coil, +/obj/item/storage/box/lights/mixed, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"af" = ( +/obj/structure/table, +/obj/item/clothing/mask/gas, +/obj/item/clothing/glasses/sunglasses/big, +/obj/item/clothing/glasses/sunglasses/big, +/obj/item/clothing/glasses/sunglasses/big, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"ag" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"ah" = ( +/obj/effect/mob_spawn/human/bartender/alive, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"ai" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"aj" = ( +/turf/simulated/wall/mineral/sandstone, +/area/ruin/powered/beach) +"ak" = ( +/obj/structure/toilet, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"al" = ( +/obj/structure/urinal{ + pixel_y = 32 + }, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"am" = ( +/obj/structure/urinal{ + pixel_y = 32 + }, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"an" = ( +/obj/item/flashlight/lantern, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"ao" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"ap" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"aq" = ( +/obj/structure/flora/ausbushes/sunnybush, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"ar" = ( +/obj/effect/turf_decal/sand, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"as" = ( +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"at" = ( +/obj/item/tank/oxygen, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"au" = ( +/obj/structure/lattice, +/turf/simulated/floor/pod/light, +/area/ruin/powered/beach) +"av" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Lavatory" + }, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"aw" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Bar Storage" + }, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"ax" = ( +/obj/structure/extinguisher_cabinet, +/turf/simulated/wall/mineral/sandstone, +/area/ruin/powered/beach) +"ay" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Restroom" + }, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"az" = ( +/obj/item/clothing/accessory/necklace/dope, +/obj/item/reagent_containers/spray/spraytan, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"aA" = ( +/obj/item/reagent_containers/spray/spraytan, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"aB" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"aC" = ( +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"aD" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/chem_dispenser/soda, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"aE" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"aF" = ( +/obj/machinery/vending/boozeomat{ + emagged = 1; + req_access_txt = "0" + }, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"aG" = ( +/obj/effect/turf_decal/sand, +/turf/simulated/floor/plasteel, +/area/ruin/powered/beach) +"aH" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/item/reagent_containers/glass/rag, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"aI" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"aJ" = ( +/obj/structure/closet/crate, +/obj/item/tank/emergency_oxygen, +/obj/item/trash/candy, +/obj/item/toy/owl, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/plasteel, +/area/ruin/powered/beach) +"aK" = ( +/obj/effect/turf_decal/sand, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"aL" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/vending/cigarette/beach, +/turf/simulated/floor/plasteel, +/area/ruin/powered/beach) +"aM" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"aN" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/vending/cola/free, +/turf/simulated/floor/plasteel, +/area/ruin/powered/beach) +"aO" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/plasteel, +/area/ruin/powered/beach) +"aP" = ( +/obj/structure/table/wood, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"aQ" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"aR" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/bottle/tequila, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"aS" = ( +/obj/machinery/processor, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"aT" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/vending/snack/free, +/turf/simulated/floor/plasteel, +/area/ruin/powered/beach) +"aU" = ( +/obj/effect/overlay/palmtree_l, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"aV" = ( +/obj/effect/mob_spawn/human/beach/alive, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"aW" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/caution{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/beach) +"aX" = ( +/obj/structure/closet/secure_closet/freezer/meat/open, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"aY" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/caution{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/beach) +"aZ" = ( +/obj/effect/overlay/coconut, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"ba" = ( +/obj/machinery/disco{ + anchored = 1 + }, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/light/colour_cycle, +/area/ruin/powered/beach) +"bb" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/beach) +"bc" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Bar Access" + }, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"bd" = ( +/obj/structure/closet/secure_closet/freezer/kitchen{ + req_access = null + }, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"be" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/caution, +/turf/simulated/floor/plasteel, +/area/ruin/powered/beach) +"bf" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/plasteel, +/area/ruin/powered/beach) +"bg" = ( +/obj/structure/sign/barsign, +/turf/simulated/wall/mineral/sandstone, +/area/ruin/powered/beach) +"bh" = ( +/obj/item/reagent_containers/spray/spraytan, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/plasteel, +/area/ruin/powered/beach) +"bi" = ( +/obj/structure/closet/athletic_mixed, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"bj" = ( +/obj/structure/rack, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/shoes/sandal, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"bk" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"bl" = ( +/obj/effect/turf_decal/sand, +/turf/simulated/floor/pod/light, +/area/ruin/powered/beach) +"bm" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"bn" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"bo" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/pod/light, +/area/ruin/powered/beach) +"bp" = ( +/obj/machinery/light/small{ + light_power = 3; + dir = 8 + }, +/obj/effect/turf_decal/sand, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"bq" = ( +/obj/effect/turf_decal/sand, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"br" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"bx" = ( +/obj/structure/flora/rock, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"bz" = ( +/mob/living/simple_animal/crab, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"bA" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/bikehorn/airhorn, +/obj/structure/table/wood, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/brute, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"bB" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/chair/stool, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"bE" = ( +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"bF" = ( +/obj/item/beach_ball, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"bG" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/item/megaphone, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"bH" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/mob_spawn/human/beach/alive/lifeguard, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"bJ" = ( +/obj/structure/chair, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"bK" = ( +/obj/item/storage/backpack/duffel, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"bL" = ( +/obj/machinery/poolcontroller/invisible, +/turf/simulated/floor/beach/water, +/area/ruin/powered/beach) +"bM" = ( +/turf/simulated/floor/plasteel/stairs/old, +/area/ruin/powered/beach) +"bN" = ( +/obj/structure/flora/ausbushes/reedbush, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"bO" = ( +/obj/item/camera, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"bP" = ( +/obj/item/reagent_containers/food/drinks/cans/beer, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"bQ" = ( +/obj/structure/flora/ausbushes/reedbush, +/turf/simulated/floor/beach/coastline_t, +/area/ruin/powered/beach) +"bR" = ( +/turf/simulated/floor/beach/coastline_t, +/area/ruin/powered/beach) +"bS" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/simulated/floor/beach/coastline_t, +/area/ruin/powered/beach) +"bT" = ( +/turf/simulated/floor/beach/coastline_b, +/area/ruin/powered/beach) +"bU" = ( +/turf/simulated/floor/beach/water, +/area/ruin/powered/beach) +"bV" = ( +/obj/structure/flora/ausbushes/stalkybush, +/turf/simulated/floor/beach/water, +/area/ruin/powered/beach) +"bW" = ( +/turf/simulated/wall/r_wall, +/area/ruin/powered/beach) +"cs" = ( +/obj/effect/overlay/palmtree_l, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"ct" = ( +/obj/machinery/light, +/turf/simulated/floor/beach/water, +/area/ruin/powered/beach) +"cR" = ( +/obj/structure/table/wood, +/obj/item/tank/oxygen, +/obj/item/pickaxe, +/obj/item/clothing/mask/gas, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"gg" = ( +/obj/structure/table, +/obj/item/storage/box/drinkingglasses, +/obj/item/storage/box/drinkingglasses, +/obj/item/storage/box/beakers, +/obj/item/storage/box/donkpockets, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"hY" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/beer, +/turf/simulated/floor/wood, +/area/ruin/powered/beach) +"lF" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/pod{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/powered/beach) +"lM" = ( +/obj/structure/dresser, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"mh" = ( +/obj/effect/spawner/window, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"pI" = ( +/obj/machinery/door/airlock/hatch{ + name = "Lava Beach Club" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"qa" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"qT" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/simulated/floor/pod/light, +/area/ruin/powered/beach) +"zw" = ( +/obj/structure/closet/athletic_mixed, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"Bl" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"Ec" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Beach Access" + }, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"Ei" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/light/small{ + light_power = 3; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ruin/powered/beach) +"Gc" = ( +/turf/simulated/floor/pod/light, +/area/ruin/powered/beach) +"HC" = ( +/obj/structure/rack, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/shoes/sandal, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"QS" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/beach/sand, +/area/ruin/powered/beach) +"TP" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/pod{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/powered/beach) +"VO" = ( +/turf/simulated/floor/pod, +/area/ruin/powered/beach) +"Xp" = ( +/obj/machinery/light/small{ + light_power = 3; + dir = 8 + }, +/turf/simulated/floor/pod, +/area/ruin/powered/beach) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +lF +aa +bW +bW +bW +pI +bW +pI +bW +bW +bW +aa +lF +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +bW +bW +bW +bW +bW +bW +zw +Xp +Gc +bo +Gc +bp +cR +bW +bW +bW +bW +bW +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +bW +bW +bW +ap +Bl +bE +bE +bW +HC +VO +bl +bl +Gc +VO +lM +bW +ad +bQ +bT +bW +bW +bW +aa +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +bW +bW +ap +bE +bE +bE +bE +bE +bW +mh +mh +mh +Ec +mh +mh +mh +bW +ap +bR +bT +bU +ct +bW +bW +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +bW +bW +ad +bE +bE +ab +bE +ac +bE +Bl +bE +bE +bm +aK +bm +bE +bE +Bl +bN +bR +bT +bU +bU +bU +bW +bW +aa +aa +"} +(6,1,1) = {" +aa +aa +bW +aq +bE +bE +bE +bE +aV +bE +bE +bE +bE +bE +bE +bE +bE +bz +bE +bJ +bE +bS +bT +bU +bU +bU +bU +bW +aa +aa +"} +(7,1,1) = {" +aa +bW +bW +bE +ap +az +bE +ab +bE +ac +bE +bE +bE +aU +aZ +bE +bE +bE +bE +bE +bE +bR +bT +bU +bU +bU +ct +bW +bW +aa +"} +(8,1,1) = {" +aa +bW +ad +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bJ +aA +bR +bT +bU +bU +bU +bU +bU +bW +aa +"} +(9,1,1) = {" +aa +bW +bW +bW +bW +aB +aK +aK +aK +aK +aK +aK +aK +aK +bE +bE +bE +ap +bE +bE +bO +bR +bT +bU +bU +bU +bU +bU +bW +aa +"} +(10,1,1) = {" +aa +bW +ae +gg +bW +aG +aG +aG +aG +aG +aG +aG +bh +aK +bE +bE +ap +bx +bE +bJ +bE +bR +bT +bU +bU +bV +bU +bU +bW +aa +"} +(11,1,1) = {" +aa +bW +af +as +aj +aj +aj +aj +aG +aG +aG +aG +aG +aK +bE +bE +bE +bE +bE +bE +bE +bR +bT +bU +bU +bU +bU +bU +bW +aa +"} +(12,1,1) = {" +aa +bW +ag +as +aw +aC +aC +aP +aO +aG +aY +aG +aG +aK +bE +bE +ap +bE +bE +bJ +bE +bR +bT +bU +bU +bU +bU +ct +bW +aa +"} +(13,1,1) = {" +aa +bW +ah +as +aj +aD +aC +aQ +aO +aW +ba +be +aG +aK +bE +bx +bE +bE +bE +bK +bE +bR +bT +bU +bU +bU +bU +bU +bW +aa +"} +(14,1,1) = {" +aa +bW +ai +at +ax +hY +aC +aP +aO +aG +bb +aG +aG +aK +bE +ap +bE +bE +bE +bJ +bE +bR +bT +bU +bU +bU +bU +bU +bW +aa +"} +(15,1,1) = {" +aa +bW +aj +aj +aj +aF +aC +aR +aO +aG +aG +aG +aG +aK +br +bE +bE +bE +aA +bE +bE +bR +bT +bU +bU +bU +bU +bU +bW +aa +"} +(16,1,1) = {" +aa +bW +ak +Ei +aj +aE +aC +aj +aj +bc +aj +bf +aG +aK +bE +bE +bE +bE +bE +bJ +bE +bR +bT +bU +bU +bU +bU +bU +bW +aa +"} +(17,1,1) = {" +aa +bW +aj +av +aj +aH +aC +aC +aC +aC +bg +aG +aG +aK +bE +bE +aU +bE +bE +bE +bE +bR +bT +bU +bV +bU +bU +bU +bW +aa +"} +(18,1,1) = {" +aa +bW +al +as +aj +aI +aM +aS +aX +bd +aj +aG +aG +aK +bE +aZ +bE +bE +bF +bE +bz +bR +bT +bU +bU +bU +bU +ct +bW +aa +"} +(19,1,1) = {" +aa +bW +am +as +aj +aj +aj +aj +aj +aj +aj +bf +aG +aK +bE +bE +bE +bE +QS +bE +bE +bR +bT +bU +bU +bU +bU +bU +bW +aa +"} +(20,1,1) = {" +aa +bW +an +ar +aj +aJ +aL +aN +aT +aG +aG +aG +aG +aK +bE +bE +bE +bA +bG +au +bE +bR +bT +bU +bU +bU +bU +bU +bW +aa +"} +(21,1,1) = {" +aa +bW +ao +ar +ay +aG +aG +aG +aG +aG +aG +aG +aG +aK +bE +bE +bE +bB +bH +bM +bE +bR +bT +bU +bU +bU +bU +bU +bW +aa +"} +(22,1,1) = {" +aa +bW +bW +bW +bW +aB +aK +aK +aK +aK +aK +aK +aK +aK +bE +bE +bE +bE +bE +bE +bP +bR +bT +bU +bU +bU +bV +bU +bW +aa +"} +(23,1,1) = {" +aa +bW +ap +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bJ +bE +bR +bT +bU +bU +bU +bU +bL +bW +aa +"} +(24,1,1) = {" +aa +bW +bW +bE +ap +bE +bE +aU +aA +bE +bE +bz +bE +bE +bE +bE +bE +aZ +bE +bE +bE +bR +bT +bU +bU +bU +ct +bW +bW +aa +"} +(25,1,1) = {" +aa +aa +bW +aq +bE +bE +bE +bE +aZ +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bE +bS +bT +bU +bU +bU +bU +bW +aa +aa +"} +(26,1,1) = {" +aa +aa +bW +bW +ap +bE +bE +aq +aV +bE +bE +QS +bE +bE +bn +aK +bn +bE +bE +cs +bE +bR +bT +bU +bU +bU +bW +bW +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +bW +bW +ad +bE +bE +bE +bE +bE +bW +mh +mh +mh +Ec +mh +mh +mh +bW +ap +bR +bT +bU +ct +bW +bW +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +bW +bW +bW +ap +QS +ap +bE +bW +bi +VO +Gc +bl +bl +bq +lM +bW +bN +bR +bT +bW +bW +bW +aa +aa +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +bW +bW +bW +bW +bW +bW +bj +bk +Gc +qT +bl +qa +cR +bW +bW +bW +bW +bW +aa +aa +aa +aa +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +TP +aa +bW +bW +bW +pI +bW +pI +bW +bW +bW +aa +TP +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm new file mode 100644 index 00000000000..5a947203de8 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm @@ -0,0 +1,1617 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ac" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/mob/living/simple_animal/bot/cleanbot, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"ad" = ( +/obj/structure/flora/ausbushes/brflowers, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"ae" = ( +/turf/simulated/wall/mineral/titanium/nodiagonal, +/area/ruin/powered/animal_hospital) +"af" = ( +/obj/effect/spawner/window, +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"ag" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"ah" = ( +/obj/structure/toilet, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"ai" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"aj" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"ak" = ( +/obj/structure/table/wood, +/obj/item/taperecorder, +/obj/item/pen/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"al" = ( +/obj/structure/table/wood, +/obj/item/toy/carpplushie, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"am" = ( +/obj/machinery/vending/snack, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"an" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"ao" = ( +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"ap" = ( +/obj/structure/table, +/obj/item/circular_saw, +/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" = ( +/obj/structure/table, +/obj/item/surgicaldrill, +/obj/item/bonegel, +/obj/item/bonesetter, +/obj/item/FixOVein, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"ar" = ( +/obj/structure/table, +/obj/item/surgical_drapes, +/obj/item/razor, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"as" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"at" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"au" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"av" = ( +/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/spray/cleaner, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"aw" = ( +/obj/structure/bed/roller, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"ax" = ( +/obj/structure/closet/crate/trashcart, +/obj/item/storage/bag/trash, +/obj/item/trash/cheesie, +/obj/item/reagent_containers/syringe/antiviral, +/obj/item/bodybag, +/obj/item/reagent_containers/food/drinks/bottle/vodka, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"ay" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/structure/mirror{ + pixel_x = -28 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"az" = ( +/obj/structure/noticeboard{ + dir = 1; + pixel_y = -27 + }, +/obj/item/paper/fluff/henderson_report, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"aA" = ( +/obj/structure/closet/secure_closet/medical2, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"aB" = ( +/obj/machinery/computer/operating{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"aC" = ( +/obj/machinery/optable, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"aD" = ( +/obj/structure/table, +/obj/item/retractor, +/obj/item/hemostat, +/obj/item/cautery{ + pixel_x = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"aE" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"aF" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Restroom" + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"aG" = ( +/obj/structure/extinguisher_cabinet, +/turf/simulated/wall/mineral/titanium/nodiagonal, +/area/ruin/powered/animal_hospital) +"aJ" = ( +/turf/simulated/floor/plasteel/grimy{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"aK" = ( +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"aL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"aN" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/iv_bag/blood/random, +/obj/item/reagent_containers/iv_bag/blood/random, +/obj/item/reagent_containers/iv_bag/blood/random, +/obj/item/reagent_containers/iv_bag/blood/random, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"aO" = ( +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"aP" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"aQ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"aR" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"aS" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"aT" = ( +/obj/structure/closet, +/obj/effect/decal/cleanable/cobweb, +/obj/item/ammo_casing/shotgun/dart, +/obj/item/ammo_casing/shotgun/dart, +/obj/item/gun/projectile/revolver/doublebarrel{ + desc = "For putting critters out to pasture." + }, +/obj/item/ammo_casing/shotgun/buckshot, +/obj/item/storage/box/bodybags, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"aU" = ( +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"aV" = ( +/obj/structure/closet/secure_closet/medical1, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"aW" = ( +/obj/machinery/vending/wallmed1{ + pixel_y = 28 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"aX" = ( +/obj/item/stack/cable_coil/random, +/obj/item/stack/sheet/mineral/titanium{ + amount = 30 + }, +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"aY" = ( +/obj/structure/morgue, +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"aZ" = ( +/obj/effect/decal/cleanable/ash, +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"ba" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker, +/obj/item/storage/backpack/duffel/medical, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"bb" = ( +/obj/structure/table/reinforced, +/obj/item/laser_pointer, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"bc" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/regular, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"bd" = ( +/obj/structure/table/glass, +/obj/item/storage/box/gloves, +/obj/item/storage/box/masks{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"be" = ( +/obj/effect/decal/cleanable/blood/oil, +/obj/item/storage/toolbox/mechanical, +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"bf" = ( +/obj/structure/table, +/obj/item/storage/fancy/cigarettes/dromedaryco, +/obj/item/storage/box/matches, +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"bg" = ( +/mob/living/simple_animal/cockroach, +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"bh" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/brute, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"bi" = ( +/obj/item/toy/cattoy, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"bj" = ( +/obj/structure/table/glass, +/obj/item/lazarus_injector, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"bk" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/item/flashlight/flare/glowstick, +/obj/item/flashlight/flare/glowstick, +/obj/item/flashlight/flare/glowstick, +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"bl" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/cookie{ + name = "doggie biscuit" + }, +/obj/item/reagent_containers/food/snacks/cookie{ + name = "doggie biscuit" + }, +/obj/item/reagent_containers/food/snacks/cookie{ + name = "doggie biscuit" + }, +/obj/item/reagent_containers/food/snacks/cookie{ + name = "doggie biscuit" + }, +/obj/item/reagent_containers/food/snacks/cookie{ + name = "doggie biscuit" + }, +/obj/item/reagent_containers/food/snacks/cookie{ + name = "doggie biscuit" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/vending/crittercare/free, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bn" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"bo" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"bp" = ( +/obj/structure/closet/crate, +/obj/item/trash/pistachios, +/obj/item/lipstick/random, +/obj/item/seeds/apple, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bq" = ( +/obj/structure/filingcabinet/chestdrawer, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"br" = ( +/obj/structure/chair/office, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bs" = ( +/obj/structure/table/reinforced, +/obj/item/phone, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bt" = ( +/obj/item/twohanded/required/kirbyplants, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bu" = ( +/obj/structure/chair/comfy/teal{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bv" = ( +/obj/effect/mob_spawn/human/doctor/alive/lavaland{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"bx" = ( +/obj/machinery/door/airlock/medical{ + name = "Rejuvenation Pods" + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"by" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bz" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/regular, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bA" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen/multi, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bB" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/hug, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bD" = ( +/mob/living/simple_animal/bot/medbot{ + desc = "A little medical robot. It's programmed to only act in emergencies."; + heal_threshold = 40; + name = "emergency Medibot" + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"bE" = ( +/obj/structure/closet/crate/critter, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bG" = ( +/obj/structure/chair/comfy/teal{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bH" = ( +/obj/structure/table, +/obj/item/tank/oxygen, +/obj/item/tank/oxygen, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/tank/oxygen, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bI" = ( +/obj/structure/sign/medbay/alt{ + name = "animal hospital" + }, +/turf/simulated/wall/mineral/titanium/nodiagonal, +/area/ruin/powered/animal_hospital) +"bJ" = ( +/obj/machinery/door/airlock/multi_tile/glass{ + name = "Ian's Pet Care" + }, +/obj/structure/fans/tiny/invisible, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bL" = ( +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"bM" = ( +/obj/structure/flora/ausbushes/sunnybush, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"bO" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"bP" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/fire, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"bQ" = ( +/obj/machinery/light/small, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"bR" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/melee/baton/cattleprod{ + desc = "On-the-fly rabies treatment."; + name = "cattle prod" + }, +/obj/item/stock_parts/cell/high, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bS" = ( +/obj/structure/closet, +/obj/item/defibrillator/loaded, +/obj/item/storage/belt/medical, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bT" = ( +/obj/item/pickaxe, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bU" = ( +/obj/effect/decal/remains/human, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bV" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bW" = ( +/obj/structure/fans/tiny/invisible, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"bX" = ( +/obj/machinery/atmospherics/pipe/simple/visible{ + dir = 6 + }, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"bY" = ( +/obj/machinery/atmospherics/pipe/manifold/visible{ + dir = 1 + }, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"bZ" = ( +/obj/machinery/atmospherics/pipe/simple/visible{ + dir = 10 + }, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"ca" = ( +/obj/machinery/atmospherics/unary/tank/air{ + dir = 1 + }, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"cb" = ( +/obj/machinery/atmospherics/binary/valve, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"cc" = ( +/obj/machinery/atmospherics/pipe/simple/visible, +/turf/simulated/wall/mineral/titanium/nodiagonal, +/area/ruin/powered/animal_hospital) +"cd" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/suit/apron/surgical, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"ce" = ( +/obj/machinery/atmospherics/unary/portables_connector{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/pump, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"cf" = ( +/obj/structure/closet/l3closet, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"cg" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Break Room" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"ch" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Operating Theatre" + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"ci" = ( +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock/shuttle{ + desc = "There's a smudged note wedged into it that says something about pizza dropoffs."; + name = "Staff Entrance" + }, +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"cj" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Morgue" + }, +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"ck" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Medical Supplies" + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"cl" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Safety Supplies" + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"cm" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Storage" + }, +/turf/simulated/floor/plating, +/area/ruin/powered/animal_hospital) +"cn" = ( +/obj/machinery/light, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"cp" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cq" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"cr" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"cs" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"cv" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"cw" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"cx" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"cy" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"cz" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered/animal_hospital) +"cC" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"cD" = ( +/obj/structure/flora/ausbushes/sunnybush, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/grass{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"cE" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cG" = ( +/obj/machinery/door/airlock/shuttle{ + desc = "There's a smudged note wedged into it that says something about pizza dropoffs."; + name = "Staff Entrance" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"cI" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/toxin, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"cJ" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/powered/animal_hospital) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +ab +ab +aJ +ab +ab +cx +ab +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +bU +bV +ab +ab +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +ab +cp +ax +bL +aJ +bL +ae +ae +ae +ae +ae +aa +aa +aa +aa +ab +ab +ab +bT +ab +ab +ab +ab +"} +(5,1,1) = {" +aa +aa +aa +aa +ae +ae +ae +ae +ae +ci +ae +ae +aT +aY +bf +ae +ae +ae +ae +ae +ae +bL +ab +ab +ab +ab +ab +ab +"} +(6,1,1) = {" +aa +aa +aa +ab +ae +ag +cq +ay +ae +aK +aK +cj +aU +aZ +bg +cj +aK +bp +by +bF +ae +cC +bL +ab +ab +ab +ab +ab +"} +(7,1,1) = {" +aa +ab +ab +ab +ae +ah +ag +ag +aF +aK +aK +ae +ae +ae +ae +ae +cz +bq +bz +aP +af +ad +bL +bL +ab +ab +bL +bL +"} +(8,1,1) = {" +aa +ab +ab +cn +ae +ae +ae +ae +aG +aL +cw +ae +aV +ba +cI +aG +aL +br +bA +aP +af +bL +bL +bL +bL +ab +ab +ab +"} +(9,1,1) = {" +ab +ab +bL +bL +ae +ai +cr +as +cg +aK +aP +ae +aW +ao +bi +ae +aL +bs +bB +aP +bI +bM +bL +ab +ab +ab +ab +ab +"} +(10,1,1) = {" +ab +ab +ab +bL +af +aj +at +as +ae +aL +aK +ck +ao +bb +ao +ck +aK +aK +aK +aK +bJ +aJ +aJ +aJ +ab +ab +ab +ab +"} +(11,1,1) = {" +ab +bL +bL +bL +af +ak +as +az +ae +cv +aP +ae +ae +ae +ae +ae +bl +bt +aE +aK +bW +aJ +aJ +ab +ab +bL +ab +ab +"} +(12,1,1) = {" +ab +bL +bL +ad +af +al +au +as +ae +aL +aK +cl +ao +bc +ao +cl +aK +aK +aK +aP +ae +cD +bL +bL +ab +ab +ab +ab +"} +(13,1,1) = {" +ab +ab +bL +bL +ae +am +cs +as +cG +aK +ac +ae +aW +ao +ao +ae +bm +bu +bu +bG +ae +bL +bO +bL +ab +ab +ab +ab +"} +(14,1,1) = {" +ab +bL +bX +ca +ae +ae +ae +ae +aG +aL +aP +ae +cf +bd +bj +ae +ae +ae +ae +ae +ae +ae +ae +ae +ab +ab +aa +aa +"} +(15,1,1) = {" +ab +ab +bY +ca +ae +cd +an +aA +ae +cv +aP +ae +ae +ae +ae +ae +bh +bv +bv +cJ +bn +bv +bP +ae +cE +ab +aa +aa +"} +(16,1,1) = {" +aa +ab +bZ +cb +cc +ce +ao +ao +ch +aK +aK +cm +aX +be +bk +ae +bo +ao +bD +ao +ao +ao +bQ +ae +ab +aa +aa +aa +"} +(17,1,1) = {" +aa +ab +ab +cn +ae +ap +ao +aB +ae +aL +aP +ae +ae +ae +ae +ae +af +bx +af +ae +af +bx +af +ae +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +ab +bL +ae +aq +ao +aC +ae +aN +aQ +aS +aS +aS +aS +aS +av +aK +bE +bH +aS +aK +bR +ae +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +ab +ab +ae +ar +aw +aD +ae +aO +aR +aR +cy +aR +aR +aR +cy +aR +aR +aR +cy +aR +bS +ae +aa +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +aa +aa +aa +aa +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm new file mode 100644 index 00000000000..8bf85306742 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -0,0 +1,1840 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"ac" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"ad" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"ae" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"af" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"ag" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"ah" = ( +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"ai" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"aj" = ( +/obj/structure/stone_tile/slab, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"ak" = ( +/turf/simulated/wall/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"al" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"am" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/wall/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"aq" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"ar" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"as" = ( +/turf/simulated/wall/mineral/wood, +/area/ruin/unpowered/ash_walkers) +"at" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"au" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/item/flashlight/lantern, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"av" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"aw" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"ax" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"ay" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/item/flashlight/lantern, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"az" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"aA" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/item/malf_upgrade, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"aB" = ( +/obj/structure/stone_tile/block/cracked, +/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" = ( +/obj/structure/stone_tile/block/cracked, +/obj/item/storage/toolbox/syndicate, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"aE" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/closet/crate/medical, +/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" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"aG" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"aH" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/lava/smooth, +/area/ruin/unpowered/ash_walkers) +"aI" = ( +/obj/structure/stone_tile/block/cracked, +/turf/simulated/floor/plating/lava/smooth, +/area/ruin/unpowered/ash_walkers) +"aJ" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/lava/smooth, +/area/ruin/unpowered/ash_walkers) +"aK" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"aM" = ( +/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" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/item/weldingtool/experimental, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"aO" = ( +/obj/structure/stone_tile/surrounding/cracked{ + icon_state = "cracked_surrounding1"; + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"aP" = ( +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"aQ" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/machinery/iv_drip, +/obj/item/reagent_containers/glass/beaker/waterbottle/large, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"aR" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"aS" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"aT" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/lava/smooth, +/area/ruin/unpowered/ash_walkers) +"aU" = ( +/obj/structure/lavaland/ash_walker, +/turf/simulated/floor/plating/lava/smooth, +/area/ruin/unpowered/ash_walkers) +"aV" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/plating/lava/smooth, +/area/ruin/unpowered/ash_walkers) +"aW" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"aY" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"aZ" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"ba" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"bc" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"bd" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/lava/smooth, +/area/ruin/unpowered/ash_walkers) +"be" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/floor/plating/lava/smooth, +/area/ruin/unpowered/ash_walkers) +"bf" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/lava/smooth, +/area/ruin/unpowered/ash_walkers) +"bg" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"bh" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"bi" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"bj" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/item/storage/bag/plants/portaseeder, +/turf/simulated/floor/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"bk" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/item/stack/marker_beacon/ten, +/turf/simulated/floor/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"bl" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"bm" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/item/rcd/preloaded, +/turf/simulated/floor/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"bn" = ( +/obj/structure/closet/crate/radiation, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/flashlight/flare, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"bo" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/item/pickaxe, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bp" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/item/flashlight/lantern, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"bq" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"br" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"bs" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"bt" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/item/flashlight/lantern, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"bv" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/closet/crate, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"bw" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/item/stack/sheet/wood, +/obj/item/stack/sheet/wood, +/obj/item/stack/sheet/wood, +/obj/item/stack/sheet/wood, +/obj/item/seeds/tower, +/turf/simulated/floor/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"bx" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"by" = ( +/obj/structure/closet/crate, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/turf/simulated/floor/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"bz" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/machinery/the_singularitygen, +/turf/simulated/floor/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"bA" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bB" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"bC" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"bD" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"bE" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bF" = ( +/obj/structure/stone_tile/slab, +/obj/effect/decal/cleanable/blood, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bG" = ( +/turf/simulated/wall/indestructible/boss/see_through, +/area/ruin/unpowered/ash_walkers) +"bH" = ( +/obj/structure/necropolis_gate, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/fans/tiny/invisible, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/indestructible/boss/air, +/area/ruin/unpowered/ash_walkers) +"bI" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"bJ" = ( +/obj/structure/stone_tile/surrounding_tile, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"bL" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bM" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bN" = ( +/obj/structure/stone_tile, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bO" = ( +/obj/structure/stone_tile/cracked, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bP" = ( +/obj/structure/stone_tile/block, +/obj/item/twohanded/spear, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bQ" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bR" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bS" = ( +/obj/structure/stone_tile/slab, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bT" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/obj/effect/decal/cleanable/blood, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bU" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bV" = ( +/obj/structure/stone_tile/block/cracked, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bW" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/ore_box, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bX" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bY" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bZ" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cb" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cd" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ce" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cf" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/closet/crate/internals, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cg" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ch" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ci" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cj" = ( +/obj/effect/mob_spawn/human/corpse/damaged, +/obj/effect/decal/cleanable/blood, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ck" = ( +/obj/item/twohanded/spear, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cl" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/item/twohanded/spear, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cm" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cn" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"co" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cp" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"cq" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cr" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cs" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ct" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cu" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cv" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cy" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/obj/effect/decal/cleanable/blood, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cz" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/item/twohanded/spear, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cA" = ( +/obj/structure/stone_tile/slab/cracked{ + icon_state = "cracked_slab1"; + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cB" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cD" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/item/flashlight/lantern, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cE" = ( +/obj/structure/stone_tile/surrounding/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cF" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/twohanded/spear, +/obj/item/storage/belt, +/turf/simulated/floor/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"cI" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cJ" = ( +/obj/item/shovel, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cK" = ( +/obj/machinery/hydroponics/soil, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cL" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/twohanded/spear, +/obj/item/scythe, +/turf/simulated/floor/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"cM" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/twohanded/spear, +/turf/simulated/floor/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"cN" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/twohanded/spear, +/obj/item/clothing/head/helmet/roman/legionaire, +/turf/simulated/floor/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"cO" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"cP" = ( +/obj/structure/stone_tile/block, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"cQ" = ( +/obj/structure/stone_tile/block/cracked, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"cR" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"cT" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"cV" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"cW" = ( +/obj/machinery/optable, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cX" = ( +/obj/item/storage/box/rxglasses, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cY" = ( +/obj/item/seeds/glowshroom, +/obj/item/seeds/glowshroom, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cZ" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dd" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"de" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"df" = ( +/obj/effect/decal/cleanable/blood, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dg" = ( +/obj/structure/bonfire/dense, +/obj/structure/stone_tile/center, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"di" = ( +/obj/effect/decal/cleanable/blood, +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dj" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dk" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/block, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dl" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dn" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"do" = ( +/obj/structure/sink/puddle, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dp" = ( +/obj/item/pickaxe, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dq" = ( +/obj/item/stack/sheet/wood, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dr" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ds" = ( +/obj/structure/stone_tile/block, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dt" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"du" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"dv" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/effect/mob_spawn/human/corpse/damaged, +/obj/effect/decal/cleanable/blood, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dw" = ( +/obj/item/reagent_containers/glass/bucket, +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dx" = ( +/obj/item/flashlight/lantern, +/obj/structure/stone_tile/center, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dy" = ( +/obj/machinery/hydroponics/soil, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dz" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"dA" = ( +/obj/machinery/hydroponics/soil, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/center, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dB" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/center/cracked, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"dC" = ( +/obj/structure/stone_tile, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"dD" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"dE" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +aa +aa +aa +aa +ah +ah +ah +ah +ah +ah +ah +aa +aa +ah +ah +ah +ah +aa +aa +aa +"} +(2,1,1) = {" +aa +ah +ab +aF +cV +ah +ah +bi +ah +bi +cO +ah +ah +ah +ah +ah +ah +ah +aa +aa +"} +(3,1,1) = {" +aa +aa +ah +as +as +as +as +ak +as +as +cP +ah +ah +bN +bY +dp +ah +ah +ah +aa +"} +(4,1,1) = {" +aa +aa +ah +ak +aA +aM +cY +bj +bv +ak +cP +bN +cg +cl +cq +cq +dv +ah +ah +aa +"} +(5,1,1) = {" +aa +aa +ac +as +aB +aN +aY +bk +bw +ak +cb +bZ +ch +cm +cr +bY +bL +cb +ah +ah +"} +(6,1,1) = {" +aa +aa +cT +ak +aC +cX +aO +bl +bx +bD +bS +de +bV +dg +cs +cy +bY +cq +ah +ah +"} +(7,1,1) = {" +aa +aa +ae +as +cW +aP +aZ +bm +by +ak +bV +cb +ci +bA +ct +bN +bL +cI +ah +ah +"} +(8,1,1) = {" +aa +aa +ae +as +aE +aQ +ba +bn +bz +ak +cb +df +bX +co +bO +dq +bZ +cJ +ah +ah +"} +(9,1,1) = {" +aa +ah +ah +as +ak +as +as +as +ak +ak +cg +cb +cg +cn +bL +dr +dw +dA +dD +ah +"} +(10,1,1) = {" +aa +ai +aq +at +aF +aR +aR +bo +bA +cZ +dd +cg +cb +di +dn +ds +dx +cK +dE +ah +"} +(11,1,1) = {" +ab +aj +ak +ak +ak +ak +ak +ak +am +bF +bE +cb +bL +co +cb +dt +dy +dB +dC +aa +"} +(12,1,1) = {" +ac +ak +ak +ak +ak +ak +ak +ak +ak +ak +bP +bL +bX +co +do +du +dz +dC +ah +aa +"} +(13,1,1) = {" +ad +ak +ak +au +aG +aS +bc +bp +ak +ak +bQ +bM +cj +dj +ah +ah +ah +ah +ah +ah +"} +(14,1,1) = {" +ae +ak +ak +av +aH +aT +bd +bq +ak +bG +bR +cd +cg +dk +cu +ah +bi +bi +bi +cO +"} +(15,1,1) = {" +ac +ak +ak +aw +aI +aU +be +br +bB +bH +bS +ce +dn +dl +ak +ak +as +ak +ak +ah +"} +(16,1,1) = {" +ac +ak +ak +ax +aJ +aV +bf +bs +ak +bG +bT +cd +bX +dj +as +cz +cD +cL +as +ah +"} +(17,1,1) = {" +af +ak +ak +ay +aK +aW +bg +bt +ak +ak +bU +cg +ck +bS +cv +cA +cE +cM +as +ah +"} +(18,1,1) = {" +ac +ak +ak +ak +ak +ak +ak +ak +ak +ak +bV +bX +bN +ah +as +cB +cF +cN +ak +cP +"} +(19,1,1) = {" +ag +aj +ak +ak +ak +ak +ak +ak +ak +bI +bW +cf +ah +cp +as +as +as +ak +ak +cQ +"} +(20,1,1) = {" +aa +al +ar +az +az +az +bh +az +bC +bJ +ah +ah +ah +al +ah +ah +bC +ah +ah +cR +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm new file mode 100644 index 00000000000..5629bb19b49 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm @@ -0,0 +1,362 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/simulated/mineral/random/volcanic, +/area/lavaland/surface/outdoors) +"c" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"d" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"e" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"f" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"g" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"h" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"i" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"j" = ( +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"k" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"l" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"m" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"n" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"o" = ( +/obj/structure/stone_tile/block, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"p" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"q" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"r" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"s" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"t" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 6 + }, +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner{ + dir = 1 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"u" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/block/cracked, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"v" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"w" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"x" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"y" = ( +/obj/structure/stone_tile/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +a +a +a +b +b +b +b +b +b +a +a +a +a +a +"} +(2,1,1) = {" +a +a +b +b +c +c +b +b +b +b +b +b +a +a +"} +(3,1,1) = {" +b +b +b +c +d +c +c +b +b +b +b +b +b +a +"} +(4,1,1) = {" +b +b +c +c +k +o +c +c +c +c +b +b +b +b +"} +(5,1,1) = {" +b +c +d +g +c +p +c +v +c +c +c +c +b +b +"} +(6,1,1) = {" +b +c +c +h +l +e +s +j +c +d +e +c +c +b +"} +(7,1,1) = {" +b +c +c +c +c +q +t +w +x +y +p +e +c +b +"} +(8,1,1) = {" +b +c +e +i +m +j +u +e +c +f +d +y +c +b +"} +(9,1,1) = {" +b +c +f +j +c +r +c +o +c +c +c +c +b +b +"} +(10,1,1) = {" +b +b +c +c +c +o +c +c +b +b +c +b +b +b +"} +(11,1,1) = {" +b +b +b +c +n +c +c +b +b +b +b +b +b +a +"} +(12,1,1) = {" +a +b +b +c +c +c +b +b +b +b +b +a +a +a +"} +(13,1,1) = {" +a +a +b +b +b +b +b +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm new file mode 100644 index 00000000000..3d224a617d6 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm @@ -0,0 +1,364 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/simulated/mineral/random/volcanic, +/area/lavaland/surface/outdoors) +"c" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"d" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"e" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"f" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"g" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"h" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"i" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"j" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"k" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"l" = ( +/obj/structure/stone_tile/surrounding_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"m" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"n" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"o" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"p" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"q" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"r" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"s" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"t" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/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, +/area/lavaland/surface/outdoors) +"w" = ( +/obj/structure/stone_tile/block, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"x" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"y" = ( +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"z" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"A" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"B" = ( +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/guidance{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +a +a +b +b +b +b +a +b +b +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +a +a +a +a +"} +(3,1,1) = {" +b +b +c +h +k +f +f +f +k +f +b +b +a +a +a +"} +(4,1,1) = {" +b +b +d +c +l +f +f +f +v +f +b +b +b +a +a +"} +(5,1,1) = {" +b +b +e +i +m +k +f +t +w +f +f +b +b +b +a +"} +(6,1,1) = {" +a +b +f +f +f +o +r +q +w +f +f +f +f +b +b +"} +(7,1,1) = {" +b +b +b +f +f +p +B +s +f +f +q +n +A +f +b +"} +(8,1,1) = {" +b +b +g +f +c +q +s +q +k +x +f +z +d +f +b +"} +(9,1,1) = {" +a +b +f +j +n +j +f +e +n +y +f +n +y +b +b +"} +(10,1,1) = {" +a +b +b +f +f +f +f +f +f +b +b +f +f +b +b +"} +(11,1,1) = {" +a +a +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(12,1,1) = {" +a +a +a +b +b +b +b +b +b +a +a +b +b +a +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm new file mode 100644 index 00000000000..0f6c96fb041 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm @@ -0,0 +1,365 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/simulated/mineral/random/volcanic, +/area/lavaland/surface/outdoors) +"c" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"d" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"e" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"f" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"g" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"h" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"i" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"k" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"l" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"m" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"n" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"o" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"p" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"q" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"r" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"s" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"t" = ( +/obj/structure/stone_tile/block/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"u" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"v" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/center, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"w" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/hunter, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +b +b +b +b +b +a +a +a +"} +(2,1,1) = {" +a +b +b +b +a +a +b +b +b +c +c +b +b +b +a +a +"} +(3,1,1) = {" +b +b +b +b +b +b +b +b +c +g +n +c +c +b +b +a +"} +(4,1,1) = {" +b +c +c +b +b +b +c +c +g +l +h +q +c +c +b +b +"} +(5,1,1) = {" +b +c +c +c +c +c +c +g +i +c +c +h +s +c +c +b +"} +(6,1,1) = {" +b +d +e +e +d +f +d +f +e +d +w +f +t +v +c +b +"} +(7,1,1) = {" +b +c +c +c +c +c +c +h +k +c +c +o +u +c +b +b +"} +(8,1,1) = {" +b +b +b +c +c +c +c +c +h +m +o +r +c +b +b +b +"} +(9,1,1) = {" +a +b +b +b +b +c +c +c +c +h +p +c +c +b +b +a +"} +(10,1,1) = {" +a +a +a +b +b +b +b +b +c +c +c +c +b +b +a +a +"} +(11,1,1) = {" +a +a +a +a +a +b +b +b +b +b +b +b +b +b +a +a +"} 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_golem_ship.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm new file mode 100644 index 00000000000..8fdc459c863 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm @@ -0,0 +1,770 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/turf/simulated/wall/mineral/titanium, +/area/shuttle/freegolem) +"ac" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/shuttle, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"ad" = ( +/obj/structure/closet/crate/golemgear, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"ae" = ( +/obj/item/storage/toolbox/mechanical, +/obj/item/reagent_containers/spray/cleaner, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"af" = ( +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"ag" = ( +/obj/structure/reagent_dispensers/watertank/high, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"ah" = ( +/obj/structure/shuttle/engine/heater{ + icon_state = "heater"; + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"ai" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4; + icon_state = "burst_l" + }, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"aj" = ( +/obj/machinery/light/small, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"ak" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"al" = ( +/obj/structure/table/wood, +/obj/item/disk/design_disk/golem_shell, +/obj/item/areaeditor/golem, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"am" = ( +/obj/machinery/vending/hydronutrients, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"an" = ( +/obj/machinery/vending/hydroseeds, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"ao" = ( +/obj/machinery/light{ + dir = 1; + on = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"ap" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aq" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swallc2"; + dir = 2 + }, +/area/shuttle/freegolem) +"ar" = ( +/obj/effect/mob_spawn/human/golem/adamantine, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"as" = ( +/obj/machinery/vending/coffee/free, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"at" = ( +/obj/machinery/mineral/equipment_vendor/golem, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"au" = ( +/obj/machinery/door/airlock/shuttle, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"av" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/freegolem) +"aw" = ( +/obj/machinery/door/airlock/shuttle, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"ax" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"ay" = ( +/obj/machinery/mineral/ore_redemption/golem, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"az" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swallc1"; + dir = 2 + }, +/area/shuttle/freegolem) +"aA" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/powered/golem_ship) +"aB" = ( +/obj/structure/window/full/shuttle{ + icon_state = "16" + }, +/obj/structure/grille, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"aC" = ( +/obj/structure/statue/gold/rd{ + name = "statue of the Liberator" + }, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aD" = ( +/obj/structure/computerframe, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aE" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/freegolem) +"aF" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aG" = ( +/obj/machinery/door/airlock/shuttle, +/obj/structure/fans/tiny, +/obj/docking_port/stationary{ + area_type = /area/ruin/powered/golem_ship; + dir = 8; + dwidth = 8; + height = 20; + id = "freegolem_lavaland"; + name = "Lavaland Surface"; + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface; + width = 16 + }, +/obj/docking_port/mobile{ + dir = 8; + dwidth = 8; + height = 20; + id = "freegolem"; + name = "Free Golem Ship"; + width = 16 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aH" = ( +/obj/structure/window/full/shuttle{ + icon_state = "15" + }, +/obj/structure/grille, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"aI" = ( +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/structure/table/wood, +/obj/item/bedsheet/rd/royal_cape{ + layer = 3; + pixel_x = 5; + pixel_y = 9 + }, +/obj/item/book/manual/research_and_development{ + name = "Sacred Text of the Liberator"; + pixel_x = -4; + pixel_y = 3 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aJ" = ( +/obj/machinery/light, +/obj/structure/chair/comfy/purp{ + icon_state = "comfychair"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aK" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall13"; + icon_state = "swall13"; + dir = 2 + }, +/area/shuttle/freegolem) +"aL" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/shuttle, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aM" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall11"; + icon_state = "swall11"; + dir = 2 + }, +/area/shuttle/freegolem) +"aN" = ( +/obj/item/resonator/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aO" = ( +/obj/machinery/autolathe, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aP" = ( +/obj/machinery/computer/shuttle/golem_ship/recall, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/powered/golem_ship) +"aQ" = ( +/obj/structure/table/wood, +/obj/machinery/reagentgrinder, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aR" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swallc4" + }, +/area/shuttle/freegolem) +"aS" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall4"; + dir = 2 + }, +/area/shuttle/freegolem) +"aT" = ( +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aU" = ( +/obj/structure/table/wood, +/obj/item/resonator, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aV" = ( +/obj/machinery/vending/snack/free, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aW" = ( +/obj/structure/table/wood, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/brute, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aX" = ( +/obj/structure/table/wood, +/obj/item/storage/firstaid/fire, +/obj/item/storage/firstaid/fire, +/obj/item/storage/firstaid/fire, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aY" = ( +/obj/structure/table/wood, +/obj/item/storage/firstaid/adv, +/obj/item/storage/firstaid/adv, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"ba" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"bb" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"bc" = ( +/obj/structure/ore_box, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"be" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"bf" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swallc3"; + dir = 2 + }, +/area/shuttle/freegolem) +"bh" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall14"; + icon_state = "swall14"; + dir = 2 + }, +/area/shuttle/freegolem) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aq +aB +aH +bf +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +av +aC +aI +av +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aq +aE +au +aR +aD +aJ +ab +au +aE +bf +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +av +am +ap +ax +ap +ap +ax +ap +as +av +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +av +an +ap +ap +ap +ap +ap +ap +aV +av +aa +aa +aa +"} +(6,1,1) = {" +aq +aE +aE +aK +ao +ap +ap +ap +ap +ap +ap +aT +bh +aE +aE +bf +"} +(7,1,1) = {" +av +ad +af +aw +ap +ap +ap +ap +ap +ap +ap +ap +aw +af +bc +av +"} +(8,1,1) = {" +av +ad +af +aw +ap +ap +ap +ap +ap +ap +ap +ap +aw +af +bc +av +"} +(9,1,1) = {" +av +ad +aj +av +ao +ap +ap +ap +ap +ap +ap +aT +av +ba +bc +av +"} +(10,1,1) = {" +av +ad +af +av +ap +ap +ar +aU +aU +ar +ap +ap +av +af +bc +av +"} +(11,1,1) = {" +av +ad +af +av +ap +ap +ar +aU +aU +ar +ap +ap +av +af +bc +av +"} +(12,1,1) = {" +av +ad +aj +av +ao +ap +ap +ap +ap +ap +ap +aT +av +ba +bc +av +"} +(13,1,1) = {" +av +ad +af +aw +ap +ap +ap +ap +ap +ap +ap +ap +aw +af +bc +av +"} +(14,1,1) = {" +av +ad +af +aw +ap +ap +ap +ap +ap +ap +ap +ap +aw +af +bc +av +"} +(15,1,1) = {" +av +ae +af +av +ap +ap +ap +ap +ap +ap +ap +aW +av +af +ae +av +"} +(16,1,1) = {" +ac +af +aj +av +ao +ap +ap +ap +ap +ap +ap +aX +av +ba +af +ac +"} +(17,1,1) = {" +ac +af +af +av +ap +ap +ap +ap +ap +aN +ap +aY +av +af +af +ac +"} +(18,1,1) = {" +av +ag +ak +av +at +ap +ay +ap +ap +aO +aQ +al +av +bb +bb +av +"} +(19,1,1) = {" +av +ah +ah +av +ah +ah +aS +aF +be +aS +ah +ah +av +ah +ah +av +"} +(20,1,1) = {" +az +ai +ai +aM +ai +ai +aM +aG +aL +aM +ai +ai +aM +ai +ai +aR +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aA +aA +aA +aP +aa +aa +aa +aa +aa +aa +"} 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 new file mode 100644 index 00000000000..b6785a746f3 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm @@ -0,0 +1,474 @@ +//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/mineral/volcanic/lava_land_surface, +/area/ruin/powered) +"c" = ( +/turf/simulated/wall/mineral/iron, +/area/ruin/powered) +"d" = ( +/obj/item/clothing/head/helmet/space/syndicate/orange, +/obj/item/clothing/mask/breath, +/turf/simulated/floor/plating/asteroid/basalt, +/area/ruin/powered) +"e" = ( +/obj/item/clothing/suit/space/syndicate/orange, +/turf/simulated/floor/plating/asteroid/basalt, +/area/ruin/powered) +"f" = ( +/turf/simulated/floor/plating/asteroid/basalt, +/area/ruin/powered) +"g" = ( +/turf/simulated/floor/plating/asteroid{ + name = "dirt" + }, +/area/ruin/powered) +"h" = ( +/obj/item/shovel, +/turf/simulated/floor/plating/asteroid{ + name = "dirt" + }, +/area/ruin/powered) +"i" = ( +/obj/item/reagent_containers/glass/bucket, +/turf/simulated/floor/plating/asteroid{ + name = "dirt" + }, +/area/ruin/powered) +"j" = ( +/obj/structure/sink/puddle, +/turf/simulated/floor/plating/asteroid{ + name = "dirt" + }, +/area/ruin/powered) +"k" = ( +/obj/structure/glowshroom/single, +/turf/simulated/floor/plating/asteroid{ + name = "dirt" + }, +/area/ruin/powered) +"l" = ( +/obj/item/storage/toolbox/emergency, +/turf/simulated/floor/plating/asteroid{ + name = "dirt" + }, +/area/ruin/powered) +"m" = ( +/obj/structure/rack, +/obj/item/seeds/reishi, +/obj/item/seeds/plump, +/obj/item/seeds/plump, +/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom, +/turf/simulated/floor/plating/asteroid/basalt, +/area/ruin/powered) +"n" = ( +/obj/machinery/hydroponics/soil, +/turf/simulated/floor/plating, +/area/ruin/powered) +"o" = ( +/turf/simulated/floor/plating, +/area/ruin/powered) +"p" = ( +/obj/structure/rack, +/obj/item/storage/bag/plants/portaseeder, +/obj/item/storage/bag/ore, +/obj/item/storage/firstaid/regular, +/turf/simulated/floor/plating/asteroid/basalt, +/area/ruin/powered) +"q" = ( +/obj/structure/glowshroom/single, +/turf/simulated/floor/plating, +/area/ruin/powered) +"r" = ( +/obj/structure/rack, +/obj/item/pickaxe/emergency, +/obj/item/tank/oxygen, +/turf/simulated/floor/plating/asteroid/basalt, +/area/ruin/powered) +"s" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"t" = ( +/turf/simulated/wall/mineral/titanium/survival/pod, +/area/ruin/powered) +"u" = ( +/obj/structure/bed/pod, +/obj/item/bedsheet/black, +/turf/simulated/floor/plating, +/area/ruin/powered) +"v" = ( +/obj/structure/fans, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"w" = ( +/obj/machinery/smartfridge/survival_pod, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"x" = ( +/obj/effect/mob_spawn/human/hermit, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"y" = ( +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"z" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/tubes, +/turf/simulated/floor/plating, +/area/ruin/powered) +"A" = ( +/obj/structure/table, +/obj/item/kitchen/knife/combat/survival, +/turf/simulated/floor/plating, +/area/ruin/powered) +"B" = ( +/obj/structure/table/survival_pod, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"C" = ( +/obj/structure/tubes, +/obj/item/crowbar, +/obj/effect/decal/cleanable/blood/drip, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"D" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/machinery/door/airlock/survival_pod/glass, +/obj/structure/fans/tiny, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"E" = ( +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 + }, +/turf/simulated/wall/mineral/titanium/interior, +/area/ruin/powered) +"F" = ( +/turf/simulated/wall/mineral/titanium, +/area/ruin/powered) +"G" = ( +/turf/simulated/wall/mineral/titanium/interior, +/area/ruin/powered) +"H" = ( +/obj/machinery/door/airlock/titanium{ + name = "Escape Pod Airlock" + }, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/powered) +"I" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/powered) +"J" = ( +/obj/effect/spawner/window/shuttle, +/turf/simulated/floor/plating{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/powered) +"K" = ( +/obj/effect/baseturf_helper, +/turf/simulated/floor/plating, +/area/ruin/powered) +"X" = ( +/obj/item/flashlight/lantern, +/turf/simulated/floor/plating/asteroid/basalt, +/area/ruin/powered) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +s +s +s +s +s +s +s +s +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +s +s +s +s +s +s +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +s +s +s +s +s +s +"} +(4,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +s +s +s +s +s +"} +(5,1,1) = {" +a +a +a +a +a +b +c +b +t +t +t +t +t +s +s +s +"} +(6,1,1) = {" +a +a +a +a +b +b +n +n +t +v +x +B +t +s +s +s +"} +(7,1,1) = {" +a +a +a +b +b +m +o +o +t +w +y +y +D +s +s +s +"} +(8,1,1) = {" +a +b +b +b +c +f +o +q +K +o +z +C +t +s +s +s +"} +(9,1,1) = {" +b +b +f +i +g +f +f +o +o +o +t +t +t +s +s +s +"} +(10,1,1) = {" +b +d +g +j +g +g +f +f +u +o +A +b +a +s +s +s +"} +(11,1,1) = {" +c +e +h +g +l +c +p +r +c +c +c +b +a +a +s +s +"} +(12,1,1) = {" +b +b +f +k +X +b +b +b +b +a +a +a +a +E +H +E +"} +(13,1,1) = {" +a +b +b +b +b +b +a +a +a +a +a +a +a +F +I +F +"} +(14,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +F +I +F +"} +(15,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +G +J +G +"} +(16,1,1) = {" +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_hierophant.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm new file mode 100644 index 00000000000..8cdc6844bfc --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm @@ -0,0 +1,608 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/simulated/wall/indestructible/hierophant, +/area/ruin/unpowered/hierophant) +"b" = ( +/turf/simulated/floor/indestructible/hierophant, +/area/ruin/unpowered/hierophant) +"c" = ( +/obj/effect/light_emitter{ + light_range = 3; + light_power = 5 + }, +/turf/simulated/floor/indestructible/hierophant, +/area/ruin/unpowered/hierophant) +"d" = ( +/mob/living/simple_animal/hostile/megafauna/hierophant, +/turf/simulated/floor/indestructible/hierophant/two, +/area/ruin/unpowered/hierophant) +"e" = ( +/turf/simulated/floor/indestructible/hierophant/two, +/area/ruin/unpowered/hierophant) +"f" = ( +/obj/effect/light_emitter{ + light_range = 3; + light_power = 5 + }, +/turf/simulated/floor/indestructible/hierophant/two, +/area/ruin/unpowered/hierophant) +"g" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/indestructible/hierophant/two, +/area/ruin/unpowered/hierophant) + +(1,1,1) = {" +a +a +a +b +b +b +b +a +a +a +a +a +a +a +a +a +b +b +b +b +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +c +b +b +b +b +b +b +b +b +b +b +a +"} +(3,1,1) = {" +a +b +b +b +c +c +b +b +b +a +b +b +b +a +b +b +b +c +c +b +b +b +a +"} +(4,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(5,1,1) = {" +b +b +c +b +a +a +b +c +b +b +b +c +b +b +b +c +b +a +a +b +c +b +b +"} +(6,1,1) = {" +b +b +c +b +a +a +b +c +b +b +b +c +b +b +b +c +b +a +a +b +c +b +b +"} +(7,1,1) = {" +b +b +b +b +b +b +e +e +e +e +e +e +e +e +e +e +e +b +b +b +b +b +b +"} +(8,1,1) = {" +a +b +b +b +c +c +e +e +e +a +e +e +e +a +e +e +e +c +c +b +b +b +a +"} +(9,1,1) = {" +a +b +b +b +b +b +e +e +e +e +e +f +e +e +e +e +e +b +b +b +b +b +a +"} +(10,1,1) = {" +a +b +a +b +b +b +e +a +e +e +e +e +e +e +e +a +e +b +b +b +a +b +a +"} +(11,1,1) = {" +a +b +b +b +b +b +e +e +e +e +e +e +e +e +e +e +e +b +b +b +b +b +a +"} +(12,1,1) = {" +a +c +b +b +c +c +e +e +f +e +e +d +e +g +f +e +e +c +c +b +b +c +a +"} +(13,1,1) = {" +a +b +b +b +b +b +e +e +e +e +e +e +e +e +e +e +e +b +b +b +b +b +a +"} +(14,1,1) = {" +a +b +a +b +b +b +e +a +e +e +e +e +e +e +e +a +e +b +b +b +a +b +a +"} +(15,1,1) = {" +a +b +b +b +b +b +e +e +e +e +e +f +e +e +e +e +e +b +b +b +b +b +a +"} +(16,1,1) = {" +a +b +b +b +c +c +e +e +e +a +e +e +e +a +e +e +e +c +c +b +b +b +a +"} +(17,1,1) = {" +b +b +b +b +b +b +e +e +e +e +e +e +e +e +e +e +e +b +b +b +b +b +b +"} +(18,1,1) = {" +b +b +c +b +a +a +b +c +b +b +b +c +b +b +b +c +b +a +a +b +c +b +b +"} +(19,1,1) = {" +b +b +c +b +a +a +b +c +b +b +b +c +b +b +b +c +b +a +a +b +c +b +b +"} +(20,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(21,1,1) = {" +a +b +b +b +c +c +b +b +b +a +b +b +b +a +b +b +b +c +c +b +b +b +a +"} +(22,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +c +b +b +b +b +b +b +b +b +b +b +a +"} +(23,1,1) = {" +a +a +a +b +b +b +b +a +a +a +a +a +a +a +a +a +b +b +b +b +a +a +a +"} 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_seed_vault.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm new file mode 100644 index 00000000000..b097156d39a --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -0,0 +1,766 @@ +//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/door/airlock/external{ + frequency = 1385; + id_tag = "seed_vault_inner"; + locked = 1 + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"d" = ( +/obj/structure/table/wood, +/obj/item/lighter, +/obj/item/lighter, +/obj/item/storage/fancy/rollingpapers, +/obj/item/storage/fancy/rollingpapers, +/obj/item/storage/fancy/rollingpapers, +/obj/item/storage/fancy/rollingpapers, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"e" = ( +/obj/structure/table/wood, +/obj/item/storage/box/disks_plantgene, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"f" = ( +/obj/machinery/plantgenes/upgraded{ + pixel_y = 6 + }, +/obj/structure/table/wood, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"g" = ( +/obj/structure/table/wood, +/obj/machinery/smartfridge/disks{ + pixel_y = 2 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"h" = ( +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"i" = ( +/obj/structure/closet/crate/hydroponics, +/obj/structure/beebox, +/obj/item/melee/flyswatter, +/obj/item/honey_frame, +/obj/item/honey_frame, +/obj/item/honey_frame, +/obj/item/queen_bee/bought, +/obj/item/clothing/head/beekeeper_head, +/obj/item/clothing/suit/beekeeper_suit, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"j" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"k" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/seed_vault, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"l" = ( +/obj/machinery/door/airlock, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"m" = ( +/obj/machinery/embedded_controller/radio/airlock/access_controller{ + frequency = 1385; + id_tag = "seed_vault"; + pixel_y = 25; + tag_exterior_door = "seed_vault_outer"; + tag_interior_door = "seed_vault_inner" + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"n" = ( +/obj/machinery/smartfridge, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"o" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/cultivator, +/obj/item/cultivator, +/obj/item/cultivator, +/obj/item/cultivator, +/obj/item/shovel/spade, +/obj/item/shovel/spade, +/obj/item/shovel/spade, +/obj/item/shovel/spade, +/obj/item/hatchet, +/obj/item/hatchet, +/obj/item/hatchet, +/obj/item/hatchet, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"p" = ( +/obj/machinery/hydroponics/constructable, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"q" = ( +/obj/item/hatchet, +/obj/item/storage/bag/plants, +/obj/item/reagent_containers/glass/bucket, +/obj/structure/table/wood, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"r" = ( +/obj/structure/table/wood, +/obj/item/storage/bag/plants, +/obj/item/storage/bag/plants, +/obj/item/storage/bag/plants, +/obj/item/storage/bag/plants, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"s" = ( +/obj/structure/table/wood, +/obj/item/gun/energy/floragun, +/obj/item/gun/energy/floragun, +/obj/item/gun/energy/floragun, +/obj/item/gun/energy/floragun, +/obj/item/storage/box/disks_plantgene, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"t" = ( +/obj/effect/mob_spawn/human/seed_vault, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"u" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"v" = ( +/obj/machinery/vending/hydronutrients, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"w" = ( +/obj/machinery/vending/hydroseeds, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"x" = ( +/obj/machinery/reagentgrinder{ + pixel_y = 5 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/bluespace, +/obj/item/reagent_containers/glass/beaker/bluespace, +/obj/item/reagent_containers/glass/beaker/bluespace, +/obj/item/reagent_containers/glass/beaker/bluespace, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"y" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"z" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + frequency = 1385; + id_tag = "seed_vault_outer"; + locked = 1 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"A" = ( +/obj/machinery/door/airlock/external{ + frequency = 1385; + id_tag = "seed_vault_outer"; + locked = 1 + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"B" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"C" = ( +/obj/machinery/seed_extractor, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"D" = ( +/obj/machinery/biogenerator, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"E" = ( +/obj/machinery/chem_dispenser/mutagensaltpeter, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"F" = ( +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"G" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/clothing/under/rank/hydroponics, +/obj/item/clothing/under/rank/hydroponics, +/obj/item/clothing/under/rank/hydroponics, +/obj/item/clothing/under/rank/hydroponics, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"H" = ( +/obj/machinery/chem_master/condimaster, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"I" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"J" = ( +/obj/item/storage/toolbox/syndicate, +/obj/structure/table/wood, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"K" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"L" = ( +/obj/machinery/access_button{ + command = "cycle_interior"; + frequency = 1385; + master_tag = "seed_vault"; + name = "interior access button"; + pixel_x = 25; + pixel_y = -25; + req_access_txt = null + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"M" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"N" = ( +/obj/structure/table/wood, +/obj/item/storage/box/disks_plantgene, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"O" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"P" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"Q" = ( +/turf/simulated/wall/r_wall, +/area/ruin/powered/seedvault) +"R" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"S" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"T" = ( +/obj/machinery/access_button{ + command = "cycle_exterior"; + frequency = 1385; + master_tag = "seed_vault"; + name = "exterior access button"; + pixel_x = -25; + pixel_y = -25; + req_access_txt = null + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"U" = ( +/obj/machinery/light, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) +"V" = ( +/obj/structure/disposalpipe/segment, +/turf/simulated/wall/r_wall, +/area/ruin/powered/seedvault) +"W" = ( +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"X" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/seedvault) + +(1,1,1) = {" +a +a +a +a +a +a +a +Q +Q +Q +Q +Q +Q +a +a +a +a +a +b +b +"} +(2,1,1) = {" +a +a +a +a +a +a +a +Q +t +t +t +t +Q +a +a +a +a +a +b +b +"} +(3,1,1) = {" +b +a +a +a +a +a +Q +Q +O +h +h +U +Q +Q +a +a +a +b +a +b +"} +(4,1,1) = {" +b +a +a +Q +Q +Q +Q +Q +Q +l +l +Q +Q +Q +Q +a +a +a +a +a +"} +(5,1,1) = {" +a +a +Q +Q +k +Q +n +R +u +h +h +u +R +u +Q +a +a +a +a +a +"} +(6,1,1) = {" +a +a +Q +d +h +Q +o +h +h +h +h +h +h +G +Q +a +a +a +a +a +"} +(7,1,1) = {" +a +a +Q +N +h +Q +P +h +p +h +h +p +h +X +Q +a +a +a +a +a +"} +(8,1,1) = {" +b +a +Q +e +h +l +h +h +v +h +h +B +F +F +V +W +a +a +a +a +"} +(9,1,1) = {" +b +a +Q +f +h +Q +p +h +n +h +h +C +h +k +Q +M +a +a +a +a +"} +(10,1,1) = {" +a +a +Q +g +h +Q +p +h +w +h +K +D +h +p +Q +b +a +a +a +a +"} +(11,1,1) = {" +a +a +Q +h +h +Q +q +h +x +h +h +E +h +H +Q +a +a +a +a +a +"} +(12,1,1) = {" +b +a +Q +O +h +Q +P +h +h +h +h +h +h +X +Q +a +a +a +a +a +"} +(13,1,1) = {" +a +a +Q +i +h +Q +r +h +h +p +p +h +h +I +Q +a +a +a +a +a +"} +(14,1,1) = {" +a +a +Q +Q +i +Q +s +S +y +h +L +y +S +J +Q +a +a +a +a +a +"} +(15,1,1) = {" +a +a +b +Q +Q +Q +Q +Q +Q +c +c +Q +Q +Q +Q +a +a +a +a +a +"} +(16,1,1) = {" +b +a +b +j +Q +j +Q +j +Q +m +h +Q +j +Q +j +a +a +a +a +a +"} +(17,1,1) = {" +a +a +a +a +a +a +a +a +Q +A +z +Q +b +b +b +a +a +a +b +b +"} +(18,1,1) = {" +a +a +a +b +b +b +b +b +b +b +T +b +b +b +b +a +a +a +b +b +"} +(19,1,1) = {" +a +a +a +a +b +b +a +b +b +b +b +b +b +b +a +a +a +b +b +b +"} +(20,1,1) = {" +a +a +a +b +b +b +a +b +b +b +b +b +b +b +a +a +a +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_swarmer_crash.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm new file mode 100644 index 00000000000..937eddc37a8 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm @@ -0,0 +1,264 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/template_noop) +"c" = ( +/turf/simulated/wall/mineral/plastitanium, +/area/ruin/unpowered) +"d" = ( +/turf/simulated/floor/mineral/plastitanium/red{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"e" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4 + }, +/turf/template_noop, +/area/ruin/unpowered) +"f" = ( +/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon, +/turf/simulated/floor/mineral/plastitanium/red{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"g" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/mineral/plastitanium/red{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +a +a +b +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +b +b +b +c +a +c +a +b +b +a +a +"} +(3,1,1) = {" +a +a +b +b +b +b +d +d +d +c +b +b +a +a +"} +(4,1,1) = {" +b +b +b +b +b +b +a +d +d +b +b +b +a +a +"} +(5,1,1) = {" +b +b +b +b +b +b +a +a +a +b +b +b +b +a +"} +(6,1,1) = {" +a +b +b +b +b +c +a +a +d +c +a +b +b +a +"} +(7,1,1) = {" +a +b +b +b +c +d +d +d +d +d +c +b +b +a +"} +(8,1,1) = {" +a +b +b +a +c +d +d +g +d +d +c +b +b +a +"} +(9,1,1) = {" +a +a +b +a +c +d +d +f +d +d +c +b +b +b +"} +(10,1,1) = {" +a +a +b +a +a +d +d +d +d +d +c +b +b +b +"} +(11,1,1) = {" +a +a +b +b +a +d +d +d +d +d +c +b +b +a +"} +(12,1,1) = {" +a +a +a +b +a +d +c +c +c +a +a +a +a +a +"} +(13,1,1) = {" +a +a +a +a +c +c +e +e +e +c +c +a +a +a +"} +(14,1,1) = {" +a +a +a +a +c +e +a +a +a +e +c +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 new file mode 100644 index 00000000000..421f2e62b53 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -0,0 +1,9303 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"ac" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ad" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/access_button{ + command = "cycle_interior"; + frequency = 1449; + master_tag = "syndicate_base_virology"; + name = "interior access button"; + pixel_x = 25; + pixel_y = -25; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 4 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ae" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"af" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ag" = ( +/obj/machinery/alarm/syndicate{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ah" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/beer/upgraded{ + dir = 1 + }, +/obj/structure/sign/barsign{ + pixel_y = -32; + req_access = null; + req_access_txt = "0" + }, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"ai" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/soda/upgraded{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"aj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/medical/syndicate_access, +/turf/simulated/floor/plasteel/white/side{ + dir = 4 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ak" = ( +/obj/machinery/vending/boozeomat/syndicate_access, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/bar) +"al" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/medical/syndicate_access, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"am" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/carbon/human/monkey{ + faction = list("neutral","syndicate") + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 9 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"an" = ( +/mob/living/carbon/human/monkey{ + faction = list("neutral","syndicate") + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 5 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ao" = ( +/mob/living/carbon/human/monkey{ + faction = list("neutral","syndicate") + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 10 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ap" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"aq" = ( +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"ar" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/carbon/human/monkey{ + faction = list("neutral","syndicate") + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 6 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"as" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"at" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/door/poddoor{ + id_tag = "lavalandsyndi_chemistry" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"au" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/mob/living/carbon/human/monkey{ + faction = list("neutral","syndicate") + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"av" = ( +/obj/machinery/light/small, +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/mob/living/carbon/human/monkey{ + faction = list("neutral","syndicate") + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"aw" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating{ + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface; + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"ax" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ay" = ( +/obj/machinery/door/airlock/external{ + frequency = 1449; + id_tag = "syndicate_base_west_north_interior"; + locked = 1; + req_access_txt = "150" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"az" = ( +/obj/machinery/embedded_controller/radio/airlock/access_controller{ + frequency = 1449; + id_tag = "syndicate_base_west_south"; + pixel_x = -25; + req_access_txt = "150"; + tag_exterior_door = "syndicate_base_west_south_exterior"; + tag_interior_door = "syndicate_base_west_south_interior" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aA" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/sign/fire{ + pixel_x = 32 + }, +/obj/structure/closet/emcloset/anchored, +/obj/item/tank/emergency_oxygen/engi, +/obj/item/flashlight/seclite, +/obj/item/clothing/mask/gas, +/obj/structure/sign/vacuum{ + pixel_x = 0; + pixel_y = 32 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aB" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + frequency = 1449; + id_tag = "syndicate_base_west_north_interior"; + locked = 1; + req_access_txt = "150" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"aC" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + frequency = 1449; + id_tag = "syndicate_base_west_north_exterior"; + locked = 1; + req_access_txt = "150" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"aD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/access_button{ + command = "cycle_interior"; + frequency = 1449; + master_tag = "syndicate_base_west_south"; + name = "interior access button"; + pixel_x = 25; + pixel_y = 25; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"aG" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + frequency = 1449; + id_tag = "syndicate_base_south_exterior"; + locked = 1; + req_access_txt = "150" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aH" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aI" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + frequency = 1449; + id_tag = "syndicate_base_virology_interior"; + locked = 1; + name = "Virology Lab Interior Airlock"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"aJ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + frequency = 1449; + id_tag = "syndicate_base_virology_exterior"; + locked = 1; + name = "Virology Lab Exterior Airlock"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"aK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/access_button{ + command = "cycle_exterior"; + frequency = 1449; + master_tag = "syndicate_base_virology"; + name = "exterior access button"; + pixel_x = -25; + pixel_y = 25; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"aL" = ( +/turf/simulated/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"aM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/chem_dispenser/upgraded, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"aN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/access_button{ + command = "cycle_interior"; + frequency = 1449; + master_tag = "syndicate_base_south"; + name = "interior access button"; + pixel_x = 25; + pixel_y = -25; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aO" = ( +/obj/machinery/door/airlock/external{ + frequency = 1449; + id_tag = "syndicate_base_south_interior"; + locked = 1; + req_access_txt = "150" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aP" = ( +/obj/structure/sign/vacuum{ + pixel_x = -32 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/embedded_controller/radio/airlock/access_controller{ + frequency = 1449; + id_tag = "syndicate_base_south"; + pixel_x = 25; + req_access_txt = "150"; + tag_exterior_door = "syndicate_base_south_exterior"; + tag_interior_door = "syndicate_base_south_interior" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aR" = ( +/obj/structure/sign/xeno_warning_mining{ + pixel_x = -32 + }, +/obj/structure/sign/fire{ + pixel_x = 32 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aS" = ( +/obj/machinery/access_button{ + command = "cycle_exterior"; + frequency = 1449; + master_tag = "syndicate_base_south"; + name = "exterior access button"; + pixel_x = 20; + pixel_y = 21; + req_access_txt = "150" + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"aT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/access_button{ + command = "cycle_interior"; + frequency = 1449; + master_tag = "syndicate_base_west_north"; + name = "interior access button"; + pixel_x = 25; + pixel_y = -8; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"aU" = ( +/obj/machinery/embedded_controller/radio/airlock/access_controller{ + frequency = 1449; + id_tag = "syndicate_base_west_north"; + pixel_x = -25; + req_access_txt = "150"; + tag_exterior_door = "syndicate_base_west_north_exterior"; + tag_interior_door = "syndicate_base_west_north_interior" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"aV" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/sign/fire{ + pixel_x = 32 + }, +/obj/structure/closet/emcloset/anchored, +/obj/item/tank/emergency_oxygen/engi, +/obj/item/flashlight/seclite, +/obj/item/clothing/mask/gas, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/vacuum{ + pixel_x = 0; + pixel_y = -32 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"aW" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/door_control{ + id = "lavalandsyndi_arrivals"; + name = "Arrivals Blast Door Control"; + pixel_y = -26; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aX" = ( +/obj/effect/turf_decal/caution/red{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 4 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"aY" = ( +/obj/structure/fans/tiny, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/external{ + frequency = 1449; + id_tag = "syndicate_base_west_north_exterior"; + locked = 1; + req_access_txt = "150" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"aZ" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + frequency = 1449; + id_tag = "syndicate_base_west_south_exterior"; + locked = 1; + req_access_txt = "150" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"ba" = ( +/obj/machinery/door/airlock/external{ + frequency = 1449; + id_tag = "syndicate_base_west_south_interior"; + locked = 1; + req_access_txt = "150" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"bb" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + frequency = 1449; + id_tag = "syndicate_base_west_south_interior"; + locked = 1; + req_access_txt = "150" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"bc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/mapping_helpers/no_lava, +/obj/machinery/access_button{ + command = "cycle_exterior"; + frequency = 1449; + master_tag = "syndicate_base_west_north"; + name = "exterior access button"; + pixel_x = -21; + pixel_y = 21; + req_access_txt = "150" + }, +/turf/simulated/floor/plating{ + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface; + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"bd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/embedded_controller/radio/airlock/access_controller{ + frequency = 1449; + id_tag = "syndicate_base_virology"; + pixel_x = -25; + req_access_txt = "150"; + tag_exterior_door = "syndicate_base_virology_exterior"; + tag_interior_door = "syndicate_base_virology_interior" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"be" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/power/apc/syndicate{ + dir = 1; + name = "Engineering APC"; + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + d1 = 0; + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bf" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/airlock/glass{ + frequency = 1449; + id_tag = "syndicate_base_incinerator_interior"; + locked = 1; + req_access_txt = "150" + }, +/obj/machinery/access_button{ + command = "cycle_interior"; + frequency = 1449; + master_tag = "syndicate_base_incinerator"; + name = "interior access button"; + pixel_x = -25; + pixel_y = 0; + req_access_txt = "150" + }, +/turf/simulated/floor/engine/insulated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bg" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/engine/insulated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bh" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/engine/insulated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bi" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/binary/pump{ + name = "Incinerator Input" + }, +/turf/simulated/floor/engine/insulated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bj" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/airlock/glass{ + frequency = 1449; + id_tag = "syndicate_base_incinerator_exterior"; + locked = 1; + req_access_txt = "150" + }, +/obj/machinery/access_button{ + command = "cycle_exterior"; + frequency = 1449; + master_tag = "syndicate_base_incinerator"; + name = "exterior access button"; + pixel_x = -25; + pixel_y = 0; + req_access_txt = "150" + }, +/turf/simulated/floor/engine/insulated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bk" = ( +/obj/structure/rack, +/obj/item/flashlight{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/flashlight, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/firealarm/syndicate{ + dir = 8; + pixel_x = -26 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"bl" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"bm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/access_button{ + command = "cycle_interior"; + frequency = 1449; + master_tag = "syndicate_base_east"; + name = "interior access button"; + pixel_x = 25; + pixel_y = 25; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"bn" = ( +/obj/machinery/door/airlock/external{ + frequency = 1449; + id_tag = "syndicate_base_east_interior"; + locked = 1; + req_access_txt = "150" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"bo" = ( +/obj/structure/sign/vacuum{ + pixel_y = -32 + }, +/obj/machinery/light/small, +/obj/machinery/embedded_controller/radio/airlock/access_controller{ + frequency = 1449; + id_tag = "syndicate_base_east"; + pixel_x = 0; + pixel_y = 25; + req_access_txt = "150"; + tag_exterior_door = "syndicate_base_east_exterior"; + tag_interior_door = "syndicate_base_east_interior" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"bp" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + frequency = 1449; + id_tag = "syndicate_base_east_exterior"; + locked = 1; + req_access_txt = "150" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"bq" = ( +/obj/machinery/access_button{ + command = "cycle_exterior"; + frequency = 1449; + master_tag = "syndicate_base_east"; + name = "exterior access button"; + pixel_x = -21; + pixel_y = 21; + req_access_txt = "150" + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"br" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/trinary/mixer/flipped{ + dir = 8; + node1_concentration = 0.2; + node2_concentration = 0.8; + on = 1; + target_pressure = 4500 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bs" = ( +/obj/machinery/air_sensor{ + frequency = 1442; + id_tag = "syndie_lavaland_n2_sensor" + }, +/turf/simulated/floor/engine{ + name = "n2 floor"; + nitrogen = 100000; + oxygen = 0 + }, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bt" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/engine{ + name = "n2 floor"; + nitrogen = 100000; + oxygen = 0 + }, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bu" = ( +/obj/machinery/atmospherics/unary/vent_pump/siphon/on{ + dir = 8; + frequency = 1442; + id_tag = "syndie_lavaland_n2_out"; + name = "nitrogen out" + }, +/turf/simulated/floor/engine{ + name = "n2 floor"; + nitrogen = 100000; + oxygen = 0 + }, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/mapping_helpers/no_lava, +/obj/machinery/access_button{ + command = "cycle_exterior"; + frequency = 1449; + master_tag = "syndicate_base_west_south"; + name = "exterior access button"; + pixel_x = -21; + pixel_y = -21; + req_access_txt = "150" + }, +/turf/simulated/floor/plating{ + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface; + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"bw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/bookcase/random, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"bx" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/turretid/lethal{ + ailock = 1; + check_synth = 0; + control_area = "Syndicate Lavaland Primary Hallway"; + dir = 1; + faction = "syndicate"; + name = "Base turret controls"; + pixel_y = 30; + req_access = null; + req_access_txt = "150"; + syndicate = 1 + }, +/turf/simulated/floor/redgrid, +/area/ruin/unpowered/syndicate_lava_base/main) +"by" = ( +/obj/machinery/atmospherics/pipe/simple/visible/scrubbers, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/visible/supply, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bz" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 6; + initialize_directions = 6; + level = 2 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bA" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 4; + level = 2 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bB" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 4; + level = 2 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bC" = ( +/obj/machinery/atmospherics/pipe/simple/visible/scrubbers, +/obj/machinery/atmospherics/pipe/simple/visible/supply, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bD" = ( +/obj/machinery/atmospherics/pipe/simple/visible/universal, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bE" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bF" = ( +/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/visible/supply{ + dir = 5 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/visible/supply, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bH" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"bJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/visible/cyan, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 4; + level = 2 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/visible/yellow{ + dir = 8; + level = 2 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bM" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/binary/pump{ + dir = 8; + name = "Plasma to Incinerator" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/visible/yellow{ + dir = 10; + level = 2 + }, +/obj/structure/reagent_dispensers/fueltank, +/obj/item/clothing/head/welding, +/obj/item/weldingtool/largetank, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bO" = ( +/obj/machinery/ignition_switch{ + id = "syndicate_base_incinerator"; + pixel_x = 6; + pixel_y = -24 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/canister, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/embedded_controller/radio/airlock/access_controller{ + frequency = 1449; + id_tag = "syndicate_base_incinerator"; + pixel_x = -6; + pixel_y = -25; + req_access_txt = "150"; + tag_exterior_door = "syndicate_base_incinerator_exterior"; + tag_interior_door = "syndicate_base_incinerator_interior" + }, +/obj/machinery/atmospherics/pipe/simple/visible/yellow, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bP" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/atmospherics/pipe/simple/visible/yellow, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bQ" = ( +/turf/simulated/floor/engine/insulated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bR" = ( +/obj/machinery/optable, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 4 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"bS" = ( +/obj/machinery/vending/toyliberationstation{ + req_access_txt = "150" + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"bT" = ( +/turf/simulated/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"bU" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/door_control{ + id = "lavalandsyndi"; + name = "Syndicate Experimentation Lockdown Control"; + pixel_y = 26; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"bV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel/white/corner{ + dir = 1 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"bW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"bX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"bY" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"bZ" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"ca" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/visible/yellow{ + dir = 6; + level = 2 + }, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cb" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"cc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"cd" = ( +/obj/machinery/light/small, +/obj/structure/extinguisher_cabinet{ + pixel_y = -29 + }, +/obj/structure/cable/yellow, +/obj/machinery/power/apc/syndicate{ + dir = 4; + name = "Medbay APC"; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel/white/side{ + dir = 6 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"ce" = ( +/obj/structure/sign/securearea, +/turf/simulated/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/main) +"cf" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/radio/intercom/syndicate, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"cg" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/simulated/floor/engine{ + name = "n2 floor"; + nitrogen = 100000; + oxygen = 0 + }, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ch" = ( +/obj/machinery/air_sensor{ + frequency = 1442; + id_tag = "syndie_lavaland_o2_sensor" + }, +/turf/simulated/floor/engine{ + name = "o2 floor"; + nitrogen = 0; + oxygen = 100000 + }, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ci" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/engine{ + name = "o2 floor"; + nitrogen = 0; + oxygen = 100000 + }, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cj" = ( +/obj/machinery/atmospherics/unary/vent_pump/siphon/on{ + dir = 8; + frequency = 1442; + id_tag = "syndie_lavaland_o2_out"; + name = "oxygen out" + }, +/turf/simulated/floor/engine{ + name = "o2 floor"; + nitrogen = 0; + oxygen = 100000 + }, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ck" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/simulated/floor/engine{ + name = "o2 floor"; + nitrogen = 0; + oxygen = 100000 + }, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cl" = ( +/obj/machinery/atmospherics/unary/vent_pump/siphon/on{ + dir = 1; + frequency = 1442; + id_tag = "syndie_lavaland_tox_out"; + name = "toxin out" + }, +/turf/simulated/floor/engine{ + carbon_dioxide = 0; + name = "plasma floor"; + nitrogen = 0; + oxygen = 0; + toxins = 70000 + }, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cm" = ( +/obj/machinery/air_sensor{ + frequency = 1442; + id_tag = "syndie_lavaland_tox_sensor" + }, +/turf/simulated/floor/engine{ + carbon_dioxide = 0; + name = "plasma floor"; + nitrogen = 0; + oxygen = 0; + toxins = 70000 + }, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cn" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/simulated/floor/engine{ + carbon_dioxide = 0; + name = "plasma floor"; + nitrogen = 0; + oxygen = 0; + toxins = 70000 + }, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"co" = ( +/obj/machinery/light/small, +/turf/simulated/floor/engine{ + carbon_dioxide = 0; + name = "plasma floor"; + nitrogen = 0; + oxygen = 0; + toxins = 70000 + }, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cp" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/igniter{ + id = "syndicate_base_incinerator" + }, +/turf/simulated/floor/engine/insulated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cq" = ( +/obj/machinery/atmospherics/unary/outlet_injector/on{ + dir = 1; + id = "syndie_lavaland_inc_in" + }, +/obj/structure/sign/vacuum/external{ + pixel_y = -32 + }, +/turf/simulated/floor/engine/insulated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cr" = ( +/obj/machinery/door/poddoor{ + id_tag = "lavalandsyndi_incineratorinput" + }, +/turf/simulated/floor/engine/insulated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cs" = ( +/obj/structure/cable, +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/power/compressor{ + comp_id = "syndie_lavaland_incineratorturbine"; + dir = 1; + luminosity = 2 + }, +/turf/simulated/floor/engine/insulated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ct" = ( +/obj/structure/cable, +/obj/machinery/power/turbine{ + dir = 2; + luminosity = 2 + }, +/turf/simulated/floor/engine/insulated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cu" = ( +/obj/machinery/door/poddoor{ + id_tag = "lavalandsyndi_incineratoroutput" + }, +/turf/simulated/floor/engine/insulated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cA" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"cG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/chem_master, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dc" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"di" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"do" = ( +/obj/structure/closet/secure_closet/medical1{ + req_access = null; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/beakers/bluespace, +/obj/item/storage/box/beakers/bluespace, +/turf/simulated/floor/plasteel/white/side{ + dir = 9 + }, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"du" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/door_control{ + id = "lavalandsyndi_chemistry"; + name = "Chemistry Blast Door Control"; + pixel_y = 26; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 1 + }, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/chem_heater, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dw" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/closet/crate, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dy" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"dA" = ( +/obj/structure/closet/l3closet, +/obj/machinery/power/apc/syndicate{ + dir = 8; + name = "Chemistry APC"; + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + d1 = 0; + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 8 + }, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dB" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dE" = ( +/obj/structure/table/glass, +/obj/item/stack/sheet/mineral/plasma{ + amount = 5; + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 5; + pixel_y = 2 + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 5; + pixel_x = 2; + pixel_y = -2 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/glass/bottle/charcoal{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/epinephrine, +/turf/simulated/floor/plasteel/white/corner{ + dir = 4 + }, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dG" = ( +/obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"dI" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_y = 5 + }, +/obj/item/reagent_containers/glass/beaker/large, +/turf/simulated/floor/plasteel/white/side{ + dir = 5 + }, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dK" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 1 + }, +/obj/structure/closet/crate/secure/gear{ + req_access_txt = "150" + }, +/obj/item/clothing/gloves/combat, +/obj/item/clothing/gloves/combat, +/obj/item/clothing/under/syndicate/combat, +/obj/item/clothing/under/syndicate/combat, +/obj/item/storage/belt/military, +/obj/item/storage/belt/military, +/obj/item/clothing/shoes/combat, +/obj/item/clothing/shoes/combat, +/obj/item/clothing/mask/gas/syndicate, +/obj/item/clothing/mask/gas/syndicate, +/obj/item/clothing/glasses/night, +/obj/item/clothing/glasses/night, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"dL" = ( +/obj/machinery/alarm/syndicate{ + pixel_y = 24 + }, +/obj/structure/closet/crate, +/obj/item/extinguisher{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/extinguisher{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/flashlight{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/radio/headset/syndicate/alt, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"dM" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 4 + }, +/obj/structure/closet/crate, +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"dP" = ( +/turf/simulated/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"dQ" = ( +/obj/structure/sign/securearea, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"dR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch{ + heat_proof = 1; + name = "Experimentation Room"; + req_access_txt = "150" + }, +/obj/machinery/door/poddoor/preopen{ + id_tag = "lavalandsyndi"; + name = "Syndicate Research Experimentation Shutters" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"dS" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id_tag = "lavalandsyndi"; + name = "Syndicate Research Experimentation Shutters" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"dT" = ( +/obj/machinery/firealarm/syndicate{ + dir = 8; + pixel_x = -26 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white/side{ + dir = 8 + }, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dX" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dY" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dZ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/folder/white, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3 + }, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3 + }, +/obj/item/reagent_containers/dropper, +/obj/machinery/alarm/syndicate{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/screwdriver/nuke{ + pixel_y = 18 + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 4 + }, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"ea" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 8 + }, +/obj/structure/closet/crate/secure/weapon{ + req_access_txt = "150" + }, +/obj/item/ammo_box/c10mm{ + pixel_y = 6 + }, +/obj/item/ammo_box/c10mm, +/obj/item/ammo_box/magazine/m10mm{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/ammo_box/magazine/m10mm{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/ammo_box/magazine/m10mm{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/ammo_box/magazine/m10mm{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eb" = ( +/obj/structure/closet/crate, +/obj/item/storage/toolbox/electrical{ + pixel_y = 4 + }, +/obj/item/storage/toolbox/mechanical, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ec" = ( +/obj/effect/turf_decal/box/white/corners, +/obj/structure/closet/crate/medical, +/obj/item/storage/firstaid/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ed" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ef" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/cable/yellow{ + d1 = 0; + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/power/apc/syndicate{ + dir = 1; + name = "Cargo Bay APC"; + pixel_y = 24 + }, +/obj/structure/closet/emcloset/anchored, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eg" = ( +/obj/structure/closet/firecloset/full{ + anchored = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eh" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ei" = ( +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ek" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"el" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eo" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/syndicate, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/paper/crumpled{ + info = "Explosive testing on site is STRICTLY forbidden, as this outpost's walls are lined with explosives intended for intentional self-destruct purposes that may be set off prematurely through careless experiments."; + name = "Explosives Testing Warning"; + pixel_x = -6; + pixel_y = -3 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"ep" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eq" = ( +/obj/structure/table/reinforced, +/obj/item/restraints/handcuffs, +/obj/item/taperecorder, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"er" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27; + pixel_y = 1 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white/side{ + dir = 8 + }, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"es" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"et" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"eu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/chem_heater, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"ev" = ( +/turf/simulated/floor/plasteel/white/corner, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"ew" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/syndichem, +/turf/simulated/floor/plasteel/white/side{ + dir = 6 + }, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"ex" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/firealarm/syndicate{ + dir = 8; + pixel_x = -26 + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ey" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ez" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eA" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/mining/glass{ + name = "Warehouse"; + req_access_txt = "150" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eB" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eC" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/storage/box/lights/bulbs, +/obj/item/wrench, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eF" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + id_tag = "lavalandsyndi_cargo" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eG" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 9 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"eH" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 5 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"eI" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/virology) +"eJ" = ( +/obj/structure/disposalpipe/segment, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/virology) +"eL" = ( +/obj/machinery/door/airlock/hatch{ + name = "Monkey Pen"; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eM" = ( +/obj/machinery/firealarm/syndicate{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eN" = ( +/obj/machinery/alarm/syndicate{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eP" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eQ" = ( +/obj/machinery/light/small, +/obj/structure/table/reinforced, +/obj/item/storage/box/monkeycubes/syndicate, +/obj/item/storage/box/monkeycubes/syndicate, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eR" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white/side{ + dir = 10 + }, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"eS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/chem_master, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"eT" = ( +/obj/effect/turf_decal/bot, +/obj/structure/chair/office/light, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"eU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/chem_dispenser/upgraded, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"eV" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 6 + }, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"eW" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eX" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 1 + }, +/obj/structure/closet/crate/internals, +/obj/item/tank/oxygen/yellow, +/obj/item/tank/oxygen/yellow, +/obj/item/tank/oxygen/yellow, +/obj/item/tank/emergency_oxygen/double, +/obj/item/tank/emergency_oxygen/double, +/obj/item/tank/emergency_oxygen/double, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eY" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 4 + }, +/obj/structure/closet/crate, +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 2 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eZ" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/stack/sheet/cardboard{ + amount = 3 + }, +/obj/item/stack/rods/twentyfive, +/obj/item/stock_parts/cell/high/plus, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fa" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fd" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ff" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 10 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fg" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 6 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fh" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 10 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fi" = ( +/obj/structure/table/glass, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/storage/box/syringes, +/obj/machinery/power/apc/syndicate{ + dir = 1; + name = "Virology APC"; + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + d1 = 0; + d2 = 2; + icon_state = "0-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 9 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fj" = ( +/obj/structure/table/glass, +/obj/structure/reagent_dispensers/virusfood{ + pixel_y = 28 + }, +/obj/item/clothing/gloves/color/latex, +/obj/item/healthanalyzer, +/obj/item/clothing/glasses/hud/health, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/syndicate{ + dir = 4; + pixel_x = 26 + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 5 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fk" = ( +/obj/machinery/power/apc/syndicate{ + dir = 2; + name = "Experimentation Lab APC"; + pixel_y = -24 + }, +/obj/structure/cable/yellow{ + d2 = 4; + icon_state = "0-4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"fl" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/extinguisher_cabinet{ + pixel_x = 25 + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"fm" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Chemistry Lab"; + req_access_txt = "150" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"fn" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"fo" = ( +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/obj/machinery/door/window/southleft{ + base_state = "left"; + dir = 2; + icon_state = "left"; + name = "Chemistry" + }, +/obj/machinery/door/window/southleft{ + base_state = "left"; + dir = 1; + icon_state = "left"; + name = "Chemistry"; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"fp" = ( +/obj/machinery/smartfridge/secure/chemistry/preloaded/syndicate, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"fq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/assist, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fr" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fs" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 8 + }, +/obj/structure/closet/crate, +/obj/item/storage/box/stockparts/deluxe, +/obj/item/storage/box/stockparts/deluxe, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/circuitboard/processor, +/obj/item/circuitboard/gibber, +/obj/item/circuitboard/deepfryer, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ft" = ( +/obj/effect/turf_decal/box/white/corners, +/obj/structure/closet/crate, +/obj/item/reagent_containers/glass/beaker/waterbottle/large{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/beaker/waterbottle/large{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/beaker/waterbottle/large, +/obj/item/reagent_containers/glass/beaker/waterbottle/large, +/obj/item/reagent_containers/glass/beaker/waterbottle/large{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/reagent_containers/glass/beaker/waterbottle/large{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fu" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/alarm/syndicate{ + dir = 4; + pixel_x = -24 + }, +/obj/structure/table, +/obj/item/clothing/suit/storage/hazardvest, +/obj/item/clothing/suit/storage/hazardvest, +/obj/item/clothing/head/soft{ + pixel_x = -8 + }, +/obj/item/clothing/head/soft{ + pixel_x = -8 + }, +/obj/item/radio{ + pixel_x = 5 + }, +/obj/item/radio{ + pixel_x = 5 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fx" = ( +/obj/structure/sign/securearea, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fy" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Isolation B"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fz" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Isolation A"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fA" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/antiviral, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/spray/cleaner, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 8 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fB" = ( +/obj/structure/chair/stool, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plasteel/white/corner{ + dir = 4 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fC" = ( +/obj/machinery/smartfridge/secure/chemistry/virology/preloaded/syndicate, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 5 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fD" = ( +/obj/structure/sign/biohazard, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fE" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/l3closet, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/alarm/syndicate{ + pixel_y = 24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"fF" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/shower{ + pixel_y = 14 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"fG" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/airlock/hatch{ + name = "Experimentation Lab"; + req_access_txt = "150" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"fH" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 1 + }, +/area/ruin/unpowered/syndicate_lava_base/main) +"fI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white/side{ + dir = 1 + }, +/area/ruin/unpowered/syndicate_lava_base/main) +"fO" = ( +/turf/simulated/floor/plasteel/white/side{ + dir = 1 + }, +/area/ruin/unpowered/syndicate_lava_base/main) +"fW" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/airlock/mining/glass{ + name = "Warehouse"; + req_access_txt = "150" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fY" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27; + pixel_y = 1 + }, +/obj/structure/table, +/obj/item/folder/yellow, +/obj/item/stack/wrapping_paper{ + pixel_y = 5 + }, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gb" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gg" = ( +/obj/structure/sign/fire{ + pixel_y = 32 + }, +/obj/structure/sign/xeno_warning_mining{ + pixel_y = -32 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gj" = ( +/turf/simulated/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gq" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gs" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 2 + }, +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gt" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 9 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gv" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gE" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gF" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gG" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gH" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 2 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gI" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gJ" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gK" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gL" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gO" = ( +/obj/structure/sign/cargo, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gP" = ( +/obj/machinery/photocopier, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gQ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gS" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/door_control{ + id = "lavalandsyndi_cargo"; + name = "Cargo Bay Blast Door Control"; + pixel_x = 26; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gT" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Monkey Pen"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gU" = ( +/obj/machinery/alarm/syndicate{ + dir = 4; + pixel_x = -24 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 8 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gV" = ( +/obj/structure/chair/office/light, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ha" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) +"hb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hd" = ( +/obj/effect/turf_decal/tile/red, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"he" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hg" = ( +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hh" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hj" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hl" = ( +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hn" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ho" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/computer/shuttle{ + desc = "Occasionally used to call in a resupply shuttle if one is in range."; + dir = 8; + icon_keyboard = "syndie_key"; + icon_screen = "syndishuttle"; + light_color = "#FA8282"; + name = "syndicate cargo shuttle terminal"; + possible_destinations = "syndielavaland_cargo"; + req_access_txt = "150"; + shuttleId = "syndie_cargo" + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hq" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white/side{ + dir = 1 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hs" = ( +/obj/machinery/computer/pandemic, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door_control{ + id = "lavalandsyndi_virology"; + name = "Virology Blast Door Control"; + pixel_x = -26; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 10 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ht" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/hand_labeler, +/obj/item/pen/red, +/obj/item/restraints/handcuffs, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/glasses/science, +/turf/simulated/floor/plasteel/white/side, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hu" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/item/stack/sheet/mineral/plasma{ + amount = 5 + }, +/obj/item/stack/sheet/mineral/uranium{ + amount = 10 + }, +/obj/item/stack/sheet/mineral/gold{ + amount = 10 + }, +/turf/simulated/floor/plasteel/white/side, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hv" = ( +/obj/machinery/disposal, +/obj/structure/sign/deathsposal{ + pixel_x = 32 + }, +/obj/effect/turf_decal/stripes/red/box, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 6 + }, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hx" = ( +/obj/machinery/alarm/syndicate{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hy" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hz" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hA" = ( +/obj/structure/closet/emcloset/anchored, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hB" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/belt/utility, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hF" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hH" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/door/poddoor/preopen{ + id_tag = "lavalandsyndi_virology" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hJ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"hL" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hM" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/m10mm, +/obj/item/ammo_box/magazine/sniper_rounds, +/obj/machinery/alarm/syndicate{ + pixel_y = 24 + }, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hN" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hO" = ( +/turf/simulated/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hP" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hQ" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/m10mm, +/obj/machinery/alarm/syndicate{ + pixel_y = 24 + }, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hS" = ( +/obj/structure/table/reinforced, +/obj/item/folder, +/obj/item/suppressor, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/ears/earmuffs, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hU" = ( +/obj/machinery/light/small, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/autolathe, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hW" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 10 + }, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) +"hZ" = ( +/obj/machinery/firealarm/syndicate{ + dir = 8; + pixel_x = -26 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ia" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ib" = ( +/obj/effect/mob_spawn/human/lavaland_syndicate{ + icon_state = "sleeper_s"; + dir = 4 + }, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"ic" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"id" = ( +/obj/structure/toilet{ + pixel_y = 18 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"ie" = ( +/obj/effect/mob_spawn/human/lavaland_syndicate/comms{ + dir = 8; + icon_state = "sleeper_s" + }, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"if" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ig" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating{ + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface; + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"ih" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"ii" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ij" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ik" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"il" = ( +/obj/machinery/door/airlock{ + name = "Cabin 2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"im" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"in" = ( +/obj/machinery/door/airlock{ + name = "Cabin 4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"ip" = ( +/obj/effect/turf_decal/stripes/red/corner, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"iq" = ( +/obj/structure/sign/securearea, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) +"ir" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/red/line{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/main) +"it" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/red/line{ + dir = 5 + }, +/obj/structure/filingcabinet, +/obj/item/folder/syndicate/mining, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/main) +"iu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating{ + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface; + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"iv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating{ + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface; + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"iw" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ix" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"iy" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Dormitories" + }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iz" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iB" = ( +/obj/machinery/alarm/syndicate{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iD" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/firealarm/syndicate{ + dir = 2; + pixel_y = 24 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iF" = ( +/obj/machinery/washing_machine, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iG" = ( +/obj/machinery/firealarm/syndicate{ + dir = 8; + pixel_x = -26 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"iH" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"iI" = ( +/obj/machinery/door/airlock/vault{ + id_tag = "syndie_lavaland_vault"; + req_access_txt = "150"; + locked = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/main) +"iJ" = ( +/turf/simulated/floor/redgrid, +/area/ruin/unpowered/syndicate_lava_base/main) +"iK" = ( +/obj/machinery/syndicatebomb/self_destruct{ + anchored = 1 + }, +/turf/simulated/floor/redgrid, +/area/ruin/unpowered/syndicate_lava_base/main) +"iM" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating{ + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface; + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"iN" = ( +/turf/simulated/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/main) +"iO" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"iP" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"iQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"iR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Dormitories" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iS" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iT" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 2 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + heat_capacity = 1e+006 + }, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iU" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/power/apc/syndicate{ + dir = 2; + name = "Dormitories APC"; + pixel_y = -24 + }, +/obj/structure/cable/yellow{ + d1 = 0; + d2 = 8; + icon_state = "0-8" + }, +/obj/effect/turf_decal/tile/neutral, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iW" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + heat_capacity = 1e+006 + }, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iY" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iZ" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ja" = ( +/obj/effect/turf_decal/stripes/red/corner{ + dir = 4 + }, +/obj/machinery/door_control{ + id = "syndie_lavaland_vault"; + name = "Vault Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 24; + pixel_y = 8; + req_access_txt = "150"; + specialfunctions = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/red/line{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/main) +"jc" = ( +/obj/machinery/light/small, +/turf/simulated/floor/redgrid, +/area/ruin/unpowered/syndicate_lava_base/main) +"jd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/red/line{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/main) +"je" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating{ + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface; + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"jf" = ( +/obj/machinery/door/airlock{ + name = "Cabin 1" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jg" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jh" = ( +/obj/machinery/door/airlock{ + name = "Cabin 3" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"ji" = ( +/obj/structure/cable/yellow{ + d1 = 0; + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/power/apc/syndicate{ + dir = 8; + name = "Primary Hallway APC"; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jj" = ( +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jk" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating{ + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface; + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"jl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jn" = ( +/obj/effect/mob_spawn/human/lavaland_syndicate{ + icon_state = "sleeper_s"; + dir = 4 + }, +/obj/machinery/alarm/syndicate{ + pixel_y = 24 + }, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jo" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"jq" = ( +/obj/effect/mob_spawn/human/lavaland_syndicate{ + dir = 8; + icon_state = "sleeper_s" + }, +/obj/machinery/alarm/syndicate{ + pixel_y = 24 + }, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jr" = ( +/obj/machinery/vending/snack, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"js" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jt" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ju" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jv" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/suit_storage_unit/radsuit, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jw" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/toolcloset{ + anchored = 1 + }, +/obj/item/crowbar, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jx" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id_tag = "lavalandsyndi_bar" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jy" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jz" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jA" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/m10mm, +/obj/item/ammo_box/magazine/sniper_rounds, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jB" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jC" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jD" = ( +/obj/machinery/vending/cola, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jE" = ( +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jF" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jG" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door/airlock/engineering{ + name = "Engineering"; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/alarm/syndicate{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jJ" = ( +/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{ + dir = 6 + }, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jK" = ( +/obj/machinery/atmospherics/unary/outlet_injector/on{ + dir = 8; + volume_rate = 200; + id = "syndie_lavaland_waste" + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jL" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/lighter{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ + pixel_x = -3 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jM" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/door_control{ + id = "lavalandsyndi_bar"; + name = "Bar Blast Door Control"; + pixel_y = 26; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jO" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 25 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jP" = ( +/turf/simulated/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"jR" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jS" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/firecloset/full{ + anchored = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jU" = ( +/obj/structure/sign/engineering, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/shower{ + desc = "The HS-452. Installed recently by the DonkCo Hygiene Division."; + dir = 4; + name = "emergency shower" + }, +/obj/structure/sign/radiation/rad_area{ + pixel_y = -32 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jY" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jZ" = ( +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"ka" = ( +/obj/structure/closet/crate, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kb" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/storage/box/lights/bulbs, +/obj/item/stack/rods{ + amount = 50 + }, +/obj/item/clothing/head/welding, +/obj/item/stock_parts/cell/high/plus, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"kc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"kd" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 2 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"ke" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"kf" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"kg" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"kh" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"ki" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 2 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"kj" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"kk" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/airlock/engineering{ + name = "Engineering"; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kl" = ( +/obj/machinery/atmospherics/pipe/simple/visible/scrubbers, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"km" = ( +/obj/structure/cable/yellow{ + d1 = 0; + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/computer/monitor/secret, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"ko" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kq" = ( +/obj/machinery/alarm/syndicate{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/vending/coffee/free, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kr" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/bar) +"ks" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"kt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"ku" = ( +/turf/simulated/floor/plasteel/white/side, +/area/ruin/unpowered/syndicate_lava_base/main) +"kv" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side, +/area/ruin/unpowered/syndicate_lava_base/main) +"kw" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/gloves/combat{ + pixel_y = -6 + }, +/obj/item/tank/emergency_oxygen{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -2; + pixel_y = 4 + }, +/turf/simulated/floor/plasteel/white/side, +/area/ruin/unpowered/syndicate_lava_base/main) +"kx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ky" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kz" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/visible/supply, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kB" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kC" = ( +/obj/machinery/computer/general_air_control/large_tank_control{ + dir = 8; + frequency = 1442; + name = "Nitrogen Supply Control"; + output_tag = "syndie_lavaland_n2_out"; + sensors = list("syndie_lavaland_n2_sensor" = "Tank") + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kD" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kG" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/cans/beer, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kH" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kJ" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kK" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kM" = ( +/obj/machinery/firealarm/syndicate{ + dir = 4; + pixel_x = 26 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/cigarette/syndicate/free, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink/kitchen{ + pixel_y = 28 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kP" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/decal/cleanable/dirt, +/obj/item/soap/syndie, +/obj/item/mop, +/obj/item/reagent_containers/glass/bucket, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"kQ" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"kR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay" + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"kS" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay" + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"kT" = ( +/obj/structure/sign/redcross, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"kV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/smes/engineering, +/obj/structure/cable/yellow, +/obj/structure/sign/electricshock{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/power/smes/engineering, +/obj/structure/cable/yellow, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lf" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/firealarm/syndicate{ + dir = 8; + pixel_x = -26 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lg" = ( +/obj/structure/chair/stool/bar, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lh" = ( +/obj/structure/table/wood, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"li" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck/syndicate{ + pixel_x = -6; + pixel_y = 6 + }, +/turf/simulated/floor/wood{ + icon_state = "wood-broken4" + }, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lj" = ( +/obj/machinery/door/window/southleft{ + base_state = "right"; + dir = 1; + icon_state = "right"; + name = "Bar" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lk" = ( +/obj/structure/table/wood, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = 30 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/shaker, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"ll" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/reagent_dispensers/beerkeg, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lm" = ( +/obj/structure/closet/secure_closet/medical1{ + req_access = null; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/defibrillator, +/turf/simulated/floor/plasteel/white/side{ + dir = 9 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"ln" = ( +/turf/simulated/floor/plasteel/white/side{ + dir = 1 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lo" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/masks{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/storage/box/gloves{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 5 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + d2 = 4; + icon_state = "0-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lu" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/pump, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lw" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating{ + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface; + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors) +"ly" = ( +/obj/structure/chair/stool/bar, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lz" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/glass/rag{ + pixel_x = -4; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/drinks/cans/beer{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lA" = ( +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lC" = ( +/obj/structure/table/wood, +/obj/machinery/reagentgrinder, +/obj/item/kitchen/rollingpin, +/obj/item/kitchen/knife{ + pixel_x = 6 + }, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lE" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lF" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/closet/crate, +/obj/item/vending_refill/snack{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/vending_refill/snack{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/vending_refill/coffee, +/obj/item/vending_refill/cola, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lG" = ( +/obj/structure/table, +/obj/item/storage/box/syringes, +/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 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lH" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/corner{ + dir = 1 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lI" = ( +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lJ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lK" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + pixel_x = -4; + pixel_y = -4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/firstaid/fire{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 4 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lL" = ( +/obj/machinery/alarm/syndicate{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/stack/sheet/mineral/plastitanium{ + amount = 30 + }, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lM" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lP" = ( +/obj/machinery/computer/general_air_control/large_tank_control{ + dir = 8; + frequency = 1442; + name = "Oxygen Supply Control"; + output_tag = "syndie_lavaland_o2_out"; + sensors = list("syndie_lavaland_o2_sensor" = "Tank") + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lS" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 9 + }, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) +"lU" = ( +/obj/machinery/alarm/syndicate{ + dir = 4; + pixel_x = -24 + }, +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lV" = ( +/obj/structure/chair/stool/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lW" = ( +/obj/structure/table/wood, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lX" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"ma" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door/airlock{ + name = "Bar Storage"; + req_access_txt = "150" + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mc" = ( +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 2 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance{ + req_access = null + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"md" = ( +/obj/machinery/sleeper/syndie{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"me" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mf" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/machinery/alarm/syndicate{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mg" = ( +/obj/machinery/firealarm/syndicate{ + dir = 8; + pixel_x = -26 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/rpd{ + pixel_y = 3 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mh" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/binary/pump{ + dir = 8; + name = "O2 to Incinerator" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mn" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mo" = ( +/turf/simulated/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mp" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id_tag = "lavalandsyndi_telecomms" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mr" = ( +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"mt" = ( +/obj/machinery/computer/arcade/orion_trail, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mu" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-22" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mv" = ( +/obj/structure/table/wood, +/obj/machinery/light/small, +/obj/structure/cable/yellow, +/obj/machinery/power/apc/syndicate{ + dir = 2; + name = "Bar APC"; + pixel_y = -24 + }, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mw" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mx" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/simulated/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"my" = ( +/obj/structure/closet/secure_closet/freezer/fridge/open, +/obj/item/reagent_containers/food/condiment/enzyme, +/obj/item/reagent_containers/food/snacks/chocolatebar, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mz" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"mA" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/machinery/firealarm/syndicate{ + dir = 8; + pixel_x = -26 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 8 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mD" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mE" = ( +/obj/structure/table/reinforced, +/obj/item/scalpel, +/obj/item/circular_saw{ + pixel_y = 9 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 4 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mF" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27; + pixel_y = 1 + }, +/obj/structure/chair/stool, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mG" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mK" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/general_air_control/large_tank_control{ + dir = 1; + frequency = 1442; + name = "Toxins Supply Control"; + output_tag = "syndie_lavaland_tox_out"; + sensors = list("syndie_lavaland_tox_sensor" = "Tank") + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mM" = ( +/turf/simulated/floor/greengrid, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mN" = ( +/obj/structure/sign/securearea, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mP" = ( +/obj/structure/filingcabinet/security, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mQ" = ( +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mR" = ( +/obj/structure/table, +/obj/item/storage/toolbox/syndicate, +/obj/item/multitool, +/obj/machinery/door_control{ + id = "lavalandsyndi_telecomms"; + name = "Telecomms Blast Door Control"; + pixel_x = 26; + req_access_txt = "150" + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mT" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"mU" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mX" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/stack/cable_coil/yellow{ + pixel_x = 2; + pixel_y = -3 + }, +/obj/item/multitool, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"mY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side{ + dir = 4 + }, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"mZ" = ( +/obj/machinery/sleeper/syndie{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"na" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"nc" = ( +/obj/machinery/computer/turbine_computer{ + dir = 1; + id = "syndie_lavaland_incineratorturbine" + }, +/obj/machinery/door_control{ + id = "lavalandsyndi_incineratoroutput"; + name = "Incinerator Output Blast Door Control"; + pixel_x = -6; + pixel_y = -24; + req_access_txt = "150" + }, +/obj/machinery/door_control{ + id = "lavalandsyndi_incineratorinput"; + name = "Incinerator Input Blast Door Control"; + pixel_x = 6; + pixel_y = -24; + req_access_txt = "150" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"nd" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"nf" = ( +/obj/structure/sign/fire, +/turf/simulated/wall/mineral/plastitanium/coated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"nh" = ( +/obj/machinery/telecomms/relay/preset/ruskie{ + use_power = 0 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"ni" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nj" = ( +/obj/machinery/door/airlock/hatch{ + name = "Telecommunications Control"; + req_access_txt = "150" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nk" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nl" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nm" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/structure/noticeboard{ + dir = 8; + pixel_x = 27 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"no" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"np" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"ns" = ( +/obj/structure/closet/emcloset/anchored, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nt" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/syndicate{ + dir = 1; + name = "Arrival Hallway APC"; + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + d2 = 4; + icon_state = "0-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nv" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nw" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 2 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 4 + }, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nx" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay" + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"ny" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel/white/side{ + dir = 8 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"nz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"nA" = ( +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/simulated/floor/plasteel/white/corner, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"nB" = ( +/obj/structure/table/reinforced, +/obj/item/surgicaldrill, +/obj/effect/decal/cleanable/dirt, +/obj/item/bonegel, +/obj/item/bonesetter, +/obj/item/FixOVein, +/turf/simulated/floor/plasteel/white/side, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"nC" = ( +/obj/structure/table/reinforced, +/obj/item/retractor, +/obj/item/hemostat, +/obj/effect/decal/cleanable/dirt, +/obj/item/cautery, +/turf/simulated/floor/plasteel/white/side{ + dir = 6 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"nH" = ( +/obj/machinery/alarm/syndicate{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nI" = ( +/obj/machinery/computer/camera_advanced, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nJ" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nL" = ( +/obj/machinery/door/airlock/hatch{ + name = "Telecommunications"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nQ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nS" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/firealarm/syndicate{ + dir = 2; + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nU" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/alarm/syndicate{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nW" = ( +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nX" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nZ" = ( +/turf/simulated/floor/plasteel/white/side{ + dir = 4 + }, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"oa" = ( +/turf/simulated/floor/plasteel/white/side{ + dir = 10 + }, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"ob" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white/side, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"oh" = ( +/obj/machinery/firealarm/syndicate{ + dir = 8; + pixel_x = -26 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"oi" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"ok" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/cable/yellow, +/obj/machinery/power/apc/syndicate{ + dir = 2; + name = "Telecommunications APC"; + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"ol" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/rack{ + dir = 8 + }, +/obj/item/clothing/suit/space/syndicate, +/obj/item/clothing/mask/gas/syndicate, +/obj/item/clothing/head/helmet/space/syndicate, +/obj/item/mining_scanner, +/obj/item/pickaxe, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"om" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"on" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -29 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"oo" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"op" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"or" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/storage/belt/medical, +/obj/effect/decal/cleanable/dirt, +/obj/item/crowbar, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/accessory/stethoscope, +/turf/simulated/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"ou" = ( +/obj/machinery/computer/message_monitor{ + dir = 1 + }, +/obj/item/paper/monitorkey, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"ov" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"ox" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + id_tag = "lavalandsyndi_arrivals" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"oF" = ( +/obj/structure/sign/securearea, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"oP" = ( +/obj/structure/sign/chemistry, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"pQ" = ( +/obj/structure/sign/explosives/alt{ + pixel_x = 32 + }, +/turf/simulated/floor/redgrid, +/area/ruin/unpowered/syndicate_lava_base/main) +"qG" = ( +/obj/structure/sign/explosives/alt{ + pixel_x = -32 + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"vu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"yd" = ( +/obj/machinery/atmospherics/pipe/simple/visible/yellow, +/turf/simulated/wall/mineral/plastitanium/coated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"yU" = ( +/turf/simulated/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"Au" = ( +/turf/simulated/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"BF" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id_tag = "lavalandsyndi"; + name = "Syndicate Research Experimentation Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"Cg" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"CG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"DL" = ( +/obj/structure/sign/explosives/alt{ + pixel_x = 32 + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"Lg" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"LQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"RI" = ( +/turf/simulated/wall/mineral/plastitanium/coated, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"RV" = ( +/obj/structure/sign/fire, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Tp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"TC" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +ab +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(4,1,1) = {" +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mn +mn +mn +mn +mn +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(5,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mn +mo +mM +nh +mM +mn +mn +ab +ab +ab +ab +ab +ab +ab +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mn +mM +mM +ni +mM +mM +mn +ab +ab +ab +ab +ab +ab +aa +aa +"} +(7,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +eh +gj +eh +eh +eh +eh +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mn +mn +mN +nj +mn +mn +mn +ab +ab +ab +ab +ab +ab +ab +aa +"} +(8,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +eh +eG +ff +eI +aj +eh +eh +eh +eh +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mp +mP +cb +nH +oh +mn +mn +ab +ab +ab +ab +ab +ab +aa +"} +(9,1,1) = {" +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +eh +eH +fg +fy +gp +eI +am +ao +eh +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mp +mP +nk +nI +oi +ou +mn +ab +ab +ab +ab +ab +ab +ab +"} +(10,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +eh +eI +eI +eI +gq +gT +hq +hF +eh +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mp +mQ +nl +nJ +cf +ov +mn +ab +ab +ab +ab +ab +ab +ab +"} +(11,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +eh +eG +fh +eI +gr +eI +an +ar +eh +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mp +mR +nm +nK +ok +mn +mn +ab +ab +ab +ab +ab +ab +ab +"} +(12,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +eh +eH +fg +fz +gs +eh +gj +eh +eh +ab +ab +ab +ab +ab +ab +dG +dG +dG +dG +dG +dG +lS +mn +mn +mo +nL +mn +mn +ab +ab +ab +ab +ab +ab +ab +ab +"} +(13,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +eh +gj +eI +eI +gt +gU +hs +hH +ab +ab +ab +ab +ab +ab +dG +dG +ig +iu +iu +iu +bv +aZ +az +ba +nn +aE +mT +mT +ab +ab +ab +ab +ab +ab +ab +ab +"} +(14,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +eh +fi +fA +bV +gV +ht +hH +ab +ab +ab +ab +ab +dG +dG +ig +je +iv +jk +aw +lw +aZ +mr +bb +aD +nN +ol +mT +ab +ab +ab +ab +ab +ab +ab +ab +"} +(15,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ei +eJ +fj +fB +gv +ax +hu +hH +ab +ab +ab +ab +dG +dG +ig +je +jk +jx +jx +jy +jy +jy +aA +mT +no +nN +ol +mT +ab +ab +ab +ab +ab +ab +ab +ab +"} +(16,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ac +ab +ac +ac +ae +ae +ae +ae +fC +ad +aX +hv +hH +ab +ab +ab +dG +dG +ig +je +jk +jx +jx +kG +lf +bw +jy +jy +jP +np +aH +mT +mT +mT +oF +ab +ab +ab +ab +ab +ab +"} +(17,1,1) = {" +ab +ab +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +au +av +aL +fD +aI +eh +eh +eh +hW +dG +dG +dG +ig +je +iv +jx +jx +kn +kH +jN +jZ +lU +mt +mU +np +aN +aO +aP +aR +aG +aS +ab +ab +ab +ab +aa +"} +(18,1,1) = {" +ab +ab +ab +ab +ae +aL +aq +aq +qG +dc +aq +dQ +ek +eL +ae +fE +gy +bd +ay +aU +aC +bc +iu +iu +je +jk +jx +jx +jN +jZ +jN +jZ +jN +jZ +kn +mU +nq +nQ +mT +mT +mT +oF +ab +ab +ab +ab +ab +aa +"} +(19,1,1) = {" +ab +ab +ab +ab +ae +ap +aq +Lg +aq +Lg +aq +dR +el +eM +ae +fF +gz +aT +aB +hJ +aY +ih +iv +iM +iv +iv +jx +jL +jY +jN +bZ +lg +ly +lV +mu +mU +cc +nR +om +mT +ab +ab +ab +ab +ab +ab +aa +aa +"} +(20,1,1) = {" +aa +ab +ab +ab +ae +aq +aq +aF +aq +aF +aq +ae +bU +eN +ae +ae +aJ +ha +ha +aV +ha +ha +ha +ha +ha +ha +jy +jM +jN +jZ +kJ +lh +lz +lW +mv +jy +jy +nS +on +mT +ab +ab +ab +ab +ab +ab +ab +aa +"} +(21,1,1) = {" +aa +ab +ab +ab +ae +aq +aq +Tp +aq +Cg +aq +dS +eo +eO +fk +ae +aK +hb +ha +iN +ha +ii +iw +iO +hB +jl +jz +jN +jZ +ko +kK +li +lA +lX +mw +ah +jy +nu +oo +ox +ab +ab +ab +ab +ab +ab +ab +ab +"} +(22,1,1) = {" +aa +ab +ab +ab +ae +ap +aq +CG +vu +TC +LQ +BF +ep +eP +fl +fG +gE +hc +hx +hL +hZ +ij +ix +iP +hd +jm +jz +jO +jN +kp +kL +lj +lB +lY +lA +ai +jP +nT +op +ox +ab +ab +ab +ab +ab +ab +ab +ab +"} +(23,1,1) = {" +aa +ab +ab +ab +ae +ae +aq +aq +DL +di +aq +dS +eq +eQ +ae +dQ +gF +hd +hy +hy +ia +ik +if +iQ +hz +hz +jP +jy +ka +kq +kM +lk +lC +lZ +mx +jy +jy +nU +oo +ox +ab +ab +ab +ab +ab +ab +ab +ab +"} +(24,1,1) = {" +aa +ab +ab +ab +ab +ae +ae +ae +ae +ae +aL +ae +ae +ae +oP +fH +gG +he +hz +hz +hz +hz +iy +iR +hz +jn +jA +jy +jy +jy +jy +jy +ak +ma +jy +jy +ns +nV +oo +ox +ab +ab +ab +ab +ab +ab +ab +ab +"} +(25,1,1) = {" +aa +ab +ab +ab +ab +ab +ac +ac +as +do +dA +dT +er +eR +fm +fI +gH +he +hz +hM +ib +hz +iz +iS +jf +jo +jB +hz +kb +jy +kN +jZ +lE +mb +my +jy +nt +nW +aW +mT +ab +ab +ab +ab +ab +ab +ab +ab +"} +(26,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +as +as +du +dB +dU +es +eS +fn +fO +gG +hf +hz +hN +ic +il +iA +iT +hz +hz +hz +hz +kc +kr +kO +ll +lF +mc +jy +jy +nu +nX +oo +mT +ab +ab +ab +ab +ab +ab +ab +ab +"} +(27,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +at +aM +dv +dC +bI +et +eT +fo +fO +gG +hg +hz +hz +hz +hz +iB +iU +jg +jp +jp +jQ +kd +jy +jy +jy +jy +jy +jy +mX +nv +aQ +mT +mT +ab +ab +ab +ab +ab +ab +ab +aa +"} +(28,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +at +cA +dw +dC +dX +eu +eU +fn +fH +gG +he +hA +hO +id +im +bX +iV +hz +hz +hz +hz +ke +jQ +jQ +jQ +jp +jp +mz +mY +nw +nZ +mT +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(29,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +at +cG +dx +dE +dY +ev +eV +fp +fH +gI +he +hz +hz +hz +hz +iD +iW +jh +jo +jC +hz +kf +ks +kP +kQ +kQ +kQ +kQ +kT +nx +kR +kQ +kQ +ab +ab +ab +ab +ab +ab +ab +ab +"} +(30,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +as +as +as +dI +dZ +ew +as +yU +as +gJ +hh +hz +hP +ic +in +iE +iX +hz +jq +jA +hz +kg +kt +kQ +bT +lG +md +mA +mZ +ny +oa +or +kQ +ab +ab +ab +ab +ab +ab +ab +ab +"} +(31,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ac +as +as +as +as +as +fq +dy +gK +he +hz +hQ +ie +hz +iF +iY +hz +hO +hz +hz +kh +ha +kQ +lm +lH +me +mB +na +nz +ob +al +kQ +ab +ab +ab +ab +ab +ab +ab +ab +"} +(32,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ac +dy +dK +ea +ex +eW +fr +fW +gL +he +hz +hz +hz +hz +hz +hz +hz +jr +jD +jR +iQ +ku +kR +ln +lI +lI +mC +lI +nA +cd +kQ +kQ +ac +ab +ab +ab +ab +ab +ab +ab +"} +(33,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +dy +dL +eb +ey +eX +fs +fa +gM +hi +hB +hB +hB +ag +iG +iZ +ji +js +jE +jS +ki +kv +kS +ln +lJ +mf +mD +lI +nB +kQ +kQ +ac +ab +ab +ab +ab +ab +ab +ab +ab +"} +(34,1,1) = {" +aa +aa +aa +ab +ab +ab +ab +ab +ab +dy +dM +ec +ez +eY +ft +dP +gN +hj +hj +hR +af +ip +iH +ja +bY +jj +gI +if +kj +kw +kT +lo +lK +kQ +mE +bR +nC +kQ +ac +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(35,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +dy +dy +ed +ey +eZ +dy +dy +gO +hk +hC +dy +ha +ce +iI +iq +ha +jt +jF +jT +ju +ju +ju +ju +ju +Au +ju +ju +RI +RI +RI +RI +RI +ab +ab +ab +ab +ab +ab +ab +"} +(36,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ac +dy +dy +eA +fa +dy +fY +gP +gQ +hl +hS +ha +ir +iJ +jb +ha +ju +jG +jU +ju +kx +kV +lp +lL +mg +mF +nc +RI +bg +RI +bQ +RI +RI +nf +ab +ab +ab +ab +aa +"} +(37,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +dy +bk +eB +fb +fu +gb +gQ +hl +bW +bS +ha +bx +iK +jc +ha +jv +jH +jV +ju +ky +kW +lq +lM +mh +mG +nd +bf +bh +bj +cp +cs +ct +cu +ab +ab +ab +ab +ab +"} +(38,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +dy +ef +eC +fc +fv +fv +gR +gQ +hl +hU +ha +it +pQ +jd +ha +jw +jI +jW +kk +kz +by +bC +bF +ca +bL +bO +yd +bi +yd +cq +RI +RI +nf +ab +ab +ab +ab +ab +"} +(39,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +dy +eg +eD +fd +bl +bm +gS +hn +gQ +hV +ha +ha +ha +ha +ha +ju +jJ +kl +kl +be +bz +bD +bG +mj +bM +RV +RI +RI +RI +cr +nf +ab +ab +ab +ab +ab +ab +ab +"} +(40,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +dy +dP +eE +fe +dy +bn +dy +ho +hD +dy +dy +ac +ab +ab +ab +ac +jK +ju +km +kB +br +bE +bH +bJ +bN +bP +cl +cn +RI +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(41,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +dy +eF +eF +dy +bo +dy +eF +eF +dy +ab +ab +ab +ab +ab +ab +ab +ju +ju +kC +bA +lu +lP +bK +mK +kD +cm +co +RI +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(42,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +dy +gg +dy +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ju +kD +bB +Au +kD +bB +ju +ju +ju +ju +RI +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(43,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +fx +bp +fx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ju +bs +bu +ju +ch +cj +ju +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(44,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +bq +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ju +bt +cg +ju +ci +ck +ju +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(45,1,1) = {" +aa +aa +aa +ab +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ju +ju +ju +ju +ju +ju +ju +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(46,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(47,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(48,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +"} 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/abandonedzoo.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm index 7411218a3f0..805f97b6784 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -81,11 +81,11 @@ /turf/simulated/mineral, /area/ruin/unpowered) "ai" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "aj" = ( /obj/structure/flora/rock, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "ak" = ( /obj/structure/grille, @@ -123,7 +123,7 @@ /mob/living/simple_animal/hostile/asteroid/goldgrub{ will_burrow = 0 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "aq" = ( /obj/structure/flora/ausbushes/grassybush, @@ -131,11 +131,11 @@ /area/ruin/unpowered) "ar" = ( /obj/structure/flora/rock/pile, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "as" = ( /mob/living/simple_animal/hostile/asteroid/basilisk, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "at" = ( /turf/simulated/wall/r_wall, @@ -152,7 +152,7 @@ "aw" = ( /obj/structure/flora/rock, /obj/machinery/light, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "ax" = ( /obj/structure/table/reinforced, @@ -315,7 +315,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aL" = ( /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -356,7 +356,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "aR" = ( /obj/machinery/light/small{ dir = 4 @@ -414,7 +414,7 @@ }, /area/ruin/unpowered) "aV" = ( -/obj/machinery/smartfridge/chemistry, +/obj/machinery/smartfridge/secure/chemistry, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -754,7 +754,7 @@ "bK" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "bL" = ( /obj/machinery/light/small{ dir = 8 @@ -781,7 +781,7 @@ "bP" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bQ" = ( /obj/machinery/shieldwallgen{ active = 2; @@ -803,7 +803,7 @@ }, /obj/structure/disposaloutlet, /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "bS" = ( /obj/structure/cable{ d1 = 1; @@ -828,11 +828,11 @@ "bV" = ( /obj/machinery/shieldwallgen, /turf/space, -/area/space) +/area/space/nearstation) "bW" = ( /obj/item/shard, /turf/space, -/area/space) +/area/space/nearstation) (1,1,1) = {" aa diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm index 13940514cd3..5dae1cf1452 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm @@ -3,7 +3,7 @@ /turf/space, /area/space) "b" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "c" = ( /turf/simulated/mineral/random/high_chance, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm index 74a44f8c95d..aace1d84625 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm @@ -3,7 +3,7 @@ /turf/space, /area/space) "b" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "c" = ( /turf/simulated/mineral, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm index d16d388f122..a569b957ebf 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm @@ -3,7 +3,7 @@ /turf/space, /area/space) "b" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "c" = ( /turf/simulated/mineral, @@ -13,11 +13,11 @@ /area/ruin/unpowered) "e" = ( /obj/effect/decal/remains/human, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "f" = ( /obj/item/pickaxe/diamond, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) (1,1,1) = {" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm index 3e3528b408f..fb51d7aabc1 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm @@ -9,7 +9,7 @@ /turf/simulated/mineral/random/high_chance, /area/ruin/unpowered) "d" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "e" = ( /turf/simulated/mineral/clown, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm index 84147acbe65..aae4ff9e9c7 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm @@ -9,7 +9,7 @@ /turf/simulated/mineral/random/high_chance, /area/ruin/unpowered) "d" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) (1,1,1) = {" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm index 30afb132426..a998609e8d5 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm @@ -868,7 +868,7 @@ /turf/simulated/floor/plating, /area/ruin/unpowered) "ce" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) (1,1,1) = {" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm index dbe0bc5d16c..95ad761e62c 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm @@ -9,7 +9,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "c" = ( /obj/machinery/door/airlock/external, /turf/simulated/floor/plating, @@ -21,7 +21,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "e" = ( /obj/structure/window/reinforced{ tag = "icon-rwindow (EAST)"; @@ -65,7 +65,7 @@ "k" = ( /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "l" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -113,7 +113,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "q" = ( /obj/machinery/light/small{ tag = "icon-bulb1 (WEST)"; diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm index 78054b180c1..be313cd7770 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm @@ -11,12 +11,12 @@ "d" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "e" = ( /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) (1,1,1) = {" a diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm index 8391071697d..1c7d14bd6fa 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm @@ -6,7 +6,7 @@ /turf/simulated/mineral, /area/ruin/unpowered) "c" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "d" = ( /turf/simulated/mineral/random/high_chance, @@ -22,40 +22,24 @@ /turf/simulated/floor/plating/airless, /area/ruin/unpowered) "h" = ( -/turf/simulated/floor/plasteel/airless{ - icon_plating = "plating"; - icon_regular_floor = "shuttlefloor"; - icon_state = "shuttlefloor" - }, +/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 }, -/turf/simulated/floor/plasteel/airless{ - icon_plating = "plating"; - icon_regular_floor = "shuttlefloor"; - icon_state = "shuttlefloor" - }, +/obj/structure/chair/comfy/shuttle, +/turf/simulated/floor/mineral/titanium/blue, /area/ruin/unpowered) "j" = ( -/obj/structure/chair, -/turf/simulated/floor/plasteel/airless{ - icon_plating = "plating"; - icon_regular_floor = "shuttlefloor"; - icon_state = "shuttlefloor" - }, +/obj/structure/chair/comfy/shuttle, +/turf/simulated/floor/mineral/titanium/blue, /area/ruin/unpowered) "k" = ( /obj/effect/spawner/lootdrop/crate_spawner, -/turf/simulated/floor/plasteel/airless{ - icon_plating = "plating"; - icon_regular_floor = "shuttlefloor"; - icon_state = "shuttlefloor" - }, +/turf/simulated/floor/mineral/titanium/blue, /area/ruin/unpowered) "l" = ( /obj/structure/shuttle/engine/propulsion{ @@ -63,16 +47,14 @@ icon_state = "propulsion"; tag = "icon-propulsion (WEST)" }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/ruin/unpowered) "m" = ( /obj/item/shard, /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, @@ -83,42 +65,28 @@ /area/ruin/unpowered) "p" = ( /obj/structure/table, -/turf/simulated/floor/plasteel/airless{ - icon_plating = "plating"; - icon_regular_floor = "shuttlefloor"; - icon_state = "shuttlefloor" - }, +/turf/simulated/floor/mineral/titanium/blue, /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/plasteel/airless{ - icon_plating = "plating"; - icon_regular_floor = "shuttlefloor"; - icon_state = "shuttlefloor" - }, +/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 }, -/turf/simulated/floor/plasteel/airless{ - icon_plating = "plating"; - icon_regular_floor = "shuttlefloor"; - icon_state = "shuttlefloor" +/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/derelict5.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm index c7fc01bccd8..ff8a5ac4cc2 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm @@ -7,9 +7,9 @@ /area/ruin/unpowered) "c" = ( /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "d" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "e" = ( /turf/simulated/wall, @@ -58,15 +58,15 @@ "p" = ( /obj/structure/barricade/wooden, /obj/machinery/door/airlock/external, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "q" = ( /obj/machinery/door/airlock/external, /turf/simulated/floor/plating, /area/ruin/unpowered) "r" = ( -/turf/simulated/floor/plating/airless/asteroid, -/area/space) +/turf/simulated/floor/plating/asteroid/airless, +/area/space/nearstation) (1,1,1) = {" a diff --git a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm index 91bbd366b48..a993ab96190 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm @@ -27,7 +27,7 @@ icon_state = "propulsion"; tag = "icon-propulsion (EAST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/ruin/powered) "f" = ( /obj/structure/window/reinforced{ @@ -38,7 +38,7 @@ icon_state = "heater"; dir = 8 }, -/turf/simulated/floor/plating, +/turf/simulated/shuttle/plating, /area/ruin/powered) "g" = ( /obj/structure/table/wood, @@ -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/listeningpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm index 5316bd3da6e..22d4c0798aa 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm @@ -9,10 +9,10 @@ /turf/simulated/mineral, /area/ruin/unpowered) "d" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "e" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/powered) "f" = ( /turf/simulated/wall/r_wall, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm index 98168731154..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, @@ -171,7 +169,7 @@ "D" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "E" = ( /obj/item/stack/rods, /turf/simulated/floor/plating/airless, @@ -205,7 +203,7 @@ "K" = ( /obj/item/stack/sheet/metal, /turf/space, -/area/space) +/area/space/nearstation) "L" = ( /obj/effect/decal/mecha_wreckage/gygax, /turf/simulated/shuttle/floor{ @@ -215,7 +213,7 @@ /area/ruin/powered) "M" = ( /turf/unsimulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "N" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall14"; @@ -231,7 +229,7 @@ "P" = ( /obj/item/stack/rods, /turf/space, -/area/space) +/area/space/nearstation) "Q" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall15"; @@ -240,7 +238,7 @@ /area/ruin/powered) "R" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/ruin/powered) (1,1,1) = {" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm index 8ce28e665a2..3ba27975660 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm @@ -753,7 +753,7 @@ /turf/simulated/floor/plasteel, /area/ruin/space/ancientstation) "cg" = ( -/obj/effect/decal/cleanable/deadcockroach, +/obj/effect/decal/cleanable/insectguts, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -781,8 +781,8 @@ /turf/simulated/floor/plating, /area/ruin/space/ancientstation/deltacorridor) "ck" = ( +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "cl" = ( /obj/structure/transit_tube/station/reverse, @@ -1819,8 +1819,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "eL" = ( /obj/machinery/light{ @@ -3002,8 +3002,8 @@ d2 = 2; icon_state = "1-2" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "hg" = ( /obj/effect/decal/cleanable/dirt, @@ -3130,8 +3130,8 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "ht" = ( /obj/structure/cable{ @@ -3310,8 +3310,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "hK" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -3722,8 +3722,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "iC" = ( /obj/structure/cable{ @@ -3831,8 +3831,8 @@ d2 = 2; icon_state = "1-2" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating, -/turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "iP" = ( /obj/structure/cable/yellow{ @@ -3840,8 +3840,8 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating, -/turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "iQ" = ( /obj/machinery/light/small, @@ -4135,8 +4135,8 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "jx" = ( /obj/effect/decal/cleanable/cobweb, @@ -4428,7 +4428,7 @@ /area/ruin/space/ancientstation) "ke" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/deadcockroach, +/obj/effect/decal/cleanable/insectguts, /turf/simulated/floor/plasteel, /area/ruin/space/ancientstation) "kf" = ( @@ -4488,8 +4488,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "km" = ( /obj/structure/cable{ @@ -4584,8 +4584,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating, -/turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "kw" = ( /obj/machinery/atmospherics/unary/vent_pump{ @@ -4816,8 +4816,8 @@ /turf/simulated/floor/plating, /area/ruin/space/ancientstation/deltacorridor) "kZ" = ( +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating, -/turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "la" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ diff --git a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm index 9a43faaf8ed..8f19d1cc390 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm @@ -11,7 +11,7 @@ tag = "" }, /turf/space, -/area/space) +/area/space/nearstation) "ac" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -21,7 +21,7 @@ tag = "" }, /turf/space, -/area/space) +/area/space/nearstation) "ad" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -30,7 +30,7 @@ icon_state = "2-8" }, /turf/space, -/area/space) +/area/space/nearstation) "ae" = ( /obj/structure/lattice, /obj/item/stack/cable_coil/cut{ @@ -39,7 +39,7 @@ icon_state = "coil_red2" }, /turf/space, -/area/space) +/area/space/nearstation) "af" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -49,7 +49,7 @@ tag = "" }, /turf/space, -/area/space) +/area/space/nearstation) "ag" = ( /turf/simulated/wall, /area/ruin/onehalf/dorms_med) @@ -66,7 +66,7 @@ icon_state = "1-2" }, /turf/space, -/area/space) +/area/space/nearstation) "aj" = ( /turf/unsimulated/floor/plating/airless, /area/ruin/onehalf/hallway) @@ -155,7 +155,7 @@ "aw" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ax" = ( /obj/structure/lattice, /turf/space, @@ -806,7 +806,7 @@ "bU" = ( /obj/item/stack/sheet/metal, /turf/space, -/area/space) +/area/space/nearstation) "bV" = ( /obj/structure/disposalpipe/segment, /obj/item/stack/rods, @@ -903,11 +903,11 @@ "ck" = ( /obj/structure/girder/reinforced, /turf/unsimulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cl" = ( /obj/effect/landmark/damageturf, /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "cm" = ( /obj/structure/lattice, /obj/structure/disposalpipe/segment{ @@ -926,7 +926,7 @@ icon_state = "small" }, /turf/space, -/area/space) +/area/space/nearstation) "co" = ( /obj/structure/grille, /obj/structure/window/full/reinforced, @@ -1009,15 +1009,15 @@ "cv" = ( /obj/item/stack/rods, /turf/space, -/area/space) +/area/space/nearstation) "cw" = ( /turf/unsimulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cx" = ( /obj/structure/lattice, /obj/item/stack/sheet/plasteel, /turf/space, -/area/space) +/area/space/nearstation) "cy" = ( /obj/structure/lattice, /obj/item/shard{ @@ -1072,7 +1072,7 @@ "cE" = ( /obj/item/stack/tile/wood, /turf/space, -/area/space) +/area/space/nearstation) "cF" = ( /turf/space, /area/ruin/onehalf/hallway) @@ -1162,7 +1162,7 @@ "cR" = ( /obj/item/stack/sheet/plasteel, /turf/space, -/area/space) +/area/space/nearstation) "cS" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -1223,7 +1223,7 @@ icon_state = "2-8" }, /turf/space, -/area/space) +/area/space/nearstation) "db" = ( /obj/structure/table, /obj/item/flashlight, @@ -1258,12 +1258,12 @@ icon_state = "1-2" }, /turf/space, -/area/space) +/area/space/nearstation) "dg" = ( /obj/structure/girder/reinforced, /obj/item/stack/sheet/plasteel, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dj" = ( /obj/structure/grille, /obj/item/shard, @@ -1352,7 +1352,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "dp" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -1368,7 +1368,7 @@ }, /obj/item/stack/rods, /turf/space, -/area/space) +/area/space/nearstation) "dq" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -1384,7 +1384,7 @@ tag = "" }, /turf/space, -/area/space) +/area/space/nearstation) (1,1,1) = {" aa diff --git a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm index 54e511a4373..108c8103975 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm @@ -4,10 +4,10 @@ /area/space) "ab" = ( /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "ac" = ( -/turf/simulated/floor/plating/airless/asteroid, -/area/space) +/turf/simulated/floor/plating/asteroid/airless, +/area/space/nearstation) "ad" = ( /obj/structure/grille, /obj/structure/window/full/reinforced, @@ -22,18 +22,18 @@ /turf/simulated/floor/plating, /area/ruin/powered) "ag" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/powered) "ah" = ( /obj/structure/grille, /obj/structure/window/full/reinforced, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/powered) "ai" = ( /turf/simulated/mineral, /area/ruin/powered) "aj" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/shuttle/wall{ icon_state = "swall_f6"; dir = 2 @@ -45,7 +45,7 @@ /turf/simulated/floor/plating, /area/ruin/powered) "al" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/shuttle/wall{ dir = 2; icon_state = "swall_f10"; @@ -64,7 +64,7 @@ }, /area/ruin/powered) "ao" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, @@ -443,7 +443,7 @@ /area/ruin/powered) "bp" = ( /obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 @@ -465,7 +465,7 @@ /area/ruin/powered) "bs" = ( /obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/shuttle/wall{ icon_state = "swall_f9"; dir = 2 diff --git a/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm index dd00d8bd38d..96e43773146 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm @@ -5,7 +5,7 @@ "b" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "c" = ( /obj/structure/grille, /turf/simulated/floor/plating, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm b/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm index ac0ee70f0bb..b0613eef965 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm @@ -6,13 +6,13 @@ /turf/simulated/mineral/random, /area/ruin/unpowered/no_grav/way_home) "c" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered/no_grav/way_home) "d" = ( /obj/structure/signpost{ name = "salvation" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered/no_grav/way_home) (1,1,1) = {" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm index 17d88dcc3bd..67adb3e7467 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm @@ -3,7 +3,7 @@ /turf/space, /area/space) "ab" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) "ac" = ( /turf/simulated/mineral, @@ -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" @@ -498,11 +498,11 @@ /area/ruin/unpowered) "bG" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/ruin/unpowered) "bH" = ( /turf/simulated/wall/mineral/titanium, -/area/space) +/area/space/nearstation) "bI" = ( /obj/structure/window/reinforced, /turf/simulated/floor/mineral/plasma, diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm index 37406781007..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" = ( @@ -264,7 +266,7 @@ "aP" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "aQ" = ( /obj/machinery/door/airlock/gold{ locked = 1 @@ -1365,7 +1367,7 @@ /turf/simulated/floor/plasteel, /area/awaymission/academy/classrooms) "dZ" = ( -/obj/machinery/igniter, +/obj/machinery/igniter/on, /turf/simulated/floor/plating, /area/awaymission/academy/classrooms) "ea" = ( @@ -1517,7 +1519,7 @@ "et" = ( /obj/singularity/academy, /turf/space, -/area/space) +/area/space/nearstation) "eu" = ( /obj/structure/window/reinforced{ dir = 8 @@ -3716,9 +3718,9 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "jz" = ( -/obj/machinery/igniter, +/obj/machinery/igniter/on, /turf/simulated/floor/plating, /area/awaymission/academy/academyaft) "jA" = ( @@ -4490,12 +4492,7 @@ /turf/simulated/floor/plasteel{ icon_state = "hydrofloor" }, -/area/space) -"lu" = ( -/turf/simulated/floor/plasteel{ - icon_state = "hydrofloor" - }, -/area/space) +/area/awaymission/academy/academyaft) "lv" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5; @@ -4504,7 +4501,7 @@ /turf/simulated/floor/plasteel{ icon_state = "hydrofloor" }, -/area/space) +/area/awaymission/academy/academyaft) "lw" = ( /obj/machinery/door/poddoor/shutters{ dir = 2; @@ -4563,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 @@ -13949,9 +13952,9 @@ ab aj ao au -ax +vq ah -ax +vq ah ah ah @@ -15432,10 +15435,10 @@ hM lp hp hp -lu -lu -lu -lu +hp +hp +hp +hp hp hp gZ @@ -15564,8 +15567,8 @@ lq lr lt lv -lu -lu +hp +hp hp hp gZ diff --git a/_maps/map_files/RandomZLevels/beach.dmm b/_maps/map_files/RandomZLevels/beach.dmm index 76a7da40fb1..2931d7175b7 100644 --- a/_maps/map_files/RandomZLevels/beach.dmm +++ b/_maps/map_files/RandomZLevels/beach.dmm @@ -6,7 +6,7 @@ /turf/unsimulated/beach/water/deep, /area/awaymission/undersea) "ac" = ( -/obj/machinery/poolcontroller/seacontroller, +/obj/machinery/poolcontroller/invisible/sea, /turf/unsimulated/beach/water/deep, /area/awaymission/undersea) "ad" = ( @@ -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, @@ -1494,6 +1494,10 @@ /obj/structure/closet/crate, /turf/unsimulated/beach/sand, /area/awaymission/beach) +"LZ" = ( +/obj/machinery/poolcontroller/invisible, +/turf/unsimulated/beach/water/deep, +/area/awaymission/beach) (1,1,1) = {" aa @@ -15371,7 +15375,7 @@ du du du du -du +LZ "} (55,1,1) = {" aa diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm index 61be7cb48ef..77e09164224 100644 --- a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm +++ b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm @@ -6,17 +6,17 @@ /turf/simulated/mineral/random/high_chance, /area/awaymission) "ac" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaymission) "ad" = ( /obj/effect/mob_spawn/human/doctor, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaymission) "ae" = ( /obj/item/circular_saw, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "af" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall12"; @@ -46,7 +46,7 @@ "aj" = ( /mob/living/simple_animal/hostile/carp, /turf/space, -/area/space) +/area/space/nearstation) "ak" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall12"; @@ -97,7 +97,7 @@ "as" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "at" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -1499,10 +1499,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/simulated/floor/plasteel/airless{ - tag = "icon-engine"; - icon_state = "engine" - }, +/turf/simulated/shuttle/plating, /area/awaymission/BMPship/Aft) "ec" = ( /obj/structure/shuttle/engine/propulsion{ @@ -1510,7 +1507,7 @@ icon_state = "propulsion"; tag = "icon-propulsion (WEST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/BMPship/Aft) "ed" = ( /obj/item/multitool, @@ -1937,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{ @@ -2629,14 +2626,6 @@ }, /turf/simulated/floor/engine, /area/awaymission/BMPship/Aft) -"gy" = ( -/turf/space, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f5"; - icon_state = "swall_f5"; - dir = 2 - }, -/area/space) "gz" = ( /obj/item/shard, /obj/effect/landmark/damageturf, @@ -3007,7 +2996,7 @@ /turf/simulated/floor/plating/airless, /area/awaymission/BMPship/Fore) "hC" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaymission/BMPship/Fore) "hD" = ( /obj/structure/rack, @@ -3017,7 +3006,7 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaymission/BMPship/Fore) "hF" = ( /turf/simulated/shuttle/wall, @@ -3174,7 +3163,7 @@ /obj/effect/landmark{ name = "awaystart" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaymission) "ic" = ( /obj/structure/bed, @@ -3276,7 +3265,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "ip" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall13"; @@ -3423,7 +3412,7 @@ /turf/simulated/floor/plating, /area/awaymission) "iM" = ( -/turf/simulated/mineral/random/high_chance_clown, +/turf/simulated/mineral/random/high_chance/clown, /area/awaymission) "iN" = ( /obj/effect/decal/cleanable/blood, @@ -3455,7 +3444,7 @@ /area/awaymission) "iS" = ( /mob/living/simple_animal/hostile/carp, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaymission) "iT" = ( /turf/simulated/floor/plating, @@ -3525,12 +3514,6 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/simulated/floor/plating, /area/awaymission) -"jf" = ( -/turf/space, -/area/crew_quarters/bar) -"jg" = ( -/turf/space, -/area/exploration/methlab) "jh" = ( /obj/machinery/door_control{ id = "packerMed"; @@ -9823,7 +9806,7 @@ eW fF ee aW -gy +gg aa aa gP @@ -14001,7 +13984,7 @@ aa aa aa aa -jf +aa aa aa aa @@ -14392,11 +14375,11 @@ aa aa aa aa -jg -jg -jg -jg -jg +aa +aa +aa +aa +aa aa aa aa @@ -14521,12 +14504,12 @@ aa aa aa aa -jg -jg -jg -jg -jg -jg +aa +aa +aa +aa +aa +aa aa aa aa @@ -14651,13 +14634,13 @@ aa aa aa aa -jg -jg -jg -jg -jg -jg -jg +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -14782,9 +14765,9 @@ aa aa aa aa -jg -jg -jg +aa +aa +aa aa aa aa @@ -14911,8 +14894,8 @@ aa aa aa aa -jg -jg +aa +aa aa aa aa @@ -15041,12 +15024,12 @@ aa aa aa aa -jg -jg -jg -jg -jg -jg +aa +aa +aa +aa +aa +aa aa aa aa @@ -15171,12 +15154,12 @@ aa aa aa aa -jg -jg -jg -jg -jg -jg +aa +aa +aa +aa +aa +aa aa aa aa @@ -15303,7 +15286,7 @@ aa aa aa aa -jg +aa aa aa aa diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm index bd6b40c51de..e64c25da157 100644 --- a/_maps/map_files/RandomZLevels/centcomAway.dmm +++ b/_maps/map_files/RandomZLevels/centcomAway.dmm @@ -483,7 +483,7 @@ "bm" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bn" = ( /turf/simulated/floor/plasteel{ icon_state = "vault"; @@ -1059,8 +1059,8 @@ pixel_x = 0; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/awaymission/centcomAway/maint) "cO" = ( /obj/structure/cable{ @@ -1082,8 +1082,8 @@ pixel_x = 0; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /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, @@ -1264,7 +1264,7 @@ pixel_y = 0 }, /turf/simulated/floor/plating, -/area/space) +/area/awaymission/centcomAway/maint) "dl" = ( /turf/simulated/shuttle/wall{ icon_state = "swallc1"; @@ -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 = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/awaymission/centcomAway/maint) "dV" = ( /obj/structure/closet/crate, @@ -1646,8 +1646,8 @@ pixel_y = 0; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/awaymission/centcomAway/maint) "ei" = ( /obj/structure/table, @@ -1694,8 +1694,8 @@ "eo" = ( /obj/structure/cable, /obj/machinery/power/tracker, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/awaymission/centcomAway/maint) "ep" = ( /obj/structure/table, @@ -1887,12 +1887,6 @@ icon_state = "floor" }, /area/awaymission/centcomAway/general) -"eP" = ( -/turf/space, -/area/awaycontent/a2{ - has_gravity = 1; - name = "MO19 Research" - }) "eQ" = ( /turf/simulated/shuttle/wall{ icon_state = "swall2"; @@ -1978,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" = ( @@ -2374,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; @@ -2973,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" = ( @@ -3595,20 +3585,6 @@ dir = 4 }, /area/awaymission/centcomAway/general) -"iZ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/space) "ja" = ( /obj/structure/grille, /obj/structure/window/reinforced, @@ -4096,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{ @@ -5213,7 +5189,7 @@ }, /area/awaymission/centcomAway/general) "mE" = ( -/obj/machinery/igniter, +/obj/machinery/igniter/on, /turf/simulated/floor/plasteel{ icon_state = "floor" }, @@ -5805,8 +5781,8 @@ icon_state = "propulsion_r"; dir = 1 }, -/turf/space, -/area/space) +/turf/simulated/shuttle/plating, +/area/awaymission/centcomAway/thunderdome) "nV" = ( /obj/machinery/light, /turf/simulated/floor/plasteel{ @@ -5818,15 +5794,15 @@ icon_state = "propulsion_l"; dir = 1 }, -/turf/space, -/area/space) +/turf/simulated/shuttle/plating, +/area/awaymission/centcomAway/thunderdome) "nX" = ( /obj/structure/shuttle/engine/propulsion{ icon_state = "propulsion"; dir = 1 }, -/turf/space, -/area/space) +/turf/simulated/shuttle/plating, +/area/awaymission/centcomAway/thunderdome) "nY" = ( /obj/structure/computerframe, /turf/simulated/floor/plasteel{ @@ -6834,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 @@ -11446,7 +11431,7 @@ gX gX gX bP -dg +Di bP oc aW @@ -12225,7 +12210,7 @@ jz gX gX bP -dg +Di bP gX gX @@ -12344,7 +12329,7 @@ bY cq ei bO -gb +dg cq hH fA @@ -16520,7 +16505,7 @@ eO oa lb eF -iZ +fg eF lV mc @@ -20660,7 +20645,7 @@ cc aa aa aa -eP +aa aa aa aa @@ -20790,7 +20775,7 @@ cc aa aa aa -eP +aa aa aa aa diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm index 1c466c039ed..fe5445dc8c3 100644 --- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm +++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm @@ -29,7 +29,7 @@ "ac" = ( /obj/structure/alien/weeds, /obj/structure/alien/resin/wall, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -44,7 +44,7 @@ icon_state = "weeds1" }, /obj/structure/alien/resin/wall, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -61,7 +61,7 @@ icon_state = "egg_hatched"; name = "egg" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -76,7 +76,7 @@ icon_state = "weeds2" }, /obj/structure/alien/resin/wall, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -95,7 +95,7 @@ icon_state = "egg_hatched"; name = "egg" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -107,7 +107,7 @@ }) "ah" = ( /obj/structure/alien/weeds, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -122,7 +122,7 @@ icon_state = "weeds2" }, /mob/living/simple_animal/hostile/alien, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -135,7 +135,7 @@ "aj" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -154,7 +154,7 @@ icon_state = "egg_hatched"; name = "egg" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -169,7 +169,7 @@ icon_state = "weeds1" }, /obj/structure/bed/nest, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -181,7 +181,7 @@ }) "am" = ( /obj/structure/alien/weeds/node, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -196,7 +196,7 @@ icon_state = "weeds2" }, /obj/structure/bed/nest, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -210,7 +210,7 @@ /obj/structure/alien/weeds{ icon_state = "weeds1" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -233,7 +233,7 @@ color = "red"; icon_state = "gib1_flesh" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -247,7 +247,7 @@ /obj/structure/alien/weeds{ icon_state = "weeds2" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -263,7 +263,7 @@ }, /obj/structure/alien/resin/wall, /obj/structure/alien/resin/wall, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -287,7 +287,7 @@ color = "red"; icon_state = "gib1_flesh" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -302,7 +302,7 @@ icon_state = "weeds2" }, /mob/living/simple_animal/hostile/alien/sentinel, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -318,7 +318,7 @@ color = "red"; icon_state = "gib2_flesh" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -333,7 +333,7 @@ /obj/effect/decal/cleanable/blood{ color = "red" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -395,7 +395,7 @@ "aC" = ( /obj/structure/alien/weeds/node, /obj/structure/alien/resin/wall, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -423,7 +423,7 @@ color = "red"; icon_state = "gibdown1_flesh" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -493,7 +493,7 @@ color = "red"; icon_state = "gib1_flesh" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -511,7 +511,7 @@ color = "red"; icon_state = "gib2_flesh" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -531,7 +531,7 @@ /obj/effect/decal/cleanable/blood{ color = "red" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -546,7 +546,7 @@ /mob/living/simple_animal/hostile/alien/drone{ plants_off = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -619,7 +619,7 @@ pixel_x = 7; pixel_y = -6 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -638,7 +638,7 @@ pixel_x = -16; plants_off = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -714,7 +714,7 @@ name = "Syndicate Outpost" }) "aZ" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -732,7 +732,7 @@ /mob/living/simple_animal/hostile/alien/drone{ plants_off = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -747,7 +747,7 @@ /obj/effect/decal/cleanable/blood{ color = "red" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -838,7 +838,7 @@ /obj/effect/decal/cleanable/blood{ color = "red" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -851,7 +851,7 @@ "bj" = ( /obj/structure/alien/weeds, /mob/living/simple_animal/hostile/alien/sentinel, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -869,7 +869,7 @@ color = "red"; icon_state = "gib2_flesh" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -1350,7 +1350,7 @@ "bW" = ( /obj/structure/alien/weeds/node, /mob/living/simple_animal/hostile/alien, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -2150,7 +2150,7 @@ /mob/living/simple_animal/hostile/alien/drone{ plants_off = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -2401,7 +2401,7 @@ pixel_x = -7; pixel_y = -4 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2453,7 +2453,7 @@ pixel_x = -3; pixel_y = 9 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2525,7 +2525,7 @@ icon = 'icons/effects/blood.dmi'; icon_state = "tracks" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2542,7 +2542,7 @@ on = 1 }, /obj/effect/decal/cleanable/blood/splatter, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2562,7 +2562,7 @@ icon = 'icons/effects/blood.dmi'; icon_state = "tracks" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2586,7 +2586,7 @@ }) "dI" = ( /obj/item/storage/bag/ore, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2599,7 +2599,7 @@ }) "dJ" = ( /obj/item/pickaxe/drill, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2644,7 +2644,7 @@ pixel_x = -7; pixel_y = -4 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2676,7 +2676,7 @@ icon = 'icons/effects/blood.dmi'; icon_state = "tracks" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -2697,7 +2697,7 @@ icon = 'icons/effects/blood.dmi'; icon_state = "tracks" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -2709,7 +2709,7 @@ }) "dP" = ( /obj/structure/alien/weeds/node, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2723,7 +2723,7 @@ "dQ" = ( /obj/structure/alien/weeds, /obj/structure/alien/resin/wall, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2739,7 +2739,7 @@ icon_state = "weeds2" }, /obj/structure/alien/resin/wall, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2760,7 +2760,7 @@ /mob/living/simple_animal/hostile/alien/drone{ plants_off = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ always_unpowered = 1; has_gravity = 1; @@ -2772,7 +2772,7 @@ }) "dT" = ( /obj/structure/alien/weeds, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2786,7 +2786,7 @@ "dU" = ( /obj/structure/alien/weeds/node, /obj/structure/alien/resin/wall, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2801,7 +2801,7 @@ /obj/structure/alien/weeds{ icon_state = "weeds2" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2817,7 +2817,7 @@ icon_state = "weeds1" }, /obj/structure/alien/resin/wall, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2832,7 +2832,7 @@ /obj/structure/alien/weeds{ icon_state = "weeds1" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -2845,7 +2845,7 @@ }) "dY" = ( /obj/machinery/light/small, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a2{ has_gravity = 1; name = "MO19 Research" @@ -3608,7 +3608,7 @@ name = "MO19 Research" }) "fj" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 2; pixel_y = 24 }, @@ -5104,7 +5104,7 @@ pixel_y = 0; tag = "" }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 4; pixel_x = 28 }, @@ -5267,7 +5267,7 @@ pixel_x = -4; pixel_y = 2 }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 2; pixel_y = 24 }, @@ -5413,7 +5413,7 @@ pixel_x = 0; pixel_y = 0 }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 4; pixel_x = 28 }, @@ -5694,7 +5694,7 @@ }) "hW" = ( /obj/machinery/light/small, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a1{ has_gravity = 1; name = "MO19 Arrivals" @@ -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" @@ -6443,7 +6443,7 @@ "jb" = ( /obj/item/stack/rods, /obj/item/shard, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -6594,7 +6594,7 @@ name = "MO19 Arrivals" }) "jp" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 4; pixel_x = 24 }, @@ -6762,7 +6762,7 @@ /obj/structure/alien/weeds{ icon_state = "weeds2" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -6778,7 +6778,7 @@ /obj/structure/alien/weeds{ icon_state = "weeds2" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -6794,7 +6794,7 @@ icon_state = "weeds2" }, /obj/structure/alien/weeds/node, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -7560,7 +7560,7 @@ name = "MO19 Arrivals" }) "kK" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 1; pixel_y = -24 }, @@ -7836,7 +7836,7 @@ name = "MO19 Arrivals" }) "ld" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/shuttle/wall{ tag = "icon-swall_f6"; icon_state = "swall_f6"; @@ -7856,7 +7856,7 @@ name = "MO19 Arrivals" }) "lf" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/shuttle/wall{ dir = 3; icon_state = "swall_f10"; @@ -7908,7 +7908,7 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a1{ has_gravity = 1; name = "MO19 Arrivals" @@ -7918,7 +7918,7 @@ /obj/item/shard{ icon_state = "small" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -8028,7 +8028,7 @@ name = "MO19 Arrivals" }) "lt" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 4; pixel_x = 24 }, @@ -8170,7 +8170,7 @@ icon_state = "burst_r"; tag = "icon-burst_r (WEST)" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/shuttle/plating, /area/awaycontent/a1{ has_gravity = 1; name = "MO19 Arrivals" @@ -8233,9 +8233,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/simulated/floor/plating/airless{ - name = "plating" - }, +/turf/simulated/shuttle/plating, /area/awaycontent/a1{ has_gravity = 1; name = "MO19 Arrivals" @@ -8415,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; @@ -8433,7 +8431,7 @@ name = "MO19 Arrivals" }) "md" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -8467,7 +8465,7 @@ icon_state = "burst_l"; tag = "icon-burst_l (WEST)" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/shuttle/plating, /area/awaycontent/a1{ has_gravity = 1; name = "MO19 Arrivals" @@ -8594,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" }, @@ -8625,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; @@ -8651,7 +8649,7 @@ name = "MO19 Arrivals" }) "mw" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 4; pixel_x = 24 }, @@ -8872,7 +8870,7 @@ /obj/machinery/light/small{ dir = 8 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a1{ has_gravity = 1; name = "MO19 Arrivals" @@ -8900,7 +8898,7 @@ name = "MO19 Arrivals" }) "mS" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 4; pixel_x = 24 }, @@ -8967,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" }, @@ -9045,7 +9043,7 @@ name = "MO19 Arrivals" }) "ne" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 @@ -9072,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; @@ -9226,7 +9224,7 @@ name = "MO19 Arrivals" }) "nw" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/shuttle/wall{ icon_state = "swall_f9"; dir = 2 @@ -9323,7 +9321,7 @@ icon = 'icons/effects/blood.dmi'; icon_state = "tracks" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -9641,7 +9639,7 @@ /obj/item/shard{ icon_state = "small" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -9654,7 +9652,7 @@ }) "of" = ( /obj/item/trash/candy, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -9681,7 +9679,7 @@ }) "oh" = ( /obj/item/pickaxe, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -9739,7 +9737,7 @@ /obj/machinery/light/small{ dir = 8 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); @@ -9754,7 +9752,7 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); diff --git a/_maps/map_files/RandomZLevels/spacebattle.dmm b/_maps/map_files/RandomZLevels/spacebattle.dmm index 675efc73e68..17341581c9a 100644 --- a/_maps/map_files/RandomZLevels/spacebattle.dmm +++ b/_maps/map_files/RandomZLevels/spacebattle.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( /turf/simulated/mineral/random, -/area/space) +/area/space/nearstation) "ab" = ( /turf/space, /area/space) @@ -26,7 +26,7 @@ icon_state = "propulsion"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate2) "af" = ( /obj/structure/shuttle/engine/propulsion{ @@ -55,7 +55,7 @@ dir = 1 }, /obj/structure/window/reinforced, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate2) "aj" = ( /turf/simulated/shuttle/floor{ @@ -147,7 +147,7 @@ icon_state = "propulsion_r"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate3) "ax" = ( /obj/structure/shuttle/engine/propulsion{ @@ -155,7 +155,7 @@ icon_state = "propulsion"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate3) "ay" = ( /obj/structure/shuttle/engine/propulsion{ @@ -163,7 +163,7 @@ icon_state = "propulsion_l"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate3) "az" = ( /turf/space, @@ -191,7 +191,7 @@ dir = 1 }, /obj/structure/window/reinforced, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate3) "aD" = ( /turf/simulated/shuttle/floor{ @@ -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" @@ -282,7 +282,7 @@ icon_state = "propulsion_r"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate1) "aQ" = ( /obj/structure/shuttle/engine/propulsion{ @@ -290,7 +290,7 @@ icon_state = "propulsion"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate1) "aR" = ( /obj/structure/shuttle/engine/propulsion{ @@ -298,7 +298,7 @@ icon_state = "propulsion_l"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate1) "aS" = ( /turf/space, @@ -329,7 +329,7 @@ dir = 1 }, /obj/structure/window/reinforced, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate1) "aX" = ( /obj/structure/window/reinforced, @@ -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, @@ -1927,6 +1929,17 @@ /obj/effect/decal/cleanable/blood, /turf/simulated/floor/plasteel, /area/awaymission/spacebattle/cruiser) +"gm" = ( +/obj/structure/shuttle/engine/heater{ + tag = "icon-heater (WEST)"; + icon_state = "heater"; + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/simulated/shuttle/plating, +/area/awaymission/spacebattle/cruiser) "gn" = ( /obj/structure/closet/crate/secure/weapon, /obj/item/ammo_casing/a357, @@ -2090,7 +2103,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate4) "gO" = ( /obj/structure/reagent_dispensers/beerkeg, @@ -2162,7 +2175,7 @@ /area/awaymission/spacebattle/syndicate7) "gY" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate4) "gZ" = ( /obj/item/pickaxe, @@ -2221,15 +2234,15 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate7) "hh" = ( /obj/structure/shuttle/engine/propulsion{ - tag = "icon-propulsion_r (WEST)"; - icon_state = "propulsion_r"; - dir = 8 + dir = 4; + icon_state = "propulsion_l"; + tag = "icon-propulsion_l (WEST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate7) "hi" = ( /obj/structure/largecrate, @@ -2287,14 +2300,6 @@ }, /turf/simulated/floor/plating, /area/awaymission/spacebattle/syndicate7) -"hq" = ( -/obj/structure/shuttle/engine/propulsion{ - tag = "icon-propulsion_l (WEST)"; - icon_state = "propulsion_l"; - dir = 8 - }, -/turf/space, -/area/awaymission/spacebattle/syndicate7) "hr" = ( /obj/structure/largecrate, /mob/living/simple_animal/pet/corgi/puppy, @@ -2416,7 +2421,7 @@ }, /area/awaymission/spacebattle/syndicate7) "hM" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /mob/living/simple_animal/hostile/syndicate, @@ -2604,14 +2609,6 @@ /mob/living/simple_animal/hostile/syndicate/ranged, /turf/simulated/floor/plasteel, /area/awaymission/spacebattle/cruiser) -"io" = ( -/obj/structure/shuttle/engine/propulsion{ - tag = "icon-burst_r (EAST)"; - icon_state = "burst_r"; - dir = 4 - }, -/turf/space, -/area/awaymission/spacebattle/cruiser) "ip" = ( /obj/effect/mob_spawn/human/engineer{ name = "Mercutio" @@ -2622,23 +2619,23 @@ "iq" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ir" = ( /obj/effect/mob_spawn/human/corpse/syndicatesoldier, /turf/space, -/area/space) +/area/space/nearstation) "is" = ( /turf/simulated/shuttle/wall{ icon_state = "wall3" }, -/area/space) +/area/space/nearstation) "it" = ( /turf/space, /turf/simulated/shuttle/wall{ dir = 1; icon_state = "diagonalWall3" }, -/area/space) +/area/space/nearstation) "iu" = ( /obj/machinery/sleeper, /turf/simulated/floor/plasteel/airless{ @@ -2646,14 +2643,14 @@ icon_state = "floor4"; dir = 10 }, -/area/space) +/area/space/nearstation) "iv" = ( /turf/simulated/floor/plasteel/airless{ tag = "icon-floor4 (SOUTHWEST)"; icon_state = "floor4"; dir = 10 }, -/area/space) +/area/space/nearstation) "iw" = ( /obj/effect/mob_spawn/human/corpse/syndicatesoldier, /turf/simulated/floor/plasteel/airless{ @@ -2661,7 +2658,7 @@ icon_state = "floor4"; dir = 10 }, -/area/space) +/area/space/nearstation) "ix" = ( /obj/machinery/door/airlock/external, /turf/simulated/floor/plasteel/airless{ @@ -2669,7 +2666,7 @@ icon_state = "floor4"; dir = 10 }, -/area/space) +/area/space/nearstation) "iy" = ( /obj/item/stack/rods, /turf/simulated/floor/plasteel/airless{ @@ -2677,7 +2674,7 @@ icon_state = "floor4"; dir = 10 }, -/area/space) +/area/space/nearstation) "iz" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -2700,7 +2697,7 @@ "iC" = ( /obj/machinery/sleeper, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "iD" = ( /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -2717,14 +2714,14 @@ /turf/simulated/shuttle/wall{ icon_state = "diagonalWall3" }, -/area/space) +/area/space/nearstation) "iG" = ( /turf/space, /turf/simulated/shuttle/wall{ dir = 4; icon_state = "diagonalWall3" }, -/area/space) +/area/space/nearstation) "iH" = ( /obj/machinery/sleeper, /turf/simulated/shuttle/floor{ @@ -2732,7 +2729,7 @@ }, /area/awaymission/spacebattle/syndicate5) "iI" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /mob/living/simple_animal/hostile/syndicate, @@ -2745,12 +2742,12 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, -/area/space) +/turf/simulated/shuttle/plating, +/area/space/nearstation) "iK" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, -/area/space) +/turf/simulated/shuttle/plating, +/area/space/nearstation) "iL" = ( /obj/machinery/door/airlock/external, /turf/simulated/shuttle/floor{ @@ -2775,11 +2772,11 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate5) "iP" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate5) "iQ" = ( /turf/space, @@ -2818,7 +2815,7 @@ }, /area/awaymission/spacebattle/syndicate6) "iW" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /mob/living/simple_animal/hostile/syndicate, @@ -2850,15 +2847,15 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate6) "jb" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/spacebattle/syndicate6) "jc" = ( -/turf/simulated/floor/plating/airless/asteroid, -/area/space) +/turf/simulated/floor/plating/asteroid/airless, +/area/space/nearstation) "jd" = ( /turf/simulated/wall/mineral/plasma, /area/awaymission/spacebattle/secret) @@ -2872,6 +2869,78 @@ /obj/machinery/door/airlock/plasma, /turf/simulated/wall/mineral/plasma, /area/awaymission/spacebattle/secret) +"nG" = ( +/obj/structure/window/reinforced, +/obj/structure/shuttle/engine/heater{ + tag = "icon-heater (NORTH)"; + icon_state = "heater"; + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/simulated/shuttle/plating, +/area/awaymission/spacebattle/cruiser) +"qC" = ( +/obj/structure/window/reinforced, +/obj/structure/shuttle/engine/heater{ + tag = "icon-heater (NORTH)"; + icon_state = "heater"; + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/shuttle/plating, +/area/awaymission/spacebattle/cruiser) +"zS" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4; + icon_state = "propulsion_l"; + tag = "icon-propulsion_l (WEST)" + }, +/turf/simulated/shuttle/plating, +/area/space/nearstation) +"Jj" = ( +/obj/structure/shuttle/engine/propulsion{ + tag = "icon-propulsion_l (NORTH)"; + icon_state = "propulsion_l"; + dir = 1 + }, +/turf/simulated/shuttle/plating, +/area/awaymission/spacebattle/syndicate2) +"Jw" = ( +/obj/structure/shuttle/engine/propulsion{ + tag = "icon-propulsion_r (NORTH)"; + icon_state = "propulsion_r"; + dir = 1 + }, +/turf/simulated/shuttle/plating, +/area/awaymission/spacebattle/syndicate2) +"JS" = ( +/obj/structure/shuttle/engine/propulsion{ + tag = "icon-propulsion_l (NORTH)"; + icon_state = "propulsion_l"; + dir = 1 + }, +/turf/simulated/shuttle/plating, +/area/awaymission/spacebattle/cruiser) +"JW" = ( +/obj/structure/shuttle/engine/propulsion{ + tag = "icon-propulsion_r (NORTH)"; + icon_state = "propulsion_r"; + dir = 1 + }, +/turf/simulated/shuttle/plating, +/area/awaymission/spacebattle/cruiser) +"YV" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "burst_r"; + tag = "icon-burst_r (EAST)" + }, +/turf/simulated/shuttle/plating, +/area/awaymission/spacebattle/cruiser) (1,1,1) = {" aa @@ -21516,15 +21585,15 @@ ab ab ab bP -bU -cc -cc -cc -cc -cc -cc -cc -io +YV +YV +YV +YV +YV +YV +YV +YV +YV dq ab ab @@ -21773,15 +21842,15 @@ ab ab ab bS -bV -bV -bV -bV -bV -bV -bV -bV -bV +gm +gm +gm +gm +gm +gm +gm +gm +gm bQ ab ab @@ -36817,7 +36886,7 @@ ab ab ab ab -ad +Jw ai aj aj @@ -40158,7 +40227,7 @@ ab ab ab ab -af +Jj ai aj aj @@ -45948,7 +46017,7 @@ ab ab ab ab -iq +zS iv iv iv @@ -51555,8 +51624,8 @@ ab ab ab ab -bF -bK +JW +nG bN bN bN @@ -52326,8 +52395,8 @@ ab ab ab ab -bH -bM +JS +qC bO bO bO @@ -64175,12 +64244,12 @@ ab ab gM hh -hq +hh hz ab gM hh -hq +hh hz ab ab diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm index 7f144031668..8394ca1b635 100644 --- a/_maps/map_files/RandomZLevels/spacehotel.dmm +++ b/_maps/map_files/RandomZLevels/spacehotel.dmm @@ -20,7 +20,7 @@ }, /area/awaymission/beach) "ad" = ( -/turf/unsimulated/floor/lava/dense, +/turf/simulated/floor/plating/lava/smooth, /area/awaymission) "ae" = ( /turf/unsimulated/wall/metal, @@ -859,9 +859,6 @@ }, /turf/unsimulated/beach/sand, /area/awaymission/beach) -"bD" = ( -/turf/unsimulated/floor/lava, -/area/awaymission) "bE" = ( /obj/effect/decal{ name = "rock"; @@ -1587,7 +1584,7 @@ /turf/unsimulated/beach/coastline/dense, /area/awaymission/beach) "cO" = ( -/turf/unsimulated/floor/chasm, +/turf/simulated/floor/chasm, /area/awaymission) "cP" = ( /obj/effect/decal/snow/sand/edge{ @@ -1619,7 +1616,7 @@ requires_power = 0 }) "cR" = ( -/obj/machinery/poolcontroller/seacontroller, +/obj/machinery/poolcontroller/invisible/sea, /turf/unsimulated/wall/metal, /area/awaymission/undersea{ requires_power = 0 @@ -1828,7 +1825,7 @@ requires_power = 0 }) "dk" = ( -/turf/unsimulated/floor/chasm, +/turf/simulated/floor/chasm, /area/awaymission{ name = "Snowland"; requires_power = 0 @@ -1879,7 +1876,7 @@ icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w" }, -/turf/unsimulated/floor/chasm, +/turf/simulated/floor/chasm, /area/awaymission{ name = "Snowland"; requires_power = 0 @@ -1890,7 +1887,7 @@ light_color = "#ffffc0"; light_power = 2 }, -/turf/unsimulated/floor/chasm, +/turf/simulated/floor/chasm, /area/awaymission{ name = "Snowland"; requires_power = 0 @@ -1906,7 +1903,7 @@ icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e" }, -/turf/unsimulated/floor/chasm, +/turf/simulated/floor/chasm, /area/awaymission{ name = "Snowland"; requires_power = 0 @@ -1949,7 +1946,7 @@ icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n" }, -/turf/unsimulated/floor/chasm, +/turf/simulated/floor/chasm, /area/awaymission{ name = "Snowland"; requires_power = 0 @@ -1965,7 +1962,7 @@ icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e" }, -/turf/unsimulated/floor/chasm, +/turf/simulated/floor/chasm, /area/awaymission{ name = "Snowland"; requires_power = 0 @@ -1981,7 +1978,7 @@ icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n" }, -/turf/unsimulated/floor/chasm, +/turf/simulated/floor/chasm, /area/awaymission{ name = "Snowland"; requires_power = 0 @@ -2049,7 +2046,7 @@ }, /area/awaymission) "dF" = ( -/turf/unsimulated/floor/lava, +/turf/simulated/floor/plating/lava/smooth, /area/awaymission{ name = "Snowland"; requires_power = 0 @@ -2062,12 +2059,6 @@ }, /turf/unsimulated/beach/water/drop/dense, /area/awaymission/beach) -"dH" = ( -/turf/unsimulated/floor/lava/dense, -/area/awaymission{ - name = "Snowland"; - requires_power = 0 - }) "dI" = ( /obj/machinery/light, /turf/unsimulated/beach/water/deep/wood_floor{ @@ -2113,30 +2104,30 @@ id = "turbinespace" }, /turf/space, -/area/space) +/area/space/nearstation) "dQ" = ( /turf/unsimulated/wall, -/area/space) +/area/space/nearstation) "dR" = ( /turf/unsimulated/wall/fakeglass{ dir = 8; icon_state = "fakewindows"; opacity = 0 }, -/area/space) +/area/space/nearstation) "dS" = ( /turf/unsimulated/wall/fakeglass{ icon_state = "fakewindows2"; dir = 8 }, -/area/space) +/area/space/nearstation) "dT" = ( /turf/unsimulated/wall/fakeglass{ dir = 4; icon_state = "fakewindows"; opacity = 0 }, -/area/space) +/area/space/nearstation) "dU" = ( /turf/unsimulated/wall/fakeglass{ dir = 8; @@ -2364,42 +2355,42 @@ /area/awaymission/spacehotel) "ev" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 110 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "ew" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 111 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "ex" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 112 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "ey" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 210 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "ez" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 211 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "eA" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 212 }, /turf/unsimulated/floor/carpet, @@ -2409,7 +2400,7 @@ icon_state = "fakewindows"; dir = 1 }, -/area/space) +/area/space/nearstation) "eC" = ( /obj/machinery/light{ dir = 1 @@ -2425,7 +2416,7 @@ icon_state = "fakewindows2"; dir = 1 }, -/area/space) +/area/space/nearstation) "eF" = ( /obj/structure/closet/crate/can, /turf/unsimulated/floor/carpet, @@ -2463,7 +2454,7 @@ /area/awaymission/spacehotel) "eL" = ( /turf/unsimulated/wall/fakeglass, -/area/space) +/area/space/nearstation) "eM" = ( /turf/unsimulated/floor{ dir = 2; @@ -2684,7 +2675,7 @@ /turf/unsimulated/wall/fakeglass{ icon_state = "fakewindows3" }, -/area/space) +/area/space/nearstation) "fv" = ( /obj/effect/landmark/map_loader/hotel_room{ dir = 1 @@ -3124,12 +3115,6 @@ icon_state = "cafeteria" }, /area/awaymission/spacehotel/kitchen) -"gE" = ( -/mob/living/carbon/human/interactive/away/hotel/chef, -/turf/unsimulated/floor{ - icon_state = "cafeteria" - }, -/area/awaymission/spacehotel/kitchen) "gF" = ( /obj/machinery/camera{ c_tag = "Room 201"; @@ -3277,12 +3262,6 @@ icon_state = "whiteyellowfull" }, /area/awaymission/spacehotel) -"ha" = ( -/mob/living/carbon/human/interactive/away/hotel/bartender, -/turf/unsimulated/floor{ - icon_state = "whiteyellowfull" - }, -/area/awaymission/spacehotel) "hb" = ( /turf/unsimulated/wall/fakeglass, /area/awaymission/spacehotel) @@ -3685,7 +3664,7 @@ dir = 1; icon_state = "fakewindows2" }, -/area/space) +/area/space/nearstation) "if" = ( /obj/effect/view_portal{ id = "hotel_13" @@ -4134,12 +4113,6 @@ }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) -"jm" = ( -/obj/effect/spawner/snpc_squad{ - squad_type = /mob/living/carbon/human/interactive/away/hotel/guard - }, -/turf/unsimulated/floor/carpet, -/area/awaymission/spacehotel) "jn" = ( /obj/structure{ desc = "It appears to be similar to a SMES."; @@ -4489,7 +4462,6 @@ /obj/structure/chair{ dir = 8 }, -/mob/living/carbon/human/interactive/away/hotel/concierge, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel/reception) "kk" = ( @@ -4512,12 +4484,6 @@ /obj/structure/table/reinforced, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel/reception) -"kn" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/unsimulated/floor/carpet, -/area/awaymission/spacehotel/reception) "ko" = ( /obj/structure/filingcabinet/filingcabinet, /obj/machinery/light{ @@ -4577,14 +4543,14 @@ dir = 10; icon_state = "fakewindows" }, -/area/space) +/area/space/nearstation) "ky" = ( /turf/unsimulated/wall/fakeglass{ dir = 4; icon_state = "fakewindows"; opacity = 1 }, -/area/space) +/area/space/nearstation) "kz" = ( /obj/machinery/door/airlock/external{ name = "Arrival Airlock" @@ -4596,13 +4562,13 @@ icon_state = "fakewindows"; dir = 8 }, -/area/space) +/area/space/nearstation) "kB" = ( /turf/unsimulated/wall/fakeglass{ icon_state = "fakewindows"; dir = 6 }, -/area/space) +/area/space/nearstation) "kC" = ( /turf/simulated/shuttle/wall{ icon_state = "swall_s6"; @@ -4656,19 +4622,19 @@ icon_state = "swall_s6"; dir = 2 }, -/area/space) +/area/space/nearstation) "kL" = ( /turf/simulated/shuttle/wall{ icon_state = "swall12"; dir = 2 }, -/area/space) +/area/space/nearstation) "kM" = ( /turf/simulated/shuttle/wall{ icon_state = "swall_s10"; dir = 2 }, -/area/space) +/area/space/nearstation) "kN" = ( /turf/unsimulated/wall/fakeglass{ icon_state = "fakewindows3" @@ -4686,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" = ( @@ -4712,42 +4678,42 @@ icon_state = "heater"; dir = 4 }, -/turf/unsimulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/awaymission) "kV" = ( /obj/structure/shuttle/engine/propulsion{ dir = 4; icon_state = "propulsion" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission) "kW" = ( /turf/simulated/shuttle/wall{ icon_state = "swallc4"; dir = 2 }, -/area/space) +/area/space/nearstation) "kX" = ( /turf/simulated/shuttle/wall/interior, -/area/space) +/area/space/nearstation) "kY" = ( /turf/simulated/shuttle/wall{ icon_state = "swall3" }, -/area/space) +/area/space/nearstation) "kZ" = ( /obj/structure/shuttle/engine/propulsion{ dir = 4; icon_state = "propulsion" }, -/turf/space, -/area/space) +/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" = ( @@ -4775,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" = ( @@ -4793,13 +4759,13 @@ icon_state = "swall_s5"; dir = 2 }, -/area/space) +/area/space/nearstation) "li" = ( /turf/simulated/shuttle/wall{ icon_state = "swallc1"; dir = 2 }, -/area/space) +/area/space/nearstation) "lj" = ( /turf/simulated/shuttle/wall{ icon_state = "swall_s9"; @@ -4811,7 +4777,7 @@ icon_state = "swall_s9"; dir = 2 }, -/area/space) +/area/space/nearstation) "ll" = ( /obj/machinery/shower{ dir = 8 @@ -4839,6 +4805,15 @@ icon_state = "cult" }, /area/awaymission/spacehotel) +"VG" = ( +/obj/effect/decal{ + name = "rock"; + icon = 'icons/turf/mining.dmi'; + icon_state = "rock_side_w" + }, +/obj/machinery/poolcontroller/invisible, +/turf/unsimulated/beach/water/deep/dense, +/area/awaymission/beach) (1,1,1) = {" aa @@ -4867,15 +4842,15 @@ aa dw dk dk -dH -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -4997,15 +4972,15 @@ aa dw dk dk -dH -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -5127,15 +5102,15 @@ aa dw dk dk -dH -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -5257,15 +5232,15 @@ aa dx dk dk -dH -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -5388,14 +5363,14 @@ aa dw dk dk -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -5518,14 +5493,14 @@ aa dw dk dk -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -5648,14 +5623,14 @@ aa dw dk dk -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -5778,14 +5753,14 @@ dy dk dk dF -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -5908,14 +5883,14 @@ dw dk dk dF -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -6038,14 +6013,14 @@ dk dk dF dF -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -6168,14 +6143,14 @@ dk dF dF dF -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -6298,14 +6273,14 @@ dk dF dF dF -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -6428,14 +6403,14 @@ dk dk dF dF -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -6558,14 +6533,14 @@ dw dk dk dF -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -6688,14 +6663,14 @@ dw dk dk dF -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -6818,14 +6793,14 @@ dw dk dk dF -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -6948,14 +6923,14 @@ dx dk dk dF -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -7078,14 +7053,14 @@ aa dw dk dk -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -7208,14 +7183,14 @@ aa dw dk dk -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -7338,14 +7313,14 @@ aa dw dk dk -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -7468,14 +7443,14 @@ aa dw dk dk -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -7598,14 +7573,14 @@ aa dw dk dk -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -7728,14 +7703,14 @@ aa dw dk dk -dH -dH -dH -dH -dH -dH -dH -dH +dF +dF +dF +dF +dF +dF +dF +dF ah ah ah @@ -9762,7 +9737,7 @@ cl jF jT kj -kn +kj jT kv dS @@ -10589,7 +10564,7 @@ dC dG dB dB -dB +VG ah ah ah @@ -10655,7 +10630,7 @@ gh eb gp gw -gE +gD gN gT gD @@ -11058,7 +11033,7 @@ cl iw iI eG -jm +eb jH jV cl @@ -13299,24 +13274,24 @@ ad ad ad ad -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad ad ad ad @@ -13429,24 +13404,24 @@ ad ad ad ad -bD -bD -bD +ad +ad +ad bL cq cq cE cO -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad ad ad ad @@ -13559,8 +13534,8 @@ ad ad ad ad -bD -bD +ad +ad bL bV bV @@ -13569,14 +13544,14 @@ bV cq cE cO -bD -bD -bD -bD -bD -bD -bD -bD +ad +ad +ad +ad +ad +ad +ad +ad ad ad ad @@ -13689,7 +13664,7 @@ ad ad ad ad -bD +ad bL bV bV @@ -13699,14 +13674,14 @@ bV bV cV cO -bD -bD -bD -bD -bD -bD -bD -bD +ad +ad +ad +ad +ad +ad +ad +ad ad ad ad @@ -13819,7 +13794,7 @@ ad ad ad ad -bD +ad bM bV cf @@ -13830,15 +13805,15 @@ cf bV cE cO -bD -bD -bD -bD -bD -bD -bD -bD -bD +ad +ad +ad +ad +ad +ad +ad +ad +ad ad ad ad @@ -13949,7 +13924,7 @@ ad ad ad ad -bD +ad bM bV bV @@ -13960,15 +13935,15 @@ bV bV cV cO -bD +ad bL dd dd cE cO -bD -bD -bD +ad +ad +ad dJ dL cO @@ -14079,7 +14054,7 @@ ad ad ad ad -bD +ad bN bV bV @@ -14093,7 +14068,7 @@ dd dd cP cO -bD +ad dE cO bL @@ -14209,8 +14184,8 @@ ad ad ad ad -bD -bD +ad +ad bM bV bV @@ -14220,15 +14195,15 @@ bV bV cV cO -bD -bD -bD -bD +ad +ad +ad +ad bN dd cP cO -bD +ad dJ dN cO @@ -14339,8 +14314,8 @@ ad ad ad ad -bD -bD +ad +ad bM cf bV @@ -14350,15 +14325,15 @@ cf bV cP cO -bD -bD -bD -bD -bD -bD -bD -bD -bD +ad +ad +ad +ad +ad +ad +ad +ad +ad ad ad ad @@ -14469,8 +14444,8 @@ ad ad ad ad -bD -bD +ad +ad bM bV bV @@ -14479,16 +14454,16 @@ bV bV cV cO -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad ad ad ad @@ -14599,8 +14574,8 @@ ad ad ad ad -bD -bD +ad +ad bN cg cg @@ -14609,16 +14584,16 @@ bV bV cP cO -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad ad ad ad @@ -14729,26 +14704,26 @@ ad ad ad ad -bD -bD -bD -bD -bD +ad +ad +ad +ad +ad bN cg cP cO -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad ad ad ad @@ -14859,26 +14834,26 @@ ad ad ad ad -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad ad ad ad @@ -18978,7 +18953,7 @@ dX gI gP gX -ha +gX hq cl hB diff --git a/_maps/map_files/RandomZLevels/stationCollision.dmm b/_maps/map_files/RandomZLevels/stationCollision.dmm index b4889b22202..8910fa36aaa 100644 --- a/_maps/map_files/RandomZLevels/stationCollision.dmm +++ b/_maps/map_files/RandomZLevels/stationCollision.dmm @@ -41,7 +41,7 @@ "ak" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "al" = ( /obj/machinery/door/window/westright, /turf/simulated/floor/plasteel/airless, @@ -173,11 +173,11 @@ /area/awaymission/northblock) "aI" = ( /obj/structure/shuttle/engine/propulsion{ - tag = "icon-burst_l (EAST)"; + dir = 8; icon_state = "burst_l"; - dir = 4 + tag = "icon-burst_l (EAST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/syndishuttle) "aJ" = ( /turf/simulated/floor/plating/airless, @@ -197,14 +197,6 @@ /obj/machinery/mecha_part_fabricator/robot, /turf/simulated/floor/plasteel, /area/awaymission/northblock) -"aO" = ( -/obj/structure/shuttle/engine/propulsion{ - tag = "icon-propulsion_r (EAST)"; - icon_state = "propulsion_r"; - dir = 4 - }, -/turf/space, -/area/awaymission/syndishuttle) "aP" = ( /obj/structure/shuttle/engine/heater{ tag = "icon-heater (WEST)"; @@ -264,10 +256,10 @@ /turf/simulated/shuttle/wall{ icon_state = "wall3" }, -/area/space) +/area/space/nearstation) "ba" = ( /turf/simulated/wall, -/area/space) +/area/space/nearstation) "bb" = ( /obj/machinery/door/airlock/engineering, /turf/simulated/floor/plasteel/airless, @@ -278,16 +270,6 @@ icon_state = "floorscorched2" }, /area/awaymission/northblock) -"bd" = ( -/obj/structure/shuttle/engine/propulsion{ - tag = "icon-burst_l (EAST)"; - icon_state = "burst_l"; - dir = 4 - }, -/turf/simulated/shuttle/wall{ - icon_state = "wall3" - }, -/area/awaymission/syndishuttle) "be" = ( /obj/structure/shuttle/engine/heater, /turf/simulated/shuttle/plating, @@ -349,16 +331,6 @@ }, /turf/simulated/floor/plasteel/airless, /area/awaymission/northblock) -"bo" = ( -/obj/structure/shuttle/engine/propulsion{ - tag = "icon-propulsion (EAST)"; - icon_state = "propulsion"; - dir = 4 - }, -/turf/simulated/shuttle/wall{ - icon_state = "wall3" - }, -/area/awaymission/syndishuttle) "bp" = ( /obj/structure/shuttle/engine/router, /turf/simulated/shuttle/plating, @@ -554,16 +526,6 @@ /mob/living/carbon/human/monkey, /turf/simulated/floor/grass, /area/awaymission/research) -"bU" = ( -/obj/structure/shuttle/engine/propulsion{ - tag = "icon-burst_r (EAST)"; - icon_state = "burst_r"; - dir = 4 - }, -/turf/simulated/shuttle/wall{ - icon_state = "wall3" - }, -/area/awaymission/syndishuttle) "bV" = ( /obj/structure/shuttle/engine/heater{ tag = "icon-heater (NORTH)"; @@ -775,11 +737,11 @@ /area/awaymission/research) "cy" = ( /obj/structure/shuttle/engine/propulsion{ - tag = "icon-propulsion (EAST)"; - icon_state = "propulsion"; - dir = 4 + dir = 8; + icon_state = "burst_l"; + tag = "icon-burst_l (EAST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/research) "cz" = ( /obj/structure/shuttle/engine/heater{ @@ -794,7 +756,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/awaymission/research) "cA" = ( /turf/simulated/floor/plasteel{ @@ -807,14 +769,6 @@ icon_state = "dark" }, /area/awaymission/research) -"cC" = ( -/obj/structure/shuttle/engine/propulsion{ - tag = "icon-propulsion_l (EAST)"; - icon_state = "propulsion_l"; - dir = 4 - }, -/turf/space, -/area/awaymission/syndishuttle) "cD" = ( /turf/simulated/floor/plating/airless, /turf/simulated/shuttle/wall{ @@ -885,7 +839,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/awaymission/research) "cL" = ( /obj/effect/decal/remains/human{ @@ -1763,7 +1717,7 @@ dir = 1 }, /obj/structure/window/reinforced, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/awaymission/research) "eI" = ( /obj/structure/window/reinforced{ @@ -1987,7 +1941,7 @@ }, /area/awaymission/research) "ff" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -1998,7 +1952,7 @@ }, /area/awaymission/syndishuttle) "fg" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -2427,7 +2381,7 @@ }, /area/awaymission/arrivalblock) "gc" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -3581,14 +3535,14 @@ icon_state = "propulsion_r" }, /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/arrivalblock) "je" = ( /turf/space, /area/awaymission/arrivalblock) "jf" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/arrivalblock) "jg" = ( /obj/structure/shuttle/engine/propulsion{ @@ -3604,7 +3558,7 @@ icon_state = "propulsion_l" }, /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/arrivalblock) "jh" = ( /obj/structure/cable{ @@ -4038,7 +3992,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/awaymission/arrivalblock) "km" = ( /obj/structure/window/reinforced, @@ -4138,7 +4092,7 @@ dir = 1 }, /obj/structure/window/reinforced, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/arrivalblock) "kB" = ( /obj/structure/shuttle/engine/propulsion{ @@ -4147,7 +4101,7 @@ dir = 1 }, /obj/structure/window/reinforced, -/turf/space, +/turf/simulated/shuttle/plating, /area/awaymission/arrivalblock) "kC" = ( /obj/machinery/suit_storage_unit/standard_unit, @@ -4169,7 +4123,7 @@ /turf/simulated/floor/plasteel, /area/awaymission/arrivalblock) "kG" = ( -/obj/item/clothing/shoes/syndigaloshes, +/obj/item/clothing/shoes/chameleon/noslip, /obj/item/clothing/under/syndicate, /obj/effect/decal/remains/human{ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; @@ -4242,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{ @@ -4250,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{ @@ -4737,11 +4691,11 @@ aa aa aC aC -bd -bo -bo -bo -bU +aI +aI +aI +aI +aI aC aC aa @@ -5461,7 +5415,7 @@ aa aa aC aI -aO +aI aC er eK @@ -5469,7 +5423,7 @@ eK ff ff aC -cC +aI aK aC af @@ -5535,7 +5489,7 @@ eK eX eX aC -aP +bq aJ af aj diff --git a/_maps/map_files/RandomZLevels/terrorspiders.dmm b/_maps/map_files/RandomZLevels/terrorspiders.dmm index 1a64a0d7f0a..583ae8c74c9 100644 --- a/_maps/map_files/RandomZLevels/terrorspiders.dmm +++ b/_maps/map_files/RandomZLevels/terrorspiders.dmm @@ -11152,7 +11152,7 @@ /turf/simulated/wall, /area/awaymission/UO71/medical) "uW" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaymission/UO71/outside) "uX" = ( /obj/structure/cable{ @@ -11633,7 +11633,7 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaymission/UO71/outside) "vV" = ( /obj/machinery/computer/monitor, @@ -13391,14 +13391,14 @@ /area/awaymission/UO71/loot) "zr" = ( /obj/structure/glowshroom/single, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaymission/UO71/outside) "zs" = ( /turf/simulated/floor/carpet, /area/awaymission/UO71/loot) "zt" = ( /obj/structure/chair/wood/normal, -/obj/item/clothing/shoes/syndigaloshes, +/obj/item/clothing/shoes/chameleon/noslip, /turf/simulated/floor/carpet, /area/awaymission/UO71/loot) "zu" = ( diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm index 9a7b73800c2..c5741039f2b 100644 --- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm @@ -13,12 +13,6 @@ power_light = 0; poweralm = 0 }) -"ab" = ( -/turf/unsimulated/wall{ - icon_state = "rock"; - name = "rock" - }, -/area/space) "ac" = ( /turf/simulated/mineral/random/labormineral, /area/awaycontent/a7{ @@ -818,7 +812,7 @@ name = "UO45 Central Hall" }) "by" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 4; pixel_x = 24 }, @@ -1088,7 +1082,7 @@ icon = 'icons/effects/blood.dmi'; icon_state = "tracks" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -1102,7 +1096,7 @@ /obj/structure/alien/weeds, /obj/structure/bed/nest, /obj/effect/mob_spawn/human/miner, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -1847,7 +1841,7 @@ name = "UO45 Central Hall" }) "do" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 2; pixel_x = 0; pixel_y = 24 @@ -2139,7 +2133,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 2; pixel_x = 0; pixel_y = 24 @@ -2775,7 +2769,7 @@ "eK" = ( /obj/structure/alien/weeds, /obj/structure/alien/resin/wall, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -3177,7 +3171,7 @@ name = "UO45 Central Hall" }) "fo" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -3470,7 +3464,7 @@ icon = 'icons/effects/blood.dmi'; icon_state = "tracks" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -3596,7 +3590,7 @@ name = "UO45 Central Hall" }) "fW" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 1; pixel_x = 0; pixel_y = -24 @@ -3714,7 +3708,7 @@ }) "gg" = ( /obj/structure/alien/weeds, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -3936,7 +3930,7 @@ "gC" = ( /obj/structure/alien/resin/wall, /obj/structure/alien/weeds, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -4211,7 +4205,7 @@ name = "UO45 Research" }) "gZ" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 2; pixel_x = 0; pixel_y = 24 @@ -4283,7 +4277,7 @@ }) "he" = ( /obj/structure/glowshroom/single, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -4297,7 +4291,7 @@ /obj/machinery/light/small{ dir = 8 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a1{ has_gravity = 1; name = "UO45 Central Hall" @@ -4320,7 +4314,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 8; pixel_x = -24 }, @@ -4333,7 +4327,7 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a1{ has_gravity = 1; name = "UO45 Central Hall" @@ -5067,7 +5061,7 @@ name = "UO45 Crew Quarters" }) "iq" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 8; pixel_x = -24 }, @@ -5833,7 +5827,7 @@ name = "UO45 Crew Quarters" }) "jw" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 8; pixel_x = -24 }, @@ -6044,7 +6038,7 @@ }) "jM" = ( /obj/machinery/light/small, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a2{ has_gravity = 1; name = "UO45 Crew Quarters" @@ -6086,7 +6080,7 @@ /obj/machinery/light/small{ dir = 8 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ has_gravity = 1; name = "UO45 Research" @@ -6517,7 +6511,7 @@ initialize_directions = 11; tag = "icon-manifold-r-f (EAST)" }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 4; pixel_x = 24 }, @@ -6998,7 +6992,10 @@ dir = 9; icon_state = "warnwhite" }, -/area/space) +/area/awaycontent/a5{ + has_gravity = 1; + name = "UO45 Research" + }) "lc" = ( /obj/structure/sink{ pixel_y = 25 @@ -7049,7 +7046,7 @@ name = "UO45 Crew Quarters" }) "lg" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 1; pixel_x = 0; pixel_y = -24 @@ -7412,7 +7409,7 @@ pixel_x = 0; tag = "" }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 1; pixel_x = 0; pixel_y = -24 @@ -7597,7 +7594,7 @@ icon_state = "pipe-j1"; tag = "icon-pipe-j1 (EAST)" }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 1; pixel_x = 0; pixel_y = -24 @@ -7671,7 +7668,7 @@ name = "UO45 Research" }) "lN" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 1; pixel_x = 0; pixel_y = -24 @@ -8184,7 +8181,7 @@ }) "mz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 8; pixel_x = -24 }, @@ -8244,7 +8241,7 @@ name = "UO45 Gateway" }) "mE" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 1; pixel_x = 0; pixel_y = -24 @@ -8325,7 +8322,7 @@ /obj/machinery/light/small{ dir = 4 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a2{ has_gravity = 1; name = "UO45 Crew Quarters" @@ -9941,7 +9938,7 @@ scrub_N2O = 0; scrub_Toxins = 0 }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 1; pixel_x = 0; pixel_y = -24 @@ -10350,7 +10347,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 8; pixel_x = -24 }, @@ -10387,7 +10384,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 4; pixel_x = 24 }, @@ -10502,21 +10499,21 @@ /obj/machinery/light/small{ dir = 8 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a2{ has_gravity = 1; name = "UO45 Crew Quarters" }) "pw" = ( /obj/machinery/light/small, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a6{ has_gravity = 1; name = "UO45 Gateway" }) "px" = ( /obj/machinery/light/small, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ has_gravity = 1; name = "UO45 Research" @@ -10896,7 +10893,7 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a6{ has_gravity = 1; name = "UO45 Gateway" @@ -11215,7 +11212,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/purple{ dir = 4 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -11229,7 +11226,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/purple{ dir = 6 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -11243,7 +11240,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/purple{ dir = 4 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ has_gravity = 1; name = "UO45 Engineering" @@ -11389,7 +11386,7 @@ /obj/item/storage/toolbox/mechanical{ pixel_y = 5 }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 2; pixel_x = 0; pixel_y = 24 @@ -11738,7 +11735,7 @@ name = "UO45 Engineering" }) "rj" = ( -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 2; pixel_x = 0; pixel_y = 24 @@ -12917,7 +12914,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 1; pixel_x = 0; pixel_y = -24 @@ -13959,7 +13956,7 @@ }) "uc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/purple, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -14769,7 +14766,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/purple{ dir = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -15093,7 +15090,7 @@ /obj/machinery/atmospherics/unary/outlet_injector/on{ dir = 4 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a3{ has_gravity = 1; name = "UO45 Engineering" @@ -15182,7 +15179,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 1; pixel_x = 0; pixel_y = -24 @@ -15451,7 +15448,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/purple{ dir = 9 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16284,7 +16281,7 @@ }) "xp" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/firealarm{ +/obj/machinery/firealarm/no_alarm{ dir = 4; pixel_x = 24 }, @@ -16674,7 +16671,7 @@ }, /obj/structure/bed/nest, /obj/effect/mob_spawn/human/miner, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16693,7 +16690,7 @@ /obj/effect/decal/cleanable/blood/splatter{ color = "red" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16707,7 +16704,7 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a2{ has_gravity = 1; name = "UO45 Crew Quarters" @@ -16719,7 +16716,7 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16733,7 +16730,7 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a5{ has_gravity = 1; name = "UO45 Research" @@ -16742,7 +16739,7 @@ /obj/machinery/light/small{ dir = 8 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a4{ has_gravity = 1; name = "UO45 Mining" @@ -16751,14 +16748,14 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a4{ has_gravity = 1; name = "UO45 Mining" }) "ym" = ( /obj/structure/ore_box, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16770,7 +16767,7 @@ }) "yn" = ( /obj/structure/closet/crate, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16786,7 +16783,7 @@ icon_state = "weeds1" }, /obj/effect/mob_spawn/human/miner, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16802,7 +16799,7 @@ icon_state = "weeds2" }, /obj/structure/glowshroom/single, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16818,7 +16815,7 @@ icon_state = "weeds2" }, /obj/structure/bed/nest, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16837,7 +16834,7 @@ color = "red"; icon_state = "gib2_flesh" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16852,7 +16849,7 @@ tag = "icon-weeds2"; icon_state = "weeds2" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16867,7 +16864,7 @@ color = "red" }, /obj/effect/mob_spawn/human/miner, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16883,7 +16880,7 @@ icon_state = "weeds1" }, /obj/structure/glowshroom/single, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16896,7 +16893,7 @@ "yv" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16917,7 +16914,7 @@ icon = 'icons/effects/blood.dmi'; icon_state = "tracks" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16932,7 +16929,7 @@ /obj/effect/decal/cleanable/blood/splatter{ color = "red" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16947,7 +16944,7 @@ tag = "icon-weeds1"; icon_state = "weeds1" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16959,7 +16956,7 @@ }) "yz" = ( /obj/structure/alien/resin/membrane, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16978,7 +16975,7 @@ color = "red" }, /obj/effect/mob_spawn/human/miner, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -16996,7 +16993,7 @@ /obj/effect/decal/cleanable/blood/splatter{ color = "red" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -17011,7 +17008,7 @@ color = "red"; icon_state = "gib1_flesh" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -17033,7 +17030,7 @@ icon_state = "tracks" }, /obj/effect/mob_spawn/human/miner, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -17046,7 +17043,7 @@ "yE" = ( /obj/structure/alien/weeds, /obj/effect/mob_spawn/human/miner, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -17061,7 +17058,7 @@ color = "red"; icon_state = "gibdown1_flesh" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -17083,7 +17080,7 @@ icon = 'icons/effects/blood.dmi'; icon_state = "tracks" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -17102,7 +17099,7 @@ icon = 'icons/effects/blood.dmi'; icon_state = "tracks" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -17116,7 +17113,7 @@ /obj/effect/decal/cleanable/blood/splatter{ color = "red" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -17132,7 +17129,7 @@ color = "red"; icon_state = "gibdown1_flesh" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/awaycontent/a7{ always_unpowered = 1; has_gravity = 1; @@ -27794,10 +27791,10 @@ aa aa "} (72,1,1) = {" -ab -ab -ab -ab +aa +aa +aa +aa aa aa aa @@ -27944,10 +27941,10 @@ aa aa "} (73,1,1) = {" -ab -ab -ab -ab +aa +aa +aa +aa aa aa aa diff --git a/_maps/map_files/RandomZLevels/wildwest.dmm b/_maps/map_files/RandomZLevels/wildwest.dmm index a60988466a1..ca6d20a6eba 100644 --- a/_maps/map_files/RandomZLevels/wildwest.dmm +++ b/_maps/map_files/RandomZLevels/wildwest.dmm @@ -204,7 +204,7 @@ /area/awaymission/wwvaultdoors) "aG" = ( /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "aH" = ( /obj/structure/cable{ d2 = 8; @@ -268,7 +268,7 @@ name = "Blocker" }, /turf/space, -/area/space) +/area/space/nearstation) "aQ" = ( /obj/effect/forcefield{ desc = "You can't get in. Heh."; @@ -276,7 +276,7 @@ name = "Blocker" }, /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "aR" = ( /obj/effect/forcefield{ desc = "You can't get in. Heh."; @@ -349,7 +349,7 @@ /area/awaymission/wwmines) "be" = ( /turf/simulated/wall/mineral/sandstone, -/area/space) +/area/space/nearstation) "bf" = ( /obj/structure/largecrate, /turf/simulated/floor/plating, @@ -393,7 +393,7 @@ "bp" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bq" = ( /obj/effect/mine/dnascramble, /obj/item/ammo_box/c10mm, @@ -431,14 +431,14 @@ icon_state = "fwindow" }, /turf/space, -/area/space) +/area/space/nearstation) "bx" = ( /obj/structure/window/reinforced{ tag = "icon-fwindow"; icon_state = "fwindow" }, /turf/space, -/area/space) +/area/space/nearstation) "by" = ( /obj/structure/closet/secure_closet/freezer/fridge, /turf/simulated/floor/plasteel{ @@ -605,7 +605,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bV" = ( /obj/structure/window/reinforced{ tag = "icon-fwindow (NORTH)"; @@ -668,7 +668,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "cb" = ( /obj/machinery/light/small{ tag = "icon-bulb1 (WEST)"; @@ -736,7 +736,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "ck" = ( /turf/simulated/floor/wood, /area/awaymission/wwgov) @@ -810,7 +810,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "cs" = ( /obj/effect/decal/cleanable/blood/splatter, /turf/simulated/floor/carpet, @@ -981,7 +981,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "cT" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -1075,7 +1075,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "dg" = ( /obj/machinery/light/small{ tag = "icon-bulb1 (WEST)"; @@ -1701,7 +1701,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "eM" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -1710,7 +1710,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "eN" = ( /obj/structure/window/reinforced{ tag = "icon-fwindow (EAST)"; @@ -1739,7 +1739,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "eP" = ( /obj/structure/window/reinforced{ tag = "icon-fwindow (NORTH)"; @@ -1752,7 +1752,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "eQ" = ( /obj/structure/window/reinforced{ tag = "icon-fwindow (EAST)"; @@ -2080,7 +2080,7 @@ /area/awaymission/wwrefine) "fI" = ( /turf/simulated/floor/plasteel, -/area/space) +/area/space/nearstation) "fJ" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/chair/office/dark{ @@ -2329,7 +2329,7 @@ icon_state = "fwindow" }, /turf/space, -/area/space) +/area/space/nearstation) "gp" = ( /obj/structure/window/reinforced{ tag = "icon-fwindow (WEST)"; @@ -2341,7 +2341,7 @@ icon_state = "fwindow" }, /turf/space, -/area/space) +/area/space/nearstation) "gq" = ( /obj/item/paper{ info = "The syndicate have invaded. Their ships appeared out of nowhere and now they likely intend to kill us all and take everything. On the off-chance that the Vault may grant us sanctuary, many of us have decided to force our way inside and bolt the door, taking as many provisions with us as we can carry. In case you find this, send for help immediately and open the Vault. Find us inside."; @@ -2422,7 +2422,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "gC" = ( /obj/item/gun/projectile/shotgun, /turf/simulated/floor/wood, @@ -2473,7 +2473,7 @@ dir = 8 }, /turf/simulated/floor/plasteel, -/area/space) +/area/space/nearstation) "gK" = ( /obj/item/gun/projectile/revolver/russian, /turf/simulated/floor/wood, @@ -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 a0deb25b20d..f57aa9bae01 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -5,7 +5,7 @@ "aab" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "aac" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall12"; @@ -84,7 +84,7 @@ icon_state = "burst_r"; tag = "icon-burst_r (WEST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/abandoned) "aam" = ( /turf/simulated/shuttle/wall{ @@ -129,7 +129,7 @@ icon_state = "propulsion"; tag = "icon-propulsion (WEST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/abandoned) "aas" = ( /obj/structure/shuttle/engine/heater{ @@ -140,7 +140,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/abandoned) "aat" = ( /turf/simulated/shuttle/floor{ @@ -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{ @@ -270,7 +270,7 @@ icon_state = "burst_l"; tag = "icon-burst_l (WEST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/abandoned) "aaM" = ( /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" }, @@ -696,7 +696,7 @@ "abM" = ( /obj/structure/lattice, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "abN" = ( /turf/simulated/wall/r_wall, /area/security/permabrig) @@ -714,7 +714,7 @@ }, /obj/structure/lattice, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "abQ" = ( /turf/simulated/shuttle/wall{ dir = 4; @@ -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{ @@ -1299,7 +1299,7 @@ /turf/simulated/shuttle/plating/vox, /area/shuttle/vox) "ade" = ( -/obj/structure/closet/syndicate/suits, +/obj/machinery/suit_storage_unit/syndicate/secure, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -1757,12 +1757,12 @@ /turf/simulated/floor/plasteel, /area/security/range) "adS" = ( -/obj/structure/closet/syndicate/suits, /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8 }, +/obj/machinery/suit_storage_unit/syndicate/secure, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -2670,7 +2670,7 @@ pixel_x = -30 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "afn" = ( /obj/structure/chair{ dir = 8 @@ -2937,7 +2937,7 @@ /area/security/podbay) "afO" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "afP" = ( /obj/machinery/door/window{ dir = 4; @@ -3037,7 +3037,7 @@ "afX" = ( /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "afY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -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, @@ -3970,7 +3972,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate) "ahz" = ( /obj/structure/computerframe, @@ -4125,18 +4127,18 @@ tag = "icon-propulsion_l"; icon_state = "propulsion_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate) "ahO" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate) "ahP" = ( /obj/structure/shuttle/engine/propulsion{ tag = "icon-propulsion_r"; icon_state = "propulsion_r" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate) "ahQ" = ( /obj/machinery/alarm{ @@ -5582,7 +5584,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/vox) "ajZ" = ( /obj/structure/rack, @@ -5833,7 +5835,7 @@ tag = "icon-propulsion_l"; icon_state = "propulsion_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/vox) "akq" = ( /obj/structure/rack, @@ -6541,11 +6543,11 @@ /obj/structure/grille, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "alw" = ( /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "alx" = ( /obj/item/broken_bottle, /turf/simulated/shuttle/floor4/vox, @@ -6588,8 +6590,8 @@ d2 = 2 }, /obj/machinery/power/tracker, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "alE" = ( /obj/structure/closet/secure_closet/brig, @@ -6955,7 +6957,7 @@ /obj/structure/grille/broken, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ami" = ( /obj/structure/chair{ dir = 4 @@ -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 = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "amp" = ( /obj/structure/chair{ @@ -7391,8 +7393,8 @@ d2 = 2 }, /obj/machinery/power/tracker, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "amV" = ( /obj/structure/sign/nosmoking_2, @@ -7402,7 +7404,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "amX" = ( /obj/structure/reagent_dispensers/watertank, /obj/item/reagent_containers/glass/bucket, @@ -7421,10 +7423,10 @@ "amZ" = ( /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) "ana" = ( @@ -7544,8 +7546,8 @@ /area/security/permabrig) "ann" = ( /obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "ano" = ( /obj/structure/cable{ @@ -7791,8 +7793,8 @@ pixel_y = 0; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "anH" = ( /turf/simulated/wall/r_wall, @@ -8469,8 +8471,8 @@ icon_state = "2-4"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "aoL" = ( /obj/structure/cable{ @@ -8845,13 +8847,13 @@ icon_state = "1-2"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "apo" = ( /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "app" = ( /obj/structure/cable{ icon_state = "0-4"; @@ -9292,7 +9294,7 @@ dir = 8; icon_state = "burst_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/trade/sol) "aqg" = ( /obj/machinery/light/spot{ @@ -9371,7 +9373,7 @@ icon_state = "brokengrille" }, /turf/space, -/area/space) +/area/space/nearstation) "aqq" = ( /obj/item/soap, /turf/simulated/floor/plating, @@ -9768,8 +9770,8 @@ }, /area/lawoffice) "aqZ" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "ara" = ( /obj/structure/table/reinforced, @@ -9787,6 +9789,7 @@ pixel_y = 2 }, /obj/item/stamp/law, +/obj/item/pen/multi, /turf/simulated/floor/plasteel{ tag = "icon-cult"; icon_state = "cult"; @@ -9795,8 +9798,8 @@ /area/lawoffice) "arb" = ( /obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "arc" = ( /obj/effect/spawner/window/reinforced, @@ -9825,7 +9828,7 @@ dir = 8; icon_state = "propulsion" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/trade/sol) "are" = ( /obj/machinery/door/poddoor{ @@ -10306,8 +10309,8 @@ icon_state = "2-4"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "arM" = ( /obj/structure/cable{ @@ -10329,16 +10332,16 @@ icon_state = "2-4"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "arN" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "arO" = ( /obj/structure/cable{ @@ -10410,18 +10413,18 @@ icon_state = "0-4"; d2 = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "arV" = ( /obj/structure/shuttle/engine/propulsion{ dir = 8; icon_state = "burst_r" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/trade/sol) "arW" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -10448,7 +10451,7 @@ pixel_x = 0; pixel_y = 32 }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -10466,8 +10469,8 @@ /turf/simulated/shuttle/floor, /area/shuttle/trade/sol) "asb" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "asc" = ( /obj/effect/spawner/random_barrier/obstruction, @@ -11024,8 +11027,8 @@ icon_state = "1-8"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "asM" = ( /obj/structure/cable{ @@ -11040,8 +11043,8 @@ icon_state = "1-8"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "asN" = ( /turf/simulated/floor/carpet, @@ -11415,6 +11418,10 @@ id_tag = "secmaintdorm1"; name = "Room 1" }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, /turf/simulated/floor/plating, /area/maintenance/fsmaint) "ats" = ( @@ -11422,6 +11429,10 @@ id_tag = "secmaintdorm2"; name = "Room 2" }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, /turf/simulated/floor/plating, /area/maintenance/fsmaint) "att" = ( @@ -11636,7 +11647,7 @@ }, /area/shuttle/siberia) "atL" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -12786,15 +12797,15 @@ /turf/simulated/floor/plasteel, /area/security/permabrig) "avp" = ( -/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) "avq" = ( @@ -12839,9 +12850,6 @@ /turf/simulated/shuttle/floor, /area/shuttle/pod_3) "avu" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/status_display{ density = 0; layer = 4; @@ -12849,6 +12857,9 @@ pixel_y = 32 }, /obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_3) "avv" = ( @@ -13085,9 +13096,9 @@ pixel_y = -25; req_access_txt = "13" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "avN" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -13171,6 +13182,25 @@ /turf/simulated/floor/plasteel, /area/security/lobby) "avU" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint) +"avV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/plasteel, +/area/security/lobby) +"avW" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ name = "Internal Affairs Office"; @@ -13184,40 +13214,16 @@ dir = 4; level = 1 }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, /turf/simulated/floor/plasteel{ tag = "icon-cult"; icon_state = "cult"; dir = 2 }, /area/lawoffice) -"avV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/turf/simulated/floor/plasteel, -/area/security/lobby) -"avW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = 0 - }, -/obj/machinery/door/airlock/security/glass{ - id_tag = "BrigEast"; - name = "Brig East Entrance"; - req_access_txt = "63" - }, -/turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "darkredcorners" - }, -/area/security/prison/cell_block/A) "avX" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ @@ -13285,11 +13291,12 @@ name = "Brig East Entrance"; req_access_txt = "63" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; dir = 4 }, /turf/simulated/floor/plasteel{ - dir = 8; + dir = 1; icon_state = "darkredcorners" }, /area/security/prison/cell_block/A) @@ -13433,8 +13440,8 @@ pixel_y = 1; d2 = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "awl" = ( /turf/simulated/wall, @@ -13480,7 +13487,7 @@ icon_state = "propulsion"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_elite) "awq" = ( /obj/structure/shuttle/engine/propulsion{ @@ -13488,7 +13495,7 @@ icon_state = "propulsion_r"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_elite) "awr" = ( /turf/space, @@ -13503,7 +13510,7 @@ icon_state = "propulsion_l"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_elite) "awt" = ( /turf/space, @@ -13518,7 +13525,7 @@ icon_state = "propulsion"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_sit) "awv" = ( /obj/structure/shuttle/engine/propulsion{ @@ -13526,7 +13533,7 @@ icon_state = "propulsion_r"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_sit) "aww" = ( /turf/space, @@ -13541,7 +13548,7 @@ icon_state = "propulsion_l"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_sit) "awy" = ( /obj/machinery/mineral/labor_claim_console{ @@ -13712,32 +13719,47 @@ }, /area/security/permabrig) "awP" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Secure Gate"; + name = "Security Blast Door"; + opacity = 0 }, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f6"; - icon_state = "swall_f6"; - dir = 2 +/obj/machinery/door/airlock/security/glass{ + id_tag = "BrigEast"; + name = "Brig East Entrance"; + req_access_txt = "63" }, -/area/shuttle/pod_3) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkredcorners" + }, +/area/security/prison/cell_block/A) "awQ" = ( /obj/structure/cable{ d1 = 2; d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "awR" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "awS" = ( /obj/item/twohanded/required/kirbyplants, @@ -13937,7 +13959,7 @@ icon_state = "heater"; dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_elite) "axk" = ( /turf/simulated/shuttle/wall{ @@ -13952,12 +13974,9 @@ icon_state = "heater"; dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/syndicate_sit) "axm" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/machinery/flasher{ id = "gulagshuttleflasher"; pixel_x = 25 @@ -13966,15 +13985,18 @@ dir = 4; icon_state = "tube1" }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/shuttle/siberia) "axn" = ( /obj/structure/lattice, /obj/item/stack/cable_coil, /turf/space, -/area/space) +/area/space/nearstation) "axo" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -14015,8 +14037,8 @@ icon_state = "1-2"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "axr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -14331,16 +14353,15 @@ }, /area/security/prison/cell_block/A) "axN" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, /turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f5"; - icon_state = "swall_f5"; - dir = 2 - }, -/area/shuttle/pod_3) +/area/maintenance/fsmaint) "axO" = ( /obj/structure/cable{ d1 = 1; @@ -14543,7 +14564,7 @@ /obj/structure/lattice, /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "ayj" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ @@ -14825,8 +14846,8 @@ icon_state = "1-2"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "ayF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -15169,9 +15190,9 @@ pixel_y = -25; req_access_txt = "13" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "azc" = ( /obj/effect/spawner/window/reinforced, /obj/structure/cable, @@ -15205,28 +15226,28 @@ }, /area/security/interrogation) "aze" = ( -/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) "azf" = ( -/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" }, @@ -15237,7 +15258,7 @@ }, /area/shuttle/syndicate_elite) "azh" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -15266,7 +15287,7 @@ dir = 1; layer = 2.9 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/siberia) "azl" = ( /obj/machinery/atmospherics/pipe/manifold/hidden{ @@ -15295,7 +15316,7 @@ "azo" = ( /obj/item/clothing/mask/gas/clown_hat, /turf/space, -/area/space) +/area/space/nearstation) "azp" = ( /obj/machinery/door/airlock{ name = "Bathroom"; @@ -15823,7 +15844,7 @@ /turf/simulated/floor/plating, /area/maintenance/abandonedbar) "aAh" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -15845,7 +15866,7 @@ /area/shuttle/siberia) "aAk" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/siberia) "aAl" = ( /obj/machinery/door/airlock/external{ @@ -16432,25 +16453,17 @@ /turf/simulated/floor/plating, /area/maintenance/abandonedbar) "aBk" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/syndicate_sit) -"aBl" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/syndicate_sit) "aBm" = ( /obj/item/stack/rods, /turf/space, -/area/space) +/area/space/nearstation) "aBn" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -16535,13 +16548,13 @@ pixel_y = 0; req_access_txt = "13" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aBy" = ( /obj/effect/landmark/damageturf, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aBz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 @@ -16572,14 +16585,16 @@ /turf/simulated/floor/plating, /area/security/prisonershuttle) "aBC" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - icon_state = "floorgrime" +/turf/simulated/floor/plating, +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f6"; + icon_state = "swall_f6"; + dir = 2 }, -/area/maintenance/fsmaint) +/area/shuttle/pod_3) "aBD" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/simulated/shuttle/floor{ @@ -16740,7 +16755,7 @@ /obj/item/paper/crumpled, /obj/effect/landmark/damageturf, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "aBU" = ( /obj/machinery/light_construct/small{ dir = 8 @@ -16787,7 +16802,7 @@ "aBZ" = ( /obj/effect/landmark/damageturf, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "aCa" = ( /obj/machinery/ai_status_display{ pixel_x = 32 @@ -17325,7 +17340,7 @@ /turf/simulated/floor/plating, /area/maintenance/abandonedbar) "aCX" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -17336,9 +17351,6 @@ icon_state = "tube1"; dir = 8 }, -/obj/structure/chair{ - dir = 4 - }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -17670,7 +17682,7 @@ /obj/item/reagent_containers/food/drinks/drinkingglass{ pixel_x = -5 }, -/obj/item/reagent_containers/food/drinks/waterbottle, +/obj/item/reagent_containers/glass/beaker/waterbottle, /turf/simulated/floor/plating, /area/maintenance/fpmaint2) "aDE" = ( @@ -17772,17 +17784,18 @@ /turf/simulated/wall, /area/crew_quarters/mrchangs) "aDO" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Magistrate's Office"; - req_access_txt = "74" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 }, /turf/simulated/floor/plasteel{ - tag = "icon-cult"; - icon_state = "cult"; - dir = 2 + icon_state = "floorgrime" }, -/area/magistrateoffice) +/area/maintenance/fsmaint) "aDP" = ( /turf/simulated/wall, /area/civilian/barber) @@ -18253,9 +18266,9 @@ pixel_y = -25; req_access_txt = "13" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aEN" = ( /obj/structure/closet/emcloset, /turf/simulated/floor/plating, @@ -18968,7 +18981,7 @@ /area/crew_quarters/courtroom) "aGr" = ( /obj/structure/table/reinforced, -/obj/item/reagent_containers/food/drinks/waterbottle, +/obj/item/reagent_containers/glass/beaker/waterbottle, /turf/simulated/floor/plasteel{ icon_state = "red"; dir = 4 @@ -18997,25 +19010,12 @@ /turf/simulated/floor/wood, /area/crew_quarters/courtroom) "aGv" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Magistrate's Office"; - req_access_txt = "74" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/turf/simulated/floor/plasteel{ - tag = "icon-cult"; - icon_state = "cult"; - dir = 2 - }, -/area/magistrateoffice) +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint) "aGw" = ( /obj/structure/disposalpipe/junction{ dir = 1; @@ -19681,16 +19681,16 @@ /turf/simulated/floor/plating, /area/maintenance/fpmaint2) "aHV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Detective"; - req_access = null; - req_access_txt = "4" +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 }, -/turf/simulated/floor/plasteel{ - icon_state = "grimy" +/turf/simulated/floor/plating, +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f5"; + icon_state = "swall_f5"; + dir = 2 }, -/area/security/detectives_office) +/area/shuttle/pod_3) "aHW" = ( /obj/structure/cable{ d1 = 1; @@ -20063,15 +20063,21 @@ }, /area/maintenance/fpmaint2) "aIM" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Magistrate's Office"; + req_access_txt = "74" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/wood{ - tag = "icon-wood-broken3"; - icon_state = "wood-broken3" +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 }, -/area/maintenance/fpmaint2) +/turf/simulated/floor/plasteel{ + tag = "icon-cult"; + icon_state = "cult"; + dir = 2 + }, +/area/magistrateoffice) "aIN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -20137,7 +20143,7 @@ /area/crew_quarters/courtroom) "aIX" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/waterbottle{ +/obj/item/reagent_containers/glass/beaker/waterbottle{ pixel_x = 5 }, /obj/item/reagent_containers/food/drinks/drinkingglass{ @@ -20154,6 +20160,10 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, /turf/simulated/floor/plating, /area/maintenance/fsmaint) "aIZ" = ( @@ -20734,25 +20744,15 @@ /turf/simulated/floor/plasteel, /area/hallway/primary/fore) "aKp" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Courtroom"; - req_access_txt = "63" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; dir = 4 }, -/obj/machinery/door/poddoor/shutters{ - density = 0; - dir = 4; - icon_state = "open"; - id_tag = "courtroomshutters"; - layer = 3.21; - name = "Courtroom Privacy Shutters"; - opacity = 0 - }, -/turf/simulated/floor/wood, -/area/crew_quarters/courtroom) +/turf/simulated/floor/plating, +/area/maintenance/fsmaint2) "aKq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -20813,20 +20813,29 @@ }, /area/lawoffice) "aKx" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Magistrate's Office"; + req_access_txt = "74" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_y = 0 + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, -/turf/simulated/floor/plating, -/area/maintenance/fsmaint) +/turf/simulated/floor/plasteel{ + tag = "icon-cult"; + icon_state = "cult"; + dir = 2 + }, +/area/magistrateoffice) "aKy" = ( /obj/item/twohanded/required/kirbyplants, /turf/simulated/floor/plasteel{ @@ -21080,9 +21089,6 @@ }, /area/shuttle/pod_1) "aLb" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/status_display{ density = 0; layer = 4; @@ -21093,6 +21099,9 @@ dir = 4; icon_state = "tube1" }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_1) "aLc" = ( @@ -21110,9 +21119,6 @@ }, /area/shuttle/pod_2) "aLf" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/status_display{ density = 0; layer = 4; @@ -21123,6 +21129,9 @@ dir = 4; icon_state = "tube1" }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_2) "aLg" = ( @@ -21135,17 +21144,20 @@ /turf/simulated/floor/plating, /area/maintenance/fpmaint2) "aLh" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Detective"; + req_access = null; + req_access_txt = "4" }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/visible/purple, -/turf/simulated/floor/plating, -/area/maintenance/fpmaint2) +/turf/simulated/floor/plasteel{ + icon_state = "grimy" + }, +/area/security/detectives_office) "aLi" = ( /obj/structure/cable{ d1 = 2; @@ -21180,6 +21192,10 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, /turf/simulated/floor/plating, /area/maintenance/fpmaint2) "aLl" = ( @@ -21217,22 +21233,15 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - tag = "" +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/turf/simulated/floor/wood{ + tag = "icon-wood-broken3"; + icon_state = "wood-broken3" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/visible/purple{ - dir = 4 - }, -/turf/simulated/floor/plating, /area/maintenance/fpmaint2) "aLo" = ( /obj/structure/cable{ @@ -21758,14 +21767,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" = ( @@ -21773,19 +21782,19 @@ /area/maintenance/electrical) "aMr" = ( /turf/simulated/wall, -/area/space) +/area/space/nearstation) "aMs" = ( /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" = ( @@ -22041,7 +22050,7 @@ /obj/item/reagent_containers/food/drinks/drinkingglass{ pixel_x = -5 }, -/obj/item/reagent_containers/food/drinks/waterbottle{ +/obj/item/reagent_containers/glass/beaker/waterbottle{ pixel_x = 5 }, /turf/simulated/floor/carpet, @@ -22071,32 +22080,15 @@ /turf/simulated/floor/carpet, /area/crew_quarters/courtroom) "aNe" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Courtroom"; - req_access_txt = "63" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - tag = "" - }, -/obj/machinery/door/poddoor/shutters{ - density = 0; - dir = 4; - icon_state = "open"; - id_tag = "courtroomshutters"; - layer = 3.21; - name = "Courtroom Privacy Shutters"; - opacity = 0 - }, -/turf/simulated/floor/wood, -/area/crew_quarters/courtroom) +/turf/simulated/floor/plating, +/area/maintenance/fsmaint2) "aNf" = ( /obj/machinery/access_button{ command = "cycle_interior"; @@ -22455,13 +22447,29 @@ /turf/simulated/floor/plating, /area/maintenance/fsmaint2) "aNS" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom"; + req_access_txt = "63" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/maintenance/fpmaint2) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "courtroomshutters"; + layer = 3.21; + name = "Courtroom Privacy Shutters"; + opacity = 0 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/wood, +/area/crew_quarters/courtroom) "aNT" = ( /obj/machinery/status_display{ layer = 4; @@ -22563,15 +22571,10 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, /area/maintenance/fsmaint2) "aOb" = ( @@ -22757,7 +22760,7 @@ /area/maintenance/fpmaint) "aOw" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/waterbottle{ +/obj/item/reagent_containers/glass/beaker/waterbottle{ pixel_x = 5 }, /obj/item/reagent_containers/food/drinks/drinkingglass{ @@ -22883,21 +22886,52 @@ /turf/simulated/floor/plating, /area/maintenance/electrical) "aON" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f5"; - dir = 2 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/area/shuttle/pod_1) +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/visible/purple, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/maintenance/fpmaint2) "aOO" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f9"; - dir = 2 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom"; + req_access_txt = "63" }, -/area/shuttle/pod_1) +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4; + level = 1 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + tag = "" + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "courtroomshutters"; + layer = 3.21; + name = "Courtroom Privacy Shutters"; + opacity = 0 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/wood, +/area/crew_quarters/courtroom) "aOP" = ( /obj/machinery/light/small{ dir = 8 @@ -22950,7 +22984,7 @@ /obj/structure/lattice, /obj/structure/closet, /turf/space, -/area/space) +/area/space/nearstation) "aOY" = ( /obj/structure/grille, /obj/structure/window/reinforced, @@ -22982,11 +23016,18 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/structure/disposalpipe/segment, /obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 }, /turf/simulated/floor/plating, /area/maintenance/fsmaint) @@ -23049,9 +23090,27 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + tag = "" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/visible/purple{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, /turf/simulated/floor/plating, -/area/maintenance/fsmaint) +/area/maintenance/fpmaint2) "aPi" = ( /turf/simulated/floor/plating, /area/maintenance/fpmaint) @@ -23350,13 +23409,21 @@ /turf/simulated/wall, /area/maintenance/electrical) "aPP" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f5"; - dir = 2 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/area/shuttle/pod_2) +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint) "aPQ" = ( /obj/effect/decal/warning_stripes/north, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -23405,15 +23472,18 @@ }, /area/hallway/secondary/entry) "aPU" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f9"; - dir = 2 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/area/shuttle/pod_2) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint) "aPV" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -24123,23 +24193,13 @@ /turf/simulated/floor/plating, /area/maintenance/fpmaint) "aRm" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, +/obj/structure/shuttle/engine/propulsion/burst, /turf/simulated/floor/plating, -/area/maintenance/fpmaint) +/turf/simulated/shuttle/wall{ + icon_state = "swall_f5"; + dir = 2 + }, +/area/shuttle/pod_1) "aRn" = ( /obj/structure/cable{ d1 = 4; @@ -24291,21 +24351,13 @@ }, /area/hallway/primary/starboard/west) "aRz" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, +/obj/structure/shuttle/engine/propulsion/burst, /turf/simulated/floor/plating, -/area/maintenance/fsmaint2) +/turf/simulated/shuttle/wall{ + icon_state = "swall_f9"; + dir = 2 + }, +/area/shuttle/pod_1) "aRA" = ( /obj/structure/cable{ d1 = 1; @@ -24524,16 +24576,13 @@ /turf/simulated/floor/plating, /area/hallway/secondary/entry) "aRV" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, +/obj/structure/shuttle/engine/propulsion/burst, /turf/simulated/floor/plating, -/area/maintenance/fpmaint) +/turf/simulated/shuttle/wall{ + icon_state = "swall_f5"; + dir = 2 + }, +/area/shuttle/pod_2) "aRW" = ( /obj/machinery/light{ icon_state = "tube1"; @@ -24554,19 +24603,13 @@ /turf/simulated/floor/plating, /area/maintenance/fsmaint2) "aRY" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/shuttle/engine/propulsion/burst, /turf/simulated/floor/plating, -/area/maintenance/fpmaint2) +/turf/simulated/shuttle/wall{ + icon_state = "swall_f9"; + dir = 2 + }, +/area/shuttle/pod_2) "aRZ" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -25182,12 +25225,23 @@ /turf/simulated/floor/plating, /area/maintenance/fsmaint2) "aTs" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; + tag = "" + }, /obj/machinery/door/airlock/maintenance{ - name = "Chapel Maintenance"; req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, /turf/simulated/floor/plating, /area/maintenance/fsmaint2) "aTt" = ( @@ -25989,10 +26043,9 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/unres, /turf/simulated/floor/plating, -/area/maintenance/fpmaint2) +/area/maintenance/fpmaint) "aVc" = ( /turf/simulated/wall, /area/security/checkpoint2) @@ -26457,24 +26510,14 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - tag = "" +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, /turf/simulated/floor/plating, -/area/maintenance/fpmaint) +/area/maintenance/fpmaint2) "aVM" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel, @@ -27276,7 +27319,7 @@ dir = 4; icon_state = "burst_r" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/arrival/station) "aXo" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ @@ -27587,18 +27630,12 @@ /turf/simulated/floor/plasteel, /area/storage/primary) "aXT" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/tranquillite{ - name = "Mime's Office"; - req_access_txt = "46" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/turf/simulated/floor/plasteel{ - icon_state = "tranquillite"; - dir = 4; - icon_regular_floor = "yellowsiding"; - icon_plating = "plating" - }, -/area/mimeoffice) +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint2) "aXU" = ( /obj/item/flag/mime, /obj/machinery/power/apc{ @@ -28109,13 +28146,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" = ( @@ -28162,7 +28199,7 @@ dir = 4; icon_state = "propulsion" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/arrival/station) "aYU" = ( /obj/structure/grille, @@ -28177,7 +28214,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/arrival/station) "aYW" = ( /obj/structure/cable{ @@ -28227,12 +28264,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" = ( @@ -28410,7 +28447,7 @@ /area/security/nuke_storage) "aZq" = ( /obj/structure/safe{ - knownby = list("captain") + known_by = list("captain") }, /obj/machinery/light_switch{ pixel_y = -23 @@ -29457,13 +29494,15 @@ }, /area/crew_quarters/dorms) "bbx" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/bananium{ - name = "Clown's Office"; - req_access_txt = "46" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/turf/simulated/floor/wood, -/area/clownoffice) +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/maintenance/fpmaint2) "bby" = ( /obj/machinery/camera{ c_tag = "Medbay Morgue"; @@ -29940,7 +29979,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bco" = ( /obj/structure/filingcabinet, /turf/simulated/floor/wood, @@ -30011,14 +30050,27 @@ /turf/simulated/floor/carpet/black, /area/chapel/office) "bcv" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /obj/machinery/door/airlock/maintenance{ - name = "Library Maintenance"; req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, /turf/simulated/floor/plating, -/area/maintenance/fsmaint2) +/area/maintenance/fpmaint) "bcw" = ( /obj/machinery/alarm{ pixel_y = 25 @@ -30142,7 +30194,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "bcK" = ( -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, @@ -30159,10 +30211,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" = ( @@ -31136,15 +31188,31 @@ }, /area/hallway/primary/central/north) "bew" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass{ - name = "Chapel Office"; - req_access_txt = "22" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4; + level = 1 }, -/area/chapel/office) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + tag = "" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/maintenance/fpmaint) "bex" = ( /obj/machinery/requests_console{ department = "Arrival Shuttle"; @@ -31158,7 +31226,7 @@ dir = 4; icon_state = "burst_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/arrival/station) "bez" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ @@ -31174,12 +31242,6 @@ /obj/machinery/computer/station_alert, /turf/simulated/shuttle/floor, /area/shuttle/escape) -"beB" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) "beC" = ( /turf/simulated/shuttle/floor, /area/shuttle/escape) @@ -31443,14 +31505,22 @@ }, /area/crew_quarters/dorms) "bfa" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/tranquillite{ + name = "Mime's Office"; + req_access_txt = "46" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/maintenance/fpmaint) +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "tranquillite"; + dir = 4; + icon_regular_floor = "yellowsiding"; + icon_plating = "plating" + }, +/area/mimeoffice) "bfb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4; @@ -31506,8 +31576,20 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, /turf/simulated/floor/plating, -/area/maintenance/fpmaint) +/area/maintenance/fpmaint2) "bfg" = ( /obj/effect/spawner/window/reinforced, /obj/structure/cable, @@ -32202,21 +32284,21 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/entry) "bgo" = ( -/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) "bgp" = ( -/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) "bgq" = ( @@ -32673,7 +32755,7 @@ amount = 10 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bho" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -33192,7 +33274,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "bil" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -33202,7 +33284,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "bin" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -33754,80 +33836,48 @@ }, /area/hydroponics) "bje" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/bananium{ + name = "Clown's Office"; + req_access_txt = "46" }, -/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 - }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding1 (NORTH)"; - icon_state = "siding1"; - dir = 1 - }, -/area/hydroponics) +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/wood, +/area/clownoffice) "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/machinery/door/airlock/maintenance{ + name = "Chapel Maintenance"; + req_access_txt = "12" }, -/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/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; dir = 1 }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding2 (NORTH)"; - icon_state = "siding2"; - dir = 1 - }, -/area/hydroponics) +/turf/simulated/floor/plating, +/area/maintenance/fsmaint2) "bjh" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/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/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; dir = 1 }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding2 (NORTH)"; - icon_state = "siding2"; - dir = 1 - }, -/area/hydroponics) +/turf/simulated/floor/plating, +/area/maintenance/fpmaint2) "bji" = ( /obj/item/radio/beacon, /turf/simulated/floor/plasteel, @@ -34582,7 +34632,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bkJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9; @@ -34954,7 +35004,7 @@ icon_state = "tube1"; dir = 1 }, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "blv" = ( @@ -35004,7 +35054,7 @@ /turf/simulated/floor/carpet, /area/chapel/main) "blA" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -35024,7 +35074,7 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/entry) "blC" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -35779,13 +35829,13 @@ /turf/simulated/floor/plasteel, /area/hallway/primary/central/nw) "bmX" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "bmY" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "bmZ" = ( @@ -35814,12 +35864,12 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "bnc" = ( -/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" }, @@ -37081,9 +37131,8 @@ /turf/simulated/floor/plasteel, /area/assembly/chargebay) "bpE" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/freezer{ - req_access_txt = "28" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, /obj/structure/cable{ d1 = 1; @@ -37091,12 +37140,12 @@ icon_state = "1-2"; tag = "" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plasteel{ - icon_state = "showroomfloor" - }, -/area/crew_quarters/kitchen) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint2) "bpF" = ( /obj/machinery/alarm{ dir = 1; @@ -37368,18 +37417,18 @@ /turf/simulated/floor/wood, /area/crew_quarters/bar) "bqj" = ( -/obj/machinery/door/airlock{ - name = "Port Emergency Storage"; - req_access_txt = "0" +/obj/machinery/door/airlock/maintenance{ + name = "Library Maintenance"; + req_access_txt = "12" }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, /turf/simulated/floor/plating, -/area/storage/emergency2) +/area/maintenance/fsmaint2) "bqk" = ( /obj/structure/chair/wood/wings{ tag = "icon-wooden_chair_wings (WEST)"; @@ -38802,9 +38851,6 @@ }, /area/maintenance/asmaint2) "btt" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/item/radio/intercom{ dir = 8; name = "station intercom (General)"; @@ -38815,14 +38861,14 @@ icon_state = "tube1"; dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/shuttle/escape) "btu" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = 28 }, @@ -38831,6 +38877,9 @@ icon_state = "tube1"; dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -38863,23 +38912,23 @@ /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" = ( @@ -38905,7 +38954,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "btD" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/transport) "btE" = ( @@ -39976,20 +40025,19 @@ }, /area/crew_quarters/kitchen) "bvN" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/glass{ + name = "Chapel Office"; + req_access_txt = "22" }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/maintenance/fsmaint2) +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/chapel/office) "bvO" = ( /obj/structure/cable{ icon_state = "0-2"; @@ -40256,17 +40304,18 @@ }, /area/hallway/secondary/exit) "bwl" = ( +/obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Kitchen"; - req_access_txt = "28" +/obj/machinery/door/airlock{ + name = "Bar Office"; + req_access_txt = "25" }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, -/area/crew_quarters/kitchen) +/turf/simulated/floor/wood, +/area/crew_quarters/bar) "bwm" = ( /turf/simulated/floor/plasteel{ dir = 10; @@ -40462,16 +40511,16 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "bwI" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, /area/shuttle/transport) "bwJ" = ( -/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) "bwK" = ( @@ -40654,17 +40703,25 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/exit) "bwX" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion"; - tag = "icon-propulsion (EAST)" +/obj/machinery/door/airlock/maintenance{ + name = "Bar Maintenance"; + req_access_txt = "12" }, -/turf/space, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f6"; - dir = 2 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" }, -/area/shuttle/transport) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint2) "bwY" = ( /obj/machinery/power/apc{ dir = 4; @@ -41450,17 +41507,18 @@ }, /area/hallway/primary/central/ne) "bys" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion"; - tag = "icon-propulsion (EAST)" +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/turf/space, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f5"; - dir = 2 +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, -/area/shuttle/transport) +/turf/simulated/floor/plating, +/area/maintenance/fpmaint) "byt" = ( /obj/machinery/door/airlock/command/glass{ name = "Bridge"; @@ -42691,7 +42749,7 @@ dir = 8; icon_state = "burst_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/specops) "bAR" = ( /turf/simulated/shuttle/wall{ @@ -42708,7 +42766,7 @@ icon_state = "tube1"; dir = 1 }, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -43167,12 +43225,12 @@ /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 = 4 + }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "bBU" = ( @@ -43225,7 +43283,7 @@ pixel_x = 4; pixel_y = 32 }, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -43235,7 +43293,7 @@ dir = 8; icon_state = "propulsion" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/specops) "bCb" = ( /turf/simulated/shuttle/floor{ @@ -43270,7 +43328,7 @@ dir = 2; network = list("ERT","CentComm") }, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -43363,10 +43421,12 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, /turf/simulated/floor/plating, -/area/maintenance/port) +/area/maintenance/fpmaint) "bCr" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating, @@ -44021,9 +44081,6 @@ }, /area/shuttle/escape) "bDG" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; icon_state = "tube1"; @@ -44513,7 +44570,7 @@ }, /area/shuttle/specops) "bEL" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -45002,22 +45059,29 @@ /turf/simulated/floor/wood, /area/bridge/meeting_room) "bFJ" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + dir = 6 }, -/turf/simulated/floor/plating, -/area/maintenance/port) +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "asteroid"; + tag = "icon-asteroid (NORTH)" + }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding2 (NORTH)"; + icon_state = "siding2"; + dir = 1 + }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding1 (NORTH)"; + icon_state = "siding1"; + dir = 1 + }, +/area/hydroponics) "bFK" = ( /obj/machinery/computer/communications, /turf/simulated/floor/wood, @@ -45606,7 +45670,7 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/exit) "bGJ" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor4, @@ -45680,7 +45744,7 @@ dir = 8; icon_state = "burst_r" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/specops) "bGQ" = ( /obj/machinery/mineral/stacking_unit_console{ @@ -46512,7 +46576,7 @@ dir = 1 }, /obj/structure/shuttle/engine/heater, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bIv" = ( /obj/structure/table, @@ -46552,7 +46616,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bIy" = ( /obj/item/radio/intercom{ @@ -47566,7 +47630,7 @@ /area/maintenance/asmaint2) "bKm" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bKn" = ( /obj/machinery/shower{ @@ -48030,18 +48094,29 @@ /turf/simulated/floor/plasteel, /area/assembly/chargebay) "bLn" = ( -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "47" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/mob/living/simple_animal/pig, /turf/simulated/floor/plasteel{ - icon_state = "white" + dir = 2; + icon_state = "asteroid"; + tag = "icon-asteroid (NORTH)" }, -/area/medical/research{ - name = "Research Division" - }) +/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) "bLo" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -48421,26 +48496,28 @@ /turf/simulated/floor/plasteel, /area/assembly/robotics) "bLU" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Disposal Access"; - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "asteroid"; + tag = "icon-asteroid (NORTH)" }, -/turf/simulated/floor/plating, -/area/maintenance/port) +/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) "bLV" = ( /obj/item/storage/firstaid/o2{ pixel_x = 5; @@ -48723,18 +48800,18 @@ /area/quartermaster/office) "bMz" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Cargo Bay"; - req_access_txt = "31" +/obj/machinery/door/airlock/glass{ + name = "Chapel Office"; + req_access_txt = "22" }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, -/turf/simulated/floor/plasteel, -/area/quartermaster/storage) +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/chapel/office) "bMA" = ( /obj/machinery/mineral/ore_redemption, /turf/simulated/floor/plasteel, @@ -48767,13 +48844,26 @@ /turf/simulated/wall, /area/hallway/primary/central/sw) "bMF" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Delivery Office"; - req_access_txt = "50" +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/freezer{ + req_access_txt = "28" }, -/turf/simulated/floor/plasteel, -/area/quartermaster/office) +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "showroomfloor" + }, +/area/crew_quarters/kitchen) "bMG" = ( /turf/simulated/wall/r_wall, /area/crew_quarters/heads) @@ -49625,25 +49715,19 @@ /turf/simulated/floor/plasteel, /area/quartermaster/office) "bNP" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Delivery Office"; - req_access_txt = "50" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, /obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel, -/area/quartermaster/office) +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plating, +/area/maintenance/port) "bNQ" = ( /obj/machinery/light{ icon_state = "tube1"; @@ -49918,24 +50002,14 @@ }, /area/quartermaster/office) "bOn" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Cargo Bay"; - req_access_txt = "31" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel, -/area/quartermaster/storage) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plating, +/area/maintenance/port) "bOo" = ( /obj/effect/landmark{ name = "blobstart" @@ -50584,25 +50658,19 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/exit) "bPr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Biohazard_medi"; - name = "Quarantine Lockdown"; - opacity = 0 +/obj/machinery/door/airlock{ + name = "Port Emergency Storage"; + req_access_txt = "0" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyerPort"; - name = "Medbay Entrance"; - req_access_txt = "5" +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/reception) +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plating, +/area/storage/emergency2) "bPs" = ( /obj/machinery/status_display, /turf/simulated/wall/r_wall, @@ -50625,25 +50693,17 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/exit) "bPv" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Biohazard_medi"; - name = "Quarantine Lockdown"; - opacity = 0 +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion"; + tag = "icon-propulsion (EAST)" }, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyerPort"; - name = "Medbay Entrance"; - req_access_txt = "5" +/turf/space, +/turf/simulated/shuttle/wall{ + icon_state = "swall_f6"; + dir = 2 }, -/turf/simulated/floor/plasteel{ - tag = "icon-whiteblue (WEST)"; - icon_state = "whiteblue"; - dir = 8 - }, -/area/medical/reception) +/area/shuttle/transport) "bPw" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ dir = 4; @@ -50655,25 +50715,24 @@ /turf/simulated/floor/plating, /area/maintenance/disposal) "bPx" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Biohazard_medi"; - name = "Quarantine Lockdown"; - opacity = 0 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" }, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyerPort"; - name = "Medbay Entrance"; - req_access_txt = "5" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "whiteblue"; - tag = "icon-whitehall (WEST)" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, -/area/medical/reception) +/turf/simulated/floor/plating, +/area/maintenance/fsmaint2) "bPy" = ( /obj/structure/table, /obj/item/assembly/prox_sensor{ @@ -50861,6 +50920,22 @@ }, /area/shuttle/administration) "bPM" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Kitchen"; + req_access_txt = "28" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "cafeteria"; + tag = "icon-cafeteria (NORTHEAST)" + }, +/area/crew_quarters/kitchen) +"bPN" = ( /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; @@ -50873,25 +50948,17 @@ id = "admin"; name = "administration shuttle"; roundstart_move = "admin_away"; + timid = 1; width = 18 }, /obj/docking_port/stationary{ dir = 2; - dwidth = 8; - height = 15; + dwidth = 9; + height = 18; id = "admin_home"; name = "port bay 1"; - width = 18 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) -"bPN" = ( -/obj/machinery/door/airlock/external{ - id_tag = "s_docking_airlock"; - name = "Shuttle Hatch"; - req_access_txt = "106" + timid = 1; + width = 19 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -50943,22 +51010,17 @@ /turf/simulated/floor/plating, /area/quartermaster/storage) "bPU" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Biohazard_medi"; - name = "Quarantine Lockdown"; - opacity = 0 +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion"; + tag = "icon-propulsion (EAST)" }, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay Emergency Entrance"; - req_access_txt = "5" +/turf/space, +/turf/simulated/shuttle/wall{ + icon_state = "swall_f5"; + dir = 2 }, -/obj/effect/decal/warning_stripes/northeast, -/turf/simulated/floor/plasteel, -/area/hallway/primary/central/se) +/area/shuttle/transport) "bPV" = ( /obj/effect/landmark/start{ name = "Cargo Technician" @@ -52067,20 +52129,26 @@ }, /area/shuttle/administration) "bRH" = ( -/obj/machinery/door_control{ - id = "adminshuttleblast"; - name = "blast door control"; - pixel_x = -30; - req_access_txt = "106" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/area/shuttle/administration) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plating, +/area/maintenance/port) "bRI" = ( /obj/structure/plasticflaps/mining, /obj/machinery/conveyor/east{ @@ -52555,36 +52623,44 @@ /turf/simulated/floor/plating, /area/medical/chemistry) "bSz" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medical Supplies"; - req_access_txt = "5" +/obj/machinery/door/airlock/research{ + name = "Research Division Access"; + req_access_txt = "47" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres, /turf/simulated/floor/plasteel{ - tag = "icon-whitebluefull"; - icon_state = "whitebluefull" + icon_state = "white" }, -/area/medical/biostorage) +/area/medical/research{ + name = "Research Division" + }) "bSA" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medical Supplies"; - req_access_txt = "5" +/obj/machinery/door/airlock/maintenance{ + name = "Disposal Access"; + req_access_txt = "12" }, -/turf/simulated/floor/plasteel{ - tag = "icon-whitebluefull"; - icon_state = "whitebluefull" +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/area/medical/biostorage) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/maintenance/port) "bSB" = ( /obj/machinery/atmospherics/unary/cryo_cell, /turf/simulated/floor/plasteel{ @@ -53021,7 +53097,7 @@ /area/engine/gravitygenerator) "bTj" = ( /obj/structure/safe/floor{ - knownby = list("captain") + known_by = list("captain") }, /obj/item/gun/projectile/revolver/russian, /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, @@ -54159,27 +54235,47 @@ /turf/simulated/floor/plasteel, /area/engine/gravitygenerator) "bVk" = ( -/obj/machinery/door_control{ - id = "adminshuttleblast"; - name = "blast door control"; - pixel_x = -30; - req_access_txt = "106" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Delivery Office"; + req_access_txt = "50" }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 }, -/area/shuttle/administration) +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/quartermaster/office) "bVl" = ( -/obj/machinery/door/airlock/centcom{ - id_tag = "adminshuttle"; - name = "Workshop"; - opacity = 1; - req_access_txt = "105" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay"; + req_access_txt = "31" }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 }, -/area/shuttle/administration) +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/quartermaster/storage) "bVm" = ( /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; @@ -54441,20 +54537,17 @@ }, /area/toxins/lab) "bVH" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Delivery Office"; + req_access_txt = "50" }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - pixel_y = 0; - tag = "" +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/maintenance/asmaint2) +/turf/simulated/floor/plasteel, +/area/quartermaster/office) "bVI" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -55150,13 +55243,28 @@ }, /area/shuttle/administration) "bWO" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion_l"; - tag = "icon-propulsion_l (EAST)" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay"; + req_access_txt = "31" }, -/turf/space, -/area/shuttle/administration) +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/quartermaster/storage) "bWP" = ( /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; @@ -55363,19 +55471,21 @@ /turf/simulated/floor/plasteel, /area/quartermaster/office) "bXi" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Cargo Office"; - req_access_txt = "50" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0; + tag = "" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel, -/area/quartermaster/office) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plating, +/area/maintenance/asmaint2) "bXj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9; @@ -56132,13 +56242,26 @@ }, /area/shuttle/administration) "bYu" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion_r"; - tag = "icon-propulsion_r (EAST)" +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard_medi"; + name = "Quarantine Lockdown"; + opacity = 0 }, -/turf/space, -/area/shuttle/administration) +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyerPort"; + name = "Medbay Entrance"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plasteel{ + tag = "icon-whiteblue (WEST)"; + icon_state = "whiteblue"; + dir = 8 + }, +/area/medical/reception) "bYv" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -57135,31 +57258,25 @@ /area/medical/genetics_cloning) "bZR" = ( /obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard_medi"; + name = "Quarantine Lockdown"; + opacity = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/airlock/medical/glass{ - id_tag = "CloningDoor"; - name = "Genetics Cloning"; - req_access_txt = "0"; - req_one_access_txt = "5;9" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + id_tag = "MedbayFoyerPort"; + name = "Medbay Entrance"; + req_access_txt = "5" }, +/obj/effect/mapping_helpers/airlock/unres, /turf/simulated/floor/plasteel{ - icon_state = "freezerfloor" + icon_state = "white" }, -/area/medical/genetics_cloning) +/area/medical/reception) "bZS" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1; @@ -57422,16 +57539,26 @@ /turf/simulated/wall, /area/quartermaster/miningdock) "can" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/spot{ - tag = "icon-tube1 (NORTH)"; - icon_state = "tube1"; - dir = 1 +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard_medi"; + name = "Quarantine Lockdown"; + opacity = 0 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyerPort"; + name = "Medbay Entrance"; + req_access_txt = "5" }, -/area/shuttle/administration) +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "whiteblue"; + tag = "icon-whitehall (WEST)" + }, +/area/medical/reception) "cao" = ( /obj/structure/filingcabinet, /turf/simulated/floor/plasteel, @@ -58144,32 +58271,28 @@ }, /area/crew_quarters/hor) "cbr" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Biohazard_medi"; - name = "Quarantine Lockdown"; - opacity = 0 - }, /obj/machinery/door/airlock/medical/glass{ id_tag = "MedbayFoyer"; - name = "Medbay Emergency Entrance"; + name = "Medical Supplies"; req_access_txt = "5" }, -/obj/effect/decal/warning_stripes/southeast, -/turf/simulated/floor/plasteel, -/area/hallway/primary/central/se) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, +/turf/simulated/floor/plasteel{ + tag = "icon-whitebluefull"; + icon_state = "whitebluefull" + }, +/area/medical/biostorage) "cbs" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58228,7 +58351,7 @@ /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{ @@ -58236,22 +58359,39 @@ }, /area/shuttle/administration) "cby" = ( -/obj/machinery/computer/shuttle/admin, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medical Supplies"; + req_access_txt = "5" }, -/area/shuttle/administration) +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, +/turf/simulated/floor/plasteel{ + tag = "icon-whitebluefull"; + icon_state = "whitebluefull" + }, +/area/medical/biostorage) "cbz" = ( -/obj/machinery/door/airlock/centcom{ - id_tag = "adminshuttle"; - name = "Bridge"; - opacity = 1; - req_access_txt = "106" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Office"; + req_access_txt = "50" }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/area/shuttle/administration) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/quartermaster/office) "cbA" = ( /obj/machinery/door/poddoor/shutters{ density = 0; @@ -58310,7 +58450,7 @@ pixel_y = 32 }, /turf/space, -/area/space) +/area/space/nearstation) "cbH" = ( /obj/machinery/power/apc{ dir = 1; @@ -58485,16 +58625,25 @@ /area/medical/genetics_cloning) "cbY" = ( /obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard_medi"; + name = "Quarantine Lockdown"; + opacity = 0 + }, /obj/machinery/door/airlock/medical/glass{ - id_tag = "CloningDoor"; - name = "Genetics Cloning"; - req_access_txt = "0"; - req_one_access_txt = "5;9" + id_tag = "MedbayFoyer"; + name = "Medbay Emergency Entrance"; + req_access_txt = "5" }, -/turf/simulated/floor/plasteel{ - icon_state = "freezerfloor" +/obj/effect/decal/warning_stripes/northeast, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 }, -/area/medical/genetics_cloning) +/turf/simulated/floor/plasteel, +/area/hallway/primary/central/se) "cbZ" = ( /obj/structure/cable{ d1 = 4; @@ -59505,17 +59654,39 @@ }, /area/shuttle/administration) "cdq" = ( -/obj/machinery/computer/card/centcom, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "CloningDoor"; + name = "Genetics Cloning"; + req_access_txt = "0"; + req_one_access_txt = "5;9" }, -/area/shuttle/administration) +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + tag = "" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "freezerfloor" + }, +/area/medical/genetics_cloning) "cdr" = ( -/obj/structure/table/reinforced, -/obj/machinery/door_control{ - id = "adminshuttleshutters"; - name = "remote shutter control"; - req_access_txt = "106" +/obj/machinery/computer/camera_advanced/shuttle_docker/admin{ + name = "NTV Argos shuttle navigation computer" }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -59551,7 +59722,7 @@ dir = 1 }, /obj/structure/shuttle/engine/heater, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/supply) "cdv" = ( /turf/space, @@ -60290,33 +60461,53 @@ }, /area/crew_quarters/hor) "ceT" = ( -/obj/machinery/door/airlock/centcom{ - id_tag = "adminshuttle"; - name = "Medbay"; - opacity = 1; - req_access_txt = "103" +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; + tag = "" }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/shuttle/administration) +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard_medi"; + name = "Quarantine Lockdown"; + opacity = 0 + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay Emergency Entrance"; + req_access_txt = "5" + }, +/obj/effect/decal/warning_stripes/southeast, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/hallway/primary/central/se) "ceU" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/supply) "ceV" = ( /obj/structure/shuttle/engine/propulsion{ tag = "icon-burst_l"; icon_state = "burst_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/supply) "ceW" = ( /obj/structure/shuttle/engine/propulsion{ tag = "icon-burst_r"; icon_state = "burst_r" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/supply) "ceX" = ( /turf/space, @@ -60349,6 +60540,9 @@ /area/quartermaster/miningdock) "cfc" = ( /obj/machinery/hologram/holopad, +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, /turf/simulated/floor/plasteel, /area/quartermaster/miningdock) "cfd" = ( @@ -61240,13 +61434,6 @@ }, /area/shuttle/administration) "cgy" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Biohazard"; - name = "Biohazard Shutter"; - opacity = 0 - }, /obj/machinery/door/poddoor{ id_tag = "ToxinsVenting"; name = "Toxins Venting Bay Door"; @@ -61264,14 +61451,14 @@ }, /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 = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -61303,6 +61490,7 @@ }, /area/shuttle/mining) "cgG" = ( +/obj/structure/closet/wardrobe/miner, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "brown" @@ -61628,11 +61816,21 @@ /turf/simulated/wall, /area/medical/paramedic) "chi" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "CloningDoor"; + name = "Genetics Cloning"; + req_access_txt = "0"; + req_one_access_txt = "5;9" }, -/turf/simulated/floor/plating, -/area/maintenance/asmaint) +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "freezerfloor" + }, +/area/medical/genetics_cloning) "chj" = ( /obj/structure/cable{ d1 = 4; @@ -62275,7 +62473,7 @@ }, /area/shuttle/administration) "cil" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -62286,7 +62484,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/mining) "cin" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, @@ -62338,6 +62536,9 @@ /obj/machinery/light{ dir = 8 }, +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "brown" @@ -63079,31 +63280,15 @@ }, /area/medical/ward) "cjA" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Operating Theatre"; - req_access_txt = "45" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/machinery/holosign/surgery{ - id = "surgery1" - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/surgery1) +/turf/simulated/floor/plating, +/area/maintenance/asmaint2) "cjB" = ( /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, @@ -63141,31 +63326,21 @@ }, /area/medical/ward) "cjD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Operating Theatre"; - req_access_txt = "45" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, /obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; + d1 = 1; + d2 = 2; + icon_state = "1-2"; tag = "" }, -/obj/machinery/holosign/surgery{ - id = "surgery2" - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/surgery2) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plating, +/area/maintenance/apmaint) "cjE" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -63503,7 +63678,7 @@ }, /area/shuttle/administration) "ckh" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -63521,7 +63696,7 @@ color = "#FF0000"; dir = 8 }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -63815,20 +63990,22 @@ /turf/simulated/floor/plasteel, /area/quartermaster/qm) "ckI" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/disposalpipe/segment, /obj/structure/cable{ d1 = 1; d2 = 2; - icon_state = "1-2"; - tag = "" + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + id_tag = "blueshieldofficedoor"; + name = "Blueshield's Office"; + req_access_txt = "67" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/maintenance/apmaint) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/wood, +/area/blueshield) "ckJ" = ( /obj/structure/sink{ pixel_y = 30 @@ -63864,14 +64041,15 @@ }, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ - id_tag = "blueshieldofficedoor"; - name = "Blueshield's Office"; - req_access_txt = "67" + id_tag = "ntrepofficedoor"; + name = "NT Representative's Office"; + req_access_txt = "73" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres, /turf/simulated/floor/wood, -/area/blueshield) +/area/ntrep) "ckO" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ @@ -63880,21 +64058,14 @@ }, /area/hallway/primary/aft) "ckP" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/machinery/door/airlock{ + name = "Custodial Closet"; + req_access_txt = "26" }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - id_tag = "ntrepofficedoor"; - name = "NT Representative's Office"; - req_access_txt = "73" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/wood, -/area/ntrep) +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plasteel, +/area/janitor) "ckQ" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -63915,13 +64086,20 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint) "ckT" = ( -/obj/machinery/door/airlock{ - name = "Custodial Closet"; - req_access_txt = "26" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/structure/disposalpipe/segment, -/turf/simulated/floor/plasteel, -/area/janitor) +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plating, +/area/maintenance/asmaint) "ckU" = ( /obj/machinery/body_scanconsole, /obj/machinery/camera{ @@ -64007,8 +64185,9 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/unres, /turf/simulated/floor/plating, -/area/maintenance/asmaint) +/area/maintenance/asmaint2) "clb" = ( /obj/structure/table/glass, /obj/machinery/computer/med_data/laptop, @@ -64263,6 +64442,10 @@ id = "air_in"; on = 1 }, +/obj/machinery/sparker{ + id = "toxinsigniter"; + pixel_x = -20 + }, /turf/simulated/floor/engine/insulated/vacuum, /area/toxins/mixing) "cly" = ( @@ -64278,11 +64461,6 @@ /turf/simulated/floor/plating, /area/maintenance/apmaint) "clz" = ( -/obj/machinery/igniter{ - icon_state = "igniter0"; - id = "ToxinsIgnitor"; - on = 0 - }, /turf/simulated/floor/engine/insulated/vacuum, /area/toxins/mixing) "clA" = ( @@ -64780,35 +64958,15 @@ }, /area/medical/medbreak) "cmt" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/medical/glass{ - id_tag = ""; - name = "Staff Room"; - req_access_txt = "5"; - req_one_access_txt = "0" - }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" - }, -/area/medical/medbay2) +/turf/simulated/floor/plating, +/area/maintenance/asmaint) "cmu" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -64953,21 +65111,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, @@ -65091,12 +65234,12 @@ /turf/simulated/floor/plasteel, /area/toxins/storage) "cmW" = ( -/obj/structure/closet/wardrobe/toxins_white, /obj/item/radio/intercom{ dir = 1; name = "station intercom (General)"; pixel_y = 25 }, +/obj/structure/reagent_dispensers/watertank, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "whitepurple" @@ -65110,19 +65253,20 @@ dir = 1; in_use = 1 }, +/obj/item/grenade/chem_grenade/firefighting, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitepurple" }, /area/toxins/mixing) "cmY" = ( -/obj/structure/closet/wardrobe/toxins_white, /obj/machinery/camera{ c_tag = "Research Toxins Mixing West"; dir = 2; network = list("Research","SS13"); pixel_x = 0 }, +/obj/structure/closet/firecloset, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitepurple" @@ -65133,6 +65277,7 @@ pixel_y = 25 }, /obj/effect/decal/warning_stripes/southwestcorner, +/obj/machinery/portable_atmospherics/canister, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -65152,6 +65297,7 @@ }, /obj/item/extinguisher, /obj/item/clothing/mask/gas, +/obj/item/grenade/chem_grenade/firefighting, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "whitepurple" @@ -65221,7 +65367,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/mining) "cnj" = ( /obj/structure/ore_box, @@ -65238,7 +65384,7 @@ /turf/simulated/wall, /area/toxins/test_area) "cnl" = ( -/obj/structure/closet/wardrobe/miner, +/obj/structure/closet/wardrobe/miner/lavaland, /turf/simulated/floor/plasteel{ dir = 2; icon_state = "brown" @@ -65441,6 +65587,7 @@ name = "\improper Virology Lobby" }) "cnE" = ( +/obj/machinery/atmospherics/unary/passive_vent, /turf/simulated/floor/engine/insulated/vacuum, /area/toxins/mixing) "cnF" = ( @@ -65591,6 +65738,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" = ( @@ -65631,6 +65781,9 @@ dir = 5; level = 1 }, +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, /turf/simulated/floor/plasteel, /area/quartermaster/miningdock) "cnV" = ( @@ -66162,7 +66315,7 @@ /area/blueshield) "coN" = ( /obj/structure/shuttle/engine/propulsion/burst, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/mining) "coO" = ( /turf/space, @@ -66504,12 +66657,22 @@ /turf/simulated/wall, /area/maintenance/genetics) "cpk" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; + tag = "" + }, /obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_access_txt = "5" + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 }, /turf/simulated/floor/plating, -/area/maintenance/genetics) +/area/maintenance/asmaint) "cpl" = ( /obj/structure/cable, /obj/structure/table, @@ -66721,8 +66884,8 @@ icon_state = "2-4"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cpA" = ( /obj/effect/decal/warning_stripes/southwestcorner, @@ -67121,10 +67284,10 @@ }, /area/toxins/mixing) "cqf" = ( -/obj/machinery/atmospherics/binary/pump/highcap{ +/obj/effect/decal/warning_stripes/north, +/obj/machinery/atmospherics/binary/pump{ dir = 1 }, -/obj/effect/decal/warning_stripes/north, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -67145,8 +67308,8 @@ }, /area/toxins/mixing) "cqh" = ( -/obj/machinery/atmospherics/binary/pump/highcap, /obj/effect/decal/warning_stripes/north, +/obj/machinery/atmospherics/binary/pump, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -67159,7 +67322,7 @@ pixel_y = 26 }, /obj/machinery/ignition_switch{ - id = "ToxinsIgnitor"; + id = "toxinsigniter"; pixel_x = 6; pixel_y = 25 }, @@ -67174,13 +67337,15 @@ }, /area/toxins/mixing) "cqj" = ( -/obj/machinery/portable_atmospherics/pump, /obj/machinery/camera{ c_tag = "Research Toxins Mixing East"; dir = 2; network = list("Research","SS13"); pixel_x = 0 }, +/obj/machinery/atmospherics/unary/portables_connector{ + dir = 1 + }, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -67222,11 +67387,35 @@ }, /area/toxins/mixing) "cqo" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/simulated/floor/plasteel{ - icon_state = "white" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" }, -/area/toxins/mixing) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; + tag = "" + }, +/obj/machinery/holosign/surgery{ + id = "surgery1" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/surgery1) "cqp" = ( /obj/machinery/camera{ c_tag = "Research Toxins Launch Room"; @@ -67385,6 +67574,17 @@ /turf/simulated/floor/plasteel, /area/hallway/primary/aft) "cqw" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -67392,11 +67592,17 @@ pixel_x = 0; tag = "" }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/holosign/surgery{ + id = "surgery2" }, -/turf/simulated/floor/plating, -/area/maintenance/asmaint) +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/surgery2) "cqx" = ( /obj/machinery/doppler_array{ dir = 4 @@ -67474,6 +67680,7 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, +/obj/effect/mapping_helpers/airlock/unres, /turf/simulated/floor/plating, /area/maintenance/apmaint) "cqG" = ( @@ -68441,6 +68648,7 @@ d2 = 8; icon_state = "1-8" }, +/obj/machinery/portable_atmospherics/scrubber, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -68448,7 +68656,7 @@ "csj" = ( /obj/structure/girder, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "csk" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance, @@ -69351,11 +69559,12 @@ name = "Research Division" }) "ctD" = ( -/obj/machinery/portable_atmospherics/canister, -/turf/simulated/floor/plasteel{ - icon_state = "white" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/area/toxins/mixing) +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plating, +/area/maintenance/asmaint) "ctE" = ( /obj/machinery/hologram/holopad, /turf/simulated/floor/plasteel{ @@ -69394,15 +69603,27 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint2) "ctI" = ( -/obj/structure/table, /obj/structure/cable, -/obj/item/storage/toolbox/mechanical, /obj/machinery/power/apc{ dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0 }, +/obj/structure/table, +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/stack/cable_coil, +/obj/item/analyzer{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/taperecorder{ + pixel_x = 5; + pixel_y = 5 + }, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -69428,37 +69649,21 @@ /turf/simulated/floor/plasteel, /area/engine/controlroom) "ctK" = ( -/obj/structure/table, -/obj/item/assembly/signaler{ - pixel_x = 8; - pixel_y = 8 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/item/assembly/signaler{ - pixel_x = 5; - pixel_y = -5 +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, -/obj/item/assembly/signaler{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/assembly/signaler, -/obj/item/assembly/signaler{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/item/assembly/signaler{ - pixel_x = 4; - pixel_y = -2 - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/toxins/mixing) +/turf/simulated/floor/plating, +/area/maintenance/apmaint) "ctL" = ( /obj/machinery/light{ dir = 4; icon_state = "tube1" }, +/obj/machinery/portable_atmospherics/pump, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -70181,13 +70386,11 @@ }, /area/toxins/explab) "cuT" = ( -/obj/item/transfer_valve, -/obj/item/transfer_valve, -/obj/item/transfer_valve, -/obj/item/transfer_valve, -/obj/item/transfer_valve, +/obj/machinery/light_switch{ + pixel_y = -23 + }, /obj/structure/table, -/obj/item/transfer_valve, +/obj/item/storage/toolbox/mechanical, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -70287,25 +70490,28 @@ }, /area/toxins/mixing) "cvc" = ( -/obj/item/assembly/prox_sensor{ - pixel_x = -5; - pixel_y = -5 +/obj/item/transfer_valve{ + pixel_x = 4; + pixel_y = -4 }, -/obj/item/assembly/prox_sensor{ +/obj/item/transfer_valve{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/transfer_valve, +/obj/item/transfer_valve{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/transfer_valve{ pixel_x = -4; pixel_y = 4 }, -/obj/item/assembly/prox_sensor{ - pixel_x = 5; - pixel_y = 5 - }, /obj/structure/table, -/obj/item/assembly/prox_sensor, -/obj/item/assembly/prox_sensor{ - pixel_x = -5; - pixel_y = -5 +/obj/item/transfer_valve{ + pixel_x = -6; + pixel_y = 6 }, -/obj/item/assembly/prox_sensor, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -70324,27 +70530,6 @@ }, /area/medical/virology) "cve" = ( -/obj/item/assembly/timer, -/obj/item/assembly/timer{ - pixel_x = 6 - }, -/obj/item/assembly/timer{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/structure/table, -/obj/item/assembly/timer{ - pixel_x = -3; - pixel_y = -4 - }, -/obj/item/assembly/timer{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/assembly/timer, -/obj/machinery/light_switch{ - pixel_y = -23 - }, /obj/machinery/light, /obj/machinery/requests_console{ department = "Science"; @@ -70353,6 +70538,7 @@ pixel_x = 0; pixel_y = -30 }, +/obj/machinery/vending/plasmaresearch, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -71491,17 +71677,38 @@ /area/maintenance/asmaint) "cxj" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Xenobiology Research"; - req_access_txt = "47" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; + tag = "" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = ""; + name = "Staff Room"; + req_access_txt = "5"; + req_one_access_txt = "0" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ - icon_state = "white" + dir = 2; + icon_state = "cafeteria"; + tag = "icon-cafeteria (NORTHEAST)" }, -/area/toxins/xenobiology) +/area/medical/medbay2) "cxk" = ( /obj/structure/cable{ icon_state = "0-4"; @@ -71962,7 +72169,7 @@ dir = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cxZ" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/decal/cleanable/cobweb, @@ -72153,20 +72360,8 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; dir = 4 }, /turf/simulated/floor/plating, @@ -72304,23 +72499,15 @@ /area/construction) "cyE" = ( /obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" + name = "Medbay Maintenance"; + req_access_txt = "5" }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, /turf/simulated/floor/plating, -/area/maintenance/asmaint2) +/area/maintenance/genetics) "cyF" = ( /obj/structure/cable{ d1 = 4; @@ -72412,8 +72599,8 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint) "cyO" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cyP" = ( /obj/effect/spawner/random_barrier/obstruction, @@ -72448,18 +72635,22 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint) "cyT" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Xenobiology Research"; + req_access_txt = "47" }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, -/turf/simulated/floor/plating, -/area/maintenance/asmaint2) +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/toxins/xenobiology) "cyU" = ( /obj/item/twohanded/required/kirbyplants, /obj/structure/extinguisher_cabinet{ @@ -72743,6 +72934,9 @@ /turf/simulated/floor/plating, /area/storage/tech) "czx" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -72750,10 +72944,8 @@ pixel_x = 0; tag = "" }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering{ - name = "Tech Storage"; - req_access_txt = "23" +/obj/structure/disposalpipe/segment{ + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -72761,8 +72953,12 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, /turf/simulated/floor/plating, -/area/storage/tech) +/area/maintenance/asmaint) "czy" = ( /obj/structure/cable{ d1 = 4; @@ -72869,7 +73065,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "czF" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -73445,24 +73641,28 @@ /turf/simulated/floor/plating, /area/maintenance/apmaint) "cAG" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, /obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; tag = "" }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Xenobiology Research"; - req_access_txt = "47" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plasteel{ - icon_state = "white" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/area/toxins/xenobiology) +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/maintenance/asmaint2) "cAH" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -73893,22 +74093,22 @@ /turf/simulated/floor/plating, /area/medical/psych) "cBx" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Psych Office"; - req_access_txt = "64" - }, /obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - pixel_y = 0 + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; + tag = "" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/wood, -/area/medical/psych) +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plating, +/area/maintenance/asmaint2) "cBy" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ dir = 1; @@ -74359,7 +74559,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cCt" = ( /obj/machinery/atmospherics/pipe/simple/visible, /turf/simulated/floor/plasteel{ @@ -74391,9 +74591,7 @@ /area/toxins/test_area) "cCw" = ( /obj/machinery/igniter{ - icon_state = "igniter0"; - id = "Incinerator"; - on = 0 + id = "Incinerator" }, /turf/simulated/floor/engine/insulated, /area/maintenance/incinerator) @@ -74507,11 +74705,13 @@ /turf/simulated/floor/plating, /area/maintenance/apmaint) "cCF" = ( -/obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance{ - name = "Alternate Construction Area"; req_access_txt = "12" }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, /turf/simulated/floor/plating, /area/maintenance/apmaint) "cCG" = ( @@ -74538,16 +74738,26 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; + pixel_x = 0; tag = "" }, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Alternate Construction Area"; - req_access_txt = "12" +/obj/machinery/door/airlock/engineering{ + name = "Tech Storage"; + req_access_txt = "23" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 }, /turf/simulated/floor/plating, -/area/maintenance/consarea) +/area/storage/tech) "cCJ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -74989,20 +75199,25 @@ /turf/simulated/floor/plating, /area/toxins/misc_lab) "cDv" = ( -/obj/structure/disposalpipe/segment, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; tag = "" }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Xenobiology Research"; + req_access_txt = "47" }, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/maintenance/apmaint) +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/toxins/xenobiology) "cDw" = ( /turf/simulated/floor/plasteel{ icon_state = "white" @@ -75855,16 +76070,15 @@ /turf/simulated/wall/r_wall, /area/engine/mechanic_workshop) "cFe" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance{ + name = "Alternate Construction Area"; req_access_txt = "12" }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, /turf/simulated/floor/plating, /area/maintenance/apmaint) "cFf" = ( @@ -76386,25 +76600,24 @@ }, /area/toxins/misc_lab) "cFT" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0; + tag = "" + }, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Mechanic Workshop"; - req_access_txt = "70"; - req_one_access_txt = "0" +/obj/machinery/door/airlock/maintenance{ + name = "Alternate Construction Area"; + req_access_txt = "12" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/engine/mechanic_workshop) +/turf/simulated/floor/plating, +/area/maintenance/consarea) "cFU" = ( /obj/structure/window/reinforced, /obj/structure/table/reinforced, @@ -76886,9 +77099,23 @@ /turf/simulated/wall/r_wall, /area/atmos/control) "cGL" = ( -/obj/machinery/door/airlock/maintenance, -/turf/simulated/floor/plating, -/area/maintenance/genetics) +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Psych Office"; + req_access_txt = "64" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/wood, +/area/medical/psych) "cGM" = ( /obj/structure/cable{ d1 = 2; @@ -77250,7 +77477,7 @@ }, /area/toxins/misc_lab) "cHq" = ( -/obj/machinery/atmospherics/binary/pump/highcap{ +/obj/machinery/atmospherics/binary/pump{ dir = 8 }, /turf/simulated/floor/plasteel{ @@ -77387,16 +77614,18 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, +/obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, /turf/simulated/floor/plating, -/area/maintenance/aft) +/area/maintenance/apmaint) "cHF" = ( /obj/structure/cable{ d1 = 1; @@ -77535,23 +77764,24 @@ /turf/simulated/wall, /area/engine/break_room) "cHR" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering"; - req_access_txt = "32"; - req_one_access_txt = "0" +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel, -/area/engine/break_room) +/turf/simulated/floor/plating, +/area/maintenance/apmaint) "cHS" = ( /obj/structure/table, /obj/item/book/manual/supermatter_engine, @@ -78760,18 +78990,29 @@ }, /area/engine/mechanic_workshop) "cJY" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/airlock/engineering/glass{ + name = "Mechanic Workshop"; + req_access_txt = "70"; + req_one_access_txt = "0" }, -/turf/simulated/floor/plating, -/area/maintenance/aft) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/engine/mechanic_workshop) "cJZ" = ( /turf/simulated/wall, /area/hallway/primary/aft) @@ -79977,9 +80218,20 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint2) "cMq" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" + }, +/obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, /turf/simulated/floor/plating, /area/maintenance/aft) "cMr" = ( @@ -80081,8 +80333,8 @@ icon_state = "1-2"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cMC" = ( /obj/effect/landmark{ @@ -80628,9 +80880,9 @@ dir = 10; level = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cNF" = ( /obj/structure/cable{ icon_state = "0-4"; @@ -81037,16 +81289,19 @@ }, /area/assembly/assembly_line) "cOs" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; + pixel_y = 0; tag = "" }, -/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres, /turf/simulated/floor/plating, /area/maintenance/aft) "cOt" = ( @@ -81634,13 +81889,13 @@ /area/assembly/assembly_line) "cPw" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cPx" = ( /obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cPy" = ( /obj/structure/table/reinforced, @@ -81687,8 +81942,8 @@ icon_state = "0-4"; d2 = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cPD" = ( /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ @@ -81733,24 +81988,24 @@ icon_state = "4-8"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cPH" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cPI" = ( /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cPJ" = ( /obj/structure/table, @@ -81933,8 +82188,8 @@ icon_state = "4-8"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cQb" = ( /obj/machinery/particle_accelerator/control_box, @@ -82062,14 +82317,14 @@ level = 2 }, /turf/space, -/area/space) +/area/space/nearstation) "cQq" = ( /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cQr" = ( /obj/structure/disposalpipe/segment{ @@ -82582,8 +82837,8 @@ icon_state = "1-2"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cRf" = ( /obj/machinery/door/poddoor{ @@ -83277,8 +83532,8 @@ icon_state = "1-4"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cSl" = ( /obj/machinery/atmospherics/unary/vent_pump/on, @@ -83517,7 +83772,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cSF" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -83525,7 +83780,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cSG" = ( /obj/structure/table/reinforced, /obj/machinery/photocopier/faxmachine{ @@ -83556,7 +83811,7 @@ icon_state = "1-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cSJ" = ( /obj/structure/cable{ d1 = 1; @@ -83585,7 +83840,7 @@ icon_state = "2-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cSN" = ( /obj/structure/chair/stool, /obj/structure/cable/yellow{ @@ -84008,7 +84263,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cTy" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -84079,7 +84334,7 @@ icon_state = "1-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cTE" = ( /obj/machinery/power/tesla_coil{ anchored = 1 @@ -84090,7 +84345,7 @@ icon_state = "0-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cTF" = ( /obj/structure/cable/yellow{ d1 = 2; @@ -84103,24 +84358,29 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cTG" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Engineering Shuttle"; - req_access_txt = "0"; - req_one_access_txt = "10;24" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Engineering"; + req_access_txt = "32"; + req_one_access_txt = "0" }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/maintenance/engi_shuttle) +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/engine/break_room) "cTH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, @@ -84252,9 +84512,9 @@ pixel_y = 8; req_access_txt = "13" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cTS" = ( /obj/effect/landmark/burnturf, /turf/simulated/floor/plating, @@ -84298,8 +84558,8 @@ /turf/simulated/floor/plasteel, /area/maintenance/turbine) "cTW" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cTX" = ( /obj/structure/cable{ @@ -84523,7 +84783,7 @@ icon_state = "0-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cUm" = ( /obj/structure/reagent_dispensers/fueltank, /obj/structure/cable{ @@ -84814,7 +85074,7 @@ icon_state = "1-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cUN" = ( /obj/machinery/atmospherics/pipe/simple/visible/green{ dir = 4; @@ -84839,7 +85099,7 @@ icon_state = "1-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cUP" = ( /obj/structure/window/reinforced{ dir = 8 @@ -84868,7 +85128,7 @@ icon_state = "1-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cUR" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -84907,7 +85167,7 @@ level = 2 }, /turf/space, -/area/space) +/area/space/nearstation) "cUW" = ( /obj/machinery/atmospherics/unary/outlet_injector{ dir = 8; @@ -86909,9 +87169,9 @@ pixel_x = -25; pixel_y = -8 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cYA" = ( /obj/structure/cable{ icon_state = "0-4"; @@ -87287,7 +87547,7 @@ level = 2 }, /turf/space, -/area/space) +/area/space/nearstation) "cZi" = ( /obj/machinery/atmospherics/unary/outlet_injector{ dir = 8; @@ -87778,7 +88038,7 @@ dir = 10 }, /turf/space, -/area/space) +/area/space/nearstation) "dae" = ( /obj/structure/door_assembly/door_assembly_mai, /turf/simulated/floor/plating, @@ -88241,7 +88501,7 @@ }, /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction, /turf/space, -/area/space) +/area/space/nearstation) "dbb" = ( /turf/simulated/floor/engine{ carbon_dioxide = 0; @@ -88310,8 +88570,9 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, +/obj/effect/mapping_helpers/airlock/unres, /turf/simulated/floor/plating, -/area/maintenance/asmaint2) +/area/maintenance/aft) "dbi" = ( /obj/structure/closet/crate, /obj/item/clothing/under/color/lightpurple, @@ -88365,17 +88626,19 @@ /turf/simulated/floor/plasteel, /area/escapepodbay) "dbp" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, /obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" }, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/unres, /turf/simulated/floor/plating, -/area/maintenance/asmaint) +/area/maintenance/aft) "dbq" = ( /obj/structure/cable{ d1 = 1; @@ -88588,7 +88851,7 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/heat_exchanging, /turf/space, -/area/space) +/area/space/nearstation) "dbJ" = ( /obj/structure/cable{ d1 = 1; @@ -88663,7 +88926,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dbQ" = ( /obj/machinery/power/emitter{ anchored = 1; @@ -88708,7 +88971,7 @@ /obj/structure/grille, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dbU" = ( /obj/structure/rack, /obj/item/clothing/suit/fire/firefighter, @@ -88742,7 +89005,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "dbY" = ( /obj/structure/disposalpipe/segment{ dir = 1; @@ -88765,14 +89028,13 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dca" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/insulated{ - dir = 10 +/obj/machinery/atmospherics/unary/passive_vent{ + dir = 8 }, -/turf/space, -/area/space) +/turf/simulated/floor/plating/airless, +/area/space/nearstation) "dcb" = ( /turf/simulated/floor/plasteel{ icon_state = "blue"; @@ -88780,13 +89042,7 @@ }, /area/hallway/primary/central/north) "dcc" = ( -/obj/machinery/atmospherics/unary/outlet_injector/on{ - dir = 1; - frequency = 1441; - id = "co2_in"; - pixel_y = 1 - }, -/turf/simulated/floor/plating/airless, +/turf/space, /area/toxins/mixing) "dcd" = ( /obj/structure/cable{ @@ -88828,7 +89084,7 @@ d2 = 2 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dcg" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -88851,11 +89107,9 @@ /area/maintenance/asmaint) "dci" = ( /obj/machinery/door/airlock/maintenance, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 }, /turf/simulated/floor/plating, /area/maintenance/genetics) @@ -89168,7 +89422,7 @@ }, /obj/machinery/atmospherics/pipe/simple/heat_exchanging, /turf/space, -/area/space) +/area/space/nearstation) "dcT" = ( /obj/machinery/atmospherics/unary/outlet_injector{ dir = 8; @@ -89487,8 +89741,8 @@ pixel_y = 0; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddB" = ( /obj/structure/disposalpipe/segment{ @@ -89501,14 +89755,14 @@ /obj/structure/transit_tube{ icon_state = "E-W-Pass" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/space) "ddD" = ( /obj/item/wrench, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ddE" = ( /obj/structure/cable{ d1 = 1; @@ -89517,15 +89771,15 @@ pixel_y = 0; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddF" = ( /obj/structure/sign/biohazard{ pixel_y = 32 }, /turf/space, -/area/space) +/area/space/nearstation) "ddG" = ( /obj/machinery/field/generator, /turf/simulated/floor/plating, @@ -89580,22 +89834,22 @@ pixel_y = 25; req_access_txt = "75;13" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ddN" = ( /obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddO" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 6; level = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ddP" = ( /obj/structure/cable{ d1 = 2; @@ -89609,8 +89863,8 @@ icon_state = "1-4"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddQ" = ( /obj/structure/cable{ @@ -89632,16 +89886,16 @@ pixel_x = 0; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddR" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddS" = ( /obj/structure/particle_accelerator/fuel_chamber, @@ -89652,8 +89906,8 @@ icon_state = "0-4"; d2 = 4 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddU" = ( /obj/structure/cable{ @@ -89675,8 +89929,8 @@ pixel_x = 0; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddV" = ( /obj/structure/cable{ @@ -89691,20 +89945,27 @@ icon_state = "2-8"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddW" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 +/obj/machinery/door/airlock/maintenance{ + name = "Engineering Shuttle"; + req_access_txt = "0"; + req_one_access_txt = "10;24" }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres, /turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f6"; - icon_state = "swall_f6"; - dir = 2 - }, -/area/shuttle/pod_4) +/area/maintenance/engi_shuttle) "ddX" = ( /obj/machinery/access_button{ command = "cycle_exterior"; @@ -89715,23 +89976,16 @@ pixel_y = 25; req_access_txt = "13" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk0"; - icon_state = "catwalk0" - }, -/area/space) +/area/space/nearstation) "ddY" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, +/obj/effect/mapping_helpers/airlock/unres, /turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f5"; - icon_state = "swall_f5"; - dir = 2 - }, -/area/shuttle/pod_4) +/area/maintenance/asmaint2) "ddZ" = ( /obj/structure/reagent_dispensers/watertank, /obj/structure/cable{ @@ -89764,8 +90018,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "dec" = ( /obj/machinery/atmospherics/pipe/manifold/visible, @@ -89776,8 +90030,8 @@ icon_state = "0-2"; d2 = 2 }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "dee" = ( /obj/structure/cable{ @@ -89787,8 +90041,8 @@ pixel_x = 0; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "def" = ( /obj/structure/cable{ @@ -89809,14 +90063,14 @@ icon_state = "1-2"; tag = "" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "deg" = ( /obj/structure/cable, /obj/machinery/power/tracker, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "deh" = ( /obj/machinery/space_heater, @@ -89866,7 +90120,7 @@ }, /obj/machinery/atmospherics/pipe/simple/heat_exchanging, /turf/space, -/area/space) +/area/space/nearstation) "dem" = ( /turf/simulated/floor/engine{ carbon_dioxide = 50000; @@ -89895,6 +90149,33 @@ oxygen = 0 }, /area/atmos) +"deo" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/maintenance/asmaint) +"dep" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" + }, +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plating, +/area/maintenance/genetics) "deq" = ( /obj/machinery/computer/guestpass, /turf/simulated/wall, @@ -90287,18 +90568,19 @@ /turf/simulated/floor/plating, /area/storage/secure) "dff" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, +/obj/machinery/door/airlock/maintenance, /obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, -/area/maintenance/port) +/area/maintenance/asmaint2) "dfg" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -90733,6 +91015,16 @@ "dfV" = ( /turf/simulated/floor/plating, /area/storage/secure) +"dfW" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/maintenance/asmaint2) "dfX" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -90797,6 +91089,23 @@ dir = 6 }, /area/maintenance/storage) +"dge" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Biohazard Disposals"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plating, +/area/maintenance/asmaint) +"dgf" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/maintenance/asmaint2) "dgg" = ( /obj/machinery/atmospherics/pipe/simple/visible/cyan{ level = 2 @@ -90916,14 +91225,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{ @@ -90951,20 +91252,31 @@ /obj/machinery/light/small, /turf/simulated/floor/plating, /area/maintenance/asmaint2) -"dgD" = ( -/turf/space, -/turf/simulated/shuttle/wall{ - tag = "icon-propulsion (EAST)"; - icon_state = "propulsion"; - dir = 4 +"dgC" = ( +/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) +"dgD" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_l"; + tag = "icon-propulsion_l (EAST)" + }, +/turf/simulated/shuttle/plating, /area/shuttle/constructionsite) "dgE" = ( /obj/machinery/power/grounding_rod{ anchored = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dgF" = ( /turf/simulated/shuttle/wall{ icon_state = "swall1"; @@ -91009,7 +91321,7 @@ pixel_y = 32 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dgK" = ( /obj/effect/spawner/lootdrop/trade_sol/sec, /obj/structure/closet, @@ -91144,7 +91456,7 @@ id = "soltraderflash"; pixel_y = -28 }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -91153,7 +91465,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dhd" = ( /obj/machinery/computer/shuttle/engineering, /turf/simulated/shuttle/floor{ @@ -91572,30 +91884,16 @@ }, /area/crew_quarters/toilet) "dhT" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Bar Office"; - req_access_txt = "25" +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 }, -/turf/simulated/floor/wood, -/area/crew_quarters/bar) -"dhU" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Bar Maintenance"; - req_access_txt = "12" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, -/area/maintenance/fsmaint2) +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f5"; + icon_state = "swall_f5"; + dir = 2 + }, +/area/shuttle/pod_4) "dhV" = ( /obj/structure/sink/kitchen{ pixel_y = 28 @@ -91605,9 +91903,6 @@ }, /area/crew_quarters/kitchen) "dhW" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light, /turf/simulated/shuttle/floor{ icon_state = "floor2" @@ -91656,16 +91951,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/asmaint2) -"die" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 - }, -/turf/simulated/floor/plating, -/area/maintenance/asmaint2) "dif" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall2"; @@ -91822,7 +92107,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "div" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -91871,7 +92156,7 @@ }, /area/hallway/primary/central/north) "diy" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -92122,21 +92407,21 @@ level = 2 }, /turf/space, -/area/space) +/area/space/nearstation) "diV" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ level = 2 }, /turf/space, -/area/space) +/area/space/nearstation) "diW" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible{ dir = 5 }, /turf/space, -/area/space) +/area/space/nearstation) "diX" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/green{ @@ -92146,14 +92431,14 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "diY" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "diZ" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ @@ -92163,7 +92448,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "dja" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/cyan{ @@ -92173,26 +92458,26 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "djb" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 4 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "djc" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 9 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "djd" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dje" = ( /obj/item/twohanded/required/kirbyplants, /turf/simulated/floor/plasteel{ @@ -92331,7 +92616,7 @@ state = 2 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "djr" = ( /obj/structure/closet/emcloset, /turf/simulated/floor/plating, @@ -92398,7 +92683,7 @@ /obj/structure/lattice, /obj/item/wirecutters, /turf/space, -/area/space) +/area/space/nearstation) "djz" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -92465,7 +92750,7 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/yellow, /turf/space, -/area/space) +/area/space/nearstation) "djF" = ( /obj/structure/cable{ d1 = 1; @@ -92624,7 +92909,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "djU" = ( /obj/machinery/atmospherics/pipe/simple/visible, /obj/structure/grille, @@ -93004,19 +93289,19 @@ "dkz" = ( /obj/effect/decal/warning_stripes/northwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dkA" = ( /obj/effect/decal/warning_stripes/north, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dkB" = ( /obj/effect/decal/warning_stripes/northeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dkC" = ( /obj/item/crowbar, /turf/space, -/area/space) +/area/space/nearstation) "dkD" = ( /obj/machinery/newscaster{ pixel_y = 32 @@ -93035,14 +93320,6 @@ /obj/structure/disposalpipe/segment, /turf/simulated/wall, /area/maintenance/asmaint2) -"dkG" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Biohazard Disposals"; - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/maintenance/asmaint) "dkH" = ( /obj/machinery/light/small{ dir = 4; @@ -93423,18 +93700,18 @@ }, /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dlf" = ( /obj/item/wrench, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dlg" = ( /obj/machinery/the_singularitygen/tesla{ anchored = 1 }, /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dlh" = ( /obj/machinery/door/airlock/external{ frequency = 1450; @@ -93665,19 +93942,19 @@ "dlE" = ( /obj/item/weldingtool, /turf/space, -/area/space) +/area/space/nearstation) "dlF" = ( /obj/effect/decal/warning_stripes/southwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dlG" = ( /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dlH" = ( /obj/effect/decal/warning_stripes/southeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dlI" = ( /obj/structure/lattice, /obj/machinery/atmospherics/binary/pump/on, @@ -93703,10 +93980,6 @@ /area/aisat/maintenance{ name = "\improper AI Satellite Service" }) -"dlL" = ( -/obj/machinery/door/airlock/maintenance, -/turf/simulated/floor/plating, -/area/maintenance/asmaint2) "dlM" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light/small, @@ -93837,7 +94110,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/purple, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dlZ" = ( /obj/structure/chair{ dir = 8 @@ -93979,10 +94252,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/simulated/floor/plating, /area/maintenance/asmaint2) -"dmo" = ( -/turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) "dmp" = ( /obj/structure/table, /obj/item/weldingtool, @@ -94104,9 +94373,7 @@ tag = "" }, /obj/machinery/igniter{ - icon_state = "igniter0"; - id = "gasturbine"; - on = 0 + id = "gasturbine" }, /turf/simulated/floor/engine/insulated, /area/maintenance/turbine) @@ -94121,7 +94388,7 @@ /area/turret_protected/aisat_interior) "dmD" = ( /turf/simulated/wall/r_wall/coated, -/area/space) +/area/space/nearstation) "dmE" = ( /obj/machinery/door/poddoor{ id_tag = "auxiliaryturbinevent"; @@ -94133,7 +94400,7 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/purple, /turf/space, -/area/space) +/area/space/nearstation) "dmG" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -94215,7 +94482,7 @@ "dmN" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dmO" = ( /obj/structure/cable{ d2 = 2; @@ -94354,14 +94621,14 @@ "dmW" = ( /obj/structure/transit_tube, /turf/space, -/area/space) +/area/space/nearstation) "dmX" = ( /obj/structure/transit_tube{ icon_state = "E-W-Pass" }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dmY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/hatch{ @@ -94407,7 +94674,7 @@ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dne" = ( /obj/structure/cable, /obj/machinery/power/turbine, @@ -94545,7 +94812,7 @@ }, /obj/structure/disposaloutlet, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dnq" = ( /obj/structure/cable{ d1 = 1; @@ -95308,12 +95575,9 @@ /turf/simulated/floor/wood, /area/crew_quarters/captain) "doE" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk0"; - icon_state = "catwalk0" - }, -/area/space) +/area/space/nearstation) "doF" = ( /turf/simulated/floor/plating, /area/toxins/launch{ @@ -95334,15 +95598,15 @@ /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 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_4) "doK" = ( @@ -95364,9 +95628,6 @@ /turf/simulated/shuttle/floor, /area/shuttle/pod_4) "doM" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/status_display{ density = 0; layer = 4; @@ -95374,6 +95635,9 @@ pixel_y = 32 }, /obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_4) "doN" = ( @@ -96288,20 +96552,6 @@ "dsw" = ( /turf/simulated/floor/mech_bay_recharge_floor, /area/shuttle/escape) -"dsx" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/maintenance/asmaint2) "dsy" = ( /obj/machinery/light/small{ dir = 4 @@ -96600,6 +96850,303 @@ /obj/machinery/suit_storage_unit/engine, /turf/simulated/floor/plating, /area/storage/secure) +"duq" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{ + dir = 1 + }, +/turf/space, +/area/space/nearstation) +"gMZ" = ( +/obj/machinery/atmospherics/pipe/simple/insulated{ + dir = 6 + }, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard"; + name = "Biohazard Shutter"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/window/plasmareinforced, +/obj/structure/window/plasmareinforced{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/toxins/mixing) +"gQL" = ( +/obj/machinery/computer/card, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"hsy" = ( +/obj/machinery/atmospherics/pipe/simple/insulated{ + dir = 4 + }, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard"; + name = "Biohazard Shutter"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/window/plasmareinforced{ + dir = 4 + }, +/obj/structure/window/plasmareinforced, +/obj/structure/window/plasmareinforced{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/toxins/mixing) +"izn" = ( +/obj/machinery/atmospherics/unary/passive_vent{ + dir = 1 + }, +/turf/simulated/floor/plating/airless, +/area/space/nearstation) +"iJf" = ( +/obj/machinery/atmospherics/pipe/simple/insulated, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard"; + name = "Biohazard Shutter"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/window/plasmareinforced{ + dir = 8 + }, +/obj/structure/window/plasmareinforced, +/obj/structure/window/plasmareinforced{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/toxins/mixing) +"iNz" = ( +/obj/machinery/atmospherics/pipe/simple/insulated{ + dir = 4 + }, +/turf/simulated/wall/r_wall, +/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/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"kOE" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{ + dir = 4 + }, +/obj/structure/lattice, +/turf/space, +/area/space/nearstation) +"mMw" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor4/vox, +/area/shuttle/vox) +"nMi" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 9 + }, +/turf/space, +/area/space/nearstation) +"oZV" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Medbay"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"pwN" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"pZO" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 10 + }, +/turf/space, +/area/space/nearstation) +"qgG" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "101" + }, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"qUv" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging, +/turf/space, +/area/space/nearstation) +"rEw" = ( +/obj/machinery/computer/shuttle/admin{ + name = "NTV Argos shuttle console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"rSv" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_l"; + tag = "icon-propulsion_l (EAST)" + }, +/turf/space, +/area/shuttle/administration) +"rYq" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Bridge"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"sUK" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/syndicate_sit) +"uxy" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 4 + }, +/turf/space, +/area/space/nearstation) +"uBM" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_r"; + tag = "icon-propulsion_r (EAST)" + }, +/turf/space, +/area/shuttle/administration) +"uDK" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + tag = "icon-intact (NORTHEAST)"; + icon_state = "intact"; + dir = 5 + }, +/turf/space, +/area/space/nearstation) +"vup" = ( +/obj/machinery/atmospherics/pipe/simple/insulated{ + dir = 10 + }, +/obj/structure/lattice, +/turf/space, +/area/space/nearstation) +"vUm" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor2" + }, +/area/shuttle/constructionsite) +"wVD" = ( +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "brown" + }, +/area/quartermaster/miningdock) +"xAw" = ( +/obj/machinery/atmospherics/pipe/manifold/visible{ + dir = 8 + }, +/obj/structure/lattice, +/turf/space, +/area/space/nearstation) +"xWg" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + tag = "icon-intact (SOUTHEAST)"; + icon_state = "intact"; + dir = 6 + }, +/turf/space, +/area/space/nearstation) +"yeP" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ylx" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Workshop"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) (1,1,1) = {" aaa @@ -104964,15 +105511,15 @@ aaa aaa aaa aaa +bPL +rSv +uBM +cae aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bPL +rSv +uBM +cae aaa aaa aaa @@ -105204,10 +105751,9 @@ aaa aaa aaa aaa -bwX +bPv bvi -bys -aaa +bPU aaa aaa aaa @@ -105222,16 +105768,17 @@ aaa aaa aaa bPL -bWO -bYu +bPI +bWG +bWG +bPI +bPI +bPI +bWG +bWG +bPI cae aaa -bPL -bWO -bYu -cae -aaa -aaa aaa aaa aaa @@ -105460,11 +106007,11 @@ aab aaa aaa aaa -bwX +bPv btv bvj bwE -bys +bPU aaa bAQ bCa @@ -105476,16 +106023,17 @@ aaa aaa aaa aaa -aaa bPL bPI -bWG -bWG +bVe +bRA +bRA +caf bPI -bPI -bPI -bWG -bWG +cdl +ceR +ceR +cig bPI cae aaa @@ -105594,7 +106142,6 @@ aaa aaa aaa aaa -aaa "} (36,1,1) = {" aaa @@ -105728,22 +106275,23 @@ bCd bCd bCd bAR -aaa -aaa +bjQ aaa aaa aaa bPL -bPI -bVe +bRu +bRA +bVf bRA bRA -caf +cag bPI -cdl +cdm ceR ceR -cig +ceR +ckd bPI cae aaa @@ -105851,7 +106399,6 @@ aaa aaa aaa aaa -aaa "} (37,1,1) = {" aaa @@ -105953,7 +106500,7 @@ aaa aJP aLa aLa -aON +aRm aOP aMs aVf @@ -105985,25 +106532,25 @@ bCc bDG bEK bAR -bjQ +aLd aaa aaa aaa -bPL -bRu -bRA -bVf -bRA -bRA -cag bPI -cdm -ceR -ceR -ceR -ckd +bRv +bRA +bVg +cuH +bRA +cah +bPI +cdp +ceR +ceR +ceR +ceR +clC bPI -cae aaa aaa aaa @@ -106242,24 +106789,24 @@ aAi bCb bCl bAR -aLd +aSd aaa aaa aaa bPI -bRv +bRw bRA -bVg +bVh cuH bRA -cah +cai bPI -cdp +cdl ceR +cgw +cih ceR -ceR -ceR -clC +clD bPI aaa aaa @@ -106467,7 +107014,7 @@ aaa aJQ aLa aLa -aOO +aRz aOR aQa aMd @@ -106504,19 +107051,19 @@ aaa aaa aaa bPI -bRw -bRA -bVh +bRx +bTl +bVi cuH bRA -cai +bRA bPI -cdl +cdo ceR -cgw -cih -ceR -clD +cgx +cii +ckf +clE bPI aaa aaa @@ -106757,23 +107304,23 @@ bCb bEL bAR aSd -aaa -aaa -aaa +aSd +aSd +aSd bPI -bRx -bTl -bVi -cuH -bRA -bRA -bPI -cdo -ceR -cgx -cii -ckf -clE +bRG +bRG +bRG +bRG +bYt +bRG +bRG +bRG +oZV +bRG +bRG +bRG +bRG bPI aaa aaa @@ -106981,7 +107528,7 @@ aaa aJR aLe aLe -aPP +aRV aOP aMs aPJ @@ -107014,23 +107561,23 @@ bCb bEL bAR aSd -aSd -aSd -aSd -bPI -bRG -bRG -bRG -bRG -bYt -bRG -bRG -bRG -ceT -bRG -bRG -bRG -bRG +bGm +bLY +bKp +qgG +yeP +bTn +pwN +bRA +bRA +bRA +bTo +bRA +bRA +bRA +bRA +bRA +bRA bPI aaa aaa @@ -107271,23 +107818,23 @@ bCb bEL bAR aSd -bGm -bLY +bGl +bLX bKp bPN -bRH +bRA bTn -bVk -bRA -bRA -bRA -bTo bRA bRA bRA bRA bRA bRA +bRA +bRA +bRA +bRA +clF bPI aaa aaa @@ -107495,7 +108042,7 @@ aaa aJT aLe aLe -aPU +aRY aOR aQa aPQ @@ -107528,23 +108075,23 @@ bCb bEL bAR aSd -bGl -bLX bKp -bPM -bRA -bTn -bRA -bRA -bRA -bRA -bRA -bRA -bRA -bRA -bRA -bRA -clF +bKp +bOb +bPI +bRG +bRG +ylx +bRG +bRG +bRG +rYq +bRG +bRG +bRG +cik +bRG +bRG bPI aaa aaa @@ -107785,23 +108332,23 @@ bCb bAR bER aSd -bKp -bKp -bOb +aMd +bLZ +aSd bPI -bRG -bRG -bVl -bRG -bRG -bRG -cbz -bRG -bRG -bRG -cik -bRG -bRG +bRB +bTo +bRA +bWI +bPI +gQL +bRA +bRA +bPI +bRA +bRA +ckg +clG bPI aaa aaa @@ -108046,19 +108593,19 @@ aMd bLZ aSd bPI -bRB -bTo +bRC bRA -bWI +bRA +bWJ +bPI +jnJ +cbx +cbx bPI bRA bRA bRA -bPI -bRA -bRA -ckg -clG +clI bPI aaa aaa @@ -108261,14 +108808,14 @@ aEe aFf aFg aaa -dmo +doE aII aII aII aII aHS aLg -aNS +aVL aQw aRe aSd @@ -108303,19 +108850,19 @@ aMd bLZ aSd bPI -bRC +bRD bRA bRA -bWJ +bWK bPI -can -cbx +cak +rEw cdr bPI bRA bRA bRA -clI +bRA bPI aaa aaa @@ -108559,21 +109106,21 @@ aSd aMd bMa bjQ +bPR bPI -bRD -bRA -bRA -bWK -bPI -cak -cby -cdq -bPI -bRA -bRA +bTp bRA bRA bPI +car +cbA +cds +bPI +cgz +cio +ckj +bPI +bYv aaa aaa aaa @@ -108775,7 +109322,7 @@ aaa aaa aaa aaa -dmo +doE aII aII aLw @@ -108816,21 +109363,21 @@ bLs bmS bMb aLd -bPR +aaa +bPI +bWL +bRA +bWM +bPI +aaa +aaa +aaa bPI -bTp bRA bRA +ckh bPI -car -cbA -cds -bPI -cgz -cio -ckj -bPI -bYv +aaa aaa aaa aaa @@ -109074,19 +109621,19 @@ aSf bLZ aSd aaa +bPR bPI -bWL -bRA -bWM +bTl +bWN bPI aaa aaa aaa bPI -bRA -bRA -ckh +cgA +cil bPI +bYv aaa aaa aaa @@ -109331,22 +109878,22 @@ aSf bMc aSd aaa +aaa bPR -bPI -bTl -bWN -bPI -aaa -aaa -aaa -bPI -cgA -cil -bPI +bRG +bRG bYv aaa aaa aaa +bPR +bRG +bRG +bYv +aaa +aaa +aaa +aaa aaa aaa aaa @@ -109578,7 +110125,7 @@ bqr bBr bqr bqr -bFJ +bRH bCf bCf bCf @@ -109589,17 +110136,17 @@ bCf bCf aaa aaa -bPR -bRG -bRG -bYv aaa aaa aaa -bPR -bRG -bRG -bYv +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -110834,7 +111381,7 @@ aHh aIx aIx aJU -aLh +aON aLl aGn aOV @@ -111382,7 +111929,7 @@ bIe bJu bnK bCh -bLU +bSA bCf bCf bCf @@ -111606,7 +112153,7 @@ aLk aGn aGn aPc -aLn +aPh aGn aGn aGn @@ -112126,7 +112673,7 @@ aGn aGn aGn aRu -aRY +bff aSF aTz aVh @@ -112909,7 +113456,7 @@ beP bgz bse bvd -dff +bNP dfg dfh dgU @@ -113401,7 +113948,7 @@ aGn aGn aGn aHn -aIM +aLn aGn aKe aLq @@ -113903,9 +114450,9 @@ awx axl ayk azi -ayk -aBl -aBl +sUK +sUK +sUK ayk diy aex @@ -113927,7 +114474,7 @@ aGn aPc aGn aSK -aVb +bjh aWl aYi bag @@ -113973,7 +114520,7 @@ aaa cng coL coL -cqF +ctK coL cvk cwx @@ -114424,9 +114971,9 @@ aaa aaa aaa aaa -dmo -dmo -dmo +doE +doE +doE aFY aEb aIf @@ -114694,7 +115241,7 @@ aGn aGn aGn aGn -aLk +bbx aGn aGn aUy @@ -114744,7 +115291,7 @@ aaa cng coL coL -cqF +ctK coL coL cwx @@ -115979,7 +116526,7 @@ aPi aPi aHS aMA -aRm +bcv aMA aKb aNx @@ -116038,11 +116585,11 @@ csu csu cCE cAF -cFe +cHE cGf cGf cGf -cJY +cMq cJn cLi cNA @@ -116261,7 +116808,7 @@ bwY bsk bnD bBf -bCq +bOn bJy bKG bxb @@ -116301,7 +116848,7 @@ cFW cIJ cEY cLm -cMq +dbh cNB cNB cPu @@ -116548,7 +117095,7 @@ ctU cgQ cgQ cgQ -cqF +cCF cgQ cgQ cgQ @@ -116764,7 +117311,7 @@ beK bgh bmf bkr -bCq +bOn bCs bCs bCs @@ -117792,7 +118339,7 @@ beN bgA blO bph -bqj +bPr brz bsD bui @@ -117830,7 +118377,7 @@ cam aab cgQ ctU -cqF +ctK coL coL coL @@ -118066,8 +118613,8 @@ bFq bFm bxb bKB -bMz -bOn +bVl +bWO bKB bxb bxb @@ -118081,7 +118628,7 @@ cam cgH cit ckn -ckn +wVD cnm cam cgQ @@ -118592,9 +119139,9 @@ cam cbI cdy cff -cfb cir cfb +cfb cnS cno cam @@ -119073,7 +119620,7 @@ aSz aSz aSz aSz -bfa +bys biE bmx bpj @@ -119093,7 +119640,7 @@ bDU bNs bHc byC -bNP +bVk bMx bSM bUn @@ -119108,7 +119655,7 @@ cdA cis ckq cls -cmI +cls cnU cno cam @@ -119120,7 +119667,7 @@ cvo cvo cvo cvo -cCF +cFe cvo cEY cEP @@ -119381,7 +119928,7 @@ cwF cwF cEY cEO -cFT +cJY cGH cEY cEY @@ -119613,7 +120160,7 @@ bzJ bQe bDX bDX -bXi +cbz bzJ bYK bYM @@ -119897,7 +120444,7 @@ cvo cEQ cGb cGM -cHE +cOs cIP cIP cKJ @@ -119920,9 +120467,9 @@ cZu cZu dcM dfY -dgv -dgv -dgv +vUm +vUm +vUm dfY aaa aaa @@ -120122,7 +120669,7 @@ bzE bzE bzE bNX -bMF +bVH bBn bBn bBn @@ -120177,8 +120724,8 @@ cZu cZu dcU dfZ -dgw -dgw +dgv +dgv dhW dfY aaa @@ -120435,7 +120982,7 @@ dcM dfd dfY dgv -dgw +vUm dgv dfY aaa @@ -121176,7 +121723,7 @@ cvo cvo cvo cvo -cCI +cFT cvo cvo cEQ @@ -121194,7 +121741,7 @@ cKb cKb cRI cSj -cTG +ddW cUY cZC dar @@ -121435,7 +121982,7 @@ czN cyg cCH coL -cqF +ctK cEQ cGj cJZ @@ -121676,7 +122223,7 @@ caw bTz cfq ciy -ckI +cjD cly cly cly @@ -121692,7 +122239,7 @@ cti cly cAH cly -cDv +cHR cFg cGm cnA @@ -122157,7 +122704,7 @@ aXZ bmu aPi aPi -bff +bCq bgS bmV bkv @@ -122642,7 +123189,7 @@ aoe aMO aod aod -avU +avW aod aod aoe @@ -122704,7 +123251,7 @@ bMG cdV cfu ciL -ckN +ckI ccK cmK com @@ -122906,14 +123453,14 @@ aIo aIl aIl aDe -aDO +aIM aIl aIl aHA aHA -aKp +aNS aHA -aNe +aOO aHA aHA aEl @@ -123944,7 +124491,7 @@ aLV aJF aOA aPD -aRV +aVb aTw aVE aYa @@ -124246,7 +124793,7 @@ bTJ ces cgi cji -ckP +ckN clL cmM coo @@ -124450,7 +124997,7 @@ aCi aCf aCn aFr -aGv +aKx aHG aHG aKv @@ -124974,7 +125521,7 @@ aSN aPH aEj aMA -aVL +bew aMA aMA aMA @@ -125029,7 +125576,7 @@ cgW cvx cvx cvx -czx +cCI cvx cvx cvx @@ -125043,7 +125590,7 @@ cJk cHG cHG cNS -cOs +dbp cPl cRR cQE @@ -125983,8 +126530,8 @@ aoq arq asZ aAx -avW awc +awP aAx azI aAP @@ -125997,7 +126544,7 @@ aFw aJh aKy aEj -aKx +aPb awl awl awl @@ -126050,7 +126597,7 @@ chc chc chc chc -cqw +cpk cJZ csD ctX @@ -126261,7 +126808,7 @@ avq avq avq avq -aHp +axN aRx aUw aDN @@ -126322,7 +126869,7 @@ cFj cGN cHU cLM -cHR +cTG cLM cHQ cHQ @@ -126507,7 +127054,7 @@ aHE axe aFz aFz -aHV +aLh aFz axe awl @@ -127330,7 +127877,7 @@ bSi ceF cgj cjl -ckT +ckP clQ cnr cor @@ -128358,13 +128905,13 @@ bSi ccn cgI cjn -cla +ckT clS cPd cos cPd cqY -chi +ctD csL csL cvI @@ -128932,9 +129479,9 @@ dfR dcq dcq dcq -ddW +dgC doL -ddY +dhT dcq aaa aaa @@ -129082,7 +129629,7 @@ aJp aJp aJp aNW -aPb +aPP aQm aSm aTE @@ -129132,7 +129679,7 @@ cjo chf cdW ceb -chi +cmt csL cqZ crX @@ -129953,7 +130500,7 @@ dkO dkO cQZ cYz -dmo +doE dcq dfE dgd @@ -130151,8 +130698,8 @@ bPc chh bQV bSu -bPU -cbr +cbY +ceT bSu bQV chf @@ -130165,7 +130712,7 @@ csL cqD csL chf -chi +cyu chf chf chf @@ -130209,7 +130756,7 @@ cQZ cQZ cQZ cQZ -dmo +doE aab dcq dfD @@ -130466,7 +131013,7 @@ dkq dkT dkT cQZ -dmo +doE aab aaa dmW @@ -130723,7 +131270,7 @@ dkp bbO dlw cQZ -dmo +doE aab aaa dmW @@ -130980,7 +131527,7 @@ dks dkT dkT cQZ -dmo +doE aab aab dmX @@ -131151,7 +131698,7 @@ aUS bjc baJ beH -dhT +bwl bft aYd bnQ @@ -131237,7 +131784,7 @@ cQZ cQZ cQZ cQZ -dmo +doE aab aaa dmW @@ -131494,7 +132041,7 @@ dkw dkV dkV cQZ -dmo +doE aab aaa dmW @@ -131751,7 +132298,7 @@ dku bdG dlx cQZ -dmo +doE aab aaa dmW @@ -131961,7 +132508,7 @@ caA cfE cfE cfE -cjA +cqo cCW cCW chu @@ -132008,11 +132555,11 @@ dkx dkV dkV cQZ -dmo -dmo -dmo +doE +doE +doE ddC -dmo +doE ddM ddO cPw @@ -132265,7 +132812,7 @@ cQZ cQZ cQZ cQZ -dmo +doE aab aaa dmW @@ -132413,7 +132960,7 @@ aIq avq aAc aBt -aHp +aGv aCh aEw aFI @@ -132436,7 +132983,7 @@ aOI bjl bbc bfn -dhU +bwX djk dkN boM @@ -132462,7 +133009,7 @@ bHO bHO bHO bHO -bPv +bYu bSR bZJ cbO @@ -132522,7 +133069,7 @@ aab aab aab aab -dmo +doE aab aaa dmW @@ -132719,7 +133266,7 @@ bLA bLA bLA bLA -bPr +bZR bYe bZK cbQ @@ -132770,16 +133317,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 @@ -132976,7 +133523,7 @@ bLB bNr bPm bNz -bPx +can crA bZJ cuv @@ -133027,7 +133574,7 @@ den deX dfO cQZ -dmo +doE aaa aaa aaa @@ -133178,7 +133725,7 @@ ajb awl arR awl -aHp +avU aqc aya awl @@ -133203,7 +133750,7 @@ aZC bbu bdj bfr -aOa +bpE bjo bbd bdT @@ -133246,7 +133793,7 @@ caA cfH cfH cfH -cjD +cqw cDf cDf cnz @@ -133284,7 +133831,7 @@ dem cRi dem cQZ -dmo +doE aab alw alw @@ -133451,7 +133998,7 @@ aSP aSP aSP aSP -aPh +aPU aQH aSQ aVs @@ -133475,7 +134022,7 @@ bpN bog bpN bog -bwl +bPM bdT bdT bAk @@ -133541,7 +134088,7 @@ dem deY dem cQZ -dmo +doE aab alw aab @@ -133798,7 +134345,7 @@ cQZ cQZ cQZ cQZ -dmo +doE aaa diu djd @@ -133954,7 +134501,7 @@ awF awF avq aya -aBC +aDO aqc atG aaa @@ -134239,7 +134786,7 @@ bdL bfE biY boQ -bpE +bMF bqB brY btI @@ -134724,7 +135271,7 @@ avb aAQ awF aye -aHp +axN avq aAS atG @@ -134742,7 +135289,7 @@ aPm aVv aXf aXf -bbx +bje aKn aKm aVU @@ -135008,7 +135555,7 @@ bbC aGY beb djw -bje +bFJ boX bpH bqH @@ -135095,10 +135642,10 @@ dlm dlm dlm dmD -dmo -dmo -dmo -dmo +doE +doE +doE +doE aab aab aab @@ -135265,7 +135812,7 @@ bbh aGY beb dju -bjg +bLn bjv dnD bmy @@ -135289,7 +135836,7 @@ bLS bTU bQB bRb -bSz +cbr bJR bZN cbU @@ -135355,7 +135902,7 @@ dlm dlm dnx aaa -dmo +doE aaa aaa aaa @@ -135511,7 +136058,7 @@ aPm aPm aSZ aLA -aXT +bfa aIh aLA aLA @@ -135522,7 +136069,7 @@ bbh aGY beb djx -bjh +bLU bjv dnE bmy @@ -135546,7 +136093,7 @@ bMY bOV bQE bOV -bSA +cby cuo bZP cbW @@ -135568,7 +136115,7 @@ cwX cpS czZ cAt -cBx +cGL cCS cEh cmy @@ -135612,7 +136159,7 @@ dmO dne dnI aaa -dmo +doE aaa aaa aaa @@ -135752,9 +136299,9 @@ atG auA axg axh -awP +aBC avt -axN +aHV atG aaa aFK @@ -135779,7 +136326,7 @@ bbI aGY beb bfH -bjh +bLU bjx bfH bmy @@ -135869,7 +136416,7 @@ dlm dlm dnx aaa -dmo +doE aaa aaa aaa @@ -136036,7 +136583,7 @@ bbV aGY beb bfJ -bjh +bLU bjy bkY bmy @@ -136062,8 +136609,8 @@ bLK bLK bLK bTZ -bZR -cbY +cdq +chi bTZ bWd chr @@ -136075,7 +136622,7 @@ chz chr ckC ckC -cmt +cxj ckC ciY cwZ @@ -136124,9 +136671,9 @@ dlm dmE dlm ddD -dmo -dmo -dmo +doE +doE +doE aaa aaa aaa @@ -136520,9 +137067,9 @@ aaa aaa aaa awl -dmo +doE avM -dmo +doE aus avw awm @@ -136795,7 +137342,7 @@ aFJ aPq aRv aTb -aMn +aXT aGY aGY aGY @@ -137401,7 +137948,7 @@ cps diq djm cps -dkG +dge dla dlr dlN @@ -138133,7 +138680,7 @@ ckL cga cga cga -cpk +cyE cxb cxJ cAb @@ -138163,7 +138710,7 @@ cJt cJG chf chf -dbp +deo chf cBN chf @@ -138849,7 +139396,7 @@ aGY aGX aGX aGX -aRz +aTs aMz aOF aOG @@ -138870,7 +139417,7 @@ bfR bfR bfR bfR -bvN +bPx byQ bAW bCN @@ -138935,7 +139482,7 @@ cOm cOm daJ dbq -dci +dep cac cac cac @@ -139359,7 +139906,7 @@ aGX aHc aIv aGX -aMn +aOa aGX aGX aGX @@ -139438,16 +139985,16 @@ ciY ciY ciY ciY -cGL +dci ciY cIb ciY ciY -cGL +dci ciY ciY ciY -cGL +dci cep cep aaa @@ -139609,7 +140156,7 @@ aab aqZ aaa aab -dmo +doE aHN aHN aHN @@ -139714,8 +140261,8 @@ dia dcW bZZ aaa -dmo -dmo +doE +doE cTR aaa aaa @@ -139872,10 +140419,10 @@ aCy aMf aNf aGY -aMn +aNe aGY aGY -aMn +aNe aGY aGY aPK @@ -140123,7 +140670,7 @@ aab aqZ aaa aaa -dmo +doE aHN dof dog @@ -140144,7 +140691,7 @@ aGX aGX aWA aYY -bcv +bqj bfU bhx bij @@ -140388,7 +140935,7 @@ aJI aGY aGX aGX -aMn +aKp aGX aGX aGY @@ -141516,7 +142063,7 @@ aaa aaa bGH cuQ -dlL +dgf cuQ bGH aaa @@ -141925,14 +142472,14 @@ aab aAf aAf aAf -aMn +aKp aAf aHb aMz aMz aIE aGX -aMn +aKp aMz aGX aOG @@ -142247,7 +142794,7 @@ bLR cvG bIi cxN -cyu +czx cBR cBR cDq @@ -142735,11 +143282,11 @@ bHQ bJq bJq bKT -bLn +bSz bNn bPi bRT -bLn +bSz bUP bVF bWl @@ -142760,10 +143307,10 @@ csH cny cvH cwt -cxj +cyT cyC cAi -cAG +cDv cBA cCU cEm @@ -142794,14 +143341,14 @@ aab aab aab bGH -die +dff dhR bGH bGH bGH bGH cuQ -dlL +dgf cuQ bGH bGH @@ -142975,7 +143522,7 @@ bcu ber bga bis -bew +bMz bcD bld blw @@ -143275,7 +143822,7 @@ bIi bIi bIi cxN -cyE +cAG cAP cAP cDu @@ -143780,11 +144327,11 @@ chS cjQ bYj cmx -dsx +cla dsz cpT dsz -dsx +cla ctH cAS cAS @@ -144257,7 +144804,7 @@ aYA baA baz baz -bew +bvN bgg bgg baz @@ -144599,7 +145146,7 @@ cuQ aaa cuQ cuQ -dlL +dgf cuQ bGG bKl @@ -144766,7 +145313,7 @@ aMz aQI aGY aSi -aTs +bjg aUX aUX aZF @@ -144817,7 +145364,7 @@ cgs bGG cuQ cxS -cyT +cBx cAP cCh cDw @@ -145568,7 +146115,7 @@ bPq bPq bPq bUS -bVH +bXi bWv bYn caS @@ -146098,7 +146645,7 @@ cnf cqe crI csg -ctK +cqk cuT cgs bGG @@ -146343,7 +146890,7 @@ big big big big -dbh +cjA aYS aaa dbP @@ -146355,7 +146902,7 @@ cgu cqg crI csg -ctD +cqk cuU cgs bGG @@ -146649,7 +147196,7 @@ bGH bGG dgy bGG -dbh +dfW dia cuQ djQ @@ -146861,7 +147408,7 @@ dbH aYS aaa dbZ -cgu +cgy cia cke clz @@ -147118,7 +147665,7 @@ ccP aYS aaa dbX -cgu +cgy cib cjX cnE @@ -147633,10 +148180,10 @@ aYS aaa dca dcc -aaa -aaa -afO -cgs +xWg +duq +xAw +iJf cqj crI csh @@ -147890,11 +148437,11 @@ aYS aaa aaa aaa +uxy aaa -aaa -afO -cgs -cqo +kOE +gMZ +cqe crI csg cqk @@ -147925,7 +148472,7 @@ aab bGH bGG bGG -dbh +ddY bGG dcJ ddJ @@ -148145,12 +148692,12 @@ baT bgm aYS aaa -aaa -aaa -aaa -aaa -afO -cgs +xWg +qUv +nMi +xWg +djc +hsy cqm crN csi @@ -148190,7 +148737,7 @@ cuQ dfc bGG bGG -dbh +ddY bGG bGG bGH @@ -148402,12 +148949,12 @@ baT baT aYS aaa -aaa -aaa -aaa -aaa -afO -cgE +pZO +uDK +xWg +nMi +aab +iNz cgE crS cgE @@ -148659,12 +149206,12 @@ baT baT aYS aaa -aaa -aaa -aaa -aaa +xWg +nMi +pZO +uDK afO -cgE +iNz cqp crQ csn @@ -148916,12 +149463,12 @@ baU bgd aYS aaa -aaa -aaa -aaa -aaa +pZO +uDK +xWg +nMi afO -cgE +iNz cqq crT crw @@ -149173,12 +149720,12 @@ baV baV daC aaa -aaa -aaa -aaa -aaa +xWg +nMi +pZO +uDK afO -cgE +iNz coG cqx csq @@ -149430,12 +149977,12 @@ aaa aaa daD aaa -aaa -aaa -aaa -aaa +uxy +xWg +uDK +uxy afO -cgE +iNz coI cqC csr @@ -149687,13 +150234,13 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +uxy +uxy +uxy +uxy afO -aaa -aab +vup +izn aab aab aab @@ -149944,10 +150491,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +pZO +nMi +pZO +nMi afO aaa aab @@ -151201,7 +151748,7 @@ aaa aYD baW bcJ -beB +bcK beC beC bjC @@ -151715,7 +152262,7 @@ aaa aYH baY bcL -beB +bcK beC bim bjC @@ -153712,8 +154259,8 @@ aaa aaa agc agZ -ahp -ahp +mMw +mMw agZ ail agw diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 0dc62cde008..d3417ba50f3 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -3225,13 +3225,6 @@ dir = 2 }, /area/syndicate_mothership) -"ir" = ( -/obj/structure/chair/stool, -/turf/unsimulated/floor{ - icon_state = "bar"; - dir = 2 - }, -/area/syndicate_mothership) "is" = ( /mob/living/simple_animal/pet/fox/Syndifox, /turf/unsimulated/floor{ @@ -3506,7 +3499,7 @@ /turf/unsimulated/wall, /area/tdome/arena) "jb" = ( -/obj/machinery/igniter, +/obj/machinery/igniter/on, /turf/simulated/floor/plasteel, /area/tdome/arena) "jc" = ( @@ -3526,6 +3519,9 @@ /area/wizard_station) "jf" = ( /obj/structure/chair/stool/bar, +/obj/effect/landmark{ + name = "Syndicate-Spawn" + }, /turf/unsimulated/floor{ icon_state = "bar"; dir = 2 @@ -3647,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" }, @@ -3668,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" }, @@ -4430,7 +4426,7 @@ /turf/unsimulated/wall, /area/tdome/arena_source) "lD" = ( -/obj/machinery/igniter, +/obj/machinery/igniter/on, /turf/simulated/floor/plasteel, /area/tdome/arena_source) "lE" = ( @@ -7143,7 +7139,7 @@ icon_state = "propulsion"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/centcom/evac) "rK" = ( /turf/unsimulated/wall/splashscreen, @@ -7154,7 +7150,7 @@ icon_state = "propulsion_r"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/centcom/evac) "rM" = ( /turf/simulated/shuttle/wall{ @@ -7169,7 +7165,7 @@ icon_state = "propulsion_l"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/centcom/evac) "rO" = ( /obj/docking_port/stationary{ @@ -7207,7 +7203,7 @@ icon_state = "heater"; dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/centcom/evac) "rS" = ( /turf/simulated/shuttle/wall{ @@ -7384,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) @@ -8034,11 +8029,12 @@ "tH" = ( /obj/docking_port/stationary{ dir = 2; - dwidth = 8; - height = 15; + dwidth = 9; + height = 18; id = "admin_away"; name = "centcom bay 1"; - width = 18 + timid = 1; + width = 19 }, /turf/space, /area/space) @@ -8547,7 +8543,7 @@ pixel_y = 3 }, /obj/item/clothing/mask/gas/cyborg, -/obj/item/clothing/mask/gas/voice, +/obj/item/clothing/mask/chameleon, /obj/item/clothing/mask/balaclava{ pixel_x = 3; pixel_y = -3 @@ -8733,7 +8729,7 @@ /area/admin) "uY" = ( /obj/structure/rack, -/obj/item/clothing/under/chameleon/all{ +/obj/item/clothing/mask/chameleon{ pixel_x = -3; pixel_y = 3 }, @@ -9040,7 +9036,7 @@ pixel_y = 3 }, /obj/item/clothing/shoes/centcom, -/obj/item/clothing/shoes/syndigaloshes{ +/obj/item/clothing/shoes/chameleon/noslip{ pixel_x = 3; pixel_y = -3 }, @@ -12009,8 +12005,8 @@ /area/syndicate_mothership) "BE" = ( /obj/structure/rack, -/obj/item/storage/backpack/duffel/syndie/ammo/loaded, -/obj/item/storage/backpack/duffel/syndie/ammo/loaded, +/obj/item/storage/backpack/duffel/syndie/ammo/shotgun, +/obj/item/storage/backpack/duffel/syndie/ammo/shotgun, /obj/item/gun/projectile/automatic/shotgun/bulldog, /obj/item/gun/projectile/automatic/shotgun/bulldog, /turf/unsimulated/floor{ @@ -12234,6 +12230,12 @@ "FL" = ( /turf/simulated/wall/r_wall, /area/adminconstruction) +"Ga" = ( +/obj/machinery/computer/shuttle/ert, +/turf/unsimulated/floor{ + icon_state = "dark" + }, +/area/centcom/specops) "GP" = ( /turf/unsimulated/floor{ icon_state = "gcircuit" @@ -12279,7 +12281,7 @@ "Hv" = ( /obj/structure/rack, /obj/item/katana/energy, -/obj/item/clothing/mask/gas/voice/space_ninja, +/obj/item/clothing/mask/gas/space_ninja, /turf/unsimulated/floor{ icon_state = "engine" }, @@ -12457,26 +12459,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{ @@ -12484,7 +12492,7 @@ }, /area/shuttle/assault_pod) "KY" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -12569,6 +12577,10 @@ /obj/effect/landmark/ai_multicam_room, /turf/unsimulated/ai_visible, /area/ai_multicam_room) +"Qt" = ( +/obj/machinery/poolcontroller/invisible, +/turf/unsimulated/beach/water, +/area/ninja/holding) "QE" = ( /obj/structure/chair/sofa/right, /turf/simulated/shuttle/floor{ @@ -12581,12 +12593,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 @@ -12739,7 +12745,7 @@ /turf/simulated/shuttle/floor, /area/centcom/evac) "Wk" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -12747,7 +12753,7 @@ }, /area/centcom/evac) "Wl" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -12755,13 +12761,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" = ( @@ -31701,7 +31707,7 @@ pb uj uj uj -uj +Ga sX we we @@ -35344,9 +35350,9 @@ wK wK wK wK -aN -aN -aN +wK +wK +wK aN aN aN @@ -35585,21 +35591,24 @@ aN aN cp cj -yt -yt -yt -cr aN aN -cr -yt -cr aN aN -cr -yt -yt -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -35642,9 +35651,6 @@ aN aN aN aN -aN -aN -aN jZ kz kM @@ -35842,9 +35848,6 @@ aN aN cp cj -yt -yt -cr aN aN aN @@ -35854,9 +35857,15 @@ aN aN aN aN -cr -yt -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -35922,9 +35931,6 @@ aN aN aN aN -aN -aN -aN "} (91,1,1) = {" aN @@ -36099,8 +36105,6 @@ aN aN cp cj -yt -cr aN aN aN @@ -36112,8 +36116,13 @@ aN aN aN aN -cr -yt +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -36156,9 +36165,6 @@ aN aN aN aN -aN -aN -aN jU kw kE @@ -36356,7 +36362,6 @@ aN aN cp cj -cr aN aN aN @@ -36370,7 +36375,11 @@ aN aN aN aN -cr +aN +aN +aN +aN +aN wK aN aN @@ -36412,9 +36421,6 @@ aN aN aN aN -aN -aN -aN jQ jW kD @@ -36628,6 +36634,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -36669,9 +36678,6 @@ aN aN aN aN -aN -aN -aN jP kt kx @@ -36885,6 +36891,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -36926,9 +36935,6 @@ aN aN aN aN -aN -aN -aN jS kv kx @@ -37142,6 +37148,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37183,9 +37192,6 @@ aN aN aN aN -aN -aN -aN jR ku kx @@ -37399,6 +37405,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37440,9 +37449,6 @@ aN aN aN aN -aN -aN -aN jT ka kA @@ -37656,6 +37662,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37698,9 +37707,6 @@ aN aN aN aN -aN -aN -aN jZ kz kM @@ -37913,6 +37919,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37978,9 +37987,6 @@ aN aN aN aN -aN -aN -aN "} (99,1,1) = {" aN @@ -38170,6 +38176,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38235,9 +38244,6 @@ aN aN aN aN -aN -aN -aN "} (100,1,1) = {" aN @@ -38427,6 +38433,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38492,9 +38501,6 @@ aN aN aN aN -aN -aN -aN "} (101,1,1) = {" aN @@ -38684,6 +38690,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38717,9 +38726,6 @@ aN aN aN aN -aN -aN -aN mr mr mr @@ -38941,6 +38947,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38974,9 +38983,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39183,7 +39189,6 @@ qo qs tx wK -cr aN aN aN @@ -39197,7 +39202,11 @@ aN aN aN aN -cr +aN +aN +aN +aN +aN wK aN aN @@ -39231,9 +39240,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39440,21 +39446,24 @@ qo qs tA wK -yt aN aN aN aN aN -yt -yt -yt aN aN aN aN aN -yt +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -39488,9 +39497,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39697,21 +39703,24 @@ tq tv tz wK -yt -cr aN aN aN aN -yt -yt -yt aN aN aN aN -cr -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -39745,9 +39754,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39954,21 +39960,24 @@ wK wK wK wK -yt -yt -cr aN aN -cr -yt -yt -yt -cr aN aN -cr -yt -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -40002,9 +40011,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -40211,22 +40217,6 @@ aN aN aN wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK aN aN aN @@ -40245,6 +40235,22 @@ aN aN aN aN +wK +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN aN aN aN @@ -40467,26 +40473,26 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK aN aN aN @@ -41459,7 +41465,7 @@ sq aN aN nV -QI +KA og og og @@ -41716,7 +41722,7 @@ sq aN aN nV -QJ +og og og og @@ -54453,7 +54459,7 @@ fI fH fH he -hv +Qt fg aN aN @@ -55027,7 +55033,7 @@ hQ hn hn en -ir +en iY jf jk @@ -55798,7 +55804,7 @@ hn hn is en -ir +en hn iL jo diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm index 31314bf545a..26d46280ae3 100644 --- a/_maps/map_files/cyberiad/z3.dmm +++ b/_maps/map_files/cyberiad/z3.dmm @@ -5,7 +5,7 @@ "ab" = ( /obj/item/trash/cheesie, /turf/space, -/area/space) +/area/space/nearstation) "ac" = ( /obj/docking_port/stationary{ dir = 8; @@ -353,157 +353,45 @@ }, /turf/simulated/floor/plating, /area/tcommsat/powercontrol) -"aI" = ( -/turf/simulated/mineral/random, -/area/mine/dangerous/explored/golem) -"aJ" = ( -/turf/simulated/floor/plating/airless/asteroid, -/area/mine/dangerous/explored/golem) -"aK" = ( -/turf/simulated/mineral/random/high_chance, -/area/mine/dangerous/explored/golem) -"aL" = ( -/turf/space, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f6"; - dir = 2 - }, -/area/shuttle/freegolem) -"aM" = ( -/turf/simulated/shuttle/wall{ - tag = "icon-swall12"; - icon_state = "swall12"; - dir = 2 - }, -/area/shuttle/freegolem) -"aN" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/shuttle{ - id_tag = "s_docking_airlock"; - locked = 1 - }, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) -"aO" = ( -/turf/simulated/shuttle/wall{ - dir = 2; - icon_state = "swall8"; - tag = "icon-swall12" - }, -/area/shuttle/freegolem) -"aP" = ( -/turf/simulated/shuttle/wall{ - icon_state = "swall3"; - dir = 2 - }, -/area/shuttle/freegolem) -"aQ" = ( -/obj/structure/closet/crate/golemgear, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) -"aR" = ( -/obj/item/storage/toolbox/mechanical, -/obj/item/reagent_containers/spray/cleaner, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) -"aS" = ( -/turf/simulated/floor/plating, -/area/shuttle/freegolem) "aT" = ( /obj/structure/lattice, /turf/space, -/area/space) -"aU" = ( -/obj/structure/reagent_dispensers/watertank/high, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) -"aV" = ( -/obj/structure/shuttle/engine/heater{ - icon_state = "heater"; - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/simulated/floor/plating/airless, -/area/shuttle/freegolem) -"aW" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "burst_l" - }, -/turf/space, -/area/shuttle/freegolem) -"aX" = ( -/obj/machinery/light/small, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) -"aY" = ( -/turf/simulated/shuttle/wall{ - tag = "icon-swall13"; - icon_state = "swall13"; - dir = 2 - }, -/area/shuttle/freegolem) -"aZ" = ( -/obj/machinery/door/airlock/shuttle, -/turf/simulated/shuttle/floor{ - icon_state = "floor5" - }, -/area/shuttle/freegolem) +/area/space/nearstation) "ba" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2 }, -/area/space) +/area/space/nearstation) "bb" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall14"; icon_state = "swall14"; dir = 2 }, -/area/space) +/area/space/nearstation) "bc" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall12"; icon_state = "swall12"; dir = 2 }, -/area/space) +/area/space/nearstation) "bd" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2 }, -/area/space) -"be" = ( -/turf/simulated/shuttle/wall{ - tag = "icon-swall14"; - icon_state = "swall14"; - dir = 2 - }, -/area/shuttle/freegolem) -"bf" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) -"bg" = ( -/obj/machinery/door/airlock/shuttle, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bh" = ( -/turf/simulated/wall/mineral/titanium/interior, -/area/shuttle/freegolem) +/area/space/nearstation) "bi" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall7"; icon_state = "swall7"; dir = 2 }, -/area/space) +/area/space/nearstation) "bj" = ( /turf/simulated/shuttle/floor{ icon_state = "floor3" @@ -513,12 +401,12 @@ icon_state = "swall_f9"; dir = 2 }, -/area/space) +/area/space/nearstation) "bk" = ( /turf/simulated/shuttle/floor{ icon_state = "floor3" }, -/area/space) +/area/space/nearstation) "bl" = ( /turf/simulated/shuttle/floor{ icon_state = "floor3" @@ -528,41 +416,20 @@ icon_state = "swall_f5"; dir = 2 }, -/area/space) +/area/space/nearstation) "bm" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall11"; icon_state = "swall11"; dir = 2 }, -/area/space) -"bn" = ( -/obj/machinery/vending/hydroseeds, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bo" = ( -/obj/machinery/vending/hydronutrients, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) +/area/space/nearstation) "bp" = ( /obj/machinery/door/unpowered/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, -/area/space) -"bq" = ( -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"br" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/shuttle{ - id_tag = "s_docking_airlock"; - locked = 1 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor5" - }, -/area/shuttle/freegolem) +/area/space/nearstation) "bs" = ( /turf/simulated/shuttle/floor{ icon_state = "floor3" @@ -572,14 +439,7 @@ icon_state = "swall_f10"; dir = 2 }, -/area/space) -"bt" = ( -/obj/machinery/light{ - dir = 1; - on = 1 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) +/area/space/nearstation) "bu" = ( /turf/simulated/shuttle/floor{ icon_state = "floor3" @@ -589,211 +449,33 @@ icon_state = "swall_f6"; dir = 2 }, -/area/space) -"bv" = ( -/obj/machinery/light{ - dir = 1; - on = 1 - }, -/obj/effect/landmark/free_golem_spawn, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bw" = ( -/obj/effect/landmark/free_golem_spawn, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) +/area/space/nearstation) "bx" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2 }, -/area/space) +/area/space/nearstation) "by" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall13"; icon_state = "swall13"; dir = 2 }, -/area/space) +/area/space/nearstation) "bz" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2 }, -/area/space) -"bA" = ( -/obj/machinery/vending/coffee/free, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bB" = ( -/turf/simulated/shuttle/wall{ - tag = "icon-swall14"; - icon_state = "swall4"; - dir = 2 - }, -/area/shuttle/freegolem) -"bC" = ( -/turf/simulated/shuttle/wall{ - dir = 2; - icon_state = "swallc1"; - tag = "icon-swall12" - }, -/area/shuttle/freegolem) -"bD" = ( -/obj/structure/window/full/shuttle{ - icon_state = "16" - }, -/obj/structure/grille, -/turf/simulated/shuttle/plating, -/area/shuttle/freegolem) -"bE" = ( -/obj/structure/statue/gold/rd{ - name = "statue of the Liberator" - }, -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = 0 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor5" - }, -/area/shuttle/freegolem) -"bF" = ( -/obj/machinery/mineral/equipment_vendor/golem, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bG" = ( -/obj/item/resonator, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bH" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bI" = ( -/obj/item/gun/energy/kinetic_accelerator, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bJ" = ( -/obj/structure/window/full/shuttle{ - icon_state = "15" - }, -/obj/structure/grille, -/turf/simulated/shuttle/plating, -/area/shuttle/freegolem) -"bK" = ( -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = 0 - }, -/obj/structure/table/wood, -/obj/item/bedsheet/rd/royal_cape{ - layer = 3; - pixel_x = 5; - pixel_y = 9 - }, -/obj/item/book/manual/research_and_development{ - name = "Sacred Text of the Liberator"; - pixel_x = -4; - pixel_y = 3 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor5" - }, -/area/shuttle/freegolem) -"bL" = ( -/obj/machinery/mineral/ore_redemption/golem, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bM" = ( -/obj/machinery/computer/shuttle/golem_ship, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bN" = ( -/turf/space, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f5"; - dir = 2 - }, -/area/shuttle/freegolem) -"bO" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bP" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 30 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bQ" = ( -/turf/simulated/shuttle/wall{ - icon_state = "swallc4" - }, -/area/shuttle/freegolem) -"bR" = ( -/obj/machinery/door/airlock/shuttle{ - id_tag = "s_docking_airlock"; - locked = 1 - }, -/obj/structure/fans/tiny, -/obj/docking_port/mobile{ - dir = 8; - dwidth = 8; - height = 20; - id = "freegolem"; - name = "Free Golem Ship"; - roundstart_move = "freegolem_transit"; - width = 16 - }, -/obj/docking_port/stationary{ - dir = 8; - dwidth = 8; - height = 20; - id = "freegolem_z3"; - name = "Small Asteroid"; - width = 16 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bS" = ( -/obj/machinery/light, -/obj/structure/chair/comfy/purp{ - icon_state = "comfychair"; - dir = 1 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bT" = ( -/obj/machinery/light/small, -/obj/structure/extinguisher_cabinet{ - pixel_y = -30 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bU" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/shuttle{ - id_tag = "s_docking_airlock"; - locked = 1 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bV" = ( -/obj/item/resonator/upgraded, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) +/area/space/nearstation) "bW" = ( /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "bX" = ( /obj/machinery/power/solar, /obj/structure/cable{ @@ -803,7 +485,7 @@ /turf/simulated/floor/plasteel/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "bY" = ( /obj/structure/cable{ d1 = 2; @@ -817,7 +499,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bZ" = ( /obj/machinery/power/solar, /obj/structure/cable{ @@ -827,7 +509,7 @@ /turf/simulated/floor/plasteel/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "ca" = ( /obj/structure/cable{ d1 = 2; @@ -846,12 +528,12 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cb" = ( /obj/structure/lattice, /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "cc" = ( /obj/machinery/camera{ c_tag = "Telecomms North Solars"; @@ -859,7 +541,7 @@ network = list("Telecomms") }, /turf/space, -/area/space) +/area/space/nearstation) "cd" = ( /obj/structure/cable{ d1 = 1; @@ -868,7 +550,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ce" = ( /obj/structure/cable{ d1 = 4; @@ -878,7 +560,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cf" = ( /obj/structure/cable{ d1 = 2; @@ -892,7 +574,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cg" = ( /obj/structure/cable{ d1 = 1; @@ -901,7 +583,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ch" = ( /obj/structure/cable{ d1 = 1; @@ -909,7 +591,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ci" = ( /obj/structure/lattice, /obj/structure/grille, @@ -919,7 +601,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cj" = ( /obj/structure/lattice, /obj/structure/grille, @@ -931,7 +613,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ck" = ( /obj/structure/grille, /obj/structure/cable{ @@ -954,7 +636,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cl" = ( /obj/structure/lattice, /obj/structure/grille, @@ -965,7 +647,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cm" = ( /obj/structure/lattice, /obj/structure/grille, @@ -976,10 +658,10 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cn" = ( /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "co" = ( /obj/structure/lattice, /obj/structure/grille, @@ -990,7 +672,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cp" = ( /turf/simulated/wall/r_wall, /area/turret_protected/tcomsat) @@ -1006,7 +688,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cs" = ( /obj/structure/lattice, /turf/space, @@ -1398,10 +1080,6 @@ }, /turf/simulated/floor/plasteel, /area/tcommsat/computer) -"dr" = ( -/obj/machinery/autolathe, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "ds" = ( /obj/machinery/atmospherics/unary/vent_pump{ dir = 4; @@ -1619,7 +1297,7 @@ dir = 4 }, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "dP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -1631,13 +1309,13 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dR" = ( /obj/structure/disposaloutlet{ dir = 4 @@ -1646,7 +1324,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dS" = ( /obj/structure/window/reinforced{ dir = 8 @@ -1704,7 +1382,7 @@ /turf/simulated/floor/plasteel/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "dY" = ( /obj/structure/cable{ d1 = 1; @@ -1720,7 +1398,7 @@ /turf/simulated/floor/plasteel/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "ea" = ( /obj/machinery/door/window/brigdoor{ dir = 8; @@ -1815,15 +1493,6 @@ }, /turf/simulated/floor/plating, /area/tcommsat/chamber) -"ej" = ( -/obj/structure/table/wood, -/obj/machinery/reagentgrinder, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"ek" = ( -/obj/machinery/computer/arcade/battle, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "el" = ( /obj/machinery/door/window/brigdoor{ dir = 1; @@ -1877,10 +1546,6 @@ /obj/structure/lattice, /turf/space, /area/turret_protected/tcomsat) -"eq" = ( -/obj/machinery/computer/arcade/orion_trail, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "er" = ( /obj/structure/window/reinforced{ dir = 4 @@ -1958,10 +1623,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"ex" = ( -/obj/machinery/light, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "ey" = ( /obj/structure/cable{ d1 = 4; @@ -2005,11 +1666,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"eA" = ( -/obj/machinery/light, -/obj/effect/landmark/free_golem_spawn, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "eB" = ( /turf/simulated/floor/bluegrid{ icon_state = "dark"; @@ -2043,7 +1699,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "eE" = ( /obj/structure/cable{ d1 = 1; @@ -2064,7 +1720,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "eF" = ( /obj/structure/cable{ d1 = 2; @@ -2073,7 +1729,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "eG" = ( /obj/structure/window/reinforced{ dir = 8 @@ -2104,10 +1760,6 @@ /obj/structure/lattice, /turf/space, /area/turret_protected/tcomsat) -"eI" = ( -/obj/machinery/vending/snack/free, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "eJ" = ( /obj/structure/cable{ d1 = 1; @@ -2151,7 +1803,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "eO" = ( /obj/structure/cable{ d1 = 2; @@ -2173,7 +1825,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "eP" = ( /obj/structure/cable{ d1 = 1; @@ -2188,14 +1840,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) -"eQ" = ( -/obj/structure/table/wood, -/obj/item/storage/firstaid/brute, -/obj/item/storage/firstaid/brute, -/obj/item/storage/firstaid/brute, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) +/area/space/nearstation) "eR" = ( /obj/structure/window/reinforced{ dir = 8 @@ -2334,7 +1979,7 @@ network = list("Telecomms") }, /turf/space, -/area/space) +/area/space/nearstation) "fd" = ( /obj/structure/window/reinforced{ dir = 4 @@ -2450,7 +2095,7 @@ network = list("Telecomms") }, /turf/space, -/area/space) +/area/space/nearstation) "fo" = ( /obj/structure/cable{ d1 = 2; @@ -2464,13 +2109,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) -"fp" = ( -/obj/structure/table/wood, -/obj/item/storage/firstaid/adv, -/obj/item/storage/firstaid/adv, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) +/area/space/nearstation) "fq" = ( /obj/structure/grille, /obj/structure/cable{ @@ -2491,7 +2130,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "fr" = ( /obj/structure/window/reinforced{ dir = 8 @@ -2579,15 +2218,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"fy" = ( -/obj/structure/table/wood, -/obj/structure/table/wood, -/obj/item/storage/firstaid/fire, -/obj/item/storage/firstaid/fire, -/obj/item/storage/firstaid/fire, -/obj/machinery/light, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "fz" = ( /obj/machinery/telecomms/processor/preset_four, /turf/simulated/floor/plasteel{ @@ -2717,7 +2347,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "fJ" = ( /obj/machinery/telecomms/bus/preset_one, /turf/simulated/floor/plasteel{ @@ -2863,18 +2493,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"fY" = ( -/obj/structure/table/wood, -/obj/item/areaeditor/golem, -/obj/item/disk/design_disk/golem_shell, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"fZ" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) "ga" = ( /obj/machinery/telecomms/server/presets/command, /turf/simulated/floor/plasteel{ @@ -2899,10 +2517,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"gc" = ( -/obj/machinery/chem_master, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) "gd" = ( /obj/machinery/camera{ c_tag = "Telecomms Server Room South"; @@ -2924,10 +2538,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"ge" = ( -/obj/structure/ore_box, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) "gf" = ( /obj/structure/cable{ d1 = 1; @@ -2971,10 +2581,6 @@ "gj" = ( /turf/simulated/wall/r_wall, /area/turret_protected/tcomfoyer) -"gk" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) "gr" = ( /obj/structure/window/reinforced, /obj/machinery/light{ @@ -3481,7 +3087,7 @@ }, /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hC" = ( /obj/structure/cable{ d1 = 1; @@ -3790,7 +3396,7 @@ /area/tcommsat/entrance) "ii" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ij" = ( /obj/structure/cable, /obj/machinery/power/terminal{ @@ -3845,7 +3451,7 @@ }, /obj/machinery/power/tracker, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iu" = ( /obj/structure/cable{ d1 = 1; @@ -3860,7 +3466,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iv" = ( /obj/structure/cable{ d1 = 4; @@ -3871,7 +3477,7 @@ }, /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iw" = ( /obj/machinery/computer/teleporter, /turf/simulated/floor/plating, @@ -3895,7 +3501,7 @@ }, /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iA" = ( /obj/structure/grille, /obj/structure/cable{ @@ -3917,7 +3523,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iB" = ( /obj/structure/cable{ d1 = 1; @@ -3932,7 +3538,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iC" = ( /obj/structure/cable{ d1 = 1; @@ -3952,7 +3558,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iD" = ( /obj/machinery/camera{ c_tag = "Telecomms South Solars"; @@ -3960,7 +3566,7 @@ network = list("Telecomms") }, /turf/space, -/area/space) +/area/space/nearstation) "iF" = ( /turf/simulated/wall/r_wall, /area/AIsattele) @@ -16116,10 +15722,10 @@ aa aa aa aa -aL -bD -bJ -bN +aa +aa +aa +aa aa aa aa @@ -16373,10 +15979,10 @@ aa aa aa aa -aM -bE -bK -aM +aa +aa +aa +aa aa aa aa @@ -16627,16 +16233,16 @@ aa aa aa aa -aL -aP -br -aY -bM -bS -be -br -aP -bN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -16884,16 +16490,16 @@ aa aa aa aa -aM -bo -bq -aZ -bq -bq -bg -bq -eq -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17141,16 +16747,16 @@ aa aa aa aa -aM -bn -bq -aZ -bq -bq -bg -bq -ek -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17395,22 +17001,22 @@ aa aa aa aa -aL -aP -aP -aY -bt -bq -bh -bq -bq -bh -bq -ex -be -aP -aP -bN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17652,22 +17258,22 @@ aa aa aa aa -aM -aQ -aS -bg -bq -bq -bh -bq -bq -bh -bq -bq -bg -aS -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17909,22 +17515,22 @@ aa aa aa aa -aM -aQ -aS -bg -bq -bq -bh -bO -bq -bh -bq -bq -bg -aS -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18166,22 +17772,22 @@ aa aa aa aa -aM -aQ -aX -bh -bv -bG -bh -bq -bq -bh -bG -eA -bh -fZ -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18423,22 +18029,22 @@ aa aa aa aa -aM -aQ -aS -bh -bw -bG -bh -bq -bq -bh -bG -bw -bh -aS -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18680,22 +18286,22 @@ aa aa aa aa -aM -aQ -aS -bh -bh -bg -bh -bg -bg -bh -bg -bh -bh -aS -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18937,22 +18543,22 @@ aa aa aa aa -aM -aQ -aX -bh -bA -bq -bH -bq -bq -bH -bq -eI -bh -fZ -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -19194,22 +18800,22 @@ aa aa aa aa -aM -aQ -aS -bg -bq -bq -bq -bq -bq -bq -bq -bq -bg -aS -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -19451,22 +19057,22 @@ aa aa aa aa -aM -aQ -aS -bg -bq -bq -bq -bq -bq -bq -bq -bq -bg -aS -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -19708,22 +19314,22 @@ aa aa aa aa -aM -aR -aS -bh -bq -bq -bq -bq -bq -bq -bq -eQ -bh -aS -aR -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -19965,22 +19571,22 @@ aa aa aa aa -aN -aS -aX -bh -bt -bq -bq -bq -bq -bq -bq -fy -bh -fZ -aS -aN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -20222,22 +19828,22 @@ aa aa aa aa -aN -aS -aS -bh -bq -bq -bI -bq -bq -bV -bq -fp -bh -aS -aS -aN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -20479,22 +20085,22 @@ aa aa aa aa -aM -aU -bf -bh -bF -bq -bL -bq -bq -dr -ej -fY -bh -gc -gk -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -20734,24 +20340,24 @@ aa aa aa aa -aI -aI -aM -aV -aV -bB -aV -aV -bB -bP -bT -bB -aV -aV -bB -aV -aV -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -20991,25 +20597,25 @@ aa aa aa aa -aI -aI -aO -aW -aW -aO -aW -aW -bC -bR -bU -bQ -aW -aW -aO -aW -aW -aO -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -21248,25 +20854,25 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aJ -aJ -aJ -aJ -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -21505,25 +21111,25 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aJ -aJ -aJ -aJ -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -21762,25 +21368,25 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -22017,27 +21623,27 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -22274,27 +21880,27 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -22531,26 +22137,26 @@ aa aa aa aa -aI -aI -aI -aI -aK -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -22788,26 +22394,26 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aK -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -23045,28 +22651,28 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -23302,28 +22908,28 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -23559,28 +23165,28 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -23816,28 +23422,28 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aK -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -24073,26 +23679,26 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -24330,26 +23936,26 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aK -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -24589,27 +24195,27 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aJ -aJ -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -24847,26 +24453,26 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI aa aa -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -25104,26 +24710,26 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI aa aa aa aa -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm index e533422b39a..08d56927445 100644 --- a/_maps/map_files/cyberiad/z4.dmm +++ b/_maps/map_files/cyberiad/z4.dmm @@ -5,7 +5,7 @@ "ab" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ac" = ( /turf/simulated/wall, /area/constructionsite/hallway/port) @@ -554,10 +554,10 @@ /area/constructionsite/hallway/starboard) "bC" = ( /turf/simulated/wall, -/area/space) +/area/space/nearstation) "bD" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bE" = ( /obj/machinery/light{ dir = 1; @@ -845,58 +845,17 @@ /turf/simulated/floor/plating/airless, /area/constructionsite/hallway/center) "cl" = ( +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk6"; - icon_state = "catwalk6" - }, -/area/space) -"cm" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk12"; - icon_state = "catwalk12" - }, -/area/space) +/area/space/nearstation) "cn" = ( +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk14"; - icon_state = "catwalk14" - }, /area/engiestation/solars) -"co" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk12"; - icon_state = "catwalk12" - }, -/area/engiestation/solars) -"cp" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk10"; - icon_state = "catwalk10" - }, -/area/space) "cq" = ( /obj/structure/inflatable/door, /turf/simulated/floor/plasteel/airless, /area/constructionsite/hallway/center) -"cr" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk3"; - icon_state = "catwalk3" - }, -/area/space) -"cs" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk3"; - icon_state = "catwalk3" - }, -/area/engiestation/solars) "ct" = ( /obj/machinery/power/solar, /obj/structure/cable{ @@ -913,11 +872,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk3"; - icon_state = "catwalk3" - }, /area/engiestation/solars) "cv" = ( /obj/machinery/power/tracker, @@ -940,11 +896,8 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk3"; - icon_state = "catwalk3" - }, /area/engiestation/solars) "cx" = ( /obj/machinery/power/solar, @@ -982,11 +935,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk3"; - icon_state = "catwalk3" - }, /area/engiestation/solars) "cB" = ( /obj/structure/cable{ @@ -1004,11 +954,8 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk3"; - icon_state = "catwalk3" - }, /area/engiestation/solars) "cC" = ( /turf/simulated/wall/r_wall, @@ -1078,73 +1025,6 @@ icon_state = "bcircuit" }, /area/constructionsite/ai) -"cL" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk6"; - icon_state = "catwalk6" - }, -/area/engiestation/solars) -"cM" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk9"; - icon_state = "catwalk9" - }, -/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, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk1"; - icon_state = "catwalk1" - }, -/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, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk1"; - icon_state = "catwalk1" - }, -/area/engiestation/solars) -"cP" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk5"; - icon_state = "catwalk5" - }, -/area/engiestation/solars) -"cQ" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk10"; - icon_state = "catwalk10" - }, -/area/engiestation/solars) "cR" = ( /obj/machinery/light_switch{ pixel_y = -28 @@ -1158,13 +1038,6 @@ icon_state = "dark" }, /area/engiestation) -"cT" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk1"; - icon_state = "catwalk1" - }, -/area/space) "cU" = ( /obj/structure/lattice, /turf/space, @@ -1208,7 +1081,7 @@ /area/engiestation) "dc" = ( /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "dd" = ( /obj/machinery/power/solar, /obj/structure/cable{ @@ -1324,13 +1197,6 @@ /obj/structure/grille, /turf/simulated/floor/plating/airless, /area/constructionsite/ai) -"do" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk7"; - icon_state = "catwalk7" - }, -/area/engiestation/solars) "dp" = ( /obj/structure/cable{ d1 = 2; @@ -1342,11 +1208,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk12"; - icon_state = "catwalk12" - }, /area/engiestation/solars) "dq" = ( /obj/structure/cable{ @@ -1365,34 +1228,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk12"; - icon_state = "catwalk12" - }, -/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, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk8"; - icon_state = "catwalk8" - }, /area/engiestation/solars) "ds" = ( /obj/effect/spawner/window/reinforced, @@ -1503,34 +1340,8 @@ icon_state = "4-8"; pixel_x = 0 }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk4"; - icon_state = "catwalk4" - }, -/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, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk12"; - icon_state = "catwalk12" - }, /area/engiestation/solars) "dA" = ( /obj/structure/cable{ @@ -1543,18 +1354,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk12"; - icon_state = "catwalk12" - }, -/area/engiestation/solars) -"dB" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk11"; - icon_state = "catwalk11" - }, /area/engiestation/solars) "dC" = ( /obj/machinery/recharge_station, @@ -1707,11 +1508,8 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk12"; - icon_state = "catwalk12" - }, /area/engiestation/solars) "dT" = ( /obj/structure/cable{ @@ -1725,29 +1523,8 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk12"; - icon_state = "catwalk12" - }, -/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, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk8"; - icon_state = "catwalk8" - }, /area/engiestation/solars) "dV" = ( /obj/structure/cable{ @@ -1803,41 +1580,8 @@ icon_state = "4-8"; pixel_x = 0 }, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk4"; - icon_state = "catwalk4" - }, -/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, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk12"; - icon_state = "catwalk12" - }, -/area/engiestation/solars) -"ec" = ( -/obj/structure/cable{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk12"; - icon_state = "catwalk12" - }, /area/engiestation/solars) "ed" = ( /obj/item/stack/sheet/metal{ @@ -1976,13 +1720,6 @@ icon_state = "dark" }, /area/engiestation) -"em" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk1"; - icon_state = "catwalk1" - }, -/area/engiestation/solars) "en" = ( /obj/machinery/vending/tool, /turf/simulated/floor/plasteel{ @@ -2018,13 +1755,6 @@ }, /turf/simulated/floor/plating/airless, /area/constructionsite/ai) -"es" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk9"; - icon_state = "catwalk9" - }, -/area/space) "et" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "0"; @@ -2330,13 +2060,6 @@ icon_state = "carpet" }, /area/engiestation) -"fi" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk2"; - icon_state = "catwalk2" - }, -/area/space) "fj" = ( /obj/machinery/vending/cola, /turf/simulated/floor/plasteel{ @@ -2635,20 +2358,14 @@ }, /area/engiestation) "fQ" = ( +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk5"; - icon_state = "catwalk5" - }, /area/space) "fR" = ( /obj/item/lighter/zippo, +/obj/structure/lattice/catwalk, /turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk8"; - icon_state = "catwalk8" - }, -/area/space) +/area/space/nearstation) "fS" = ( /obj/machinery/shower{ dir = 4; @@ -2740,13 +2457,6 @@ icon_state = "delivery" }, /area/engiestation) -"gc" = ( -/turf/simulated/floor/plating/airless, -/turf/simulated/floor/plating/airless/catwalk{ - tag = "icon-catwalk4"; - icon_state = "catwalk4" - }, -/area/space) "gd" = ( /obj/structure/lattice, /obj/structure/disposaloutlet{ @@ -2756,18 +2466,18 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "ge" = ( /obj/structure/disposalpipe/segment{ dir = 8; icon_state = "pipe-c" }, /turf/space, -/area/space) +/area/space/nearstation) "gf" = ( /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "gg" = ( /obj/item/radio/intercom{ dir = 1; @@ -4077,7 +3787,7 @@ /area/constructionsite/engineering) "jh" = ( /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "ji" = ( /obj/structure/cable{ d1 = 1; @@ -5152,6 +4862,17 @@ }, /turf/simulated/floor/plating/airless, /area/constructionsite/engineering) +"zH" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 8; + height = 20; + id = "freegolem_z4"; + name = "Near Construction Site"; + width = 16 + }, +/turf/space, +/area/space) (1,1,1) = {" aa @@ -14507,14 +14228,14 @@ aa aa ab cl -cr -cr -cr -cr -cr -cr -cr -cr +cl +cl +cl +cl +cl +cl +cl +cl fQ bC aa @@ -14763,7 +14484,7 @@ aa aa ab cl -es +cl ab ab ab @@ -14772,7 +14493,7 @@ ab ab aa aa -cm +cl ab aa aa @@ -15010,16 +14731,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 @@ -15029,7 +14750,7 @@ cF cC aa aa -cm +cl ab aa aa @@ -15266,12 +14987,12 @@ aa aa aa ab -cm +cl ab ab aa ab -co +cn dd dp dK @@ -15523,12 +15244,12 @@ aa aa aa aa -cm +cl ab ab ab ab -co +cn dd dq dK @@ -15780,12 +15501,12 @@ aa aa aa aa -cm +cl aa ab ab ab -co +cn dd dq dK @@ -16037,16 +15758,16 @@ aa aa aa aa -cm +cl ab ab ab -cL -cM +cn +cn dd -dr +dq dK -dU +dT dK da eB @@ -16295,10 +16016,10 @@ aa aa ab cn -cs -cs -cs -cM +cn +cn +cn +cn cW cX ds @@ -16551,7 +16272,7 @@ aa aa aa ab -co +cn ct ct ct @@ -16812,7 +16533,7 @@ cn cu cA cA -cN +cA cY df du @@ -17065,7 +16786,7 @@ aa aa aa ab -co +cn cv ct ct @@ -17326,7 +17047,7 @@ cn cw cB cB -cO +cB cY df dw @@ -17579,7 +17300,7 @@ aa aa aa ab -co +cn cx cx cx @@ -17837,10 +17558,10 @@ aa aa ab cn -cs -cs -cs -cP +cn +cn +cn +cn cW cX ds @@ -18093,12 +17814,12 @@ aa aa aa aa -cm +cl aa aa ab -cQ -cP +cn +cn dd dy dK @@ -18350,16 +18071,16 @@ aa aa aa aa -cm +cl aa ab ab ab -co +cn dd -dz +dy dK -eb +ea dK da eI @@ -18607,16 +18328,16 @@ aa aa aa aa -cm +cl ab ab ab ab -co +cn dd -dz +dy dK -eb +ea dK da dj @@ -18864,16 +18585,16 @@ aa aa aa aa -cm +cl ab ab aa ab -co +cn dd dA dK -ec +cu dK da dj @@ -19121,17 +18842,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 @@ -19378,7 +19099,7 @@ aa aa aa aa -cm +cl aa cC cF @@ -19399,7 +19120,7 @@ cF cF cF cC -gc +cl aa aa aa @@ -19635,7 +19356,7 @@ aa aa aa aa -cm +cl aa cC cG @@ -19656,7 +19377,7 @@ ab ab aa aa -cm +cl aa aa aa @@ -19892,7 +19613,7 @@ aa aa aa aa -cm +cl aa cC cH @@ -19913,7 +19634,7 @@ aa ab ab aa -cm +cl aa aa aa @@ -20149,7 +19870,7 @@ aa aa aa aa -cm +cl aa cC cI @@ -20170,7 +19891,7 @@ aa aa ab ab -cm +cl ab aa aa @@ -20406,7 +20127,7 @@ aa aa aa ab -cm +cl aa cC cF @@ -20421,13 +20142,13 @@ dE dj dE cC -fi -cr -cr -cr -cr -cr -es +cl +cl +cl +cl +cl +cl +cl bC aa aa @@ -20663,11 +20384,11 @@ aa aa aa ab -cp -cr -cr -cr -cT +cl +cl +cl +cl +cl dc cC dD @@ -44162,7 +43883,7 @@ aa aa aa aa -aa +zH aa aa aa diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index 08f7dc62ebe..f47b299a8d7 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -7,7 +7,7 @@ amount = 2 }, /turf/space, -/area/space) +/area/space/nearstation) "ac" = ( /obj/machinery/power/solar/fake, /turf/simulated/floor/plasteel/airless{ @@ -15,19 +15,19 @@ }, /area/djstation/solars) "ad" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ae" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "af" = ( /obj/machinery/power/solar/fake, /turf/simulated/floor/plasteel/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "ag" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -41,7 +41,7 @@ icon_state = "brokengrille" }, /turf/space, -/area/space) +/area/space/nearstation) "aj" = ( /obj/machinery/power/terminal, /turf/simulated/floor/plating, @@ -55,7 +55,7 @@ amount = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "am" = ( /obj/item/extinguisher, /turf/simulated/floor/plating, @@ -76,8 +76,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/djstation/solars) "ao" = ( /obj/structure/grille{ @@ -86,15 +86,15 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ap" = ( /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/djstation/solars) "aq" = ( /obj/structure/cable{ @@ -125,8 +125,8 @@ d2 = 2; icon_state = "1-2" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/djstation) "at" = ( /obj/structure/lattice, @@ -135,12 +135,12 @@ icon_state = "brokengrille" }, /turf/space, -/area/space) +/area/space/nearstation) "au" = ( /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "av" = ( /obj/structure/grille, /obj/structure/window/full/shuttle, @@ -174,7 +174,7 @@ /area/djstation) "az" = ( /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "aA" = ( /obj/structure/grille, /obj/structure/window/full/shuttle, @@ -312,8 +312,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/djstation) "aR" = ( /obj/structure/cable{ @@ -331,8 +331,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/djstation/solars) "aS" = ( /obj/structure/cable{ @@ -340,8 +340,8 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/djstation/solars) "aT" = ( /obj/structure/cable{ @@ -359,8 +359,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/djstation/solars) "aU" = ( /obj/item/storage/toolbox/mechanical{ @@ -386,8 +386,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/djstation) "aW" = ( /turf/simulated/floor/plasteel{ @@ -511,7 +511,7 @@ "bj" = ( /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "bk" = ( /obj/structure/table/reinforced, /obj/item/ashtray/bronze, @@ -577,7 +577,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "bt" = ( /turf/simulated/wall/mineral/titanium/nodecon, /area/derelict/arrival) @@ -1257,7 +1257,7 @@ /turf/simulated/floor/plasteel/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "cJ" = ( /obj/structure/sign/securearea, /turf/simulated/wall/mineral/titanium/nodecon/nodiagonal, @@ -1836,7 +1836,7 @@ "ed" = ( /obj/item/stack/rods, /turf/space, -/area/space) +/area/space/nearstation) "ee" = ( /obj/structure/grille, /obj/structure/window/full/shuttle, @@ -2282,7 +2282,7 @@ "fa" = ( /mob/living/simple_animal/hostile/carp, /turf/space, -/area/space) +/area/space/nearstation) "fb" = ( /obj/structure/grille, /obj/structure/window/full/shuttle, @@ -2510,7 +2510,7 @@ /area/derelict/crew_quarters) "fC" = ( /turf/simulated/wall/mineral/titanium/nodecon, -/area/space) +/area/space/nearstation) "fD" = ( /obj/machinery/light_switch{ pixel_x = 32; @@ -2708,7 +2708,7 @@ "fZ" = ( /obj/item/shard, /turf/space, -/area/space) +/area/space/nearstation) "ga" = ( /obj/structure/toilet{ dir = 8 @@ -3086,7 +3086,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "gV" = ( /obj/structure/coatrack, /turf/simulated/floor/plasteel{ @@ -3382,7 +3382,7 @@ "hw" = ( /obj/machinery/atmospherics/unary/passive_vent, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hx" = ( /obj/structure/chair/wood/normal, /turf/simulated/floor/wood{ @@ -4417,7 +4417,7 @@ icon_state = "small" }, /turf/space, -/area/space) +/area/space/nearstation) "ju" = ( /obj/structure/chair{ dir = 4 @@ -4602,8 +4602,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "jL" = ( /obj/structure/table/wood, @@ -4876,7 +4876,7 @@ "kp" = ( /obj/item/stack/ore/uranium, /turf/space, -/area/space) +/area/space/nearstation) "kq" = ( /obj/structure/table/reinforced, /obj/item/paper/djstation{ @@ -5221,7 +5221,7 @@ "kZ" = ( /obj/item/stack/ore/iron, /turf/space, -/area/space) +/area/space/nearstation) "la" = ( /turf/simulated/floor/plasteel{ dir = 8; @@ -5361,7 +5361,7 @@ invisibility = 100; location = "SDNE" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/outer) "lq" = ( /obj/structure/chair/office/light, @@ -5391,8 +5391,8 @@ icon_state = "propulsion_r"; dir = 1 }, -/turf/space, -/area/space) +/turf/simulated/shuttle/plating, +/area/space/nearstation) "lu" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -5400,7 +5400,7 @@ icon_state = "swall_f6"; tag = "icon-swall_f6" }, -/area/space) +/area/space/nearstation) "lv" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance, @@ -5414,8 +5414,8 @@ dir = 1 }, /obj/structure/window/reinforced, -/turf/simulated/floor/plating/airless, -/area/space) +/turf/simulated/shuttle/plating, +/area/space/nearstation) "lx" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -5423,11 +5423,11 @@ icon_state = "swall_f10"; dir = 2 }, -/area/space) +/area/space/nearstation) "ly" = ( /obj/item/stack/tile, /turf/space, -/area/space) +/area/space/nearstation) "lz" = ( /obj/machinery/light{ dir = 1; @@ -5454,25 +5454,25 @@ icon_state = "swall11"; dir = 2 }, -/area/space) +/area/space/nearstation) "lC" = ( /turf/simulated/shuttle/wall{ icon_state = "swall7"; dir = 2 }, -/area/space) +/area/space/nearstation) "lD" = ( /turf/space, /area/derelict/eva{ name = "Derelict Annex" }) "lE" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 }, -/area/space) +/area/space/nearstation) "lF" = ( /turf/space, /area/syndicate_depot/perimeter) @@ -5495,7 +5495,7 @@ }, /area/syndicate_depot/outer) "lK" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/outer) "lL" = ( /turf/simulated/floor/plating/airless, @@ -5533,13 +5533,13 @@ icon_state = "swall_f9"; dir = 2 }, -/area/space) +/area/space/nearstation) "lP" = ( /turf/simulated/shuttle/wall{ icon_state = "swall3"; dir = 2 }, -/area/space) +/area/space/nearstation) "lQ" = ( /obj/structure/cable{ d1 = 1; @@ -5624,7 +5624,7 @@ /obj/effect/landmark{ name = "syndi_depot_bot" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/outer) "mc" = ( /obj/machinery/light{ @@ -5652,11 +5652,11 @@ /area/syndicate_depot/outer) "mf" = ( /obj/effect/spawner/random_spawners/syndicate/turret/external, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/outer) "mg" = ( /obj/machinery/light, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/outer) "mh" = ( /obj/machinery/light{ @@ -5673,7 +5673,7 @@ dir = 4; icon_state = "tube1" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/outer) "mj" = ( /obj/machinery/navbeacon/invisible{ @@ -5681,7 +5681,7 @@ invisibility = 100; location = "SDNW" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/outer) "mk" = ( /obj/structure/table, @@ -5704,25 +5704,25 @@ /obj/machinery/light{ dir = 8 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/outer) "mo" = ( /obj/item/shard, /obj/effect/mob_spawn/human/mime/corpse, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mp" = ( /obj/item/broken_bottle, /obj/effect/mob_spawn/human/mime/corpse, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mq" = ( /obj/item/shard{ icon_state = "medium" }, /obj/effect/mob_spawn/human/mime/corpse, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mr" = ( /obj/structure/falsewall, /turf/simulated/floor/plasteel{ @@ -5774,15 +5774,15 @@ icon_state = "swall12"; dir = 2 }, -/area/space) +/area/space/nearstation) "my" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/shuttle/wall{ tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2 }, -/area/space) +/area/space/nearstation) "mz" = ( /obj/structure/closet/crate{ icon_state = "crateopen"; @@ -5791,7 +5791,7 @@ /obj/item/stack/ore/bananium, /obj/item/grenade/bananade, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mA" = ( /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -5814,7 +5814,7 @@ icon_state = "medium" }, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mE" = ( /obj/structure/cable{ d1 = 1; @@ -5839,8 +5839,8 @@ icon_state = "burst_r"; tag = "icon-burst_r (WEST)" }, -/turf/space, -/area/space) +/turf/simulated/shuttle/plating, +/area/space/nearstation) "mG" = ( /obj/structure/shuttle/engine/heater{ tag = "icon-heater (EAST)"; @@ -5850,14 +5850,14 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/simulated/floor/plating/airless, -/area/space) +/turf/simulated/shuttle/plating, +/area/space/nearstation) "mH" = ( /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "mI" = ( -/turf/simulated/floor/plating/airless/asteroid, -/area/space) +/turf/simulated/floor/plating/asteroid/airless, +/area/space/nearstation) "mJ" = ( /obj/effect/decal/cleanable/blood, /turf/simulated/floor/plasteel{ @@ -5871,7 +5871,7 @@ "mL" = ( /obj/machinery/door/unpowered/shuttle, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mM" = ( /obj/effect/spawner/random_spawners/syndicate/loot, /turf/simulated/floor/plasteel{ @@ -5900,7 +5900,7 @@ /obj/item/stack/ore/tranquillite, /obj/item/stack/ore/tranquillite, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mQ" = ( /obj/structure/closet/crate, /obj/item/stack/ore/tranquillite, @@ -5911,7 +5911,7 @@ /obj/item/stack/ore/tranquillite, /obj/item/stack/ore/tranquillite, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mR" = ( /obj/machinery/light{ dir = 1; @@ -5934,8 +5934,8 @@ /area/syndicate_depot/core) "mT" = ( /obj/item/shard, -/turf/simulated/floor/plating/airless/asteroid, -/area/space) +/turf/simulated/floor/plating/asteroid/airless, +/area/space/nearstation) "mU" = ( /obj/structure/closet/crate, /obj/item/stack/ore/bananium, @@ -5944,25 +5944,25 @@ /obj/item/stack/ore/bananium, /obj/item/stack/ore/bananium, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mV" = ( /obj/effect/mob_spawn/human/mime/corpse{ name = "Mime Pilot" }, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mW" = ( /obj/structure/computerframe/HONKputer, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mX" = ( /obj/effect/mob_spawn/human/corpse/clownmili, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mY" = ( /obj/effect/mob_spawn/human/corpse/clownoff, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mZ" = ( /obj/effect/spawner/random_spawners/syndicate/turret/external, /turf/simulated/floor/plasteel{ @@ -5979,17 +5979,17 @@ dir = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "nb" = ( /obj/item/shard{ icon_state = "small" }, -/turf/simulated/floor/plating/airless/asteroid, -/area/space) +/turf/simulated/floor/plating/asteroid/airless, +/area/space/nearstation) "nc" = ( /obj/item/stack/ore/bananium, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "nd" = ( /obj/item/stack/sheet/metal{ layer = 4.1 @@ -6004,8 +6004,8 @@ icon_state = "propulsion_l"; tag = "icon-propulsion_l (WEST)" }, -/turf/space, -/area/space) +/turf/simulated/shuttle/plating, +/area/space/nearstation) "nf" = ( /obj/effect/spawner/random_spawners/syndicate/trap/mine, /obj/item/stack/sheet/metal{ @@ -6018,14 +6018,14 @@ "ng" = ( /obj/item/paper/clownship, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "nh" = ( /obj/item/shard, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "ni" = ( /obj/machinery/light{ dir = 4; @@ -6039,7 +6039,7 @@ "nj" = ( /obj/effect/mob_spawn/human/clown/corpse, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "nk" = ( /obj/machinery/computer/syndicate_depot/teleporter, /turf/simulated/floor/plasteel{ @@ -6049,7 +6049,7 @@ "nl" = ( /obj/item/pickaxe, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "nm" = ( /obj/structure/closet/crate, /obj/item/stack/ore/bananium, @@ -6057,7 +6057,7 @@ /obj/item/stack/ore/bananium, /obj/item/stack/ore/bananium, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "nn" = ( /turf/simulated/floor/plasteel{ dir = 1; @@ -6080,7 +6080,7 @@ icon_state = "swall_f10"; dir = 2 }, -/area/space) +/area/space/nearstation) "nq" = ( /obj/structure/shuttle/engine/propulsion{ dir = 4; @@ -6092,8 +6092,8 @@ icon_state = "propulsion_l"; tag = "icon-propulsion_l (WEST)" }, -/turf/space, -/area/space) +/turf/simulated/shuttle/plating, +/area/space/nearstation) "nr" = ( /obj/effect/decal/warning_stripes/red, /obj/structure/window/plasmareinforced{ @@ -6263,17 +6263,17 @@ /obj/item/shard{ icon_state = "medium" }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/turf/simulated/floor/plating/airless/asteroid, -/area/space) +/turf/simulated/floor/plating/asteroid/airless, +/area/space/nearstation) "nO" = ( /obj/effect/mob_spawn/human/clown/corpse{ name = "Clown Pilot" }, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "nP" = ( /obj/structure/dispenser, /turf/simulated/floor/plasteel{ @@ -6525,7 +6525,7 @@ dir = 1; on = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/outer) "oy" = ( /obj/structure/cable{ @@ -6693,8 +6693,8 @@ d2 = 2; icon_state = "1-2" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "oT" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ @@ -6782,7 +6782,7 @@ invisibility = 100; location = "SDSW" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/outer) "pe" = ( /obj/machinery/power/apc/noalarm{ @@ -6817,7 +6817,7 @@ invisibility = 100; location = "SDSE" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/outer) "pi" = ( /obj/structure/sign/poster/official/obey, @@ -6870,7 +6870,7 @@ /area/syndicate_depot/core) "pq" = ( /obj/effect/spawner/random_spawners/blood_maybe, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/core) "pr" = ( /obj/structure/closet/crate/can, @@ -6936,13 +6936,13 @@ "pw" = ( /obj/item/candle, /obj/structure/table, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/core) "px" = ( /obj/structure/chair{ dir = 8 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/core) "py" = ( /obj/structure/chair{ @@ -6972,7 +6972,7 @@ /turf/simulated/floor/plasteel, /area/derelict/crew_quarters) "pC" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/core) "pD" = ( /obj/structure/falsewall, @@ -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" }, @@ -7454,7 +7454,7 @@ /obj/effect/landmark/burnturf, /obj/structure/grille/broken, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "qI" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -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" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "rn" = ( /obj/structure/cable{ @@ -7765,8 +7765,8 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /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" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "rG" = ( /obj/structure/closet/crate/secure/loot, @@ -8029,8 +8027,8 @@ /turf/space, /area/derelict/crew_quarters) "rJ" = ( +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "rK" = ( /obj/machinery/power/tracker, @@ -8047,7 +8045,7 @@ /turf/simulated/wall/mineral/titanium/nodecon/nosmooth{ icon_state = "swall_f10" }, -/area/space) +/area/space/nearstation) "rM" = ( /turf/simulated/floor/plasteel/airless{ dir = 5; @@ -8272,8 +8270,8 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /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" }, @@ -8965,7 +8963,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "tA" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -9006,8 +9004,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "tF" = ( /obj/structure/sign/greencross, @@ -9040,8 +9038,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "tI" = ( /obj/structure/cable{ @@ -9563,8 +9561,8 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "uJ" = ( /turf/space, @@ -9895,8 +9893,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "vn" = ( /obj/item/shard{ @@ -10462,8 +10460,8 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "wm" = ( /obj/structure/cable{ @@ -10476,8 +10474,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "wn" = ( /obj/structure/closet/jcloset, @@ -10502,8 +10500,8 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "wp" = ( /obj/structure/cable{ @@ -10521,8 +10519,8 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "wq" = ( /obj/structure/cable{ @@ -10540,8 +10538,8 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/lattice/catwalk, /turf/space, -/turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "wr" = ( /obj/docking_port/stationary{ @@ -10583,7 +10581,7 @@ "wz" = ( /obj/item/stack/sheet/metal, /turf/space, -/area/space) +/area/space/nearstation) "wC" = ( /obj/effect/landmark/burnturf, /obj/machinery/light/small{ @@ -11119,7 +11117,7 @@ name = "I PISS ON YOU!" }, /turf/space, -/area/space) +/area/space/nearstation) "yo" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -11325,7 +11323,7 @@ max_amount = 30 }, /turf/space, -/area/space) +/area/space/nearstation) "yS" = ( /obj/machinery/door/airlock/external{ frequency = 1501; @@ -11489,7 +11487,7 @@ icon_state = "small" }, /turf/space, -/area/space) +/area/space/nearstation) "zt" = ( /turf/simulated/wall, /area/derelict/teleporter) @@ -11647,7 +11645,7 @@ icon_state = "swall_f5"; dir = 2 }, -/area/space) +/area/space/nearstation) "zR" = ( /obj/machinery/portable_atmospherics/canister/toxins, /obj/machinery/light/small{ @@ -53934,7 +53932,7 @@ aa aa aa aa -wr +aa aa aa aa @@ -54190,7 +54188,7 @@ aa aa aa aa -aa +wr aa aa aa diff --git a/_maps/map_files/generic/Lavaland.dmm b/_maps/map_files/generic/Lavaland.dmm new file mode 100644 index 00000000000..142bbcff5f7 --- /dev/null +++ b/_maps/map_files/generic/Lavaland.dmm @@ -0,0 +1,69821 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/simulated/wall/indestructible/boss, +/area/lavaland/surface/outdoors) +"ab" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ac" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"ad" = ( +/turf/simulated/mineral/random/high_chance/volcanic, +/area/lavaland/surface/outdoors) +"ae" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"af" = ( +/obj/structure/necropolis_gate/legion_gate, +/obj/structure/necropolis_arch{ + pixel_y = -40 + }, +/obj/structure/stone_tile/slab, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"ag" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ah" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ai" = ( +/turf/simulated/mineral/random/volcanic, +/area/lavaland/surface/outdoors) +"aj" = ( +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"ak" = ( +/turf/simulated/mineral/random/volcanic, +/area/lavaland/surface/outdoors/unexplored/danger) +"al" = ( +/turf/simulated/mineral/random/high_chance/volcanic, +/area/lavaland/surface/outdoors/unexplored/danger) +"am" = ( +/turf/simulated/mineral/random/volcanic, +/area/lavaland/surface/outdoors/unexplored) +"an" = ( +/turf/simulated/mineral/random/labormineral/volcanic, +/area/lavaland/surface/outdoors) +"ao" = ( +/obj/machinery/computer/shuttle/labor/one_way{ + icon_state = "computer"; + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"ap" = ( +/obj/effect/spawner/window/reinforced, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"aq" = ( +/turf/simulated/wall, +/area/mine/laborcamp) +"ar" = ( +/obj/structure/table, +/turf/simulated/floor/plasteel/white, +/area/mine/laborcamp) +"as" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/turf/simulated/floor/plasteel/white, +/area/mine/laborcamp) +"at" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/camera{ + c_tag = "Labor Camp Medical"; + dir = 8; + network = list("Labor Camp") + }, +/turf/simulated/floor/plasteel/white, +/area/mine/laborcamp) +"au" = ( +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/pickaxe/safety, +/obj/item/flashlight/lantern, +/obj/item/clothing/glasses/meson, +/obj/item/mining_scanner, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"av" = ( +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/flashlight/lantern, +/obj/item/pickaxe/safety, +/obj/item/clothing/glasses/meson, +/obj/item/mining_scanner, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aw" = ( +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/explored) +"ax" = ( +/turf/simulated/floor/plasteel/white, +/area/mine/laborcamp) +"ay" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/mine/laborcamp) +"az" = ( +/turf/simulated/floor/bluegrid, +/area/mine/maintenance) +"aA" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aB" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Infirmary" + }, +/turf/simulated/floor/plasteel/white, +/area/mine/laborcamp) +"aC" = ( +/obj/structure/closet/crate/internals, +/obj/item/tank/emergency_oxygen, +/obj/item/tank/emergency_oxygen, +/obj/item/tank/emergency_oxygen, +/obj/item/tank/emergency_oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aD" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) +"aE" = ( +/obj/item/radio/intercom/locked/prison{ + dir = 2; + pixel_y = 24 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aF" = ( +/obj/machinery/door/airlock{ + name = "Labor Camp Storage" + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aG" = ( +/obj/structure/table, +/obj/item/trash/plate, +/obj/item/kitchen/utensil/fork, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aH" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aI" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/suit_storage_unit/lavaland, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"aJ" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aK" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aL" = ( +/obj/machinery/door/airlock{ + name = "Vending" + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aM" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"aO" = ( +/obj/machinery/camera{ + c_tag = "Labor Camp External"; + dir = 4; + network = list("Labor Camp") + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"aP" = ( +/obj/machinery/vending/sustenance, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aQ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aR" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/mine/laborcamp) +"aS" = ( +/obj/machinery/mineral/unloading_machine{ + dir = 1; + icon_state = "unloader-corner"; + input_dir = 1; + output_dir = 2 + }, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"aT" = ( +/obj/structure/ore_box, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) +"aU" = ( +/obj/machinery/flasher{ + id = "labor" + }, +/turf/simulated/wall, +/area/mine/laborcamp) +"aV" = ( +/obj/effect/turf_decal/delivery, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"aW" = ( +/obj/machinery/conveyor{ + dir = 2; + id = "gulag" + }, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"aX" = ( +/obj/structure/closet/crate, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) +"aY" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door_control{ + id = "miningdorm1"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 24; + pixel_y = 0; + specialfunctions = 4 + }, +/turf/simulated/floor/carpet, +/area/mine/living_quarters) +"aZ" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/door_control{ + id = "Labor"; + name = "Labor Camp Lockdown"; + pixel_x = 0; + pixel_y = 25; + req_access_txt = "2" + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"ba" = ( +/obj/machinery/door/poddoor/preopen{ + id_tag = "Labor"; + name = "labor camp blast door" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Labor Camp Shuttle Cockpit"; + req_access_txt = "2" + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"bb" = ( +/obj/machinery/camera{ + c_tag = "Labor Camp Central"; + network = list("Labor Camp") + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"bc" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "gulag" + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"bd" = ( +/obj/machinery/mineral/processing_unit_console{ + dir = 2; + machinedir = 4 + }, +/turf/simulated/wall, +/area/mine/laborcamp) +"be" = ( +/obj/machinery/mineral/processing_unit{ + dir = 1; + output_dir = 2 + }, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"bf" = ( +/turf/simulated/wall, +/area/mine/eva) +"bg" = ( +/obj/effect/spawner/window/reinforced, +/turf/simulated/floor/plating, +/area/mine/eva) +"bh" = ( +/obj/machinery/computer/secure_data{ + icon_state = "computer"; + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp/security) +"bi" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door_control{ + id = "miningdorm2"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 24; + pixel_y = 0; + specialfunctions = 4 + }, +/turf/simulated/floor/carpet, +/area/mine/living_quarters) +"bj" = ( +/obj/machinery/status_display{ + pixel_y = 32 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"bk" = ( +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"bl" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "gulag" + }, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"bm" = ( +/obj/machinery/conveyor{ + dir = 10; + id = "gulag" + }, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"bn" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"bo" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/door_control{ + id = "miningbathroom"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -24; + specialfunctions = 4 + }, +/turf/simulated/floor/plasteel/freezer, +/area/mine/living_quarters) +"bp" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/lavaland, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bq" = ( +/turf/simulated/wall, +/area/mine/production) +"br" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door_control{ + id = "miningdorm3"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 24; + pixel_y = 0; + specialfunctions = 4 + }, +/turf/simulated/floor/carpet, +/area/mine/living_quarters) +"bs" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/lavaland, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bt" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/lavaland, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bu" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/suit_storage_unit/lavaland, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bv" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/eva) +"bw" = ( +/obj/machinery/alarm{ + pixel_y = 23 + }, +/obj/machinery/computer/shuttle/mining{ + req_access = null + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"bx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"by" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"bz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"bA" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Labor Camp Backroom"; + req_access_txt = "2" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"bB" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Labor Camp APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"bC" = ( +/obj/structure/closet/crate, +/obj/item/dice/d4, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"bD" = ( +/obj/machinery/camera{ + c_tag = "EVA"; + dir = 4; + network = list("Mining Outpost") + }, +/obj/machinery/alarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bE" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/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" = ( +/obj/effect/spawner/window, +/turf/simulated/floor/plating, +/area/mine/eva) +"bG" = ( +/obj/machinery/light_switch{ + pixel_x = 27 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bH" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bI" = ( +/obj/effect/turf_decal/tile/purple, +/obj/structure/dispenser/oxygen, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bJ" = ( +/obj/effect/spawner/window/reinforced, +/obj/structure/sign/securearea{ + name = "\improper KEEP CLEAR: DOCKING AREA" + }, +/turf/simulated/floor/plating, +/area/mine/production) +"bK" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/embedded_controller/radio/airlock/access_controller{ + id_tag = "mining"; + pixel_y = 25; + tag_exterior_door = "mining_outer"; + tag_interior_door = "mining_inner" + }, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bL" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Labor Camp Monitoring"; + req_access_txt = "2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"bM" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Labor Camp Maintenance"; + req_access_txt = "2" + }, +/obj/structure/cable{ + icon_state = "1-10" + }, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"bN" = ( +/obj/effect/spawner/window/reinforced, +/turf/simulated/floor/plating, +/area/mine/production) +"bO" = ( +/obj/docking_port/stationary{ + area_type = /area/lavaland/surface/outdoors; + dir = 8; + dwidth = 2; + height = 5; + id = "laborcamp_away"; + name = "labor camp"; + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface; + width = 9 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) +"bP" = ( +/obj/item/radio/beacon, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"bQ" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"bR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"bS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Station EVA"; + req_access_txt = "54" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bT" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/effect/turf_decal/tile/purple, +/turf/simulated/floor/plasteel, +/area/mine/production) +"bU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bW" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bX" = ( +/obj/machinery/access_button{ + command = "cycle_interior"; + frequency = 1379; + master_tag = "mining"; + name = "interior access button"; + pixel_x = 25; + pixel_y = 25; + req_access_txt = null + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bY" = ( +/turf/simulated/floor/plasteel, +/area/mine/eva) +"bZ" = ( +/turf/simulated/mineral/random/volcanic, +/area/lavaland/surface/outdoors/explored) +"ca" = ( +/turf/simulated/wall, +/area/mine/laborcamp/security) +"cb" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_y = 25 + }, +/obj/machinery/alarm{ + dir = 4; + pixel_x = -23 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp/security) +"cc" = ( +/obj/structure/chair/office, +/obj/structure/cable{ + icon_state = "1-4" + }, +/mob/living/simple_animal/bot/secbot/beepsky{ + desc = "Powered by the tears and sweat of laborers."; + name = "Prison Ofitser" + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp/security) +"cd" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen, +/obj/machinery/power/apc{ + dir = 4; + name = "Labor Camp Security APC"; + pixel_x = 24 + }, +/obj/machinery/camera{ + c_tag = "Labor Camp Monitoring"; + network = list("Labor Camp") + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp/security) +"ce" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "5-6" + }, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"cf" = ( +/obj/machinery/power/terminal, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"cg" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"ch" = ( +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"ci" = ( +/obj/machinery/computer/prisoner{ + icon_state = "computer"; + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp/security) +"cj" = ( +/obj/machinery/door/airlock/external{ + frequency = 1379; + glass = 1; + id_tag = "mining_inner"; + locked = 1; + name = "Mining External Airlock"; + opacity = 0; + req_access_txt = "54" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"ck" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"cl" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cm" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cn" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"co" = ( +/obj/machinery/power/apc{ + dir = 2; + name = "Mining EVA APC"; + pixel_x = 1; + pixel_y = -23 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/lavaland, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"cp" = ( +/obj/machinery/suit_storage_unit/lavaland, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"cq" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"cr" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"cs" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"ct" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cu" = ( +/obj/item/pickaxe, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cv" = ( +/obj/structure/ore_box, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cx" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cy" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"cz" = ( +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/structure/cable, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"cA" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-9" + }, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"cB" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"cC" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/floor/plating, +/area/mine/laborcamp) +"cD" = ( +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cF" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cG" = ( +/obj/effect/spawner/window/reinforced, +/turf/simulated/floor/plating, +/area/mine/laborcamp/security) +"cH" = ( +/obj/machinery/power/apc{ + dir = 8; + name = "Mining Station Starboard Wing APC"; + pixel_x = -27; + pixel_y = 2 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cJ" = ( +/obj/machinery/door/airlock{ + name = "Closet" + }, +/turf/simulated/floor/plating, +/area/mine/production) +"cK" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/mine/production) +"cL" = ( +/obj/machinery/space_heater, +/turf/simulated/floor/plating, +/area/mine/production) +"cM" = ( +/turf/simulated/wall, +/area/mine/living_quarters) +"cN" = ( +/obj/machinery/mineral/equipment_vendor, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cO" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cP" = ( +/obj/structure/closet/crate, +/obj/machinery/alarm{ + pixel_y = 23 + }, +/obj/effect/turf_decal/bot, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cQ" = ( +/turf/simulated/wall/r_wall, +/area/mine/maintenance) +"cR" = ( +/obj/effect/spawner/window/reinforced, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"cS" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"cT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/crate/secure/loot, +/obj/structure/sign/electricshock{ + pixel_y = 32 + }, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"cU" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"cV" = ( +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"cW" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"cX" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/bot, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"cZ" = ( +/obj/effect/turf_decal/bot, +/turf/simulated/floor/plasteel, +/area/mine/production) +"da" = ( +/obj/machinery/mineral/mint{ + input_dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"db" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/alarm{ + pixel_y = 23 + }, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/mine/living_quarters) +"dc" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/mine/living_quarters) +"dd" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/obj/structure/table, +/turf/simulated/floor/plasteel, +/area/mine/production) +"de" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/mine/living_quarters) +"df" = ( +/obj/structure/table, +/obj/item/storage/firstaid/toxin{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/simulated/floor/plasteel/white, +/area/mine/living_quarters) +"dg" = ( +/obj/machinery/alarm{ + pixel_y = 24 + }, +/turf/simulated/floor/bluegrid, +/area/mine/maintenance) +"dh" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + dir = 1; + name = "Mining Communications APC"; + pixel_x = 1; + pixel_y = 25 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/plasteel/dark, +/area/mine/maintenance) +"di" = ( +/obj/machinery/telecomms/relay/preset/mining, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plasteel/dark, +/area/mine/maintenance) +"dj" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/plasteel/dark, +/area/mine/maintenance) +"dk" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/bluegrid, +/area/mine/maintenance) +"dl" = ( +/obj/machinery/mineral/equipment_vendor, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dm" = ( +/obj/effect/turf_decal/loading_area, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dn" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"do" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"dp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 6 + }, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"dq" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"dr" = ( +/obj/machinery/atmospherics/unary/tank/air{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"ds" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dt" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/mine/living_quarters) +"du" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dv" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Shuttle Docking Foyer"; + dir = 8; + network = list("Mining Outpost") + }, +/obj/machinery/newscaster{ + pixel_x = 30; + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dw" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/turf_decal/bot, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dx" = ( +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/bluegrid, +/area/mine/maintenance) +"dy" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dz" = ( +/obj/machinery/camera{ + c_tag = "Communications Relay"; + dir = 8; + network = list("Mining Outpost") + }, +/turf/simulated/floor/bluegrid, +/area/mine/maintenance) +"dA" = ( +/obj/machinery/camera{ + c_tag = "Processing Area Room"; + dir = 8; + network = list("Mining Outpost") + }, +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (General)"; + pixel_x = 28 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dB" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/iv_bag/blood, +/obj/item/reagent_containers/iv_bag/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/reagent_containers/iv_bag/blood/AMinus, +/obj/item/reagent_containers/iv_bag/blood/BMinus{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/reagent_containers/iv_bag/blood/BPlus{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OPlus{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/reagent_containers/iv_bag/blood/random, +/obj/item/reagent_containers/iv_bag/blood/random, +/obj/item/reagent_containers/iv_bag/blood/random, +/obj/machinery/camera{ + c_tag = "Sleeper Room"; + dir = 1; + network = list("Mining Outpost") + }, +/turf/simulated/floor/plasteel/white, +/area/mine/living_quarters) +"dC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/plasteel/white, +/area/mine/living_quarters) +"dD" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/plasteel/white, +/area/mine/living_quarters) +"dE" = ( +/obj/machinery/mineral/unloading_machine{ + dir = 1; + icon_state = "unloader-corner"; + input_dir = 1; + output_dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/simulated/floor/plating, +/area/mine/production) +"dF" = ( +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"dG" = ( +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"dH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/binary/pump/on, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"dI" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 5 + }, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"dJ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dK" = ( +/obj/effect/turf_decal/tile/purple, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dL" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dM" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dN" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "mining_internal"; + name = "mining conveyor" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dO" = ( +/obj/machinery/conveyor{ + dir = 2; + id = "mining_internal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/mine/production) +"dP" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Mining Station Communications"; + req_access_txt = "48" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/mine/maintenance) +"dQ" = ( +/obj/effect/spawner/window, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"dR" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Infirmary" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel/white, +/area/mine/living_quarters) +"dS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Mining Station Maintenance"; + req_access_txt = "48" + }, +/obj/machinery/atmospherics/pipe/simple/visible/universal, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"dT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"dU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"dV" = ( +/obj/effect/spawner/window, +/turf/simulated/floor/plating, +/area/mine/production) +"dW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/mine/production) +"dX" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"dY" = ( +/obj/machinery/door/airlock/external{ + frequency = 1379; + glass = 1; + id_tag = "mining_outer"; + locked = 1; + name = "Mining External Airlock"; + opacity = 0; + req_access_txt = "54" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"dZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"ea" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"ec" = ( +/obj/machinery/camera{ + c_tag = "Crew Area Hallway East"; + network = list("Mining Outpost") + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"ed" = ( +/obj/machinery/camera{ + c_tag = "Crew Area Hallway West"; + network = list("Mining Outpost") + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"ee" = ( +/obj/effect/turf_decal/tile/purple, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"ef" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eg" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Mining Station Port Wing APC"; + pixel_x = 1; + pixel_y = 25 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eh" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"ei" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"ej" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"ek" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"el" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Processing Area"; + req_access_txt = "48" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"em" = ( +/obj/machinery/mineral/processing_unit{ + dir = 1; + output_dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/simulated/floor/plating, +/area/mine/production) +"en" = ( +/obj/machinery/mineral/processing_unit_console, +/turf/simulated/wall, +/area/mine/production) +"eo" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/lavaland, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"ep" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eq" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"er" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"es" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"et" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eu" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"ev" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"ew" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/eva) +"ex" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Station Bridge"; + req_access_txt = "48" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"ey" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"ez" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eA" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Station Bridge"; + req_access_txt = "48" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eC" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eF" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Processing Area"; + req_access_txt = "48" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/ore_box, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eK" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/effect/turf_decal/tile/purple, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eM" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eP" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eQ" = ( +/obj/machinery/door/airlock/mining{ + name = "Mining Station Storage"; + req_access_txt = "48" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eR" = ( +/obj/machinery/door/airlock/glass{ + name = "Break Room" + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eT" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eU" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"eV" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"eW" = ( +/turf/simulated/floor/plasteel, +/area/mine/production) +"eX" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "mining_internal" + }, +/obj/structure/plasticflaps, +/turf/simulated/floor/plating, +/area/mine/production) +"eY" = ( +/obj/machinery/access_button{ + command = "cycle_interior"; + frequency = 1379; + master_tag = "labor"; + name = "interior access button"; + pixel_x = 25; + pixel_y = -25; + req_access_txt = null + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"eZ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"fa" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fb" = ( +/obj/machinery/alarm{ + dir = 1; + pixel_y = -22 + }, +/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" = ( +/obj/machinery/alarm{ + pixel_y = 23 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fd" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/brown{ + dir = 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" = ( +/obj/structure/bed, +/obj/item/bedsheet/brown, +/obj/machinery/alarm{ + pixel_y = 23 + }, +/turf/simulated/floor/carpet, +/area/mine/living_quarters) +"ff" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/turf/simulated/floor/carpet, +/area/mine/living_quarters) +"fg" = ( +/obj/machinery/door/airlock{ + id_tag = "miningdorm1"; + name = "Room 1" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fh" = ( +/turf/simulated/floor/mech_bay_recharge_floor, +/area/mine/production) +"fi" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fj" = ( +/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" = ( +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fl" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"fm" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "mining_internal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/mine/production) +"fn" = ( +/obj/machinery/conveyor{ + dir = 10; + id = "mining_internal" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/mine/production) +"fo" = ( +/obj/machinery/mineral/equipment_vendor, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fp" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fr" = ( +/obj/structure/table, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/carpet, +/area/mine/living_quarters) +"fs" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"ft" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fu" = ( +/obj/machinery/alarm{ + pixel_y = 23 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fv" = ( +/obj/machinery/camera{ + c_tag = "Storage"; + dir = 2; + network = list("Mining Outpost") + }, +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fx" = ( +/obj/machinery/vending/snack, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fz" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fB" = ( +/obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"fC" = ( +/obj/machinery/vending/cigarette, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fD" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fE" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fF" = ( +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (General)"; + pixel_x = 28 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fG" = ( +/obj/machinery/camera{ + c_tag = "Dormitories"; + dir = 4; + network = list("Mining Outpost") + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fH" = ( +/obj/machinery/door/airlock{ + id_tag = "miningdorm2"; + name = "Room 2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fI" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fJ" = ( +/obj/docking_port/stationary{ + area_type = /area/lavaland/surface/outdoors; + dir = 8; + dwidth = 3; + height = 5; + id = "mining_away"; + name = "lavaland mine"; + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface; + width = 7 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"fK" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fL" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/structure/closet/secure_closet/miner, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fM" = ( +/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" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fO" = ( +/obj/machinery/door/airlock{ + id_tag = "miningdorm3"; + name = "Room 3" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fP" = ( +/obj/structure/closet/secure_closet/miner, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fQ" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored/danger) +"fR" = ( +/turf/simulated/mineral/random/high_chance/volcanic, +/area/lavaland/surface/outdoors/unexplored) +"fS" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"fT" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"fU" = ( +/obj/structure/closet/secure_closet/miner, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fV" = ( +/turf/simulated/wall/indestructible/boss/see_through, +/area/lavaland/surface/outdoors) +"fW" = ( +/obj/structure/necropolis_gate/locked, +/obj/structure/stone_tile/slab, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"fX" = ( +/obj/structure/closet/secure_closet/miner, +/obj/effect/turf_decal/tile/brown{ + dir = 2 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fY" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"fZ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"ga" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/cans/beer{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/cans/beer{ + pixel_x = -1; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/drinks/cans/beer{ + pixel_x = -8 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gb" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gc" = ( +/obj/machinery/door/window/southleft, +/obj/machinery/shower{ + pixel_y = 22 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/curtain/open/shower, +/turf/simulated/floor/plasteel/freezer, +/area/mine/living_quarters) +"gd" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/mine/production) +"ge" = ( +/obj/machinery/door/window/southright, +/obj/machinery/shower{ + pixel_y = 22 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/curtain/open/shower, +/turf/simulated/floor/plasteel/freezer, +/area/mine/living_quarters) +"gf" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gg" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gh" = ( +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gi" = ( +/obj/machinery/camera{ + c_tag = "Crew Area"; + dir = 1; + network = list("Mining Outpost") + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = -32 + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gj" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/center, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"gk" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"gl" = ( +/obj/machinery/alarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gm" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gn" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"go" = ( +/obj/structure/stone_tile/block, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"gp" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gq" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gr" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"gs" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"gt" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gu" = ( +/obj/machinery/door/airlock/external{ + id_tag = "laborcamp_away"; + locked = 0; + name = "Labor Camp Airlock"; + req_access_txt = "2" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"gv" = ( +/obj/machinery/door/airlock/external{ + glass = 1; + id_tag = "mining_away"; + name = "Mining Shuttle Airlock"; + opacity = 0; + req_one_access_txt = "48" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plasteel, +/area/mine/production) +"gw" = ( +/obj/machinery/door/airlock/external{ + glass = 1; + id_tag = "mining_away"; + name = "Mining Shuttle Airlock"; + opacity = 0; + req_access_txt = "48" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plasteel, +/area/mine/production) +"gx" = ( +/obj/machinery/door/airlock{ + frequency = 1379; + id_tag = "labor_inner"; + locked = 1; + name = "Labor Camp External Access" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"gy" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"gA" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gB" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"gC" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"gD" = ( +/obj/machinery/embedded_controller/radio/airlock/access_controller{ + id_tag = "labor"; + pixel_y = 25; + tag_exterior_door = "labor_outer"; + tag_interior_door = "labor_inner" + }, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"gE" = ( +/obj/machinery/door/airlock{ + frequency = 1379; + id_tag = "labor_outer"; + locked = 1; + name = "Labor Camp External Access" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/plasteel, +/area/mine/laborcamp) +"gF" = ( +/obj/machinery/access_button{ + command = "cycle_exterior"; + frequency = 1379; + master_tag = "labor"; + name = "exterior access button"; + pixel_x = -25; + pixel_y = -25; + req_access_txt = null + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) +"gG" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"gH" = ( +/obj/machinery/access_button{ + command = "cycle_exterior"; + frequency = 1379; + master_tag = "mining"; + name = "exterior access button"; + pixel_x = -25; + pixel_y = -25; + req_access_txt = null + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"gI" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel/dark, +/area/mine/maintenance) +"gJ" = ( +/obj/machinery/atmospherics/unary/outlet_injector/on{ + dir = 4; + name = "scrubber outlet" + }, +/obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/living_quarters) +"gK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/living_quarters) +"gL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"gM" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"gO" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"gP" = ( +/obj/structure/stone_tile/slab, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"gR" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"hg" = ( +/obj/structure/stone_tile/surrounding, +/obj/structure/stone_tile/center/cracked, +/mob/living/simple_animal/hostile/megafauna/legion, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"hs" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"hz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel/freezer, +/area/mine/living_quarters) +"hH" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"hJ" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"id" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"ir" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 10 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"it" = ( +/obj/structure/stone_tile/block, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"iu" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"iw" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ix" = ( +/obj/structure/stone_tile/block/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"iy" = ( +/obj/structure/stone_tile/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"iC" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile/block/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"iK" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"iX" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"iY" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ja" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"jb" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"jg" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"jk" = ( +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"jl" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"jm" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"jq" = ( +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"js" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"jx" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"jF" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"jH" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"jL" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"jN" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/center/cracked, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"jQ" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"jR" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"jS" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"kg" = ( +/obj/structure/fluff/drake_statue, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"kj" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"kl" = ( +/obj/structure/fluff/drake_statue/falling, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ko" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ky" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"kB" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"kD" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"kH" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/center/cracked, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"kJ" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/center, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"kM" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"kN" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"kR" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"le" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"lg" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"lj" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ll" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"lp" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"lq" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"lr" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ls" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"lu" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"lv" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"lw" = ( +/obj/structure/stone_tile/cracked, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"ly" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"lz" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"lD" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"lE" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"lF" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"lG" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/block, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"lI" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"lP" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"lQ" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 6 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"lR" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"lS" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"lW" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"lZ" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"ma" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mb" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"mk" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ml" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"mn" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mq" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"mr" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"ms" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"mt" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mu" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mv" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"mw" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"mx" = ( +/obj/structure/stone_tile, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"my" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mA" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mB" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mC" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"mD" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mE" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mF" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mG" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mH" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mI" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mJ" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mK" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mL" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mM" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mN" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mO" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mP" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mQ" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"mS" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"mV" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"mW" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"mX" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"mY" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"mZ" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"nb" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"nc" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"ne" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"nf" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"ng" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/floor/indestructible/boss, +/area/lavaland/surface/outdoors) +"on" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"pa" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"rV" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"sL" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"tI" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/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, +/area/mine/living_quarters) +"vZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"xA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"yR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"zu" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"AB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"BD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/wall, +/area/mine/living_quarters) +"BT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"Eg" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"Ej" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"El" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/wall, +/area/mine/living_quarters) +"EG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"Fe" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12 + }, +/obj/structure/mirror{ + pixel_x = -28 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel/freezer, +/area/mine/living_quarters) +"IK" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/plasteel/freezer, +/area/mine/living_quarters) +"Jl" = ( +/obj/effect/spawner/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"Kb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/living_quarters) +"LO" = ( +/obj/effect/spawner/window, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/mine/eva) +"Nj" = ( +/obj/machinery/door/airlock{ + name = "Restroom" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel/freezer, +/area/mine/living_quarters) +"PQ" = ( +/obj/effect/spawner/window, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"Tn" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light/small, +/turf/simulated/floor/plasteel/freezer, +/area/mine/living_quarters) +"TN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/wall/r_wall, +/area/mine/maintenance) +"Uh" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"UQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"VD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/mine/production) +"WO" = ( +/obj/effect/spawner/window, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/mine/living_quarters) +"Zf" = ( +/obj/machinery/door/airlock{ + id_tag = "miningbathroom"; + name = "Restroom" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel/freezer, +/area/mine/living_quarters) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ad +ad +ad +ad +ad +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ai +ai +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ix +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +an +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ai +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +al +al +al +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +an +an +an +an +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ai +aD +ab +aj +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ak +ak +ak +ak +ak +ak +ak +al +aj +aj +aj +aj +aj +aj +aj +aj +an +an +an +an +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aw +aw +ab +aD +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +"} +(8,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ad +aj +ab +ab +ad +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ad +an +an +an +an +an +an +an +an +an +an +an +an +ab +ab +ab +an +an +ab +ab +an +an +an +an +an +an +an +an +an +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +ab +aj +aj +aj +aw +aw +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +"} +(9,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ai +aj +aj +ab +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +ab +ab +aj +aj +aj +aj +aw +aw +aj +aj +aw +aw +aj +aj +aw +aj +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ix +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ai +aj +ab +ab +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ai +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ab +ab +an +an +an +an +an +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aw +aw +aD +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +ab +aj +aj +aj +aj +aj +aj +aj +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iX +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ai +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aj +aj +aj +aj +aj +aj +aj +aj +an +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aw +aw +aw +aD +aw +aw +aw +aw +aw +aD +aw +aw +aD +aw +aw +aw +aj +aw +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iY +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ai +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ab +ab +aj +aj +aj +aj +aj +aj +ab +an +an +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +ab +aj +aw +aw +aw +aD +aD +aD +aD +aD +aD +aD +aD +aD +aw +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +"} +(14,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ai +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ab +ab +an +an +an +an +an +an +an +an +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aw +aw +aw +aw +aD +aD +aD +aD +aD +aD +aD +aD +aD +aw +aw +ab +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +aj +ab +aj +aj +aj +aj +aj +"} +(15,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ak +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +ai +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aw +aw +aw +aw +aD +aD +aD +aD +aD +aD +aD +aD +aD +aw +aw +aw +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +"} +(16,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ir +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +ab +al +al +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ai +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aw +aw +aw +aD +aD +aD +aD +aD +aD +aD +aD +aD +aw +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +gP +ad +ad +ab +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +ab +aj +al +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ai +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aw +aw +aD +aD +aD +aD +aD +aD +aD +bO +aD +aD +aD +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +aj +ab +aj +aj +aj +aj +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +it +ab +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +aj +ab +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +ai +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ab +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aq +aq +aq +aq +aq +gu +aq +aq +aq +gu +aq +aw +aw +aj +aj +aj +aj +aj +ai +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +aj +ab +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +ai +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ab +ab +an +ab +aj +aj +aj +aj +aj +ab +aq +aG +aK +aP +aq +aZ +aq +ao +aq +aJ +aq +aD +bZ +aj +aj +aD +aj +ab +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +aj +aj +aj +aj +ab +ab +ab +ab +aj +aj +aj +aj +ab +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +ai +ai +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ab +aj +aj +aj +ab +ab +aq +aH +bk +aQ +aq +gu +aq +bk +aq +gu +aq +bZ +bZ +bZ +aj +aj +aj +ai +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +aj +aj +aj +aj +ab +ab +ab +ab +aj +aj +aj +aj +ab +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +ai +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ap +ap +ap +aq +aq +aq +aL +aq +aq +ba +aq +bj +bk +bk +aq +ca +ca +ca +aj +aj +aj +ai +ad +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(22,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ix +ab +ab +ab +aj +aj +aj +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +ai +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ap +ar +ar +aq +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +aq +cb +bh +cG +aj +aj +aj +aj +ai +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(23,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ab +ab +ab +ab +aj +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +ai +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aq +as +ax +aB +bk +bk +bk +bk +aU +bb +bk +bk +bk +by +bL +cc +ci +cG +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +ai +aj +aj +aj +aj +aj +ab +ab +ab +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aq +at +ay +aq +aE +bk +bk +bk +bk +bk +cy +bn +bk +bz +aq +cd +ci +cG +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ix +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +ai +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aq +aq +aq +aq +aq +bk +bk +aR +bk +bc +aq +bl +aq +bA +aq +aq +aq +aq +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ad +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aq +au +au +au +aq +bk +aM +aq +aq +bd +aq +bl +aq +bz +aq +ce +cz +aq +aj +aj +aj +ab +ab +ab +gJ +ab +ab +aj +aj +aj +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +jq +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aq +av +bk +bk +aF +eY +aV +aS +aW +be +aW +bm +aq +bB +bM +cf +cA +aq +aj +aj +ab +ad +ai +fB +gK +fB +ai +ab +ab +ab +ad +ai +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +ai +aj +aj +ai +ab +ab +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aq +aq +aA +aC +aq +gx +aq +aq +aq +aq +aq +aq +aq +aq +aq +cg +cB +aq +aj +cQ +cQ +cQ +cQ +cR +Jl +cR +cM +cR +cR +cR +cM +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +it +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +ai +ai +am +ai +ab +ai +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aq +aq +aq +aq +gD +aq +aT +aX +aX +aD +aD +aD +aD +aq +ch +cC +aq +aj +cQ +az +az +cQ +fk +yR +fk +cM +fo +fE +fL +cM +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +aj +ab +ab +ab +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +ai +ai +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aq +aJ +aq +aT +aD +aD +aD +aD +aD +aD +aq +aq +aq +aq +aj +cQ +dh +dk +TN +dT +ep +eL +cM +fs +fk +fM +cR +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +ai +aj +aj +ai +aj +aj +aj +aj +aj +an +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +aq +gE +aq +aT +aD +aD +aD +aD +aD +aj +aj +aj +aj +aj +ab +cQ +di +gI +dP +dU +eq +eO +eQ +ft +fp +fP +cR +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +ai +ai +ai +ab +ab +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +gF +aO +aD +aD +aD +aD +aD +aj +aj +aj +aj +aj +ab +ad +cQ +dj +dx +cQ +dX +er +eS +cM +fu +fk +fU +cR +ab +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +ai +ab +ai +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +aD +aD +aD +aD +aD +aD +aD +aD +aj +aj +aj +aj +ab +ai +cQ +dg +dz +cQ +ed +Kb +eM +El +fv +fF +fX +cM +ai +ad +ai +ai +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(34,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ja +ab +ab +ab +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +ad +aj +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +aD +aD +aD +aD +aD +aD +aj +aj +aj +aj +ab +ab +cQ +cQ +cQ +cQ +fc +er +vZ +cM +cM +cM +cM +cM +cM +cM +cM +cM +cM +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ab +ab +ab +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +ai +aj +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +aD +aD +aD +aD +aD +aD +aj +aj +aj +aj +aj +ab +cM +db +dB +cM +fk +EG +on +cM +fe +fr +cM +fe +fr +cM +fe +fr +cM +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +it +ab +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +ai +aj +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +aD +aD +aD +aD +aD +aD +aD +aj +aj +aj +aj +ab +cR +dc +dC +WO +dT +Kb +Eg +cM +ff +aY +cM +ff +bi +cM +ff +br +cM +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +aj +aj +aj +ab +ab +ab +aj +aj +ab +aj +ab +ab +ab +ab +ab +ab +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +aD +aT +an +aD +aD +aj +aj +aj +aj +ab +cR +de +dD +dR +dZ +es +vZ +cM +fg +BD +cM +fH +BD +cM +fO +BD +cM +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +aj +aj +aj +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +an +an +an +ab +ab +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +aD +aD +aj +aj +ai +ad +cM +df +dt +dQ +dX +er +sL +fa +fw +fG +fa +fw +gp +gq +fw +gt +cR +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +aj +aj +aj +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aj +aj +ai +cM +cM +cM +cM +cM +eg +et +eN +gL +fi +pa +pa +fi +fN +Ej +gA +fp +cR +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +ai +aj +aj +ai +ai +ai +aj +aj +aj +aj +aj +aj +aj +ab +ab +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +aj +aj +cM +cS +do +dF +cM +eh +EG +on +cM +cM +dQ +dQ +cM +cM +BD +Nj +cM +cM +ai +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(41,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +jq +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +ai +ai +am +am +am +ai +aj +aj +aj +aj +aj +aj +aj +ab +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +aD +aj +aj +cM +cT +cV +dG +cM +ea +er +rV +cM +fx +fz +fY +gh +cM +gc +hz +cM +ai +ad +ai +ai +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +"} +(42,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iu +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +ai +aj +aj +aj +aj +aj +aj +aj +aj +ab +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +aD +aj +aj +cM +cU +dp +dH +dS +eb +eu +Ej +PQ +fy +fy +fZ +fz +cM +ge +Tn +cM +ab +ai +ai +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(43,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +ai +aj +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aj +aj +aj +aj +aj +ab +ab +ab +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +aD +aj +ab +cM +cV +dq +dI +cM +ec +ev +vZ +eR +fz +fI +ga +gi +cM +BD +Zf +cM +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(44,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ab +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +aD +aD +aj +aj +ab +cM +cW +dr +dr +cM +vq +Kb +eT +WO +fA +fA +gb +gl +cM +Fe +bo +cM +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(45,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +ai +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +an +an +an +an +an +an +an +an +an +an +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +an +an +ab +aj +aj +ab +an +an +an +an +an +an +an +an +an +an +an +an +an +ab +aj +aj +an +an +an +an +an +aD +aD +aD +aD +aj +aj +aj +aj +cM +cM +cM +cM +cM +fk +er +vZ +cM +fC +fz +gf +gm +cM +IK +tI +cM +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(46,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ja +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +ai +ab +aj +aj +aj +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +an +an +an +an +an +aj +aj +aj +aj +aj +aj +aj +aD +aD +aD +aD +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +cR +fk +ev +bx +cM +fD +fK +gg +gn +cM +cM +cM +cM +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +"} +(47,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ai +ab +ab +ab +ai +am +ai +aj +aj +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +ab +cR +ee +ey +eU +cM +cR +cR +cR +cR +cM +ai +ai +ai +aj +ab +aj +aj +ab +ab +aj +ab +ab +ab +aj +aj +aj +aj +aj +aj +"} +(48,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +ai +ai +ai +am +am +am +ai +ai +am +am +ai +ai +aj +aj +aj +aj +aj +aj +ai +ai +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +ab +aj +aj +aj +aj +aj +cR +cR +ex +cR +cR +ab +ab +ab +ab +ai +ai +ai +ab +aj +aj +aj +aj +ab +ab +ab +ai +ad +ad +ab +ab +aj +aj +aj +aj +"} +(49,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +ai +ai +ai +ai +ai +ai +am +am +ai +ai +aj +aj +aj +aj +ad +ab +ab +ab +ai +aj +aj +aj +aj +aj +aj +aj +ai +ai +ai +ai +ai +ai +ai +aj +aj +aj +aj +aj +ai +ai +ai +ai +ai +ai +ai +ab +ab +ai +ai +ai +ai +aj +aj +aj +aj +ai +ai +aj +aj +aj +aj +aj +aj +aj +ai +ai +ai +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +cR +ez +cR +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ad +ad +ad +ad +ad +ai +ai +aj +aj +aj +"} +(50,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +it +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ai +ai +ai +am +ai +ai +ai +am +ai +ai +ai +ai +ai +ai +ai +am +am +am +am +am +am +am +ai +ai +ab +ab +ai +am +am +am +am +am +am +am +ai +ai +am +am +am +am +ai +ab +ab +ab +ai +am +ai +ai +ai +ai +ai +ai +ai +am +ai +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +cR +BT +cR +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +ab +ab +ad +ad +ad +ad +ad +ad +ad +ad +ab +aj +aj +"} +(51,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ai +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ai +ai +am +am +am +am +am +am +am +am +am +ai +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +cR +BT +cR +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ad +ad +ad +ad +ad +ad +ad +ab +aj +aj +"} +(52,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +aj +aj +ab +ab +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +cR +BT +cR +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ad +ad +ad +ad +ad +ad +ad +ab +aj +aj +"} +(53,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +aj +ab +ab +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +ab +bN +UQ +bN +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ad +ad +ai +ad +ab +ab +aj +aj +"} +(54,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +fJ +ab +ab +ab +ab +aj +aj +ab +bN +UQ +bN +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +aj +aj +aj +aj +"} +(55,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +jx +ad +ad +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +aj +ab +aj +aj +aj +aj +aj +ab +ab +bJ +gv +bN +ab +ab +aj +aj +aj +ab +bN +UQ +bN +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +aj +"} +(56,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ai +ai +ai +ai +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +aj +aj +aj +aj +aj +aj +ab +bN +eW +bN +ab +aj +aj +aj +aj +ab +bN +eB +bN +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +"} +(57,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ad +ai +ai +ai +ai +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +aj +aj +aj +aj +aj +aj +bN +bN +gw +bN +bN +ab +aj +aj +ab +bN +bN +eA +bN +bN +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +"} +(58,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ad +ai +ai +ai +ai +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ai +ai +aj +aj +aj +bq +bN +bP +cn +ct +bN +bq +bq +bq +bq +bN +ef +eD +ct +bN +bq +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(59,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ad +ad +ad +jq +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +ai +aj +aj +aj +ab +bq +bw +eW +cl +eW +cx +cD +cH +cn +du +dJ +xA +aN +eW +fb +bq +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +"} +(60,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +aj +ab +aj +aj +ab +ab +aj +ab +aj +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +aj +aj +aj +aj +ab +bN +bC +bQ +cm +cE +Uh +cE +cY +cE +Uh +cE +Uh +eC +eP +fd +bq +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(61,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +ai +aj +aj +aj +aj +ab +ab +bN +bT +bR +cI +cw +dy +cF +cI +VD +zu +VD +gd +eH +eW +fh +bN +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(62,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +ai +aj +aj +ai +ab +bf +bf +bf +LO +bS +bF +bf +cJ +bq +cN +dl +dv +dK +ei +eE +eV +fj +bN +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(63,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ai +ai +ab +bf +bp +bD +bE +cs +co +bf +cK +bq +bq +bN +bq +dV +el +eF +dV +bq +bq +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(64,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +bg +bs +bY +bY +bU +cp +bf +cL +bq +da +dm +dw +dL +ej +eG +ct +tK +bN +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(65,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +aj +ab +ab +aj +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +ai +aj +aj +ab +bg +bt +bY +bH +bV +aI +bf +bq +bq +cO +eW +eW +eW +xA +eI +eZ +fl +bq +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(66,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +aj +aj +ab +bf +bu +bG +bI +bX +eo +bf +ad +bq +cP +eW +dM +dW +AB +eJ +bq +eX +bq +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +"} +(67,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +aj +aj +ab +bf +bf +bf +bg +cj +bg +bf +ai +bq +dd +eW +dA +dN +ek +eK +dV +fm +bq +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +"} +(68,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +jb +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +aj +aj +ab +ab +ab +bf +bK +ck +cr +bf +ai +bq +cX +dn +bq +dV +en +dV +dV +fm +bq +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +"} +(69,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ai +aj +aj +ab +ab +bf +bW +cq +ew +bf +ai +bq +cZ +ds +dE +dO +em +dO +dO +fn +bq +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(70,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ai +ai +aj +aj +ab +bf +bg +dY +bg +bf +ai +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ab +ab +ab +aj +aj +aj +aj +ab +aj +aj +aj +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +"} +(71,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +bv +ab +gH +ab +bv +ai +ai +ab +ab +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +aj +aj +ab +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(72,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +ai +ai +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +"} +(73,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iw +ad +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +ab +aj +ab +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ai +ai +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +aj +aj +ab +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +"} +(74,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ai +ab +ai +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +aj +aj +ab +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +"} +(75,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ai +ai +ab +ab +ab +aj +ab +ab +ab +aj +aj +aj +ab +ab +ab +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +"} +(76,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ai +ab +ab +ab +ab +ab +ab +ai +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ai +ai +ai +ai +ai +ab +ab +aj +ab +ab +ab +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +"} +(77,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +ab +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +ai +ab +ab +ai +ab +ab +ab +ab +ai +ai +ab +ab +ab +ab +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ab +aj +ab +ab +ab +ab +ab +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +"} +(78,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +ai +ai +ai +ab +ab +ab +ab +ab +ai +ai +ab +ab +ab +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +ai +ai +ai +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +"} +(79,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ad +ad +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +ab +ab +ab +ab +ab +ab +ab +aj +ab +aj +aj +aj +aj +"} +(80,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ad +ai +ai +ai +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +"} +(81,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ad +ai +ai +ai +ad +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +"} +(82,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ai +ai +ai +ad +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +"} +(83,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ad +ad +ix +ab +aj +aj +aj +aj +aj +aj +aj +ab +aj +ab +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +ai +ai +ai +ab +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +"} +(84,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +am +am +am +ai +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +"} +(85,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +am +am +ai +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +"} +(86,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +aj +ab +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +am +ai +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +"} +(87,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ix +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +ab +ab +ab +ai +am +ai +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +"} +(88,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +jb +ab +ab +ab +ab +ab +ab +ab +aj +ab +aj +ab +ab +ab +aj +ab +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +ai +ai +am +ai +ai +ab +ai +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +"} +(89,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +aj +ab +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +am +am +am +am +am +am +ai +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +"} +(90,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +"} +(91,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +"} +(92,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iy +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(93,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +ai +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(94,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +"} +(95,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ix +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +"} +(96,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ai +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +ab +ab +"} +(97,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iy +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +ai +ab +ab +ai +ai +ab +ab +ab +ab +ab +ai +ab +ab +ab +ab +ab +ab +ai +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +"} +(98,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ai +ai +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +ai +ab +ab +ai +ab +ab +ab +ab +ab +ab +ai +ai +ab +ab +ab +ab +ab +ab +ai +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +"} +(99,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ai +ai +ad +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +ai +ab +ab +ai +ab +ab +ab +ab +ab +ab +ai +am +ai +ai +ai +ai +ab +ab +ai +ai +ai +am +am +ai +ai +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +"} +(100,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ad +ai +ai +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ai +ab +ab +ai +am +am +am +am +am +ai +ab +ab +ab +ab +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +"} +(101,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ad +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +aj +ab +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ai +ai +ab +ai +am +am +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +"} +(102,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ai +am +ai +am +am +ai +cu +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +"} +(103,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ai +am +am +am +am +ai +cv +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +"} +(104,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ai +am +am +am +am +ai +ab +ab +ab +ab +ab +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +"} +(105,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +jb +jb +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ai +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ai +am +ai +ai +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +"} +(106,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ai +am +am +am +am +am +am +am +ai +ai +ab +ab +ai +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +"} +(107,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ai +ab +am +am +am +am +am +am +am +am +am +ai +ai +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +"} +(108,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +ai +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +"} +(109,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ix +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +"} +(110,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +"} +(111,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +"} +(112,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ix +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(113,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +ab +ab +ab +ab +"} +(114,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +ab +aj +aj +"} +(115,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ad +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +"} +(116,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +it +ab +ab +ab +ab +ad +ai +ai +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +ab +aj +aj +"} +(117,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ad +ad +ai +ai +ad +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +"} +(118,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +it +ky +ad +ai +ai +ad +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +"} +(119,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ad +ai +ai +jq +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +"} +(120,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +kN +aj +aj +aj +aj +aj +aj +mD +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ai +ai +ab +ab +ab +ab +ab +ab +aj +ab +ab +aj +aj +aj +aj +"} +(121,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ae +jg +gB +gB +js +ab +ab +ab +ab +aj +aj +mu +aj +aj +aj +ab +mA +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ai +ab +ab +ab +ab +aj +aj +ab +aj +aj +aj +aj +"} +(122,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iC +gr +gs +gr +gr +kR +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +jQ +ak +ak +ak +ak +al +iy +ab +ab +mK +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +"} +(123,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +gR +ag +jF +gM +kB +jm +ix +ab +jS +aj +aj +aj +aj +lI +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ab +ab +jx +ab +ab +mM +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +ab +ab +aj +aj +ab +aj +aj +aj +aj +"} +(124,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +gG +go +kg +hs +gr +hH +ab +ab +aj +ly +aj +aj +aj +lw +aj +aj +ls +aj +aj +jx +jS +iy +al +ak +al +jq +ab +kN +ab +ab +jx +ab +ab +mN +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +ai +ab +aj +aj +ab +aj +aj +ab +ab +aj +aj +aj +"} +(125,1,1) = {" +aa +aa +aa +mS +mV +mq +mV +nc +aa +aa +fV +fV +gr +jH +gO +kD +ag +le +aa +aa +ls +aj +aj +aj +aj +aj +aj +aj +aj +aj +lI +aa +aa +jS +ab +ab +ja +ab +jx +ab +jq +ab +kN +ab +ab +ab +mO +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +am +aj +aj +aj +aj +aj +aj +aj +ab +aj +aj +aj +"} +(126,1,1) = {" +aa +aa +fV +gj +gC +mr +nb +ne +aa +aa +fV +fV +jk +gr +gr +gr +gr +gs +aa +lp +lp +lz +lp +lF +lp +lP +lS +lp +lZ +lS +lS +lp +aa +mE +ab +ab +ab +ab +kN +ab +ab +ab +ab +ab +jS +ab +ab +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +"} +(127,1,1) = {" +mQ +mQ +fW +mQ +mW +hg +ac +nf +ac +ac +ac +af +lg +fT +kj +fT +fT +lg +gP +lq +lu +lq +lD +lG +lu +lQ +lu +lW +ma +lq +mk +mn +kR +mF +ab +mG +ab +ja +ab +jx +ab +ab +kN +ab +ab +jq +jR +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +am +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(128,1,1) = {" +aa +aa +fV +gk +mX +mZ +nc +ng +aa +aa +fV +fV +jl +gr +ah +gG +gs +gy +aa +lr +lv +lv +lE +lv +lE +lR +lv +lv +mb +lR +ml +lR +aa +it +ab +ab +jx +jR +ab +ab +ab +mL +al +iY +ab +ab +jQ +ab +jx +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +am +am +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(129,1,1) = {" +aa +aa +aa +mS +mY +ms +hJ +id +aa +aa +fV +fV +jm +jL +gM +kH +gr +hH +aa +aa +lw +aj +aj +aj +lI +aj +aj +aj +aj +lw +aj +aa +aa +jq +ab +ab +ab +jQ +ab +mI +ab +ab +al +al +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +am +fR +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(130,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +gr +go +kl +hs +gG +lj +ab +ab +aj +aj +mv +my +lw +aj +aj +aj +lI +aj +aj +kN +jq +jS +jx +jS +ab +ab +ab +ab +ab +ab +jR +ak +jS +kN +ab +ab +jR +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +am +am +fS +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +"} +(131,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +gR +ah +jN +gO +kJ +gr +it +ab +ab +aj +aj +aj +ab +jQ +aj +jx +ab +ly +aj +aj +ab +ab +ak +al +ja +ab +mH +ab +ab +mJ +al +ak +ak +al +ab +ab +mP +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +fS +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(132,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +gR +gr +gr +gr +jm +gP +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +mB +aj +aj +aj +ab +ja +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +am +fS +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(133,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ae +gr +jm +ko +iu +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +iy +aj +aj +aj +kN +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +am +am +fS +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +"} +(134,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +jq +ab +ab +ab +ab +ab +kN +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +am +am +am +am +am +fS +aj +ab +aj +ab +aj +aj +aj +aj +aj +aj +"} +(135,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +jR +mt +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(136,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +jq +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +mC +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(137,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iK +ab +jQ +jq +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(138,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(139,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(140,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +lI +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(141,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +iy +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(142,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(143,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(144,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +jq +ab +ab +ab +ab +ab +ab +ab +aj +aj +mw +ab +lI +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(145,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iy +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +mx +ab +ab +mx +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(146,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(147,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +ab +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(148,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +jR +ad +ab +ab +ll +ab +ab +aj +aj +aj +ab +ab +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(149,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(150,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +aj +aj +aj +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(151,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ix +ab +ab +ab +ad +ad +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(152,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ad +ad +ad +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(153,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(154,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +jS +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(155,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(156,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(157,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iy +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(158,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(159,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(160,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(161,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iy +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(162,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(163,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(164,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +ab +ab +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(165,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(166,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +jS +ad +ad +ab +ab +aj +aj +aj +aj +ab +ab +ab +aj +ab +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(167,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ai +ai +ai +ai +ab +aj +aj +aj +ab +ab +ab +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +ab +aj +ab +aj +aj +aj +aj +aj +aj +"} +(168,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +kM +ai +ai +ai +ai +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +fQ +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(169,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ad +ai +ai +ai +ai +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +fQ +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +"} +(170,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ad +ad +ai +ai +ai +ai +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(171,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ad +ai +ai +ai +ai +ad +ad +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +"} +(172,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ad +ai +ai +ai +ai +ad +ad +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +aj +"} +(173,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +it +ab +ab +ab +ad +ai +ai +ai +ai +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(174,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ad +ai +ai +ai +ai +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(175,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ab +ab +kN +ai +ai +ai +ai +jq +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(176,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +it +ab +ai +ai +ai +ai +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(177,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ad +ad +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(178,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(179,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(180,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iy +ab +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(181,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(182,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(183,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(184,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ad +ai +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(185,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ai +jS +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(186,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ai +ad +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(187,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ai +ad +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(188,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ai +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(189,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +iy +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(190,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iy +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +ab +aj +aj +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(191,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(192,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(193,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(194,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(195,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(196,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(197,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(198,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +iy +ab +ad +ad +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(199,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +iy +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(200,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(201,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(202,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(203,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +iy +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(204,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(205,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(206,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +it +ab +ab +ab +ab +ab +ab +ab +ai +ai +ab +ab +ab +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(207,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ad +ai +ai +ab +ab +ab +aj +ab +aj +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(208,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ai +ai +ad +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(209,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ad +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(210,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(211,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(212,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(213,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(214,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +fQ +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(215,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(216,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(217,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(218,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +js +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(219,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(220,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ai +ai +ai +ai +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +aj +aj +aj +aj +aj +aj +aj +aj +"} +(221,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ai +ai +ai +ai +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +aj +aj +aj +aj +aj +aj +aj +aj +"} +(222,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ai +ai +ai +ai +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +aj +aj +aj +aj +aj +aj +aj +aj +"} +(223,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ai +ai +ai +ai +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(224,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ai +ai +ai +ai +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(225,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +gP +ai +ai +ai +ai +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(226,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ai +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +al +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(227,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ai +ai +ai +ai +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +ab +ab +ab +al +al +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(228,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +al +al +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(229,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +fQ +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(230,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +fQ +fQ +fQ +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(231,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +fQ +fQ +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(232,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(233,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(234,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(235,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(236,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(237,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +gP +js +ab +ad +ad +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(238,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(239,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +ab +ab +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(240,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +aj +ab +aj +ab +ab +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(241,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(242,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(243,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(244,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(245,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(246,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(247,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(248,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(249,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad +ad +ad +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(250,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ab +ab +ad +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(251,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +al +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(252,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(253,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad +js +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(254,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +js +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(255,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} diff --git a/_maps/map_files/generic/z5.dmm b/_maps/map_files/generic/z5.dmm index af8d04699dc..99e23f4c9d4 100644 --- a/_maps/map_files/generic/z5.dmm +++ b/_maps/map_files/generic/z5.dmm @@ -4,7 +4,7 @@ /area/space) "ab" = ( /turf/simulated/mineral, -/area/mine/dangerous/unexplored) +/area/mine/unexplored) "ac" = ( /obj/docking_port/stationary{ dheight = 9; @@ -18,11 +18,11 @@ /turf/space, /area/space) "ad" = ( -/turf/simulated/floor/plating/airless/asteroid/cave, -/area/mine/dangerous/unexplored) +/turf/simulated/floor/plating/asteroid/airless/cave, +/area/mine/unexplored) "ae" = ( /turf/simulated/mineral/random, -/area/mine/dangerous/unexplored) +/area/mine/unexplored) "af" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -39,7 +39,7 @@ "ag" = ( /obj/spacepod/random, /turf/space, -/area/space) +/area/space/nearstation) "ah" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -57,10 +57,10 @@ "aj" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ak" = ( /turf/simulated/mineral/random/high_chance, -/area/mine/dangerous/unexplored) +/area/mine/unexplored) "al" = ( /obj/structure/window/reinforced{ dir = 4 @@ -104,7 +104,7 @@ icon_state = "pwall"; dir = 1 }, -/area/space) +/area/mine/abandoned) "ar" = ( /turf/simulated/floor/plating/airless, /turf/simulated/shuttle/wall{ @@ -143,7 +143,7 @@ tag = "icon-floor2"; icon_state = "floor2" }, -/area/space) +/area/mine/abandoned) "aw" = ( /obj/structure/shuttle/engine/propulsion{ dir = 8; @@ -156,7 +156,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/mine/abandoned) "ax" = ( /obj/machinery/door/airlock/hatch, /turf/simulated/shuttle/floor{ @@ -172,7 +172,7 @@ tag = "icon-floor2"; icon_state = "floor2" }, -/area/space) +/area/mine/abandoned) "az" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -223,7 +223,7 @@ icon_state = "pwall"; dir = 5 }, -/area/space) +/area/mine/abandoned) "aH" = ( /obj/structure/alien/weeds, /turf/simulated/floor/plating/airless{ @@ -236,7 +236,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "aJ" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -252,7 +252,7 @@ icon_state = "pwall"; dir = 6 }, -/area/space) +/area/mine/abandoned) "aL" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -260,7 +260,7 @@ icon_state = "pwall"; dir = 9 }, -/area/space) +/area/mine/abandoned) "aM" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -305,7 +305,7 @@ /obj/item/stack/rods, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "aS" = ( /obj/item/shard, /obj/item/stack/rods, @@ -411,7 +411,7 @@ /obj/item/shard, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bj" = ( /obj/machinery/power/terminal{ dir = 4 @@ -660,7 +660,7 @@ /turf/simulated/floor/plasteel/airless, /area/mine/abandoned) "bV" = ( -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/mine/dangerous/explored) "bW" = ( /obj/structure/alien/weeds{ @@ -748,7 +748,7 @@ /obj/machinery/camera{ c_tag = "North Outpost"; dir = 8; - network = list("MINE") + network = list("Mining Outpost") }, /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plasteel, @@ -981,7 +981,7 @@ /area/mine/dangerous/explored) "cL" = ( /obj/structure/ore_box, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/mine/dangerous/explored) "cM" = ( /obj/effect/decal/remains/xeno, @@ -1121,7 +1121,7 @@ /area/mine/north_outpost) "dh" = ( /obj/structure/glowshroom, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/mine/dangerous/explored) "di" = ( /obj/structure/alien/resin/wall, @@ -1237,7 +1237,7 @@ "ds" = ( /obj/item/reagent_containers/food/snacks/grown/mushroom/libertycap, /obj/structure/glowshroom, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/mine/dangerous/explored) "dt" = ( /obj/effect/decal/warning_stripes/north, @@ -1286,8 +1286,8 @@ /turf/space, /area/mine/north_outpost) "dy" = ( -/turf/simulated/floor/plating/airless/asteroid, -/area/mine/dangerous/unexplored) +/turf/simulated/floor/plating/asteroid/airless, +/area/mine/unexplored) "dz" = ( /obj/machinery/atmospherics/pipe/manifold4w/hidden, /turf/simulated/floor/plasteel{ @@ -1564,13 +1564,13 @@ /area/mine/abandoned) "eg" = ( /turf/simulated/mineral/random/labormineral, -/area/space) +/area/space/nearstation) "eh" = ( /turf/simulated/wall/r_wall, /area/mine/dangerous/explored) "ei" = ( /turf/simulated/mineral/random, -/area/space) +/area/space/nearstation) "ej" = ( /obj/structure/girder/displaced, /turf/simulated/floor/plating/airless{ @@ -1595,7 +1595,7 @@ /area/mine/abandoned) "em" = ( /turf/simulated/mineral/random/labormineral, -/area/mine/dangerous/unexplored) +/area/mine/unexplored) "en" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating/airless{ @@ -1612,21 +1612,11 @@ /obj/item/clothing/glasses/meson, /obj/item/flashlight, /obj/item/storage/bag/ore, -/obj/item/shovel{ - attack_verb = list("ineffectively hit"); - desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."; - force = 1; - name = "safety shovel"; - pixel_x = -5; - throwforce = 1 +/obj/item/shovel/safety{ + pixel_x = -5 }, -/obj/item/pickaxe{ - attack_verb = list("ineffectively hit"); - desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."; - force = 1; - name = "safety pickaxe"; - pixel_x = 5; - throwforce = 1 +/obj/item/pickaxe/safety{ + pixel_x = 5 }, /obj/item/radio/intercom/locked/prison{ pixel_y = 25 @@ -1642,21 +1632,11 @@ /obj/item/clothing/glasses/meson, /obj/item/flashlight, /obj/item/storage/bag/ore, -/obj/item/shovel{ - attack_verb = list("ineffectively hit"); - desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."; - force = 1; - name = "safety shovel"; - pixel_x = -5; - throwforce = 1 +/obj/item/shovel/safety{ + pixel_x = -5 }, -/obj/item/pickaxe{ - attack_verb = list("ineffectively hit"); - desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."; - force = 1; - name = "safety pickaxe"; - pixel_x = 5; - throwforce = 1 +/obj/item/pickaxe/safety{ + pixel_x = 5 }, /turf/simulated/floor/plasteel{ icon_state = "floorgrime" @@ -1669,21 +1649,11 @@ /obj/item/clothing/glasses/meson, /obj/item/flashlight, /obj/item/storage/bag/ore, -/obj/item/shovel{ - attack_verb = list("ineffectively hit"); - desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."; - force = 1; - name = "safety shovel"; - pixel_x = -5; - throwforce = 1 +/obj/item/shovel/safety{ + pixel_x = -5 }, -/obj/item/pickaxe{ - attack_verb = list("ineffectively hit"); - desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."; - force = 1; - name = "safety pickaxe"; - pixel_x = 5; - throwforce = 1 +/obj/item/pickaxe/safety{ + pixel_x = 5 }, /obj/machinery/status_display{ density = 0; @@ -1702,26 +1672,16 @@ /obj/item/clothing/glasses/meson, /obj/item/flashlight, /obj/item/storage/bag/ore, -/obj/item/shovel{ - attack_verb = list("ineffectively hit"); - desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."; - force = 1; - name = "safety shovel"; - pixel_x = -5; - throwforce = 1 +/obj/item/shovel/safety{ + pixel_x = -5 }, -/obj/item/pickaxe{ - attack_verb = list("ineffectively hit"); - desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."; - force = 1; - name = "safety pickaxe"; - pixel_x = 5; - throwforce = 1 +/obj/item/pickaxe/safety{ + pixel_x = 5 }, /obj/machinery/camera{ c_tag = "Labor Camp Storage"; dir = 8; - network = list("Labor") + network = list("Labor Camp") }, /turf/simulated/floor/plasteel{ icon_state = "floorgrime" @@ -1749,7 +1709,7 @@ /obj/machinery/camera{ c_tag = "Labor Camp Medical"; dir = 8; - network = list("Labor") + network = list("Labor Camp") }, /obj/structure/bed, /obj/item/bedsheet/medical, @@ -1795,7 +1755,7 @@ /area/mine/laborcamp) "eB" = ( /turf/simulated/wall, -/area/mine/dangerous/unexplored) +/area/mine/unexplored) "eC" = ( /obj/machinery/atmospherics/unary/vent_pump{ on = 1 @@ -1975,7 +1935,7 @@ /turf/simulated/floor/plating/airless{ icon_state = "asteroidplating" }, -/area/mine/dangerous/unexplored) +/area/mine/unexplored) "eX" = ( /obj/item/shard{ icon_state = "medium" @@ -2175,21 +2135,21 @@ icon_state = "asteroidwarning"; dir = 10 }, -/area/mine/dangerous/unexplored) +/area/mine/unexplored) "ft" = ( /turf/simulated/floor/plasteel/airless{ tag = "icon-asteroidwarning (SOUTHEAST)"; icon_state = "asteroidwarning"; dir = 6 }, -/area/mine/dangerous/unexplored) +/area/mine/unexplored) "fu" = ( /turf/simulated/floor/plasteel/airless{ tag = "icon-asteroidwarning"; icon_state = "asteroidwarning"; dir = 2 }, -/area/mine/dangerous/unexplored) +/area/mine/unexplored) "fv" = ( /obj/machinery/light/small{ dir = 4 @@ -2292,7 +2252,7 @@ "fF" = ( /obj/machinery/camera{ c_tag = "Labor Camp Central"; - network = list("Labor") + network = list("Labor Camp") }, /obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 8 @@ -2419,7 +2379,7 @@ /obj/machinery/camera{ c_tag = "Labor Camp External"; dir = 4; - network = list("Labor") + network = list("Labor Camp") }, /turf/simulated/floor/plasteel{ dir = 1; @@ -2494,7 +2454,7 @@ d2 = 4 }, /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "gb" = ( /obj/effect/spawner/window/reinforced, /obj/structure/cable{ @@ -2526,7 +2486,7 @@ icon_state = "0-8" }, /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "ge" = ( /obj/machinery/computer/shuttle/labor/one_way, /obj/structure/cable{ @@ -2586,7 +2546,7 @@ /obj/machinery/camera{ c_tag = "Labor Camp Security Hallway"; dir = 8; - network = list("Labor"); + network = list("Labor Camp"); pixel_x = 0; pixel_y = 0 }, @@ -2786,7 +2746,7 @@ /obj/machinery/camera{ c_tag = "Communications Relay"; dir = 8; - network = list("MINE") + network = list("Mining Outpost") }, /turf/simulated/floor/bluegrid, /area/mine/maintenance) @@ -3013,7 +2973,7 @@ "hj" = ( /obj/machinery/computer/security{ name = "Labor Camp Monitoring"; - network = list("Labor") + network = list("Labor Camp") }, /obj/structure/cable{ d1 = 1; @@ -3099,10 +3059,10 @@ /area/mine/west_outpost) "hu" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hv" = ( /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "hw" = ( /obj/machinery/computer/mech_bay_power_console, /obj/structure/window/reinforced{ @@ -3123,7 +3083,7 @@ /obj/machinery/light/small{ dir = 8 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/mine/west_outpost) "hA" = ( /obj/machinery/computer/arcade, @@ -3133,7 +3093,7 @@ /area/mine/living_quarters) "hB" = ( /turf/space, -/area/mine/dangerous/unexplored) +/area/mine/unexplored) "hC" = ( /obj/structure/lattice, /turf/space, @@ -3497,7 +3457,7 @@ /obj/machinery/camera{ c_tag = "Crew Area"; dir = 1; - network = list("MINE") + network = list("Mining Outpost") }, /turf/simulated/floor/plasteel{ icon_state = "bar" @@ -3539,7 +3499,7 @@ "iz" = ( /obj/structure/disposalpipe/segment, /turf/simulated/mineral/random, -/area/mine/dangerous/unexplored) +/area/mine/unexplored) "iA" = ( /obj/machinery/light/small{ dir = 4 @@ -3559,7 +3519,7 @@ /obj/machinery/camera{ c_tag = "Storage Room"; dir = 1; - network = list("MINE") + network = list("Mining Outpost") }, /turf/simulated/floor/plasteel, /area/mine/living_quarters) @@ -3861,7 +3821,7 @@ /obj/machinery/camera{ c_tag = "West Outpost"; dir = 1; - network = list("MINE") + network = list("Mining Outpost") }, /turf/simulated/floor/plasteel, /area/mine/west_outpost) @@ -3960,7 +3920,7 @@ "js" = ( /obj/machinery/camera{ c_tag = "Crew Area Hallway"; - network = list("MINE") + network = list("Mining Outpost") }, /obj/structure/extinguisher_cabinet{ pixel_x = -5; @@ -4071,7 +4031,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/camera{ c_tag = "Labor Camp Monitoring"; - network = list("Labor") + network = list("Labor Camp") }, /obj/machinery/light_switch{ pixel_y = 28 @@ -4315,15 +4275,9 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel, /area/mine/eva) -"kh" = ( -/turf/simulated/floor/plating/airless{ - icon_state = "asteroidwarning"; - dir = 5 - }, -/area/space) "ki" = ( /obj/machinery/light, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/mine/dangerous/explored) "kj" = ( /obj/structure/disposalpipe/segment{ @@ -4421,21 +4375,21 @@ /area/mine/living_quarters) "ku" = ( /obj/structure/disposalpipe/segment, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/mine/dangerous/explored) "kv" = ( /obj/structure/disposalpipe/segment{ dir = 2; icon_state = "pipe-c" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/mine/dangerous/explored) "kw" = ( /obj/structure/disposalpipe/segment{ dir = 1; icon_state = "pipe-c" }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/mine/dangerous/explored) "kx" = ( /obj/machinery/access_button{ @@ -4598,7 +4552,7 @@ icon_state = "asteroidwarning"; dir = 4 }, -/area/space) +/area/mine/dangerous/explored) "kR" = ( /obj/machinery/door/airlock/external{ frequency = 1379; @@ -4773,8 +4727,8 @@ /turf/simulated/floor/plasteel, /area/mine/living_quarters) "ll" = ( -/turf/simulated/floor/plating/airless/asteroid, -/area/space) +/turf/simulated/floor/plating/asteroid/airless, +/area/space/nearstation) "lm" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/door/firedoor, @@ -5341,7 +5295,7 @@ /obj/machinery/light{ dir = 1 }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/mine/living_quarters) "mv" = ( /obj/effect/decal/warning_stripes/northeast, @@ -5368,12 +5322,6 @@ }, /turf/simulated/floor/plasteel, /area/mine/eva) -"mx" = ( -/turf/simulated/floor/plating/airless{ - icon_state = "asteroidwarning"; - dir = 6 - }, -/area/space) "my" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden, @@ -5489,7 +5437,7 @@ /obj/effect/decal/remains/human{ desc = "Seems to be all that remains of a poor miner that didn't heed the warning signs." }, -/turf/simulated/floor/plating/airless/asteroid, +/turf/simulated/floor/plating/asteroid/airless, /area/mine/dangerous/explored) "mK" = ( /obj/structure/table/reinforced, @@ -6702,7 +6650,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "pj" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/decal/warning_stripes/blue/hollow, @@ -52246,11 +52194,11 @@ bV bV bV bV -ll -kh +bV +dP kQ -mx -ll +dK +bV mQ nj nj @@ -52503,11 +52451,11 @@ bV bV bV bV -ll -ll -ll -ll -ll +bV +bV +bV +bV +bV bV bV bV diff --git a/_maps/map_files/shuttles/admin_admin.dmm b/_maps/map_files/shuttles/admin_admin.dmm new file mode 100644 index 00000000000..bad43283b9b --- /dev/null +++ b/_maps/map_files/shuttles/admin_admin.dmm @@ -0,0 +1,1098 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/space, +/area/space) +"ab" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + dir = 8; + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"ac" = ( +/turf/simulated/shuttle/wall{ + icon_state = "wall3" + }, +/area/shuttle/administration) +"ad" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "101" + }, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ae" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "101" + }, +/obj/docking_port/mobile{ + dir = 2; + dwidth = 8; + height = 15; + id = "admin"; + name = "admin"; + roundstart_move = null; + timid = 1; + width = 18 + }, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"af" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + dir = 1; + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"ag" = ( +/obj/machinery/vending/boozeomat, +/turf/simulated/shuttle/wall{ + icon_state = "wall3" + }, +/area/shuttle/administration) +"ah" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/beer, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ai" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/drinkingglasses, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aj" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/soda, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ak" = ( +/turf/simulated/shuttle/wall{ + dir = 4; + icon_state = "wall3" + }, +/area/shuttle/administration) +"al" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"am" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"an" = ( +/obj/machinery/cell_charger, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ao" = ( +/obj/item/storage/toolbox/mechanical, +/obj/item/multitool, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ap" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aq" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ar" = ( +/obj/machinery/door/poddoor/preopen{ + id_tag = "adminshuttleblast"; + name = "Blast Doors"; + req_access_txt = "101" + }, +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "General Access"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"as" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"at" = ( +/obj/item/stack/sheet/metal, +/obj/structure/table, +/obj/item/stack/sheet/glass{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"au" = ( +/obj/machinery/mecha_part_fabricator/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"av" = ( +/obj/machinery/kitchen_machine/microwave/upgraded, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aw" = ( +/obj/machinery/door/window/northright{ + name = "bar" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ax" = ( +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ay" = ( +/obj/item/ashtray/glass, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"az" = ( +/obj/item/storage/fancy/cigarettes/dromedaryco, +/obj/item/lighter/zippo{ + pixel_x = 5 + }, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aA" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aB" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Workshop"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aC" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_l"; + tag = "icon-propulsion_l (EAST)" + }, +/turf/simulated/shuttle/plating, +/area/shuttle/administration) +"aD" = ( +/obj/structure/shuttle/engine/heater{ + tag = "icon-heater (WEST)"; + icon_state = "heater"; + dir = 8 + }, +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 4 + }, +/turf/simulated/shuttle/plating, +/area/shuttle/administration) +"aE" = ( +/obj/structure/chair/stool/bar, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aF" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aG" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aH" = ( +/obj/machinery/recharge_station/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aI" = ( +/obj/machinery/autolathe/upgraded{ + hacked = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aJ" = ( +/obj/structure/dispenser, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aK" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_r"; + tag = "icon-propulsion_r (EAST)" + }, +/turf/simulated/shuttle/plating, +/area/shuttle/administration) +"aL" = ( +/obj/machinery/door/airlock/public/glass, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aM" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + dir = 4; + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"aN" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"aO" = ( +/obj/machinery/vending/snack, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aP" = ( +/obj/machinery/vending/cola, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aQ" = ( +/obj/machinery/vending/coffee, +/obj/machinery/light/spot, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aR" = ( +/obj/machinery/vending/cigarette, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aS" = ( +/obj/machinery/computer/card, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aT" = ( +/obj/machinery/computer/communications, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aU" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "adminshuttleshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_end (WEST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/shuttle/administration) +"aV" = ( +/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 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aW" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aX" = ( +/obj/machinery/computer/shuttle/admin{ + name = "NTV Argos shuttle console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aY" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "adminshuttleshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + dir = 4; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + tag = "icon-window5 (EAST)" + }, +/turf/simulated/floor/plating, +/area/shuttle/administration) +"aZ" = ( +/obj/machinery/dna_scannernew/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ba" = ( +/obj/machinery/computer/cloning, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bb" = ( +/obj/machinery/clonepod/upgraded, +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bc" = ( +/obj/machinery/computer/scan_consolenew, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bd" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Bridge"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"be" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/admin{ + name = "NTV Argos shuttle navigation computer" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bf" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "adminshuttleshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_end (EAST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 4 + }, +/turf/simulated/floor/plating, +/area/shuttle/administration) +"bg" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bh" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Medbay"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bi" = ( +/obj/machinery/bodyscanner, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bj" = ( +/obj/machinery/body_scanconsole, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bk" = ( +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bl" = ( +/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) +"bm" = ( +/obj/machinery/sleeper/upgraded{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bn" = ( +/obj/machinery/chem_master, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bo" = ( +/obj/machinery/chem_dispenser, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bp" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Holding Cell"; + opacity = 1; + req_access_txt = "104" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bq" = ( +/obj/machinery/door/window/brigdoor/westleft{ + color = "#d70000"; + req_access_txt = "104" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"br" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bs" = ( +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bt" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bu" = ( +/obj/structure/table, +/obj/item/storage/box/handcuffs, +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bv" = ( +/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) +"bw" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bx" = ( +/obj/structure/table, +/obj/item/bonegel, +/obj/item/bonesetter, +/obj/item/hemostat, +/obj/item/cautery, +/obj/item/surgicaldrill, +/obj/item/circular_saw, +/obj/item/scalpel, +/obj/item/retractor, +/obj/item/FixOVein, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"by" = ( +/obj/machinery/optable, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bz" = ( +/obj/machinery/vending/medical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bA" = ( +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bB" = ( +/obj/structure/table, +/obj/item/storage/lockbox/mindshield, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bC" = ( +/obj/structure/table, +/obj/item/storage/box/chemimp{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/storage/box/trackimp, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) + +(1,1,1) = {" +aa +aa +aa +ab +aC +aK +aN +aa +ab +aC +aK +aN +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +ab +ac +aD +aD +ac +ac +ac +aD +aD +ac +aN +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +ab +ac +av +am +am +aO +ac +aZ +bg +bg +bm +ac +aN +aa +aa +aa +aa +"} +(4,1,1) = {" +ab +ag +am +aw +am +am +aP +ac +ba +bg +bg +bg +bs +ac +aN +aa +aa +aa +"} +(5,1,1) = {" +ac +ah +am +ax +aE +am +aQ +ac +bb +bg +bg +bg +bg +bx +ac +aa +aa +aa +"} +(6,1,1) = {" +ac +ai +am +ay +aE +am +aR +ac +aZ +bg +bi +bn +bg +by +ac +aa +aa +aa +"} +(7,1,1) = {" +ac +aj +aq +az +aE +am +am +ac +bc +bg +bj +bo +bt +bz +ac +aa +aa +aa +"} +(8,1,1) = {" +ac +ak +ak +ak +ak +aL +ak +ak +ak +bh +ak +ak +ak +ak +ac +aa +aa +aa +"} +(9,1,1) = {" +ad +al +ar +aA +am +am +am +as +am +am +am +am +am +am +ac +aa +aa +aa +"} +(10,1,1) = {" +ae +am +ar +am +am +am +am +am +am +am +am +am +am +bA +ac +aa +aa +aa +"} +(11,1,1) = {" +ac +ak +ak +aB +ak +ak +ak +bd +ak +ak +ak +bp +ak +ak +ac +aa +aa +aa +"} +(12,1,1) = {" +ac +an +as +am +aF +ac +aS +am +am +ac +am +am +bu +bB +ac +aa +aa +aa +"} +(13,1,1) = {" +ac +ao +am +am +aG +ac +aV +aW +aW +ac +am +am +am +bC +ac +aa +aa +aa +"} +(14,1,1) = {" +ac +ap +am +am +aH +ac +aT +aX +be +ac +am +am +am +am +ac +aa +aa +aa +"} +(15,1,1) = {" +af +ac +at +am +am +ac +aU +aY +bf +ac +bk +bq +bv +ac +aM +aa +aa +aa +"} +(16,1,1) = {" +aa +ac +au +am +aI +ac +aa +aa +aa +ac +am +am +bw +ac +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +af +ac +aq +aJ +ac +aa +aa +aa +ac +bl +br +ac +aM +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +af +ak +ak +aM +aa +aa +aa +af +ak +ak +aM +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/map_files/shuttles/admin_hospital.dmm b/_maps/map_files/shuttles/admin_hospital.dmm new file mode 100644 index 00000000000..c9a41d69463 --- /dev/null +++ b/_maps/map_files/shuttles/admin_hospital.dmm @@ -0,0 +1,1679 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/space, +/area/space) +"ab" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s6"; + dir = 2 + }, +/area/shuttle/administration) +"ac" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/administration) +"ad" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 2 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"ae" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_mid"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + dir = 2 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"af" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (NORTH)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 1 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"ag" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall14"; + dir = 2 + }, +/area/shuttle/administration) +"ah" = ( +/obj/structure/sign/redcross{ + desc = "The Star of Life, a symbol of Medical Aid."; + icon_state = "lifestar"; + name = "NHV Asclepius" + }, +/turf/simulated/shuttle/wall{ + dir = 2; + icon_state = "swall8"; + tag = "icon-swall12" + }, +/area/shuttle/administration) +"ai" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "asclblast"; + name = "Blast Door"; + opacity = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aj" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external, +/obj/docking_port/mobile{ + dir = 2; + dwidth = 9; + height = 18; + id = "admin"; + name = "hospital"; + roundstart_move = "cc_bay_1"; + timid = 1; + width = 19 + }, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "asclblast"; + name = "Blast Door"; + opacity = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ak" = ( +/obj/structure/sign/redcross{ + desc = "The Star of Life, a symbol of Medical Aid."; + icon_state = "lifestar"; + name = "NHV Asclepius" + }, +/turf/simulated/shuttle/wall{ + tag = "icon-swall14"; + icon_state = "swall4"; + dir = 2 + }, +/area/shuttle/administration) +"al" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_mid"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + dir = 2 + }, +/turf/space, +/area/shuttle/administration) +"am" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_end (NORTH)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 1 + }, +/turf/space, +/area/shuttle/administration) +"an" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s10"; + dir = 2 + }, +/area/shuttle/administration) +"ao" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall3"; + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"ap" = ( +/obj/machinery/chem_master, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aq" = ( +/obj/machinery/chem_dispenser, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ar" = ( +/obj/machinery/chem_heater, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"as" = ( +/obj/structure/closet/secure_closet/reagents, +/obj/item/storage/bag/chemistry, +/obj/item/storage/bag/chemistry, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"at" = ( +/obj/structure/closet/secure_closet/chemical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"au" = ( +/obj/structure/sign/chemistry{ + pixel_y = 1 + }, +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"av" = ( +/obj/structure/chair{ + tag = "icon-chair (EAST)"; + icon_state = "chair"; + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aw" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ax" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/camera{ + dir = 8; + icon_state = "camera"; + name = "NHV Asclepius Lobby"; + network = list("NHV Asclepius") + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ay" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"az" = ( +/obj/machinery/clonepod{ + biomass = 300 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aA" = ( +/obj/machinery/computer/cloning, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aB" = ( +/obj/machinery/dna_scannernew, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aC" = ( +/obj/machinery/atmospherics/unary/cryo_cell, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aD" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall7"; + dir = 2 + }, +/area/shuttle/administration) +"aE" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"aF" = ( +/obj/structure/reagent_dispensers/fueltank/chem{ + pixel_x = -32 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aG" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aH" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/westleft{ + req_access_txt = "33" + }, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aI" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aJ" = ( +/obj/structure/sign/nosmoking_2, +/turf/simulated/shuttle/wall{ + tag = "icon-swall1"; + icon_state = "swall1"; + dir = 2 + }, +/area/shuttle/administration) +"aK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aL" = ( +/obj/structure/shuttle/engine/heater{ + icon_state = "heater"; + dir = 4 + }, +/obj/structure/window/plasmareinforced{ + dir = 8 + }, +/turf/simulated/shuttle/plating, +/area/shuttle/administration) +"aM" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4; + icon_state = "propulsion" + }, +/turf/simulated/shuttle/plating, +/area/shuttle/administration) +"aN" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/spray/cleaner{ + desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; + name = "Chemistry Cleaner" + }, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aO" = ( +/obj/structure/closet/crate/can, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aP" = ( +/obj/structure/shuttle/window, +/obj/structure/grille, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aQ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aR" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aS" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/syringes, +/obj/item/storage/box/beakers, +/obj/machinery/reagentgrinder, +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius Chemistry"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aT" = ( +/obj/machinery/door/airlock/shuttle/glass{ + name = "Chemistry"; + req_access_txt = "33" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aU" = ( +/obj/machinery/door/airlock/shuttle/glass, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aV" = ( +/obj/machinery/camera{ + dir = 8; + icon_state = "camera"; + name = "NHV Asclepius Cloning"; + network = list("NHV Asclepius") + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aW" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s9"; + dir = 2 + }, +/area/shuttle/administration) +"aX" = ( +/obj/machinery/iv_drip, +/obj/item/reagent_containers/iv_bag, +/obj/structure/reagent_dispensers/fueltank/chem{ + pixel_x = -32 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aY" = ( +/obj/structure/chair/comfy/shuttle, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ba" = ( +/obj/machinery/chem_heater, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bb" = ( +/obj/machinery/status_display, +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"bc" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bd" = ( +/obj/machinery/vending/coffee, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"be" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/storage/box/gloves, +/obj/item/storage/box/masks, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bf" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bg" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid, +/obj/item/storage/firstaid, +/obj/item/storage/firstaid/adv, +/obj/item/storage/firstaid/adv, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bh" = ( +/obj/structure/table/reinforced, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bi" = ( +/obj/machinery/atmospherics/unary/cold_sink/freezer{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bj" = ( +/obj/machinery/smartfridge/medbay, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bk" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall13"; + icon_state = "swall13"; + dir = 2 + }, +/area/shuttle/administration) +"bl" = ( +/obj/structure/shuttle/window, +/obj/structure/grille, +/turf/simulated/shuttle/wall{ + dir = 2; + icon_state = "swall8"; + tag = "icon-swall12" + }, +/area/shuttle/administration) +"bm" = ( +/obj/structure/shuttle/window, +/obj/structure/grille, +/turf/simulated/shuttle/wall{ + tag = "icon-swall14"; + icon_state = "swall4"; + dir = 2 + }, +/area/shuttle/administration) +"bn" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall15"; + icon_state = "swall15"; + dir = 2 + }, +/area/shuttle/administration) +"bo" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (WEST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 8 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 8; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"bp" = ( +/obj/machinery/computer/pandemic, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bq" = ( +/obj/machinery/camera{ + c_tag = "Tech Storage"; + dir = 2; + name = "NHV Asclepius Command Center"; + network = list("NHV Asclepius") + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/door_control{ + dir = 4; + id = "Asclshutters"; + name = "remote shutter control"; + pixel_x = -5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/machinery/keycard_auth{ + pixel_y = 24 + }, +/obj/machinery/door_control{ + dir = 2; + id = "asclblast"; + name = "blast door control"; + pixel_x = 5; + pixel_y = 35; + pixel_z = 0; + req_access = list(101); + req_access_txt = "0" + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"br" = ( +/obj/machinery/recharger/wallcharger{ + pixel_y = 25 + }, +/obj/machinery/recharger/wallcharger{ + pixel_y = 35 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bs" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall1"; + icon_state = "swall1"; + dir = 2 + }, +/area/shuttle/administration) +"bt" = ( +/obj/structure/sink{ + icon_state = "sink"; + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bu" = ( +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/structure/closet/walllocker/emerglocker{ + pixel_y = 32 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bv" = ( +/obj/machinery/vending/medical, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bw" = ( +/obj/structure/table/tray, +/obj/item/stack/medical/bruise_pack/advanced, +/obj/item/scalpel, +/obj/item/hemostat, +/obj/item/retractor, +/obj/item/circular_saw, +/obj/item/bonegel, +/obj/item/bonesetter, +/obj/item/cautery, +/obj/item/FixOVein, +/obj/item/surgicaldrill, +/obj/item/storage/backpack/duffel/medical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bx" = ( +/obj/machinery/optable, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"by" = ( +/obj/machinery/computer/operating, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bz" = ( +/obj/structure/closet/secure_closet/medical3, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bA" = ( +/obj/structure/closet/secure_closet/medical2, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bB" = ( +/obj/structure/shuttle/window{ + dir = 4; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + tag = "icon-window5 (EAST)" + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 8; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"bC" = ( +/obj/machinery/computer/shuttle/admin{ + name = "NHV Asclepius shuttle console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bD" = ( +/obj/machinery/door/airlock/command{ + name = "Command Center"; + req_access = null; + req_access_txt = "19" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bE" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bF" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall1"; + dir = 2 + }, +/area/shuttle/administration) +"bG" = ( +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius OR 1"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bH" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/admin{ + name = "NHV Asclepius navigation computer" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bI" = ( +/obj/machinery/door/airlock/shuttle/glass{ + name = "Operating Room"; + req_access = null; + req_access_txt = "45" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bJ" = ( +/obj/structure/sink{ + dir = 4; + icon_state = "sink"; + pixel_x = 11; + pixel_y = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bK" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (EAST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 4 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 8; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"bL" = ( +/obj/machinery/computer/communications{ + name = "NHV Asclepius Communications Console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bM" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bN" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall2"; + icon_state = "swall2"; + dir = 2 + }, +/area/shuttle/administration) +"bO" = ( +/obj/machinery/sleeper, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bP" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bQ" = ( +/obj/structure/bed{ + name = "Triage: High Priority" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bR" = ( +/obj/machinery/bodyscanner, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bS" = ( +/obj/machinery/body_scanconsole, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bT" = ( +/obj/machinery/light, +/obj/structure/closet/crate/can, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bU" = ( +/obj/item/reagent_containers/spray/cleaner{ + desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; + name = "Surgery Cleaner" + }, +/obj/structure/table/glass, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bV" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bW" = ( +/obj/machinery/status_display, +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/administration) +"bX" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall13"; + dir = 2 + }, +/area/shuttle/administration) +"bY" = ( +/obj/structure/sign/examroom, +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/administration) +"bZ" = ( +/obj/machinery/defibrillator_mount/loaded, +/turf/simulated/shuttle/wall{ + dir = 2; + icon_state = "swall8"; + tag = "icon-swall12" + }, +/area/shuttle/administration) +"ca" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/camera{ + dir = 5; + icon_state = "camera"; + name = "NHV Asclepius Central"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cb" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/obj/structure/bed{ + name = "Triage: High Priority" + }, +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cc" = ( +/obj/structure/sign/nosmoking_2, +/turf/simulated/shuttle/wall{ + icon_state = "swall7"; + dir = 2 + }, +/area/shuttle/administration) +"cd" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall11"; + dir = 2 + }, +/area/shuttle/administration) +"ce" = ( +/obj/machinery/portable_atmospherics/canister/oxygen{ + name = "Canister: \[O2] (CRYO)" + }, +/obj/machinery/atmospherics/unary/portables_connector{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cf" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cg" = ( +/obj/machinery/portable_atmospherics/canister/oxygen{ + name = "Canister: \[O2] (CRYO)" + }, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius Cryo"; + network = list("NHV Asclepius") + }, +/obj/machinery/atmospherics/unary/portables_connector, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ch" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/spray/cleaner{ + desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; + name = "Surgery Cleaner" + }, +/obj/machinery/cell_charger, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ci" = ( +/obj/structure/bed{ + name = "Triage: High Priority" + }, +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cj" = ( +/obj/machinery/atmospherics/unary/cold_sink/freezer, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ck" = ( +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius OR 2"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cl" = ( +/obj/structure/closet/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/suit/radiation, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cm" = ( +/obj/structure/closet/l3closet, +/obj/item/clothing/head/bio_hood, +/obj/item/clothing/head/bio_hood, +/obj/item/clothing/head/bio_hood, +/obj/item/clothing/suit/bio_suit, +/obj/item/clothing/suit/bio_suit, +/obj/item/clothing/suit/bio_suit, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cn" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/item/clothing/head/beret/med, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"co" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cp" = ( +/obj/machinery/suit_storage_unit/cmo/secure/sec_storage, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cq" = ( +/obj/machinery/light, +/obj/machinery/suit_storage_unit/cmo/secure/sec_storage, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cr" = ( +/obj/structure/dispenser/oxygen, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cs" = ( +/obj/machinery/vending/medical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ct" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s5"; + dir = 2 + }, +/area/shuttle/administration) +"cu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5; + icon_state = "intact" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cv" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4; + level = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9; + icon_state = "intact" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"hL" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_mid"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + dir = 2 + }, +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 2; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/turf/space, +/area/shuttle/administration) +"qa" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 2 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 2; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"Kq" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 2 + }, +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 2; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/turf/space, +/area/shuttle/administration) +"Vi" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (NORTH)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 1 + }, +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 2; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/turf/space, +/area/shuttle/administration) + +(1,1,1) = {" +ab +ao +aE +aE +aE +aE +aE +aD +bo +bB +bB +bK +aD +aE +aE +aE +aE +ct +"} +(2,1,1) = {" +ac +ap +aF +aN +aS +aX +ap +ac +bp +bC +bH +bL +ac +cg +cu +aw +cl +ac +"} +(3,1,1) = {" +ad +aq +aG +aw +aw +aY +aq +ac +bq +aR +aR +bM +ac +aC +cv +aw +cm +qa +"} +(4,1,1) = {" +ae +ar +aw +aw +aw +aw +ba +ac +br +aw +aw +aw +bW +cf +cw +aw +cn +hL +"} +(5,1,1) = {" +af +as +aw +aw +aw +aw +aw +ag +bs +bD +aP +bN +bX +aC +cv +aw +co +Vi +"} +(6,1,1) = {" +ac +at +aw +aO +aw +aw +aw +bj +bt +aw +aw +bO +bY +cj +cx +aw +cp +ac +"} +(7,1,1) = {" +ag +au +aH +aP +aT +aP +bb +bk +bu +aw +aw +bP +bZ +ch +aw +aw +cq +ac +"} +(8,1,1) = {" +ah +av +aw +aQ +aw +aQ +bc +bl +aw +aw +aw +aw +ca +aw +aw +aw +cr +ac +"} +(9,1,1) = {" +ai +aw +aw +aw +aw +aw +aw +aU +aw +aw +aw +aw +aw +aw +aw +aw +bR +ac +"} +(10,1,1) = {" +aj +aw +aw +aw +aw +aw +aw +aU +aw +aw +aw +aw +aw +aw +aw +aw +bS +ac +"} +(11,1,1) = {" +ak +ax +aI +aR +aw +aR +bd +bm +bv +bE +aw +bQ +cb +ci +bQ +aw +cs +ac +"} +(12,1,1) = {" +ag +ao +aJ +aP +aU +aP +bb +bn +aP +bF +bI +bN +cc +aP +bF +bI +bN +bX +"} +(13,1,1) = {" +ac +ay +aw +aw +aw +aw +be +ac +bw +bG +aw +bR +ac +bw +ck +aw +bR +ac +"} +(14,1,1) = {" +ad +az +aw +aw +aw +aw +bg +ac +bx +aw +aw +bS +ac +bx +aw +aw +bS +Kq +"} +(15,1,1) = {" +al +aA +aw +aw +aw +aw +bh +ac +by +aw +aw +bT +ac +by +aw +aw +bT +hL +"} +(16,1,1) = {" +am +aB +aw +aw +aw +aZ +bi +ac +bz +aw +aw +bU +ac +bz +aw +aw +bU +Vi +"} +(17,1,1) = {" +ac +aC +aK +aK +aV +bf +ce +ac +bA +aw +bJ +bV +ac +bA +aw +bJ +bV +ac +"} +(18,1,1) = {" +an +aD +aL +aL +aD +aE +aE +bn +aL +aL +aD +aE +cd +aD +aL +aL +aD +aW +"} +(19,1,1) = {" +aa +an +aM +aM +aW +aa +aa +an +aM +aM +aW +aa +aa +an +aM +aM +aW +aa +"} diff --git a/_maps/map_files/shuttles/cargo_base.dmm b/_maps/map_files/shuttles/cargo_base.dmm index 7fc34998596..d14aa27c38e 100644 --- a/_maps/map_files/shuttles/cargo_base.dmm +++ b/_maps/map_files/shuttles/cargo_base.dmm @@ -159,7 +159,7 @@ dir = 1 }, /obj/structure/shuttle/engine/heater, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/supply) "u" = ( /turf/space, @@ -177,18 +177,18 @@ tag = "icon-burst_l"; icon_state = "burst_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/supply) "x" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/supply) "y" = ( /obj/structure/shuttle/engine/propulsion{ tag = "icon-burst_r"; icon_state = "burst_r" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/supply) (1,1,1) = {" diff --git a/_maps/map_files/shuttles/emergency_bar.dmm b/_maps/map_files/shuttles/emergency_bar.dmm index d8ebf266f68..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" = ( @@ -642,7 +653,7 @@ dir = 1 }, /obj/structure/shuttle/engine/heater, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bH" = ( /turf/simulated/shuttle/wall{ @@ -661,7 +672,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bK" = ( /turf/space, @@ -672,7 +683,7 @@ /area/shuttle/escape) "bL" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/escape) (1,1,1) = {" diff --git a/_maps/map_files/shuttles/emergency_clown.dmm b/_maps/map_files/shuttles/emergency_clown.dmm index 5179a940b4c..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{ @@ -164,7 +156,7 @@ }, /area/shuttle/escape) "aB" = ( -/turf/unsimulated/floor/chasm, +/turf/simulated/floor/chasm, /area/shuttle/escape) "aC" = ( /obj/machinery/status_display{ @@ -175,7 +167,7 @@ icon_state = "tube1"; dir = 1 }, -/turf/unsimulated/floor/chasm, +/turf/simulated/floor/chasm, /area/shuttle/escape) "aD" = ( /obj/structure/bed, @@ -207,7 +199,7 @@ /obj/structure/closet/walllocker/emerglocker{ pixel_x = -28 }, -/turf/unsimulated/floor/chasm, +/turf/simulated/floor/chasm, /area/shuttle/escape) "aH" = ( /obj/item/storage/bible{ @@ -246,7 +238,7 @@ name = "station intercom (General)"; pixel_x = 28 }, -/turf/unsimulated/floor/chasm, +/turf/simulated/floor/chasm, /area/shuttle/escape) "aM" = ( /obj/structure/grille, @@ -505,7 +497,7 @@ /obj/structure/window/reinforced, /obj/item/stack/sheet/mineral/bananium, /obj/item/bikehorn/rubberducky, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bp" = ( /turf/simulated/shuttle/wall{ @@ -527,7 +519,7 @@ /obj/structure/window/reinforced, /obj/item/stack/sheet/mineral/bananium, /obj/item/bikehorn/rubberducky, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bs" = ( /turf/space, @@ -538,7 +530,7 @@ /area/shuttle/escape) "bt" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/escape) (1,1,1) = {" @@ -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 9bce9e28f00..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, @@ -162,7 +162,7 @@ dir = 1; layer = 2.9 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "A" = ( /turf/simulated/shuttle/wall{ @@ -175,14 +175,14 @@ tag = "icon-burst_l"; icon_state = "burst_l" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "C" = ( /obj/structure/shuttle/engine/propulsion{ tag = "icon-propulsion_r"; icon_state = "propulsion_r" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "D" = ( /turf/simulated/shuttle/wall{ diff --git a/_maps/map_files/shuttles/emergency_cyb.dmm b/_maps/map_files/shuttles/emergency_cyb.dmm index 078a6e81cf6..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" }, @@ -543,7 +537,7 @@ dir = 1 }, /obj/structure/shuttle/engine/heater, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bs" = ( /turf/simulated/shuttle/wall{ @@ -562,7 +556,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bv" = ( /turf/space, @@ -573,7 +567,7 @@ /area/shuttle/escape) "bw" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/escape) (1,1,1) = {" @@ -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 d7fac770216..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{ @@ -743,14 +713,14 @@ dir = 1 }, /obj/structure/shuttle/engine/heater, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bR" = ( /obj/structure/shuttle/engine/heater, /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bS" = ( /turf/space, @@ -761,7 +731,7 @@ /area/shuttle/escape) "bT" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bU" = ( /turf/space, @@ -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 df8d70bfab5..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; @@ -559,14 +518,14 @@ dir = 1 }, /obj/structure/shuttle/engine/heater, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bv" = ( /obj/structure/shuttle/engine/heater, /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bw" = ( /turf/space, @@ -577,7 +536,7 @@ /area/shuttle/escape) "bx" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "by" = ( /turf/simulated/floor/plating/airless, @@ -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 b6bfe0376d6..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" = ( @@ -410,7 +404,7 @@ }, /obj/structure/shuttle/engine/heater, /obj/structure/cult/forge, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bi" = ( /obj/structure/shuttle/engine/heater, @@ -418,11 +412,11 @@ dir = 1 }, /obj/structure/cult/forge, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bj" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/escape) (1,1,1) = {" @@ -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 602d366d476..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, @@ -472,7 +466,7 @@ dir = 1 }, /obj/structure/shuttle/engine/heater, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bk" = ( /turf/simulated/shuttle/wall{ @@ -485,7 +479,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/shuttle/escape) "bn" = ( /turf/space, @@ -496,7 +490,7 @@ /area/shuttle/escape) "bo" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/shuttle/escape) (1,1,1) = {" @@ -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 324e3f05fbc..90acb3211a1 100644 --- a/_maps/map_files/templates/medium_shuttle1.dmm +++ b/_maps/map_files/templates/medium_shuttle1.dmm @@ -8,7 +8,7 @@ icon_state = "burst_l"; tag = "icon-burst_l (EAST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) @@ -23,7 +23,7 @@ icon_state = "rwindow"; dir = 4 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) @@ -218,7 +218,7 @@ icon_state = "burst_r"; tag = "icon-burst_r (EAST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) @@ -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 ed0cccfda87..8966fc3ac7a 100644 --- a/_maps/map_files/templates/medium_shuttle2.dmm +++ b/_maps/map_files/templates/medium_shuttle2.dmm @@ -8,7 +8,7 @@ icon_state = "burst_l"; tag = "icon-burst_l (EAST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) @@ -23,7 +23,7 @@ icon_state = "rwindow"; dir = 4 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) @@ -52,7 +52,7 @@ icon_state = "burst_r"; tag = "icon-burst_r (EAST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) @@ -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 013f2ae2f50..e87eec1f66b 100644 --- a/_maps/map_files/templates/medium_shuttle3.dmm +++ b/_maps/map_files/templates/medium_shuttle3.dmm @@ -8,7 +8,7 @@ icon_state = "propulsion"; dir = 1 }, -/turf/space, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) @@ -26,7 +26,7 @@ icon_state = "heater"; dir = 1 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) @@ -103,7 +103,7 @@ icon_state = "propulsion"; tag = "icon-propulsion (EAST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) @@ -113,7 +113,7 @@ icon_state = "heater"; dir = 8 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) @@ -129,7 +129,7 @@ icon_state = "heater"; dir = 4 }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) @@ -139,7 +139,7 @@ icon_state = "propulsion"; tag = "icon-propulsion (WEST)" }, -/turf/space, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) @@ -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{ @@ -262,13 +260,13 @@ }) "F" = ( /obj/structure/shuttle/engine/heater, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) "G" = ( /obj/structure/shuttle/engine/propulsion, -/turf/space, +/turf/simulated/shuttle/plating, /area/ruin/powered{ name = "Shuttle" }) diff --git a/_maps/map_files/templates/shelter_1.dmm b/_maps/map_files/templates/shelter_1.dmm index 0cebbd66b5f..0123bf7329c 100644 --- a/_maps/map_files/templates/shelter_1.dmm +++ b/_maps/map_files/templates/shelter_1.dmm @@ -15,7 +15,7 @@ /turf/simulated/floor/pod, /area/survivalpod) "d" = ( -/obj/machinery/smartfridge/survival_pod/loaded, +/obj/machinery/smartfridge/survival_pod, /turf/simulated/floor/pod, /area/survivalpod) "e" = ( @@ -30,6 +30,9 @@ /area/survivalpod) "g" = ( /obj/machinery/sleeper/survival_pod, +/obj/machinery/vending/wallmed1/survival_pod{ + pixel_x = -24 + }, /turf/simulated/floor/pod, /area/survivalpod) "h" = ( diff --git a/_maps/map_files/templates/shelter_2.dmm b/_maps/map_files/templates/shelter_2.dmm index 4a6b445ab4c..1c2e99a0c4d 100644 --- a/_maps/map_files/templates/shelter_2.dmm +++ b/_maps/map_files/templates/shelter_2.dmm @@ -9,7 +9,7 @@ /turf/simulated/wall/mineral/titanium/survival, /area/survivalpod) "c" = ( -/obj/machinery/smartfridge/survival_pod/loaded, +/obj/machinery/smartfridge/survival_pod, /turf/simulated/floor/pod, /area/survivalpod) "d" = ( @@ -39,6 +39,9 @@ /area/survivalpod) "i" = ( /obj/machinery/sleeper/survival_pod, +/obj/machinery/vending/wallmed1/survival_pod{ + pixel_x = -24 + }, /turf/simulated/floor/pod, /area/survivalpod) "j" = ( @@ -161,7 +164,7 @@ icon_state = "cutout_lusty"; name = "lusty xenomorph maid" }, - /turf/simulated/floor/carpet/black, +/turf/simulated/floor/carpet/black, /area/survivalpod) "A" = ( /obj/structure/table/wood/fancy/black, diff --git a/_maps/map_files/templates/small_shuttle_1.dmm b/_maps/map_files/templates/small_shuttle_1.dmm index e795e98614c..a1fae43e707 100644 --- a/_maps/map_files/templates/small_shuttle_1.dmm +++ b/_maps/map_files/templates/small_shuttle_1.dmm @@ -46,11 +46,11 @@ /area/ruin/powered) "j" = ( /obj/structure/shuttle/engine/heater, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/ruin/powered) "k" = ( /obj/structure/shuttle/engine/propulsion, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/ruin/powered) "l" = ( /turf/simulated/shuttle/wall{ @@ -59,7 +59,7 @@ }, /area/ruin/powered) "m" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -75,7 +75,7 @@ /obj/structure/shuttle/engine/propulsion{ icon_state = "propulsion_l" }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/ruin/powered) "p" = ( /turf/simulated/shuttle/wall{ @@ -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, @@ -124,7 +124,7 @@ /obj/structure/shuttle/engine/propulsion{ icon_state = "propulsion_r" }, -/turf/simulated/floor/plating/airless, +/turf/simulated/shuttle/plating, /area/ruin/powered) (1,1,1) = {" diff --git a/_maps/map_files/templates/spacehotel/s_01.dmm b/_maps/map_files/templates/spacehotel/s_01.dmm index 89fe83c521f..8362c0f21cc 100644 --- a/_maps/map_files/templates/spacehotel/s_01.dmm +++ b/_maps/map_files/templates/spacehotel/s_01.dmm @@ -141,6 +141,10 @@ icon_state = "freezerfloor" }, /area/template_noop) +"K" = ( +/obj/machinery/poolcontroller/invisible, +/turf/unsimulated/beach/water, +/area/template_noop) (1,1,1) = {" a @@ -153,7 +157,7 @@ a "} (2,1,1) = {" a -b +K b l o diff --git a/_maps/map_files/templates/spacehotel/s_02.dmm b/_maps/map_files/templates/spacehotel/s_02.dmm index 09dee220922..6834bc8d7e8 100644 --- a/_maps/map_files/templates/spacehotel/s_02.dmm +++ b/_maps/map_files/templates/spacehotel/s_02.dmm @@ -142,6 +142,10 @@ icon_state = "freezerfloor" }, /area/template_noop) +"O" = ( +/obj/machinery/poolcontroller/invisible, +/turf/unsimulated/beach/water, +/area/template_noop) (1,1,1) = {" a @@ -154,7 +158,7 @@ a "} (2,1,1) = {" a -b +O b l o diff --git a/_maps/map_files/templates/spacehotel/s_04.dmm b/_maps/map_files/templates/spacehotel/s_04.dmm index 564246a2854..81c1306da96 100644 --- a/_maps/map_files/templates/spacehotel/s_04.dmm +++ b/_maps/map_files/templates/spacehotel/s_04.dmm @@ -190,6 +190,10 @@ icon_state = "floor4" }, /area/template_noop) +"X" = ( +/obj/machinery/poolcontroller/invisible, +/turf/unsimulated/beach/water, +/area/template_noop) (1,1,1) = {" a @@ -202,7 +206,7 @@ a "} (2,1,1) = {" a -b +X b l o diff --git a/_maps/map_files/templates/spacehotel/s_05.dmm b/_maps/map_files/templates/spacehotel/s_05.dmm index 62c82037700..1ff9546e265 100644 --- a/_maps/map_files/templates/spacehotel/s_05.dmm +++ b/_maps/map_files/templates/spacehotel/s_05.dmm @@ -129,6 +129,10 @@ icon_state = "freezerfloor" }, /area/template_noop) +"Z" = ( +/obj/machinery/poolcontroller/invisible, +/turf/unsimulated/beach/water, +/area/template_noop) (1,1,1) = {" a @@ -141,7 +145,7 @@ a "} (2,1,1) = {" a -b +Z b k n diff --git a/_maps/map_files/templates/spacehotel/s_06.dmm b/_maps/map_files/templates/spacehotel/s_06.dmm index fa839217019..03a1e7e9e99 100644 --- a/_maps/map_files/templates/spacehotel/s_06.dmm +++ b/_maps/map_files/templates/spacehotel/s_06.dmm @@ -131,6 +131,10 @@ icon_state = "freezerfloor" }, /area/template_noop) +"X" = ( +/obj/machinery/poolcontroller/invisible, +/turf/unsimulated/beach/water, +/area/template_noop) (1,1,1) = {" a @@ -143,7 +147,7 @@ a "} (2,1,1) = {" a -b +X b m p diff --git a/_maps/metastation.dm b/_maps/metastation.dm index 7fa09edbca9..0ab9595c49a 100644 --- a/_maps/metastation.dm +++ b/_maps/metastation.dm @@ -24,12 +24,13 @@ z7 = empty space #define MAP_FILE "MetaStation.v41A.II.dmm" #define MAP_NAME "MetaStation" + #define MINETYPE "lavaland" #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE, BOOSTS_SIGNAL, AI_OK)),\ DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\ -DECLARE_LEVEL(MINING, CROSSLINKED, list(REACHABLE, STATION_CONTACT, AI_OK, ORE_LEVEL, HAS_WEATHER)),\ +DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, AI_OK, ORE_LEVEL, HAS_WEATHER)),\ DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\ DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE))) diff --git a/_maps/test_all_maps.dm b/_maps/test_all_maps.dm index 48d9574b966..064bf8defaf 100644 --- a/_maps/test_all_maps.dm +++ b/_maps/test_all_maps.dm @@ -17,6 +17,35 @@ #include "map_files\RandomZLevels\wildwest.dmm" + // Lavaland Ruins + #include "map_files\RandomRuins\LavaRuins\lavaland_biodome_beach.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_animal_hospital.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_ash_walker1.dmm" + #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" #include "map_files\RandomRuins\SpaceRuins\asteroid1.dmm" diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index ede0351993b..c542d714ca6 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -11,7 +11,8 @@ Pipelines + Other Objects -> Pipe network GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) /obj/machinery/atmospherics anchored = 1 - layer = 2.4 //under wires with their 2.44 + layer = GAS_PIPE_HIDDEN_LAYER //under wires + plane = FLOOR_PLANE idle_power_usage = 0 active_power_usage = 0 power_channel = ENVIRON @@ -61,10 +62,14 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) // Icons/overlays/underlays /obj/machinery/atmospherics/update_icon() - return null + var/turf/T = loc + if(level == 2 || !T.intact) + plane = GAME_PLANE + else + plane = FLOOR_PLANE /obj/machinery/atmospherics/proc/update_pipe_image() - pipe_image = image(src, loc, layer = 20, dir = dir) //the 20 puts it above Byond's darkness (not its opacity view) + pipe_image = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) //the 20 puts it above Byond's darkness (not its opacity view) pipe_image.plane = HUD_PLANE /obj/machinery/atmospherics/proc/check_icon_cache(var/safety = 0) @@ -226,6 +231,12 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) var/turf/T = loc level = T.intact ? 2 : 1 add_fingerprint(usr) + if(!SSair.initialized) //If there's no atmos subsystem, we can't really initialize pipenets + SSair.machinery_to_construct.Add(src) + return + initialize_atmos_network() + +/obj/machinery/atmospherics/proc/initialize_atmos_network() atmos_init() var/list/nodes = pipeline_expansion() for(var/obj/machinery/atmospherics/A in nodes) @@ -243,7 +254,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) @@ -327,3 +339,4 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) /obj/machinery/atmospherics/update_remote_sight(mob/user) user.sight |= (SEE_TURFS|BLIND) + . = ..() diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 5b09cc250c5..68a1033a266 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -3,6 +3,8 @@ initialize_directions = SOUTH|NORTH use_power = IDLE_POWER_USE + layer = GAS_PUMP_LAYER + var/datum/gas_mixture/air1 var/datum/gas_mixture/air2 diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm index 3e18cfb41fa..6bb16cb36c9 100644 --- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm +++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm @@ -15,8 +15,6 @@ var/obj/machinery/power/generator/generator - layer = 2.45 // Just above wires - anchored = 1 density = 1 @@ -112,6 +110,8 @@ ..() /obj/machinery/atmospherics/binary/circulator/update_icon() + ..() + if(stat & (BROKEN|NOPOWER)) icon_state = "circ[side]-p" else if(last_pressure_delta > 0) diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index 785d58520a0..b9902dbb066 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -43,8 +43,8 @@ icon = null /obj/machinery/atmospherics/binary/dp_vent_pump/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() @@ -56,6 +56,9 @@ /obj/machinery/atmospherics/binary/dp_vent_pump/high_volume name = "large dual port air vent" +/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume/on + on = TRUE + /obj/machinery/atmospherics/binary/dp_vent_pump/high_volume/New() ..() air1.volume = 1000 @@ -71,6 +74,8 @@ add_underlay(T, node2, dir) /obj/machinery/atmospherics/binary/dp_vent_pump/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return @@ -158,10 +163,10 @@ //Radio remote control /obj/machinery/atmospherics/binary/dp_vent_pump/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, filter = RADIO_ATMOSIA) /obj/machinery/atmospherics/binary/dp_vent_pump/proc/broadcast_status() if(!radio_connection) diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 9e845c15a98..3448655c953 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -22,12 +22,13 @@ set_frequency(frequency) /obj/machinery/atmospherics/binary/passive_gate/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() /obj/machinery/atmospherics/binary/passive_gate/update_icon() + ..() icon_state = "[on ? "on" : "off"]" /obj/machinery/atmospherics/binary/passive_gate/update_underlays() @@ -70,10 +71,10 @@ //Radio remote control /obj/machinery/atmospherics/binary/passive_gate/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, filter = RADIO_ATMOSIA) /obj/machinery/atmospherics/binary/passive_gate/proc/broadcast_status() if(!radio_connection) diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 118a70c3ecd..1998e67e17d 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -28,23 +28,59 @@ Thus, the two variables affect pump operation are set in New(): var/id = null var/datum/radio_frequency/radio_connection -/obj/machinery/atmospherics/binary/pump/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) - radio_connection = null +/obj/machinery/atmospherics/binary/pump/CtrlClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + toggle() return ..() -/obj/machinery/atmospherics/binary/pump/highcap - name = "High capacity gas pump" - desc = "A high capacity pump" +/obj/machinery/atmospherics/binary/pump/AICtrlClick() + toggle() + return ..() - target_pressure = 15000000 +/obj/machinery/atmospherics/binary/pump/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + set_max() + return + +/obj/machinery/atmospherics/binary/pump/AIAltClick() + set_max() + return ..() + +/obj/machinery/atmospherics/binary/pump/proc/toggle() + if(powered()) + on = !on + update_icon() + +/obj/machinery/atmospherics/binary/pump/proc/set_max() + if(powered()) + target_pressure = MAX_OUTPUT_PRESSURE + update_icon() + +/obj/machinery/atmospherics/binary/pump/Destroy() + if(SSradio) + SSradio.remove_object(src, frequency) + radio_connection = null + return ..() /obj/machinery/atmospherics/binary/pump/on icon_state = "map_on" on = 1 /obj/machinery/atmospherics/binary/pump/update_icon() + ..() + if(!powered()) icon_state = "off" else @@ -86,10 +122,10 @@ Thus, the two variables affect pump operation are set in New(): //Radio remote control /obj/machinery/atmospherics/binary/pump/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, filter = RADIO_ATMOSIA) /obj/machinery/atmospherics/binary/pump/proc/broadcast_status() if(!radio_connection) @@ -209,7 +245,15 @@ Thus, the two variables affect pump operation are set in New(): update_icon() /obj/machinery/atmospherics/binary/pump/attackby(obj/item/W, mob/user, params) - if(!istype(W, /obj/item/wrench)) + if(istype(W, /obj/item/pen)) + var/t = copytext(stripped_input(user, "Enter the name for the pump.", "Rename", name), 1, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + name = t + return + else if(!istype(W, /obj/item/wrench)) return ..() if(!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") diff --git a/code/ATMOSPHERICS/components/binary_devices/valve.dm b/code/ATMOSPHERICS/components/binary_devices/valve.dm index f8f282a55af..f9da99544b5 100644 --- a/code/ATMOSPHERICS/components/binary_devices/valve.dm +++ b/code/ATMOSPHERICS/components/binary_devices/valve.dm @@ -16,6 +16,8 @@ icon_state = "map_valve1" /obj/machinery/atmospherics/binary/valve/update_icon(animation) + ..() + if(animation) flick("valve[src.open][!src.open]",src) else @@ -72,8 +74,8 @@ settagwhitelist = list("id_tag") /obj/machinery/atmospherics/binary/valve/digital/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() @@ -104,10 +106,10 @@ icon_state = "valve[open]nopower" /obj/machinery/atmospherics/binary/valve/digital/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) /obj/machinery/atmospherics/binary/valve/digital/atmos_init() ..() diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index a64c94e7fc5..0947b2ee860 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -28,9 +28,49 @@ Thus, the two variables affect pump operation are set in New(): var/id = null var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/binary/volume_pump/CtrlClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + toggle() + return ..() + +/obj/machinery/atmospherics/binary/volume_pump/AICtrlClick() + toggle() + return ..() + +/obj/machinery/atmospherics/binary/volume_pump/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + set_max() + return + +/obj/machinery/atmospherics/binary/volume_pump/AIAltClick() + set_max() + return ..() + +/obj/machinery/atmospherics/binary/volume_pump/proc/toggle() + if(powered()) + on = !on + update_icon() + +/obj/machinery/atmospherics/binary/volume_pump/proc/set_max() + if(powered()) + transfer_rate = MAX_TRANSFER_RATE + update_icon() + /obj/machinery/atmospherics/binary/volume_pump/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() @@ -43,6 +83,8 @@ Thus, the two variables affect pump operation are set in New(): set_frequency(frequency) /obj/machinery/atmospherics/binary/volume_pump/update_icon() + ..() + if(!powered()) icon_state = "off" else @@ -82,10 +124,10 @@ Thus, the two variables affect pump operation are set in New(): return 1 /obj/machinery/atmospherics/binary/volume_pump/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = radio_controller.add_object(src, frequency) + radio_connection = SSradio.add_object(src, frequency) /obj/machinery/atmospherics/binary/volume_pump/proc/broadcast_status() if(!radio_connection) @@ -199,7 +241,15 @@ Thus, the two variables affect pump operation are set in New(): update_icon() /obj/machinery/atmospherics/binary/volume_pump/attackby(obj/item/W, mob/user, params) - if(!istype(W, /obj/item/wrench)) + if(istype(W, /obj/item/pen)) + var/t = copytext(stripped_input(user, "Enter the name for the volume pump.", "Rename", name), 1, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + name = t + return + else if(!istype(W, /obj/item/wrench)) return ..() if(!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index a3903f278fb..cde1c9e80b0 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -72,6 +72,8 @@ update_ports() /obj/machinery/atmospherics/omni/update_icon() + ..() + if(stat & NOPOWER) overlays = overlays_off on = 0 @@ -83,8 +85,6 @@ underlays = underlays_current - return - /obj/machinery/atmospherics/omni/proc/error_check() return diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 903f917e0c6..e45a8c3956f 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -22,10 +22,49 @@ Filter types: var/frequency = 0 var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/trinary/filter/CtrlClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + toggle() + return ..() + +/obj/machinery/atmospherics/trinary/filter/AICtrlClick() + toggle() + return ..() + +/obj/machinery/atmospherics/trinary/filter/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + set_max() + return + +/obj/machinery/atmospherics/trinary/filter/AIAltClick() + set_max() + return ..() + +/obj/machinery/atmospherics/trinary/filter/proc/toggle() + if(powered()) + on = !on + update_icon() + +/obj/machinery/atmospherics/trinary/filter/proc/set_max() + if(powered()) + target_pressure = MAX_OUTPUT_PRESSURE + update_icon() /obj/machinery/atmospherics/trinary/filter/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() @@ -34,12 +73,14 @@ Filter types: flipped = 1 /obj/machinery/atmospherics/trinary/filter/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) /obj/machinery/atmospherics/trinary/filter/update_icon() + ..() + if(flipped) icon_state = "m" else @@ -211,4 +252,16 @@ Filter types: . = TRUE update_icon() - SSnanoui.update_uis(src) \ No newline at end of file + SSnanoui.update_uis(src) + +/obj/machinery/atmospherics/trinary/filter/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/pen)) + var/t = copytext(stripped_input(user, "Enter the name for the filter.", "Rename", name), 1, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + name = t + return + else + return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index 0c64804b6da..19849582a0f 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -12,11 +12,53 @@ //node 3 is the outlet, nodes 1 & 2 are intakes +/obj/machinery/atmospherics/trinary/mixer/CtrlClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + toggle() + return ..() + +/obj/machinery/atmospherics/trinary/mixer/AICtrlClick() + toggle() + return ..() + +/obj/machinery/atmospherics/trinary/mixer/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + set_max() + return + +/obj/machinery/atmospherics/trinary/mixer/AIAltClick() + set_max() + return ..() + /obj/machinery/atmospherics/trinary/mixer/flipped icon_state = "mmap" flipped = 1 +/obj/machinery/atmospherics/trinary/mixer/proc/toggle() + if(powered()) + on = !on + update_icon() + +/obj/machinery/atmospherics/trinary/mixer/proc/set_max() + if(powered()) + target_pressure = MAX_OUTPUT_PRESSURE + update_icon() + /obj/machinery/atmospherics/trinary/mixer/update_icon(safety = 0) + ..() + if(flipped) icon_state = "m" else @@ -176,4 +218,16 @@ . = TRUE update_icon() - SSnanoui.update_uis(src) \ No newline at end of file + SSnanoui.update_uis(src) + +/obj/machinery/atmospherics/trinary/mixer/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/pen)) + var/t = copytext(stripped_input(user, "Enter the name for the mixer.", "Rename", name), 1, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + name = t + return + else + return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index c0787a95612..8087db9966e 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -4,6 +4,7 @@ use_power = IDLE_POWER_USE var/on = 0 + layer = GAS_FILTER_LAYER var/datum/gas_mixture/air1 var/datum/gas_mixture/air2 diff --git a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm index 9dddf8b06f4..7b3f8299339 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm @@ -109,8 +109,8 @@ var/datum/radio_frequency/radio_connection /obj/machinery/atmospherics/trinary/tvalve/digital/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() @@ -135,6 +135,7 @@ /obj/machinery/atmospherics/trinary/tvalve/digital/update_icon() ..() + if(!powered()) icon_state = "tvalvenopower" @@ -151,10 +152,10 @@ //Radio remote control /obj/machinery/atmospherics/trinary/tvalve/digital/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) /obj/machinery/atmospherics/trinary/tvalve/digital/atmos_init() ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm b/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm index 51415223de2..7cae2968a22 100644 --- a/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm @@ -13,6 +13,8 @@ var/current_heat_capacity = 50000 //totally random /obj/machinery/atmospherics/unary/cold_sink/update_icon() + ..() + if(node) icon_state = "intact_[on?("on"):("off")]" else @@ -20,8 +22,6 @@ on = 0 - return - /obj/machinery/atmospherics/unary/cold_sink/process_atmos() ..() if(!on) diff --git a/code/ATMOSPHERICS/components/unary_devices/generator_input.dm b/code/ATMOSPHERICS/components/unary_devices/generator_input.dm index 42c3676836c..cb095b1e551 100644 --- a/code/ATMOSPHERICS/components/unary_devices/generator_input.dm +++ b/code/ATMOSPHERICS/components/unary_devices/generator_input.dm @@ -9,12 +9,12 @@ var/update_cycle /obj/machinery/atmospherics/unary/generator_input/update_icon() + ..() + if(node) icon_state = "intact" else icon_state = "exposed" - return - /obj/machinery/atmospherics/unary/generator_input/proc/return_exchange_air() return air_contents diff --git a/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm index 58b374578df..e4afcadc7fa 100644 --- a/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm @@ -13,13 +13,13 @@ burn_state = LAVA_PROOF /obj/machinery/atmospherics/unary/heat_exchanger/update_icon() + ..() + if(node) icon_state = "intact" else icon_state = "exposed" - return - /obj/machinery/atmospherics/unary/heat_exchanger/atmos_init() if(!partner) var/partner_connect = turn(dir,180) diff --git a/code/ATMOSPHERICS/components/unary_devices/heat_source.dm b/code/ATMOSPHERICS/components/unary_devices/heat_source.dm index 31eb7305ded..b3b1d0c4fdc 100644 --- a/code/ATMOSPHERICS/components/unary_devices/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary_devices/heat_source.dm @@ -13,6 +13,8 @@ var/current_heat_capacity = 50000 //totally random /obj/machinery/atmospherics/unary/heat_reservoir/update_icon() + ..() + if(node) icon_state = "intact_[on?("on"):("off")]" else @@ -20,8 +22,6 @@ on = 0 - return - /obj/machinery/atmospherics/unary/heat_reservoir/process_atmos() ..() if(!on) diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm index d597d0eb4c4..5302a99caa1 100644 --- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm @@ -2,7 +2,7 @@ icon = 'icons/atmos/injector.dmi' icon_state = "map_injector" use_power = IDLE_POWER_USE - layer = 3 + layer = GAS_SCRUBBER_LAYER can_unwrench = 1 @@ -32,12 +32,14 @@ id_tag = id /obj/machinery/atmospherics/unary/outlet_injector/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() /obj/machinery/atmospherics/unary/outlet_injector/update_icon() + ..() + if(!powered()) icon_state = "off" else @@ -95,10 +97,10 @@ flick("inject", src) /obj/machinery/atmospherics/unary/outlet_injector/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = radio_controller.add_object(src, frequency) + radio_connection = SSradio.add_object(src, frequency) /obj/machinery/atmospherics/unary/outlet_injector/proc/broadcast_status() if(!radio_connection) diff --git a/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm b/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm index 0f575fb9c3a..a9c3b98ad74 100644 --- a/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm +++ b/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm @@ -14,6 +14,8 @@ var/oxygen_content = 10 /obj/machinery/atmospherics/unary/oxygen_generator/update_icon() + ..() + if(node) icon_state = "intact_[on?("on"):("off")]" else @@ -21,8 +23,6 @@ on = 0 - return - /obj/machinery/atmospherics/unary/oxygen_generator/New() ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm index 711a1df3861..7b4ba08af77 100644 --- a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm @@ -6,7 +6,7 @@ desc = "For connecting portables devices related to atmospherics control." can_unwrench = 1 - layer = 2.4 + layer = GAS_FILTER_LAYER var/obj/machinery/portable_atmospherics/connected_device @@ -18,6 +18,7 @@ return ..() /obj/machinery/atmospherics/unary/portables_connector/update_icon() + ..() icon_state = "connector" /obj/machinery/atmospherics/unary/portables_connector/update_underlays() diff --git a/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm b/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm index c245bfc120e..5a6e76a182b 100644 --- a/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm +++ b/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm @@ -11,10 +11,12 @@ desc = "Transfers heat to and from an area" /obj/machinery/atmospherics/unary/thermal_plate/update_icon() - var/prefix="" + ..() + + var/prefix = "" //var/suffix="_idle" // Also available: _heat, _cool if(level == 1 && istype(loc, /turf/simulated)) - prefix="h" + prefix = "h" icon_state = "[prefix]off" /obj/machinery/atmospherics/unary/thermal_plate/process_atmos() diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 613d0f0794e..2a22052c7dc 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -10,6 +10,8 @@ desc = "Has a valve and pump attached to it" use_power = IDLE_POWER_USE + layer = GAS_SCRUBBER_LAYER + can_unwrench = 1 var/open = 0 @@ -77,6 +79,10 @@ air_contents.volume = 1000 /obj/machinery/atmospherics/unary/vent_pump/update_icon(var/safety = 0) + ..() + + plane = FLOOR_PLANE + if(!check_icon_cache()) return @@ -180,10 +186,10 @@ //Radio remote control /obj/machinery/atmospherics/unary/vent_pump/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = radio_controller.add_object(src, frequency,radio_filter_in) + radio_connection = SSradio.add_object(src, frequency,radio_filter_in) if(frequency != ATMOS_VENTSCRUB) initial_loc.air_vent_info -= id_tag initial_loc.air_vent_names -= id_tag @@ -435,7 +441,7 @@ if(initial_loc) initial_loc.air_vent_info -= id_tag initial_loc.air_vent_names -= id_tag - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 8416a784019..a6f0b8c8adb 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -6,6 +6,7 @@ name = "air scrubber" desc = "Has a valve and pump attached to it" + layer = GAS_SCRUBBER_LAYER use_power = IDLE_POWER_USE idle_power_usage = 10 @@ -40,6 +41,11 @@ connect_types = list(1,3) //connects to regular and scrubber pipes +/obj/machinery/atmospherics/unary/vent_scrubber/on + on = TRUE + scrub_N2O = TRUE + scrub_Toxins = TRUE + /obj/machinery/atmospherics/unary/vent_scrubber/New() ..() icon = null @@ -53,8 +59,8 @@ if(initial_loc && frequency == ATMOS_VENTSCRUB) initial_loc.air_scrub_info -= id_tag initial_loc.air_scrub_names -= id_tag - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() @@ -91,6 +97,10 @@ return 1 /obj/machinery/atmospherics/unary/vent_scrubber/update_icon(var/safety = 0) + ..() + + plane = FLOOR_PLANE + if(!check_icon_cache()) return @@ -127,9 +137,9 @@ add_underlay(T,, dir) /obj/machinery/atmospherics/unary/vent_scrubber/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, radio_filter_in) + radio_connection = SSradio.add_object(src, frequency, radio_filter_in) if(frequency != ATMOS_VENTSCRUB) initial_loc.air_scrub_info -= id_tag initial_loc.air_scrub_names -= id_tag diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index b4a0cd9ba7b..43082c38ded 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -22,7 +22,7 @@ A.nullifyPipenet(src) return ..() -/datum/pipeline/proc/process()//This use to be called called from the pipe networks +/datum/pipeline/process()//This use to be called called from the pipe networks if(update) update = 0 reconcile_air() diff --git a/code/ATMOSPHERICS/pipes/cap.dm b/code/ATMOSPHERICS/pipes/cap.dm index 2552f6e0794..8421685d44c 100644 --- a/code/ATMOSPHERICS/pipes/cap.dm +++ b/code/ATMOSPHERICS/pipes/cap.dm @@ -4,7 +4,6 @@ icon = 'icons/atmos/pipes.dmi' icon_state = "cap" level = 2 - layer = 2.4 //under wires with their 2.44 volume = 35 @@ -55,6 +54,8 @@ node.update_underlays() /obj/machinery/atmospherics/pipe/cap/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index 199942e7a40..13e35d10c7b 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -14,7 +14,6 @@ var/obj/machinery/atmospherics/node3 level = 1 - layer = 2.4 //under wires with their 2.44 /obj/machinery/atmospherics/pipe/manifold/New() @@ -116,6 +115,8 @@ node3.update_underlays() /obj/machinery/atmospherics/pipe/manifold/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index 502795e1da9..d2cee29c0ba 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -15,7 +15,6 @@ var/obj/machinery/atmospherics/node4 level = 1 - layer = 2.4 //under wires with their 2.44 /obj/machinery/atmospherics/pipe/manifold4w/New() ..() @@ -90,6 +89,8 @@ node4.update_underlays() /obj/machinery/atmospherics/pipe/manifold4w/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/pipes/pipe.dm b/code/ATMOSPHERICS/pipes/pipe.dm index 4cd51e66b67..ec4f6bfd7ec 100644 --- a/code/ATMOSPHERICS/pipes/pipe.dm +++ b/code/ATMOSPHERICS/pipes/pipe.dm @@ -3,7 +3,6 @@ var/datum/pipeline/parent var/volume = 0 force = 20 - layer = 2.4 //under wires with their 2.44 use_power = NO_POWER_USE can_unwrench = 1 var/alert_pressure = 80*ONE_ATMOSPHERE //minimum pressure before check_pressure(...) should be called diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm index b2c2750a452..b966690733b 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm @@ -137,6 +137,8 @@ node2.update_underlays() /obj/machinery/atmospherics/pipe/simple/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm index 3efd22ed446..db982639c2f 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm @@ -28,6 +28,8 @@ icon_state = "map_universal" /obj/machinery/atmospherics/pipe/simple/hidden/universal/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm index 9bf085b534a..1ca4da646ac 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm @@ -39,6 +39,8 @@ icon_state = "map_universal" /obj/machinery/atmospherics/pipe/simple/visible/universal/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index a49b93d2ef0..00fddd5b1f0 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -48,12 +48,12 @@ anchored = 1 mouse_opacity = MOUSE_OPACITY_TRANSPARENT unacidable = 1//So you can't melt fire with acid. - icon = 'icons/effects/fire.dmi' + icon = 'icons/goonstation/effects/fire.dmi' icon_state = "1" - layer = TURF_LAYER - + layer = MASSIVE_OBJ_LAYER + alpha = 250 blend_mode = BLEND_ADD - light_range = 3 + light_range = 2 var/volume = 125 var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST @@ -184,12 +184,12 @@ else chance_of_deletion = 100 if(prob(chance_of_deletion)) - T.ChangeTurf(/turf/space) + T.ChangeTurf(T.baseturf) else 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/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index 685eba641c5..b7a71e68bff 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -49,6 +49,7 @@ var/icy = 0 var/icyoverlay var/obj/effect/hotspot/active_hotspot + var/planetary_atmos = FALSE //air will revert to its initial mix over time var/temperature_archived //USED ONLY FOR SOLIDS @@ -66,8 +67,6 @@ air.temperature = temperature - update_visuals() - /turf/simulated/Destroy() visibilityChanged() QDEL_NULL(active_hotspot) @@ -140,13 +139,16 @@ /turf/simulated/proc/process_cell() - if(archived_cycle < SSair.times_fired) //archive self if not already done archive() current_cycle = SSair.times_fired var/remove = 1 //set by non simulated turfs who are sharing with this turf + var/planet_atmos = planetary_atmos + if (planet_atmos) + atmos_adjacent_turfs_amount++ + for(var/direction in cardinal) if(!(atmos_adjacent_turfs & direction)) continue @@ -207,8 +209,21 @@ if(excited_group) last_share_check() + if(planet_atmos) //share our air with the "atmosphere" "above" the turf + var/datum/gas_mixture/G = new + G.copy_from_turf(src) + G.archive() + if(air.compare(G)) + if(!excited_group) + var/datum/excited_group/EG = new + EG.add_turf(src) + air.share(G, atmos_adjacent_turfs_amount) + last_share_check() + air.react() + update_visuals() + if(air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) hotspot_expose(air.temperature, CELL_VOLUME) for(var/atom/movable/item in src) @@ -219,13 +234,6 @@ if(consider_superconductivity(starting = 1)) remove = 0 - if(air.temperature < T0C && air.return_pressure() > 10) - icy = 1 - else if(air.temperature > T0C) - icy = 0 - - update_visuals() - if(!excited_group && remove == 1) SSair.remove_from_active(src) @@ -237,27 +245,19 @@ archived_cycle = SSair.times_fired /turf/simulated/proc/update_visuals() - if(icy && !icyoverlay) - overlays |= icemaster - icyoverlay = icemaster - else if(icyoverlay && !icy) - icyoverlay = null - overlays -= icemaster - var/new_overlay_type = tile_graphic() if(new_overlay_type == atmos_overlay_type) return var/atmos_overlay = get_atmos_overlay_by_name(atmos_overlay_type) if(atmos_overlay) - overlays -= atmos_overlay - mouse_opacity = MOUSE_OPACITY_ICON + vis_contents -= atmos_overlay atmos_overlay = get_atmos_overlay_by_name(new_overlay_type) if(atmos_overlay) - overlays += atmos_overlay + vis_contents += atmos_overlay atmos_overlay_type = new_overlay_type -/turf/simulated/proc/get_atmos_overlay_by_name(var/name) +/turf/simulated/proc/get_atmos_overlay_by_name(name) switch(name) if("plasma") return plmaster @@ -266,13 +266,13 @@ return null /turf/simulated/proc/tile_graphic() + if(!air) + return if(air.toxins > MOLES_PLASMA_VISIBLE) - mouse_opacity = MOUSE_OPACITY_TRANSPARENT return "plasma" var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air.trace_gases if(sleeping_agent && (sleeping_agent.moles > 1)) - mouse_opacity = MOUSE_OPACITY_TRANSPARENT return "sleeping_agent" return null @@ -435,16 +435,7 @@ turf_list.Cut() SSair.excited_groups -= src - - - - - - - - - -turf/simulated/proc/super_conduct() +/turf/simulated/proc/super_conduct() var/conductivity_directions = 0 if(blocks_air) //Does not participate in air exchange, so will conduct heat across all four borders at this time @@ -532,7 +523,7 @@ turf/simulated/proc/radiate_to_spess() //Radiate excess tile heat to space if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)) var/heat = thermal_conductivity*delta_temperature* \ - (heat_capacity*700000/(heat_capacity+700000)) //700000 is the heat_capacity from a space turf, hardcoded here + (heat_capacity*HEAT_CAPACITY_VACUUM/(heat_capacity+HEAT_CAPACITY_VACUUM)) //700000 is the heat_capacity from a space turf, hardcoded here temperature -= heat/heat_capacity /turf/proc/Initialize_Atmos(times_fired) diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm index 1c4c12c243d..cbcf2c1dd90 100644 --- a/code/__DEFINES/MC.dm +++ b/code/__DEFINES/MC.dm @@ -21,7 +21,6 @@ #define START_PROCESSING(Processor, Datum) if (!Datum.isprocessing) {Datum.isprocessing = TRUE;Processor.processing += Datum} #define STOP_PROCESSING(Processor, Datum) Datum.isprocessing = FALSE;Processor.processing -= Datum -#define START_DEFERRED_PROCESSING(Processor, Datum) if (!Datum.isprocessing) {Datum.isprocessing = TRUE;Processor.processing.Insert(1,Datum)} //SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier) diff --git a/code/__DEFINES/tick.dm b/code/__DEFINES/_tick.dm similarity index 52% rename from code/__DEFINES/tick.dm rename to code/__DEFINES/_tick.dm index 80550ab5e7a..666971e7209 100644 --- a/code/__DEFINES/tick.dm +++ b/code/__DEFINES/_tick.dm @@ -6,5 +6,8 @@ #define TICK_USAGE world.tick_usage //for general usage #define TICK_USAGE_REAL world.tick_usage //to be used where the result isn't checked -#define TICK_CHECK ( world.tick_usage > TICK_LIMIT_RUNNING ? stoplag() : 0 ) -#define CHECK_TICK if(world.tick_usage > TICK_LIMIT_RUNNING) stoplag() \ No newline at end of file +#define TICK_CHECK ( TICK_USAGE > Master.current_ticklimit ) +#define CHECK_TICK ( TICK_CHECK ? stoplag() : 0 ) + +#define TICK_CHECK_HIGH_PRIORITY ( TICK_USAGE > 95 ) +#define CHECK_TICK_HIGH_PRIORITY ( TICK_CHECK_HIGH_PRIORITY? stoplag() : 0 ) \ No newline at end of file diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index be6326272f7..67eea12291a 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -1,66 +1,67 @@ -#define FIRE_DAMAGE_MODIFIER 0.0215 //Higher values result in more external fire damage to the skin (default 0.0215) -#define AIR_DAMAGE_MODIFIER 2.025 //More means less damage from hot air scalding lungs, less = more damage. (default 2.025) - -#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) //moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC -#define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005) -#define O2STANDARD 0.21 -#define N2STANDARD 0.79 -#define MOLES_O2STANDARD (MOLES_CELLSTANDARD*O2STANDARD) // O2 standard value (21%) -#define MOLES_N2STANDARD (MOLES_CELLSTANDARD*N2STANDARD) // N2 standard value (79%) - #define GAS_O2 (1 << 0) #define GAS_N2 (1 << 1) #define GAS_PL (1 << 2) #define GAS_CO2 (1 << 3) #define GAS_N2O (1 << 4) -//stuff you should probably leave well alone! //ATMOS -#define CELL_VOLUME 2500 //liters in a cell -#define BREATH_VOLUME 0.5 //liters in a normal breath -#define BREATH_MOLES (ONE_ATMOSPHERE * BREATH_VOLUME /(T20C*R_IDEAL_GAS_EQUATION)) -#define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) //Amount of air to take a from a tile -#define HUMAN_NEEDED_OXYGEN (MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16) //Amount of air needed before pass out/suffocation commences -#define NORMPIPERATE 30 //pipe-insulation rate divisor -#define HEATPIPERATE 8 //heat-exch pipe insulation -#define FLOWFRAC 0.99 //fraction of gas transfered per process -#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) //Tank starts leaking -#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) //Tank spills all contents into atmosphere -#define TANK_FRAGMENT_PRESSURE (50.*ONE_ATMOSPHERE) //Boom 3x3 base explosion -#define TANK_FRAGMENT_SCALE (10.*ONE_ATMOSPHERE) //+1 for each SCALE kPa aboe threshold -#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.005 //Minimum ratio of air that must move to/from a tile to suspend group processing -#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Minimum amount of air that has to move before a group processing can be suspended -#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Either this must be active -#define MINIMUM_TEMPERATURE_TO_MOVE (T20C+100) //or this (or both, obviously) +//stuff you should probably leave well alone! +#define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol) +#define ONE_ATMOSPHERE 101.325 //kPa +#define TCMB 2.7 // -270.3degC +#define TCRYO 265 // -48.15degC +#define T0C 273.15 // 0degC +#define T20C 293.15 // 20degC + +#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) //moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC +#define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005) //compared against for superconductivity +#define O2STANDARD 0.21 //percentage of oxygen in a normal mixture of air +#define N2STANDARD 0.79 //same but for nitrogen +#define MOLES_O2STANDARD (MOLES_CELLSTANDARD*O2STANDARD) // O2 standard value (21%) +#define MOLES_N2STANDARD (MOLES_CELLSTANDARD*N2STANDARD) // N2 standard value (79%) +#define CELL_VOLUME 2500 //liters in a cell +#define BREATH_VOLUME 0.5 //liters in a normal breath +#define BREATH_MOLES (ONE_ATMOSPHERE * BREATH_VOLUME /(T20C*R_IDEAL_GAS_EQUATION)) +#define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) //Amount of air to take a from a tile + +//EXCITED GROUPS +#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.005 //Minimum ratio of air that must move to/from a tile to suspend group processing +#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Minimum amount of air that has to move before a group processing can be suspended +#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Either this must be active +#define MINIMUM_TEMPERATURE_TO_MOVE (T20C+100) //or this (or both, obviously) #define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012 #define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 //Minimum temperature difference before group processing is suspended #define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 //Minimum temperature difference before the gas temperatures are just set to be equal #define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION (T20C+10) #define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION (T20C+200) -#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4 + +//HEAT TRANSFER COEFFICIENTS +//Must be between 0 and 1. Values closer to 1 equalize temperature faster +//Should not exceed 0.4 else strange heat flow occur +#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.15 #define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 -#define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0 -#define SPACE_HEAT_TRANSFER_COEFFICIENT 0.2 //a hack to partly simulate radiative heat #define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4 #define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 //a hack for now - //Must be between 0 and 1. Values closer to 1 equalize temperature faster - //Should not exceed 0.4 else strange heat flow occur +#define HEAT_CAPACITY_VACUUM 700000 //a hack to help make vacuums "cold", sacrificing realism for gameplay + +//FIRE #define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD (150+T0C) #define FIRE_MINIMUM_TEMPERATURE_TO_EXIST (100+T0C) #define FIRE_SPREAD_RADIOSITY_SCALE 0.85 -#define FIRE_CARBON_ENERGY_RELEASED 2500000 //Amount of heat released per mole of burnt carbon into the tile -#define FIRE_PLASMA_ENERGY_RELEASED 15000000 //Amount of heat released per mole of burnt plasma into the tile +#define FIRE_CARBON_ENERGY_RELEASED 500000 //Amount of heat released per mole of burnt carbon into the tile +#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile #define FIRE_GROWTH_RATE 40000 //For small fires -#define CARBON_LIFEFORM_FIRE_RESISTANCE 200+T0C //Resistance to fire damage -#define CARBON_LIFEFORM_FIRE_DAMAGE 4 //Fire damage - //Plasma fire properties -#define OXYGEN_BURN_RATE_BASE 7 -#define PLASMA_BURN_RATE_DELTA 20 + +//Plasma fire properties +#define OXYGEN_BURN_RATE_BASE 1.4 +#define PLASMA_BURN_RATE_DELTA 4 #define PLASMA_MINIMUM_BURN_TEMPERATURE (100+T0C) #define PLASMA_UPPER_TEMPERATURE (1370+T0C) #define PLASMA_MINIMUM_OXYGEN_NEEDED 2 #define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30 #define PLASMA_OXYGEN_FULLBURN 10 + +//GASES #define MIN_TOXIC_GAS_DAMAGE 1 #define MAX_TOXIC_GAS_DAMAGE 10 #define MOLES_PLASMA_VISIBLE 0.5 //Moles in a standard cell after which plasma is visible @@ -72,6 +73,8 @@ #define HAZARD_LOW_PRESSURE 20 //This is when the black ultra-low pressure icon is displayed. (This one is set as a constant) #define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 //This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount. + +#define BODYTEMP_NORMAL 310.15 //The natural temperature for a body #define BODYTEMP_AUTORECOVERY_DIVISOR 12 //This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive. #define BODYTEMP_AUTORECOVERY_MINIMUM 10 //Minimum amount of kelvin moved toward 310.15K per tick. So long as abs(310.15 - bodytemp) is more than 50. #define BODYTEMP_COLD_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster. @@ -79,8 +82,8 @@ #define BODYTEMP_COOLING_MAX 30 //The maximum number of degrees that your body can cool in 1 tick, when in a cold area. #define BODYTEMP_HEATING_MAX 30 //The maximum number of degrees that your body can heat up in 1 tick, when in a hot area. -#define BODYTEMP_HEAT_DAMAGE_LIMIT 360.15 // The limit the human body can take before it starts taking damage from heat. -#define BODYTEMP_COLD_DAMAGE_LIMIT 260.15 // The limit the human body can take before it starts taking damage from coldness. +#define BODYTEMP_HEAT_DAMAGE_LIMIT (BODYTEMP_NORMAL + 50) // The limit the human body can take before it starts taking damage from heat. +#define BODYTEMP_COLD_DAMAGE_LIMIT (BODYTEMP_NORMAL - 50) // The limit the human body can take before it starts taking damage from coldness. #define SPACE_HELM_MIN_TEMP_PROTECT 2.0 //what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0. #define SPACE_HELM_MAX_TEMP_PROTECT 1500 //Thermal insulation works both ways /Malkevin @@ -92,8 +95,7 @@ #define FIRE_HELM_MIN_TEMP_PROTECT 60 //Cold protection for fire helmets #define FIRE_HELM_MAX_TEMP_PROTECT 30000 //for fire helmet quality items (red and white hardhats) -#define FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT 35000 //what max_heat_protection_temperature is set to for firesuit quality suits. MUST NOT BE 0. -#define FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT 35000 //for fire helmet quality items (red and white hardhats) +#define FIRE_IMMUNITY_MAX_TEMP_PROTECT 35000 //what max_heat_protection_temperature is set to for firesuit quality suits and helmets. MUST NOT BE 0. #define HELMET_MIN_TEMP_PROTECT 160 //For normal helmets #define HELMET_MAX_TEMP_PROTECT 600 //For normal helmets @@ -105,17 +107,23 @@ #define SHOES_MIN_TEMP_PROTECT 2.0 //For gloves #define SHOES_MAX_TEMP_PROTECT 1500 //For gloves - #define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE -#define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( +#define MAX_HIGH_PRESSURE_DAMAGE 4 #define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). #define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this +//PIPES // Atmos pipe limits #define MAX_OUTPUT_PRESSURE 4500 // (kPa) What pressure pumps and powered equipment max out at. #define MAX_TRANSFER_RATE 200 // (L/s) Maximum speed powered equipment can work at. +//TANKS +#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) //Tank starts leaking +#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) //Tank spills all contents into atmosphere +#define TANK_FRAGMENT_PRESSURE (50.*ONE_ATMOSPHERE) //Boom 3x3 base explosion +#define TANK_FRAGMENT_SCALE (10.*ONE_ATMOSPHERE) //+1 for each SCALE kPa aboe threshold + // Atmos alarm defines #define ATMOS_ALARM_NONE 0 #define ATMOS_ALARM_WARNING 1 diff --git a/code/__DEFINES/callbacks.dm b/code/__DEFINES/callbacks.dm index c0d8ac15ace..26c81f8b143 100644 --- a/code/__DEFINES/callbacks.dm +++ b/code/__DEFINES/callbacks.dm @@ -1,2 +1,4 @@ +#define GLOBAL_PROC "some_magic_bullshit" + #define CALLBACK new /datum/callback #define INVOKE_ASYNC ImmediateInvokeAsync \ No newline at end of file diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm index f7fe5b8b28e..c44c65397dd 100644 --- a/code/__DEFINES/clothing.dm +++ b/code/__DEFINES/clothing.dm @@ -9,7 +9,7 @@ #define HIDEEYES 4 //APPLIES ONLY TO HELMETS/MASKS!! (eyes means glasses) #define HIDEFACE 8 //APPLIES ONLY TO HELMETS/MASKS!! Dictates whether we appear as unknown. -//slots +// slots #define slot_back 1 #define slot_wear_mask 2 #define slot_handcuffed 3 @@ -35,6 +35,11 @@ #define slot_collar 23 #define slots_amt 23 +// accessory slots +#define ACCESSORY_SLOT_DECOR 1 +#define ACCESSORY_SLOT_UTILITY 2 +#define ACCESSORY_SLOT_ARMBAND 3 + //Cant seem to find a mob bitflags area other than the powers one // bitflags for clothing parts 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 593419b61b1..fbc28695ebf 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -26,6 +26,7 @@ #define TOXLOSS 4 #define OXYLOSS 8 #define SHAME 16 +#define OBLITERATION 32 //Bitflags defining which status effects could be or are inflicted on a mob #define CANSTUN 1 @@ -40,6 +41,9 @@ #define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath #define XENO_HOST 16384 //Tracks whether we're gonna be a baby alien's mummy. +//Health Defines +#define HEALTH_THRESHOLD_CRIT 0 +#define HEALTH_THRESHOLD_DEAD -100 //Grab levels #define GRAB_PASSIVE 1 @@ -48,12 +52,6 @@ #define GRAB_UPGRADING 4 #define GRAB_KILL 5 - -//Hostile Mob AI Status -#define AI_ON 1 -#define AI_IDLE 2 -#define AI_OFF 3 - //Attack types for checking shields/hit reactions #define MELEE_ATTACK 1 @@ -72,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) @@ -84,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 444077aacd7..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. @@ -101,6 +104,8 @@ //turf-only flags #define NOJAUNT 1 +#define NO_LAVA_GEN 2 //Blocks lava rivers being generated on the turf +#define NO_RUINS 4 //ITEM INVENTORY SLOT BITMASKS #define SLOT_OCLOTHING 1 diff --git a/code/__DEFINES/game.dm b/code/__DEFINES/game.dm index 68518e80d6c..5c262724a14 100644 --- a/code/__DEFINES/game.dm +++ b/code/__DEFINES/game.dm @@ -1,3 +1,4 @@ +#define GAME_STATE_STARTUP 0 #define GAME_STATE_PREGAME 1 #define GAME_STATE_SETTING_UP 2 #define GAME_STATE_PLAYING 3 diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm index 617cdf3cb21..308e7a5f6d9 100644 --- a/code/__DEFINES/gamemode.dm +++ b/code/__DEFINES/gamemode.dm @@ -6,15 +6,15 @@ #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 (ticker && istype(ticker.mode, /datum/game_mode/blob)) -#define GAMEMODE_IS_CULT (ticker && istype(ticker.mode, /datum/game_mode/cult)) -#define GAMEMODE_IS_HEIST (ticker && istype(ticker.mode, /datum/game_mode/heist)) -#define GAMEMODE_IS_NATIONS (ticker && istype(ticker.mode, /datum/game_mode/nations)) -#define GAMEMODE_IS_NUCLEAR (ticker && istype(ticker.mode, /datum/game_mode/nuclear)) -#define GAMEMODE_IS_REVOLUTION (ticker && istype(ticker.mode, /datum/game_mode/revolution)) -#define GAMEMODE_IS_WIZARD (ticker && istype(ticker.mode, /datum/game_mode/wizard)) +#define GAMEMODE_IS_BLOB (SSticker && istype(SSticker.mode, /datum/game_mode/blob)) +#define GAMEMODE_IS_CULT (SSticker && istype(SSticker.mode, /datum/game_mode/cult)) +#define GAMEMODE_IS_HEIST (SSticker && istype(SSticker.mode, /datum/game_mode/heist)) +#define GAMEMODE_IS_NUCLEAR (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear)) +#define GAMEMODE_IS_REVOLUTION (SSticker && istype(SSticker.mode, /datum/game_mode/revolution)) +#define GAMEMODE_IS_WIZARD (SSticker && istype(SSticker.mode, /datum/game_mode/wizard)) //special roles // Distinct from the ROLE_X defines because some antags have multiple special roles but only one ban type diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 59cf95a72d7..4a1e4f20f98 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -16,18 +16,17 @@ #define DIAG_MECH_HUD "11"// Mech health bar #define STATUS_HUD_OOC "12"// STATUS_HUD without virus db check for someone being ill. #define SPECIALROLE_HUD "13" //for antag huds. these are used at the /mob level -#define NATIONS_HUD "14" //Show nations icons during nations gamemode -#define DIAG_BOT_HUD "15"// Bot HUDS -#define PLANT_NUTRIENT_HUD "16"// Plant nutrient level -#define PLANT_WATER_HUD "17"// Plant water level -#define PLANT_STATUS_HUD "18"// Plant harvest/dead -#define PLANT_HEALTH_HUD "19"// Plant health -#define PLANT_TOXIN_HUD "20"// Toxin level -#define PLANT_PEST_HUD "21"// Pest level -#define PLANT_WEED_HUD "22"// Weed level -#define DIAG_TRACK_HUD "23"// Mech tracking beacon -#define DIAG_PATH_HUD "24"//Bot path indicators -#define GLAND_HUD "25"//Gland indicators for abductors +#define DIAG_BOT_HUD "14"// Bot HUDS +#define PLANT_NUTRIENT_HUD "15"// Plant nutrient level +#define PLANT_WATER_HUD "16"// Plant water level +#define PLANT_STATUS_HUD "17"// Plant harvest/dead +#define PLANT_HEALTH_HUD "18"// Plant health +#define PLANT_TOXIN_HUD "19"// Toxin level +#define PLANT_PEST_HUD "20"// Pest level +#define PLANT_WEED_HUD "21"// Weed level +#define DIAG_TRACK_HUD "22"// Mech tracking beacon +#define DIAG_PATH_HUD "23"//Bot path indicators +#define GLAND_HUD "24"//Gland indicators for abductors //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior @@ -42,22 +41,21 @@ #define DATA_HUD_DIAGNOSTIC 5 #define DATA_HUD_DIAGNOSTIC_ADVANCED 6 #define DATA_HUD_HYDROPONIC 7 -//NATIONS -#define GAME_HUD_NATIONS 8 //antag HUD defines -#define ANTAG_HUD_CULT 9 -#define ANTAG_HUD_REV 10 -#define ANTAG_HUD_OPS 11 -#define ANTAG_HUD_WIZ 12 -#define ANTAG_HUD_SHADOW 13 -#define ANTAG_HUD_TRAITOR 14 -#define ANTAG_HUD_NINJA 15 -#define ANTAG_HUD_CHANGELING 16 -#define ANTAG_HUD_VAMPIRE 17 -#define ANTAG_HUD_ABDUCTOR 18 -#define DATA_HUD_ABDUCTOR 19 -#define ANTAG_HUD_DEVIL 20 -#define ANTAG_HUD_EVENTMISC 21 +#define ANTAG_HUD_CULT 8 +#define ANTAG_HUD_REV 9 +#define ANTAG_HUD_OPS 10 +#define ANTAG_HUD_WIZ 11 +#define ANTAG_HUD_SHADOW 12 +#define ANTAG_HUD_TRAITOR 13 +#define ANTAG_HUD_NINJA 14 +#define ANTAG_HUD_CHANGELING 15 +#define ANTAG_HUD_VAMPIRE 16 +#define ANTAG_HUD_ABDUCTOR 17 +#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/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 5ee80535780..c4478f62837 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -13,8 +13,12 @@ //Objects #define isitem(A) (istype(A, /obj/item)) +#define ismachinery(A) (istype(A, /obj/machinery)) + #define ismecha(A) (istype(A, /obj/mecha)) +#define iseffect(A) (istype(A, /obj/effect)) + #define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable #define is_pen(W) (istype(W, /obj/item/pen)) @@ -52,6 +56,10 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define ismineralturf(A) istype(A, /turf/simulated/mineral) +#define islava(A) (istype(A, /turf/simulated/floor/plating/lava)) + +#define ischasm(A) (istype(A, /turf/simulated/floor/chasm)) + //Mobs #define isliving(A) (istype(A, /mob/living)) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 9da2c725a43..db88f46a676 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -6,7 +6,9 @@ #define PLANE_SPACE -95 #define PLANE_SPACE_PARALLAX -90 -#define GAME_PLANE 0 +#define FLOOR_PLANE -2 +#define GAME_PLANE -1 +#define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals #define SPACE_LAYER 1.8 //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define @@ -83,23 +85,29 @@ #define ABOVE_LIGHTING_PLANE 16 #define ABOVE_LIGHTING_LAYER 16 -#define BYOND_LIGHTING_PLANE 17 -#define BYOND_LIGHTING_LAYER 17 +#define FLOOR_OPENSPACE_PLANE 17 +#define OPENSPACE_LAYER 17 + +#define BYOND_LIGHTING_PLANE 18 +#define BYOND_LIGHTING_LAYER 18 + +#define CAMERA_STATIC_PLANE 19 +#define CAMERA_STATIC_LAYER 19 //HUD layer defines -#define FULLSCREEN_PLANE 18 -#define FLASH_LAYER 18 -#define FULLSCREEN_LAYER 18.1 -#define UI_DAMAGE_LAYER 18.2 -#define BLIND_LAYER 18.3 -#define CRIT_LAYER 18.4 -#define CURSE_LAYER 18.5 +#define FULLSCREEN_PLANE 20 +#define FLASH_LAYER 20 +#define FULLSCREEN_LAYER 20.1 +#define UI_DAMAGE_LAYER 20.2 +#define BLIND_LAYER 20.3 +#define CRIT_LAYER 20.4 +#define CURSE_LAYER 20.5 -#define HUD_PLANE 19 -#define HUD_LAYER 19 -#define ABOVE_HUD_PLANE 20 -#define ABOVE_HUD_LAYER 20 +#define HUD_PLANE 21 +#define HUD_LAYER 21 +#define ABOVE_HUD_PLANE 22 +#define ABOVE_HUD_LAYER 22 -#define SPLASHSCREEN_LAYER 21 -#define SPLASHSCREEN_PLANE 21 \ No newline at end of file +#define SPLASHSCREEN_LAYER 23 +#define SPLASHSCREEN_PLANE 23 \ No newline at end of file diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 3db7c467c24..7357c5f441e 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -1,42 +1,92 @@ -#define LIGHTING_FALLOFF 1 // type of falloff to use for lighting; 1 for circular, 2 for square -#define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources -#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone +//Bay lighting engine shit, not in /code/modules/lighting because BYOND is being shit about it +#define LIGHTING_INTERVAL 5 // frequency, in 1/10ths of a second, of the lighting process -#define LIGHTING_ICON 'icons/effects/lighting_overlay.dmi' // icon used for lighting shading effects +#define MINIMUM_USEFUL_LIGHT_RANGE 1.4 -#define LIGHTING_ROUND_VALUE (1 / 128) //Value used to round lumcounts, values smaller than 1/255 don't matter (if they do, thanks sinking points), greater values will make lighting less precise, but in turn increase performance, VERY SLIGHTLY. +#define LIGHTING_FALLOFF 1 // type of falloff to use for lighting; 1 for circular, 2 for square +#define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources +#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone +#define LIGHTING_ROUND_VALUE (1 / 64) //Value used to round lumcounts, values smaller than 1/129 don't matter (if they do, thanks sinking points), greater values will make lighting less precise, but in turn increase performance, VERY SLIGHTLY. -#define LIGHTING_SOFT_THRESHOLD 0.05 // If the max of the lighting lumcounts of each spectrum drops below this, disable luminosity on the lighting overlays. +#define LIGHTING_ICON 'icons/effects/lighting_object.dmi' // icon used for lighting shading effects + +// If the max of the lighting lumcounts of each spectrum drops below this, disable luminosity on the lighting objects. +// Set to zero to disable soft lighting. Luminosity changes then work if it's lit at all. +#define LIGHTING_SOFT_THRESHOLD 0 // If I were you I'd leave this alone. #define LIGHTING_BASE_MATRIX \ list \ ( \ - LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \ - LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \ - LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \ - LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \ + 1, 1, 1, 0, \ + 1, 1, 1, 0, \ + 1, 1, 1, 0, \ + 1, 1, 1, 0, \ 0, 0, 0, 1 \ ) \ -// Helpers so we can (more easily) control the colour matrices. -#define CL_MATRIX_RR 1 -#define CL_MATRIX_RG 2 -#define CL_MATRIX_RB 3 -#define CL_MATRIX_RA 4 -#define CL_MATRIX_GR 5 -#define CL_MATRIX_GG 6 -#define CL_MATRIX_GB 7 -#define CL_MATRIX_GA 8 -#define CL_MATRIX_BR 9 -#define CL_MATRIX_BG 10 -#define CL_MATRIX_BB 11 -#define CL_MATRIX_BA 12 -#define CL_MATRIX_AR 13 -#define CL_MATRIX_AG 14 -#define CL_MATRIX_AB 15 -#define CL_MATRIX_AA 16 -#define CL_MATRIX_CR 17 -#define CL_MATRIX_CG 18 -#define CL_MATRIX_CB 19 -#define CL_MATRIX_CA 20 \ No newline at end of file + +//Some defines to generalise colours used in lighting. +//Important note on colors. Colors can end up significantly different from the basic html picture, especially when saturated +#define LIGHT_COLOR_WHITE "#FFFFFF" +#define LIGHT_COLOR_RED "#FA8282" //Warm but extremely diluted red. rgb(250, 130, 130) +#define LIGHT_COLOR_GREEN "#64C864" //Bright but quickly dissipating neon green. rgb(100, 200, 100) +#define LIGHT_COLOR_BLUE "#6496FA" //Cold, diluted blue. rgb(100, 150, 250) + +#define LIGHT_COLOR_BLUEGREEN "#7DE1AF" //Light blueish green. rgb(125, 225, 175) +#define LIGHT_COLOR_CYAN "#7DE1E1" //Diluted cyan. rgb(125, 225, 225) +#define LIGHT_COLOR_LIGHT_CYAN "#40CEFF" //More-saturated cyan. rgb(64, 206, 255) +#define LIGHT_COLOR_DARK_BLUE "#6496FA" //Saturated blue. rgb(51, 117, 248) +#define LIGHT_COLOR_PINK "#E17DE1" //Diluted, mid-warmth pink. rgb(225, 125, 225) +#define LIGHT_COLOR_YELLOW "#E1E17D" //Dimmed yellow, leaning kaki. rgb(225, 225, 125) +#define LIGHT_COLOR_BROWN "#966432" //Clear brown, mostly dim. rgb(150, 100, 50) +#define LIGHT_COLOR_ORANGE "#FA9632" //Mostly pure orange. rgb(250, 150, 50) +#define LIGHT_COLOR_PURPLE "#952CF4" //Light Purple. rgb(149, 44, 244) +#define LIGHT_COLOR_LAVENDER "#9B51FF" //Less-saturated light purple. rgb(155, 81, 255) + +#define LIGHT_COLOR_HOLY_MAGIC "#FFF743" //slightly desaturated bright yellow. +#define LIGHT_COLOR_BLOOD_MAGIC "#D00000" //deep crimson + +#define LIGHT_COLOR_PURE_CYAN "#00FFFF" +#define LIGHT_COLOR_DARKRED "#A91515" +#define LIGHT_COLOR_PURE_RED "#FF0000" +#define LIGHT_COLOR_DARKGREEN "#50AB00" +#define LIGHT_COLOR_PURE_GREEN "#00FF00" +#define LIGHT_COLOR_LIGHTBLUE "#0099FF" +#define LIGHT_COLOR_DARKBLUE "#315AB4" +#define LIGHT_COLOR_PURE_BLUE "#0000FF" +#define LIGHT_COLOR_FADEDPURPLE "#A97FAA" + +//These ones aren't a direct colour like the ones above, because nothing would fit +#define LIGHT_COLOR_FIRE "#FAA019" //Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25) +#define LIGHT_COLOR_LAVA "#C48A18" //Very warm yellow, leaning slightly towards orange. rgb(196, 138, 24) +#define LIGHT_COLOR_FLARE "#FA644B" //Bright, non-saturated red. Leaning slightly towards pink for visibility. rgb(250, 100, 75) +#define LIGHT_COLOR_SLIME_LAMP "#AFC84B" //Weird color, between yellow and green, very slimy. rgb(175, 200, 75) +#define LIGHT_COLOR_TUNGSTEN "#FAE1AF" //Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175) +#define LIGHT_COLOR_HALOGEN "#F0FAFA" //Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250) + +#define LIGHT_RANGE_FIRE 3 //How many tiles standard fires glow. + +#define LIGHTING_PLANE_ALPHA_VISIBLE 255 +#define LIGHTING_PLANE_ALPHA_NV_TRAIT 245 +#define LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE 192 +#define LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE 128 //For lighting alpha, small amounts lead to big changes. even at 128 its hard to figure out what is dark and what is light, at 64 you almost can't even tell. +#define LIGHTING_PLANE_ALPHA_INVISIBLE 0 + +//lighting area defines +#define DYNAMIC_LIGHTING_DISABLED 0 //dynamic lighting disabled (area stays at full brightness) +#define DYNAMIC_LIGHTING_ENABLED 1 //dynamic lighting enabled +#define DYNAMIC_LIGHTING_FORCED 2 //dynamic lighting enabled even if the area doesn't require power +#define DYNAMIC_LIGHTING_IFSTARLIGHT 3 //dynamic lighting enabled only if starlight is. +#define IS_DYNAMIC_LIGHTING(A) A.dynamic_lighting + + +//code assumes higher numbers override lower numbers. +#define LIGHTING_NO_UPDATE 0 +#define LIGHTING_VIS_UPDATE 1 +#define LIGHTING_CHECK_UPDATE 2 +#define LIGHTING_FORCE_UPDATE 3 + +#define FLASH_LIGHT_DURATION 2 +#define FLASH_LIGHT_POWER 3 +#define FLASH_LIGHT_RANGE 3.8 \ No newline at end of file diff --git a/code/__DEFINES/math.dm b/code/__DEFINES/math.dm index 7115cc677f6..4d98c565c3a 100644 --- a/code/__DEFINES/math.dm +++ b/code/__DEFINES/math.dm @@ -3,13 +3,6 @@ #define SPEED_OF_LIGHT_SQ 9e+16 #define INFINITY 1e31 //closer then enough -//atmos -#define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol) -#define ONE_ATMOSPHERE 101.325 //kPa -#define T0C 273.15 // 0degC -#define T20C 293.15 // 20degC -#define TCMB 2.7 // -270.3degC - #define Clamp(x, y, z) ((x) <= (y) ? (y) : ((x) >= (z) ? (z) : (x))) #define CLAMP01(x) (Clamp((x), 0, 1)) diff --git a/code/__DEFINES/medal.dm b/code/__DEFINES/medal.dm new file mode 100644 index 00000000000..81dea5f373b --- /dev/null +++ b/code/__DEFINES/medal.dm @@ -0,0 +1,24 @@ +// Medal names +#define BOSS_KILL_MEDAL "Killer" +#define ALL_KILL_MEDAL "Exterminator" //Killing all of x type +#define BOSS_KILL_MEDAL_CRUSHER "Crusher" + + //Defines for boss medals +#define BOSS_MEDAL_MINER "Blood-drunk Miner" +#define BOSS_MEDAL_BUBBLEGUM "Bubblegum" +#define BOSS_MEDAL_COLOSSUS "Colossus" +#define BOSS_MEDAL_DRAKE "Drake" +#define BOSS_MEDAL_HIEROPHANT "Hierophant" +#define BOSS_MEDAL_LEGION "Legion" +#define BOSS_MEDAL_SWARMERS "Swarmer Beacon" +#define BOSS_MEDAL_TENDRIL "Tendril" + + // Score names +#define HIEROPHANT_SCORE "Hierophants Killed" +#define BOSS_SCORE "Bosses Killed" +#define BUBBLEGUM_SCORE "Bubblegum Killed" +#define COLOSSUS_SCORE "Colossus Killed" +#define DRAKE_SCORE "Drakes Killed" +#define LEGION_SCORE "Legion Killed" +#define SWARMER_BEACON_SCORE "Swarmer Beacons Killed" +#define TENDRIL_CLEAR_SCORE "Tendrils Killed" \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 7783216427b..049f2541bc1 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -57,16 +57,88 @@ #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" +//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" +#define COLOR_BLACK "#000000" +#define COLOR_NAVY_BLUE "#000080" +#define COLOR_LIGHT_GREEN "#008000" +#define COLOR_DARK_GRAY "#404040" +#define COLOR_MAROON "#800000" +#define COLOR_PURPLE "#800080" +#define COLOR_VIOLET "#9933ff" +#define COLOR_OLIVE "#808000" +#define COLOR_BROWN_ORANGE "#824b28" +#define COLOR_DARK_ORANGE "#b95a00" +#define COLOR_GRAY40 "#666666" +#define COLOR_GRAY20 "#333333" +#define COLOR_GRAY15 "#151515" +#define COLOR_SEDONA "#cc6600" +#define COLOR_DARK_BROWN "#917448" +#define COLOR_DEEP_SKY_BLUE "#00e1ff" +#define COLOR_LIME "#00ff00" +#define COLOR_TEAL "#33cccc" +#define COLOR_PALE_PINK "#bf89ba" +#define COLOR_YELLOW_GRAY "#c9a344" +#define COLOR_PALE_YELLOW "#c1bb7a" +#define COLOR_WARM_YELLOW "#b3863c" +#define COLOR_RED_GRAY "#aa5f61" +#define COLOR_BROWN "#b19664" +#define COLOR_GREEN_GRAY "#8daf6a" +#define COLOR_DARK_GREEN_GRAY "#54654c" +#define COLOR_BLUE_GRAY "#6a97b0" +#define COLOR_DARK_BLUE_GRAY "#3e4855" +#define COLOR_SUN "#ec8b2f" +#define COLOR_PURPLE_GRAY "#a2819e" +#define COLOR_BLUE_LIGHT "#33ccff" +#define COLOR_RED_LIGHT "#ff3333" +#define COLOR_BEIGE "#ceb689" +#define COLOR_BABY_BLUE "#89cff0" +#define COLOR_PALE_GREEN_GRAY "#aed18b" +#define COLOR_PALE_RED_GRAY "#cc9090" +#define COLOR_PALE_PURPLE_GRAY "#bda2ba" +#define COLOR_PALE_BLUE_GRAY "#8bbbd5" +#define COLOR_LUMINOL "#66ffff" +#define COLOR_SILVER "#c0c0c0" +#define COLOR_GRAY80 "#cccccc" +#define COLOR_OFF_WHITE "#eeeeee" +#define COLOR_GOLD "#6d6133" +#define COLOR_NT_RED "#9d2300" +#define COLOR_BOTTLE_GREEN "#1f6b4f" +#define COLOR_PALE_BTL_GREEN "#57967f" +#define COLOR_GUNMETAL "#545c68" +#define COLOR_WALL_GUNMETAL "#353a42" +#define COLOR_STEEL "#a8b0b2" +#define COLOR_MUZZLE_FLASH "#ffffb2" +#define COLOR_CHESTNUT "#996633" +#define COLOR_BEASTY_BROWN "#663300" +#define COLOR_WHEAT "#ffff99" +#define COLOR_CYAN_BLUE "#3366cc" +#define COLOR_LIGHT_CYAN "#66ccff" +#define COLOR_PAKISTAN_GREEN "#006600" +#define COLOR_HULL "#436b8e" +#define COLOR_AMBER "#ffbf00" +#define COLOR_COMMAND_BLUE "#46698c" +#define COLOR_SKY_BLUE "#5ca1cc" +#define COLOR_PALE_ORANGE "#b88a3b" +#define COLOR_CIVIE_GREEN "#b7f27d" +#define COLOR_TITANIUM "#d1e6e3" +#define COLOR_DARK_GUNMETAL "#4c535b" +#define COLOR_BRONZE "#8c7853" +#define COLOR_BRASS "#b99d71" +#define COLOR_INDIGO "#4b0082" +#define COLOR_ALUMINIUM "#bbbbbb" +#define COLOR_CRYSTAL "#00c8a5" +#define COLOR_ASTEROID_ROCK "#735555" +#define COLOR_NULLGLASS "#ff6088" +#define COLOR_DIAMOND "#d8d4ea" //FONTS: // Used by Paper and PhotoCopier (and PaperBin once a year). @@ -114,33 +186,6 @@ #define CHRISTMAS "Christmas" #define FRIDAY_13TH "Friday the 13th" -//Light color defs, for light-emitting things -//Some defs may be pure color- this is for neatness, and configurability. Changing #define COLOR_ is a bad idea. -#define LIGHT_COLOR_CYAN "#7BF9FF" -#define LIGHT_COLOR_PURE_CYAN "#00FFFF" - -#define LIGHT_COLOR_RED "#B40000" -#define LIGHT_COLOR_ORANGE "#FF9933" -#define LIGHT_COLOR_DARKRED "#A91515" -#define LIGHT_COLOR_PURE_RED "#FF0000" - -#define LIGHT_COLOR_GREEN "#00CC00" -#define LIGHT_COLOR_DARKGREEN "#50AB00" -#define LIGHT_COLOR_PURE_GREEN "#00FF00" - -#define LIGHT_COLOR_BLUE "#6496FA" //Cold, diluted blue. rgb(100, 150, 250) -#define LIGHT_COLOR_LIGHTBLUE "#0099FF" -#define LIGHT_COLOR_DARKBLUE "#315AB4" -#define LIGHT_COLOR_PURE_BLUE "#0000FF" - -#define LIGHT_COLOR_FADEDPURPLE "#A97FAA" -#define LIGHT_COLOR_PURPLE "#CD00CD" -#define LIGHT_COLOR_PINK "#FF33CC" - -#define LIGHT_COLOR_YELLOW "#E1E17D" //Dimmed yellow, leaning kaki. rgb(225, 225, 125) - -#define LIGHT_COLOR_WHITE "#FFFFFF" - #define RESIZE_DEFAULT_SIZE 1 //transfer_ai() defines. Main proc in ai_core.dm @@ -170,7 +215,12 @@ for(type in view(range, dview_mob)) #define END_FOR_DVIEW dview_mob.loc = null +//Turf locational stuff #define get_turf(A) (get_step(A, 0)) +#define NORTH_OF_TURF(T) locate(T.x, T.y + 1, T.z) +#define EAST_OF_TURF(T) locate(T.x + 1, T.y, T.z) +#define SOUTH_OF_TURF(T) locate(T.x, T.y - 1, T.z) +#define WEST_OF_TURF(T) locate(T.x - 1, T.y, T.z) #define MIN_SUPPLIED_LAW_NUMBER 15 #define MAX_SUPPLIED_LAW_NUMBER 50 @@ -208,33 +258,34 @@ #define MFOAM_IRON 2 //Human Overlays Indexes///////// -#define BODY_LAYER 37 -#define MUTANTRACE_LAYER 36 -#define TAIL_UNDERLIMBS_LAYER 35 //Tail split-rendering. -#define LIMBS_LAYER 34 -#define INTORGAN_LAYER 33 -#define MARKINGS_LAYER 32 -#define UNDERWEAR_LAYER 31 -#define MUTATIONS_LAYER 30 -#define H_DAMAGE_LAYER 29 -#define UNIFORM_LAYER 28 -#define ID_LAYER 27 -#define SHOES_LAYER 26 -#define GLOVES_LAYER 25 -#define EARS_LAYER 24 -#define SUIT_LAYER 23 -#define BELT_LAYER 22 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 21 -#define BACK_LAYER 20 -#define HEAD_ACCESSORY_LAYER 19 -#define FHAIR_LAYER 18 -#define GLASSES_LAYER 17 -#define HAIR_LAYER 16 //TODO: make part of head layer? -#define HEAD_ACC_OVER_LAYER 15 //Select-layer rendering. -#define FHAIR_OVER_LAYER 14 //Select-layer rendering. -#define GLASSES_OVER_LAYER 13 //Select-layer rendering. -#define TAIL_LAYER 12 //bs12 specific. this hack is probably gonna come back to haunt me -#define FACEMASK_LAYER 11 +#define BODY_LAYER 38 +#define MUTANTRACE_LAYER 37 +#define TAIL_UNDERLIMBS_LAYER 36 //Tail split-rendering. +#define LIMBS_LAYER 35 +#define INTORGAN_LAYER 34 +#define MARKINGS_LAYER 33 +#define UNDERWEAR_LAYER 32 +#define MUTATIONS_LAYER 31 +#define H_DAMAGE_LAYER 30 +#define UNIFORM_LAYER 29 +#define ID_LAYER 28 +#define SHOES_LAYER 27 +#define GLOVES_LAYER 26 +#define EARS_LAYER 25 +#define SUIT_LAYER 24 +#define BELT_LAYER 23 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 22 +#define BACK_LAYER 21 +#define HEAD_ACCESSORY_LAYER 20 +#define FHAIR_LAYER 19 +#define GLASSES_LAYER 18 +#define HAIR_LAYER 17 //TODO: make part of head layer? +#define HEAD_ACC_OVER_LAYER 16 //Select-layer rendering. +#define FHAIR_OVER_LAYER 15 //Select-layer rendering. +#define GLASSES_OVER_LAYER 14 //Select-layer rendering. +#define TAIL_LAYER 13 //bs12 specific. this hack is probably gonna come back to haunt me +#define FACEMASK_LAYER 12 +#define OVER_MASK_LAYER 11 //Select-layer rendering. #define HEAD_LAYER 10 #define COLLAR_LAYER 9 #define HANDCUFF_LAYER 8 @@ -245,7 +296,7 @@ #define FIRE_LAYER 3 //If you're on fire #define MISC_LAYER 2 #define FROZEN_LAYER 1 -#define TOTAL_LAYERS 37 +#define TOTAL_LAYERS 38 ///Access Region Codes/// #define REGION_ALL 0 @@ -303,7 +354,7 @@ #define TRIGGER_GUARD_NORMAL 1 // Macro to get the current elapsed round time, rather than total world runtime -#define ROUND_TIME (round_start_time ? (world.time - round_start_time) : 0) +#define ROUND_TIME (SSticker.round_start_time ? (world.time - SSticker.round_start_time) : 0) // Macro that returns true if it's too early in a round to freely ghost out #define TOO_EARLY_TO_GHOST (config && (ROUND_TIME < (config.round_abandon_penalty_period))) @@ -318,27 +369,12 @@ #define SHELTER_DEPLOY_BAD_AREA "bad area" #define SHELTER_DEPLOY_ANCHORED_OBJECTS "anchored objects" -// Client donator levels -#define DONATOR_LEVEL_NONE 0 -#define DONATOR_LEVEL_ONE 1 -#define DONATOR_LEVEL_TWO 2 +// Maximum donation level +#define DONATOR_LEVEL_MAX 4 // The cooldown on OOC messages such as OOC, LOOC, praying and adminhelps #define OOC_COOLDOWN 5 -// Medal names -#define BOSS_KILL_MEDAL "Killer" -#define ALL_KILL_MEDAL "Exterminator" //Killing all of x type - -// Score names -#define LEGION_SCORE "Legion Killed" -#define COLOSSUS_SCORE "Colossus Killed" -#define BUBBLEGUM_SCORE "Bubblegum Killed" -#define DRAKE_SCORE "Drakes Killed" -#define BIRD_SCORE "Hierophants Killed" -#define BOSS_SCORE "Bosses Killed" -#define TENDRIL_CLEAR_SCORE "Tendrils Killed" - // The number of station goals generated each round. #define STATION_GOAL_BUDGET 1 @@ -367,7 +403,7 @@ #define INVESTIGATE_BOMB "bombs" // The SQL version required by this version of the code -#define SQL_VERSION 5 +#define SQL_VERSION 8 // Vending machine stuff #define CAT_NORMAL 1 @@ -394,4 +430,59 @@ // Defib stats #define DEFIB_TIME_LIMIT 120 -#define DEFIB_TIME_LOSS 60 \ No newline at end of file +#define DEFIB_TIME_LOSS 60 + +//different types of atom colorations +#define ADMIN_COLOUR_PRIORITY 1 //only used by rare effects like greentext coloring mobs and when admins varedit color +#define TEMPORARY_COLOUR_PRIORITY 2 //e.g. purple effect of the revenant on a mob, black effect when mob electrocuted +#define WASHABLE_COLOUR_PRIORITY 3 //color splashed onto an atom (e.g. paint on turf) +#define FIXED_COLOUR_PRIORITY 4 //color inherent to the atom (e.g. blob color) +#define COLOUR_PRIORITY_AMOUNT 4 //how many priority levels there are. + +//Ruin Generation + +#define SPACERUIN_MAP_EDGE_PAD 15 +#define PLACEMENT_TRIES 100 //How many times we try to fit the ruin somewhere until giving up (really should just swap to some packing algo) + +#define PLACE_DEFAULT "random" +#define PLACE_SAME_Z "same" +#define PLACE_SPACE_RUIN "space" +#define PLACE_LAVA_RUIN "lavaland" + +//Cleaning tool strength +// 1 is also a valid cleaning strength but completely unused so left undefined +#define CLEAN_WEAK 2 +#define CLEAN_MEDIUM 3 // Acceptable tools +#define CLEAN_STRONG 4 // Industrial strength +#define CLEAN_IMPRESSIVE 5 // Cleaning strong enough your granny would be proud +#define CLEAN_GOD 6 // Cleans things spotless down to the atomic structure + +//Ghost orbit types: +#define GHOST_ORBIT_CIRCLE "circle" +#define GHOST_ORBIT_TRIANGLE "triangle" +#define GHOST_ORBIT_HEXAGON "hexagon" +#define GHOST_ORBIT_SQUARE "square" +#define GHOST_ORBIT_PENTAGON "pentagon" + +//Explosive wall groups +#define EXPLOSIVE_WALL_GROUP_SYNDICATE_BASE "syndicate_base" + +// Filters +#define FILTER_AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA") + +//Fullscreen overlay resolution in tiles. +#define FULLSCREEN_OVERLAY_RESOLUTION_X 15 +#define FULLSCREEN_OVERLAY_RESOLUTION_Y 15 + +//suit sensors: sensor_mode defines +#define SENSOR_OFF 0 +#define SENSOR_LIVING 1 +#define SENSOR_VITALS 2 +#define SENSOR_COORDS 3 + +// Cult summon possibilities +#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/mobs.dm b/code/__DEFINES/mobs.dm index 0f05c08b2f7..284b0e4d745 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -94,6 +94,13 @@ #define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY|APPEARANCE_ALT_HEAD #define APPEARANCE_ALL 32767 +//If you add a new status, be sure to add a list for it to the simple_animals global in _globalvars/lists/mobs.dm +//Hostile Mob AI Status +#define AI_ON 1 +#define AI_IDLE 2 +#define AI_OFF 3 +#define AI_Z_OFF 4 + // Intents #define INTENT_HELP "help" #define INTENT_DISARM "disarm" diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index f8f9609aced..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 @@ -28,8 +29,15 @@ #define CHAT_NO_TICKETLOGS 65536 #define UI_DARKMODE 131072 #define DISABLE_KARMA 262144 +#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_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC) + +#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/__DEFINES/process_scheduler.dm b/code/__DEFINES/process_scheduler.dm deleted file mode 100644 index c6c3722d49f..00000000000 --- a/code/__DEFINES/process_scheduler.dm +++ /dev/null @@ -1,34 +0,0 @@ -// Process status defines -#define PROCESS_STATUS_IDLE 1 -#define PROCESS_STATUS_QUEUED 2 -#define PROCESS_STATUS_RUNNING 3 -#define PROCESS_STATUS_MAYBE_HUNG 4 -#define PROCESS_STATUS_PROBABLY_HUNG 5 -#define PROCESS_STATUS_HUNG 6 - -// Process time thresholds -#define PROCESS_DEFAULT_HANG_WARNING_TIME 300 // 30 seconds -#define PROCESS_DEFAULT_HANG_ALERT_TIME 600 // 60 seconds -#define PROCESS_DEFAULT_HANG_RESTART_TIME 900 // 90 seconds -#define PROCESS_DEFAULT_SCHEDULE_INTERVAL 50 // 50 ticks -#define PROCESS_DEFAULT_SLEEP_INTERVAL 20 // 20% of a tick -#define PROCESS_DEFAULT_DEFER_USAGE 90 // 90% of a tick - -// Sleep check macro -#define SCHECK if(world.tick_usage >= next_sleep_usage) defer() - -//Timing Controller -#define GLOBAL_PROC "some_magic_bullshit" - -#define DECLARE_GLOBAL_CONTROLLER(PROCESS,VARNAME) \ -/datum/controller/process/##PROCESS/assertGlobality(){\ - if(##VARNAME){\ - message_admins("Controller '[name]' tried to become global but found another controller there already. Deleting the old controller.");\ - qdel(##VARNAME);}\ - ##VARNAME = src;}\ -\ -/datum/controller/process/##PROCESS/releaseGlobality(){\ - if(##VARNAME == src)\ - ##VARNAME = null;\ - else\ - message_admins("Controller '[name]' asked to release global control in spite of not having it!");} diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm new file mode 100644 index 00000000000..e49a9ea9b67 --- /dev/null +++ b/code/__DEFINES/radio.dm @@ -0,0 +1,60 @@ + +#define DISPLAY_FREQ 1435 //status displays +#define ATMOS_FIRE_FREQ 1437 //air alarms +#define ENGINE_FREQ 1438 //engine components +#define ATMOS_VENTSCRUB 1439 //vents, scrubbers, atmos control +#define ATMOS_DISTRO_FREQ 1443 //distro loop +#define ATMOS_TANKS_FREQ 1441 //atmos supply tanks +#define BOT_BEACON_FREQ 1445 //bot navigation beacons +#define AIRLOCK_FREQ 1449 //airlock controls, electropack, magnets + +#define RSD_FREQ 1457 //radio signal device +#define IMPL_FREQ 1451 //tracking implant + +#define RADIO_LOW_FREQ 1200 //minimum radio freq +#define PUBLIC_LOW_FREQ 1441 //minimum radio chat freq +#define PUBLIC_HIGH_FREQ 1489 //maximum radio chat freq +#define RADIO_HIGH_FREQ 1600 //maximum radio freq + +#define SYND_FREQ 1213 +#define SYNDTEAM_FREQ 1244 +#define DTH_FREQ 1341 //Special Operations +#define AI_FREQ 1343 +#define ERT_FREQ 1345 +#define COMM_FREQ 1353 //Command +#define BOT_FREQ 1447 //mulebot, secbot, ed209 + + +// Department channels +#define PUB_FREQ 1459 //standard radio chat +#define SEC_FREQ 1359 //security +#define ENG_FREQ 1357 //engineering +#define SCI_FREQ 1351 //science +#define MED_FREQ 1355 //medical +#define SUP_FREQ 1347 //cargo +#define SRV_FREQ 1349 //service + +// Internal department channels +#define MED_I_FREQ 1485 +#define SEC_I_FREQ 1475 + +// Transmission methods +#define TRANSMISSION_WIRE 0 +#define TRANSMISSION_RADIO 1 + +//This filter is special because devices belonging to default also recieve signals sent to any other filter. +#define RADIO_DEFAULT "radio_default" +#define RADIO_TO_AIRALARM "radio_airalarm" //air alarms +#define RADIO_FROM_AIRALARM "radio_airalarm_rcvr" //devices interested in recieving signals from air alarms +#define RADIO_CHAT "radio_telecoms" +#define RADIO_ATMOSIA "radio_atmos" +#define RADIO_NAVBEACONS "radio_navbeacon" +#define RADIO_AIRLOCK "radio_airlock" +#define RADIO_SECBOT "radio_secbot" +#define RADIO_HONKBOT "radio_honkbot" +#define RADIO_MULEBOT "radio_mulebot" +#define RADIO_CLEANBOT "10" +#define RADIO_FLOORBOT "11" +#define RADIO_MEDBOT "12" +#define RADIO_MAGNETS "radio_magnet" +#define RADIO_LOGIC "radio_logic" diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 65372fed1c8..34ad4d69e54 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -43,6 +43,7 @@ #define ROLE_DRONE "drone" #define ROLE_DEATHSQUAD "deathsquad" #define ROLE_EVENTMISC "eventmisc" +#define ROLE_GHOST "ghost role" //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //The gamemode specific ones are just so the gamemodes can query whether a player is old enough diff --git a/code/__DEFINES/rolebans.dm b/code/__DEFINES/rolebans.dm index b2eb79e26be..d6e54abf14a 100644 --- a/code/__DEFINES/rolebans.dm +++ b/code/__DEFINES/rolebans.dm @@ -25,6 +25,7 @@ var/global/list/other_roles = list( ROLE_SENTIENT, ROLE_NYMPH, ROLE_ERT, + ROLE_GHOST, "AntagHUD", "Records" ) diff --git a/code/__DEFINES/snpc.dm b/code/__DEFINES/snpc.dm deleted file mode 100644 index 8d4768005cd..00000000000 --- a/code/__DEFINES/snpc.dm +++ /dev/null @@ -1,23 +0,0 @@ -#define SNPC_MAX_RANGE_FIND 32 -#define SNPC_MIN_RANGE_FIND 16 -#define SNPC_FUZZY_CHANCE_HIGH 85 -#define SNPC_FUZZY_CHANCE_LOW 50 -#define SNPC_CHANCE_TALK 15 - -#define SNPC_BRUTE 1 -#define SNPC_STEALTH 2 -#define SNPC_MARTYR 3 -#define SNPC_PSYCHO 4 - -#define SNPC_INTERACTING 2 -#define SNPC_TRAVEL 4 -#define SNPC_FIGHTING 8 -#define SNPC_SPECIAL 16 - -#define TRAIT_ROBUST 2 -#define TRAIT_UNROBUST 4 -#define TRAIT_SMART 8 -#define TRAIT_DUMB 16 -#define TRAIT_MEAN 32 -#define TRAIT_FRIENDLY 64 -#define TRAIT_THIEVING 128 \ No newline at end of file diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index b492e91ece5..e5d5bb723c1 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -14,6 +14,7 @@ #define STATUS_EFFECT_SHADOW_MEND /datum/status_effect/shadow_mend //Quick, powerful heal that deals damage afterwards. Heals 15 brute/burn every second for 3 seconds. #define STATUS_EFFECT_VOID_PRICE /datum/status_effect/void_price //The price of healing yourself with void energy. Deals 3 brute damage every 3 seconds for 30 seconds. +#define STATUS_EFFECT_EXERCISED /datum/status_effect/exercised //Prevents heart disease //#define STATUS_EFFECT_VANGUARD /datum/status_effect/vanguard_shield //Grants temporary stun absorption, but will stun the user based on how many stuns they absorbed. //#define STATUS_EFFECT_INATHNEQS_ENDOWMENT /datum/status_effect/inathneqs_endowment //A 15-second invulnerability and stun absorption, granted by Inath-neq. @@ -53,7 +54,7 @@ //#define STATUS_EFFECT_CRUSHERMARK /datum/status_effect/crusher_mark //if struck with a proto-kinetic crusher, takes a ton of damage -//#define STATUS_EFFECT_SAWBLEED /datum/status_effect/saw_bleed //if the bleed builds up enough, takes a ton of damage +#define STATUS_EFFECT_SAWBLEED /datum/status_effect/saw_bleed //if the bleed builds up enough, takes a ton of damage //#define STATUS_EFFECT_NECROPOLIS_CURSE /datum/status_effect/necropolis_curse //#define CURSE_BLINDING 1 //makes the edges of the target's screen obscured diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 5ade3b0baef..29a93ae94f9 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -61,6 +61,8 @@ #define INIT_ORDER_LANGUAGE 6 #define INIT_ORDER_MACHINES 5 #define INIT_ORDER_CIRCUIT 4 +#define INIT_ORDER_HOLIDAY 3 +#define INIT_ORDER_ALARMS 2 #define INIT_ORDER_TIMER 1 #define INIT_ORDER_DEFAULT 0 #define INIT_ORDER_AIR -1 diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index e7f5262db1f..65fc87c3b34 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -150,7 +150,7 @@ // A logging proc that only outputs after setup is done, to // help devs test initialization stuff that happens a lot /proc/log_after_setup(var/message) - if(ticker && ticker.current_state > GAME_STATE_SETTING_UP) + if(SSticker && SSticker.current_state > GAME_STATE_SETTING_UP) to_chat(world, "[message]") log_world(message) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index c7c3bbf5256..abd9aeb5a03 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -19,6 +19,12 @@ return A return 0 +/proc/get_location_name(atom/X, format_text = FALSE) + var/area/A = isarea(X) ? X : get_area(X) + if(!A) + return null + return format_text ? format_text(A.name) : A.name + /proc/get_areas_in_range(dist=0, atom/center=usr) if(!dist) var/turf/T = get_turf(center) @@ -442,7 +448,7 @@ /proc/SecondsToTicks(var/seconds) return seconds * 10 -proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time = 300, ignore_respawnability = 0, min_hours = 0, flashwindow = TRUE, check_antaghud = TRUE) +proc/pollCandidates(Question, be_special_type, antag_age_check = FALSE, poll_time = 300, ignore_respawnability = FALSE, min_hours = 0, flashwindow = TRUE, check_antaghud = TRUE) var/roletext = be_special_type ? get_roletext(be_special_type) : null var/list/mob/dead/observer/candidates = list() var/time_passed = world.time diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 5b830a72b9f..dc2b2e4ec0a 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -28,7 +28,6 @@ init_datum_subtypes(/datum/job, GLOB.joblist, list(/datum/job/ai, /datum/job/cyborg), "title") init_datum_subtypes(/datum/superheroes, GLOB.all_superheroes, null, "name") - init_datum_subtypes(/datum/nations, GLOB.all_nations, null, "default_name") init_datum_subtypes(/datum/language, GLOB.all_languages, null, "name") for(var/language_name in GLOB.all_languages) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 2db8621195d..11c86940b75 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -114,17 +114,13 @@ return if(QDELETED(A)) return - if((A.smooth & SMOOTH_TRUE) || (A.smooth & SMOOTH_MORE)) + if(A.smooth & (SMOOTH_TRUE | SMOOTH_MORE)) var/adjacencies = calculate_adjacencies(A) if(A.smooth & SMOOTH_DIAGONAL) A.diagonal_smooth(adjacencies) else cardinal_smooth(A, adjacencies) - if(A.smooth & SMOOTH_DIAGONAL) - A.diagonal_smooth(adjacencies) - else - cardinal_smooth(A, adjacencies) /atom/proc/diagonal_smooth(adjacencies) switch(adjacencies) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 04fc2c6f73c..ed4f3242c4d 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -634,164 +634,214 @@ The _flatIcons list is a cache for generated icon files. */ // Creates a single icon from a given /atom or /image. Only the first argument is required. -/proc/getFlatIcon(image/A, defdir=2, deficon=null, defstate="", defblend=BLEND_DEFAULT) - // We start with a blank canvas, otherwise some icon procs crash silently - var/icon/flat = icon('icons/effects/effects.dmi', "icon_state"="nothing") // Final flattened icon - if(!A) - return flat - if(A.alpha <= 0) - return flat +/proc/getFlatIcon(image/A, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE) + //Define... defines. + var/static/icon/flat_template = icon('icons/effects/effects.dmi', "nothing") + + #define BLANK icon(flat_template) + #define SET_SELF(SETVAR) do { \ + var/icon/SELF_ICON=icon(icon(curicon, curstate, base_icon_dir),"",SOUTH,no_anim?1:null); \ + if(A.alpha<255) { \ + SELF_ICON.Blend(rgb(255,255,255,A.alpha),ICON_MULTIPLY);\ + } \ + if(A.color) { \ + if(islist(A.color)){ \ + SELF_ICON.MapColors(arglist(A.color))} \ + else{ \ + SELF_ICON.Blend(A.color,ICON_MULTIPLY)} \ + } \ + ##SETVAR=SELF_ICON;\ + } while (0) + #define INDEX_X_LOW 1 + #define INDEX_X_HIGH 2 + #define INDEX_Y_LOW 3 + #define INDEX_Y_HIGH 4 + + #define flatX1 flat_size[INDEX_X_LOW] + #define flatX2 flat_size[INDEX_X_HIGH] + #define flatY1 flat_size[INDEX_Y_LOW] + #define flatY2 flat_size[INDEX_Y_HIGH] + #define addX1 add_size[INDEX_X_LOW] + #define addX2 add_size[INDEX_X_HIGH] + #define addY1 add_size[INDEX_Y_LOW] + #define addY2 add_size[INDEX_Y_HIGH] + + if(!A || A.alpha <= 0) + return BLANK + var/noIcon = FALSE + if(start) + if(!defdir) + defdir = A.dir + if(!deficon) + deficon = A.icon + if(!defstate) + defstate = A.icon_state + if(!defblend) + defblend = A.blend_mode - var/curicon - if(A.icon) - curicon = A.icon - else - curicon = deficon + var/curicon = A.icon || deficon + var/curstate = A.icon_state || defstate - if(!curicon) - noIcon = TRUE // Do not render this object. - - var/curstate - if(A.icon_state) - curstate = A.icon_state - else - curstate = defstate - - if(!noIcon && !(curstate in icon_states(curicon))) - if("" in icon_states(curicon)) - curstate = "" - else - noIcon = TRUE // Do not render this object. + if(!((noIcon = (!curicon)))) + var/curstates = icon_states(curicon) + if(!(curstate in curstates)) + if("" in curstates) + curstate = "" + else + noIcon = TRUE // Do not render this object. var/curdir - if(A.dir != 2) - curdir = A.dir - else + var/base_icon_dir //We'll use this to get the icon state to display if not null BUT NOT pass it to overlays as the dir we have + + //These should use the parent's direction (most likely) + if(!A.dir || A.dir == SOUTH) curdir = defdir - - var/curblend - if(A.blend_mode == BLEND_DEFAULT) - curblend = defblend else - curblend = A.blend_mode + curdir = A.dir - // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed - var/list/layers = list() - var/image/copy - // Add the atom's icon itself, without pixel_x/y offsets. - if(!noIcon) - copy = image(icon=curicon, icon_state=curstate, layer=A.layer, dir=curdir) - copy.color = A.color - copy.alpha = A.alpha - copy.blend_mode = curblend - layers[copy] = A.layer - - // Loop through the underlays, then overlays, sorting them into the layers list - var/list/process = A.underlays // Current list being processed - var/pSet=0 // Which list is being processed: 0 = underlays, 1 = overlays - var/curIndex=1 // index of 'current' in list being processed - var/current // Current overlay being sorted - var/currentLayer // Calculated layer that overlay appears on (special case for FLOAT_LAYER) - var/compare // The overlay 'add' is being compared against - var/cmpIndex // The index in the layers list of 'compare' - while(TRUE) - if(curIndex<=process.len) - current = process[curIndex] - if(!current) - curIndex++ //Skip this bad layer item - continue - currentLayer = current:layer - if(currentLayer<0) // Special case for FLY_LAYER - if(currentLayer <= -1000) return flat - if(pSet == 0) // Underlay - currentLayer = A.layer+currentLayer/1000 - else // Overlay - currentLayer = A.layer+(1000+currentLayer)/1000 - - // Sort add into layers list - for(cmpIndex=1,cmpIndex<=layers.len,cmpIndex++) - compare = layers[cmpIndex] - if(currentLayer < layers[compare]) // Associated value is the calculated layer - layers.Insert(cmpIndex,current) - layers[current] = currentLayer - break - if(cmpIndex>layers.len) // Reached end of list without inserting - layers[current]=currentLayer // Place at end - - curIndex++ - - if(curIndex>process.len) - if(pSet == 0) // Switch to overlays - curIndex = 1 - pSet = 1 - process = A.overlays - else // All done + //Try to remove/optimize this section ASAP, CPU hog. + //Determines if there's directionals. + if(!noIcon && curdir != SOUTH) + var/exist = FALSE + var/static/list/checkdirs = list(NORTH, EAST, WEST) + for(var/i in checkdirs) //Not using GLOB for a reason. + if(length(icon_states(icon(curicon, curstate, i)))) + exist = TRUE break + if(!exist) + base_icon_dir = SOUTH + // - var/icon/add // Icon of overlay being added + if(!base_icon_dir) + base_icon_dir = curdir + + ASSERT(!BLEND_DEFAULT) //I might just be stupid but lets make sure this define is 0. + + var/curblend = A.blend_mode || defblend + + if(A.overlays.len || A.underlays.len) + var/icon/flat = BLANK + // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed + var/list/layers = list() + var/image/copy + // Add the atom's icon itself, without pixel_x/y offsets. + if(!noIcon) + copy = image(icon=curicon, icon_state=curstate, layer=A.layer, dir=base_icon_dir) + copy.color = A.color + copy.alpha = A.alpha + copy.blend_mode = curblend + layers[copy] = A.layer + + // Loop through the underlays, then overlays, sorting them into the layers list + for(var/process_set in 0 to 1) + var/list/process = process_set? A.overlays : A.underlays + for(var/i in 1 to process.len) + var/image/current = process[i] + if(!current) + continue + if(current.plane != FLOAT_PLANE && current.plane != A.plane) + continue + var/current_layer = current.layer + if(current_layer < 0) + if(current_layer <= -1000) + return flat + current_layer = process_set + A.layer + current_layer / 1000 + + for(var/p in 1 to layers.len) + var/image/cmp = layers[p] + if(current_layer < layers[cmp]) + layers.Insert(p, current) + break + layers[current] = current_layer + + //sortTim(layers, /proc/cmp_image_layer_asc) + + var/icon/add // Icon of overlay being added // Current dimensions of flattened icon - var/{flatX1=1;flatX2=flat.Width();flatY1=1;flatY2=flat.Height()} + var/list/flat_size = list(1, flat.Width(), 1, flat.Height()) // Dimensions of overlay being added - var/{addX1;addX2;addY1;addY2} + var/list/add_size[4] - for(var/I in layers) + for(var/V in layers) + var/image/I = V + if(I.alpha == 0) + continue - if(I:alpha == 0) - continue + if(I == copy) // 'I' is an /image based on the object being flattened. + curblend = BLEND_OVERLAY + add = icon(I.icon, I.icon_state, base_icon_dir) + else // 'I' is an appearance object. + add = getFlatIcon(image(I), curdir, curicon, curstate, curblend, FALSE, no_anim) + if(!add) + continue + // Find the new dimensions of the flat icon to fit the added overlay + add_size = list( + min(flatX1, I.pixel_x+1), + max(flatX2, I.pixel_x+add.Width()), + min(flatY1, I.pixel_y+1), + max(flatY2, I.pixel_y+add.Height()) + ) - if(I == copy) // 'I' is an /image based on the object being flattened. - curblend = BLEND_OVERLAY - add = icon(I:icon, I:icon_state, I:dir) - // This checks for a silent failure mode of the icon routine. If the requested dir - // doesn't exist in this icon state it returns a 32x32 icon with 0 alpha. - if(I:dir != SOUTH && add.Width() == 32 && add.Height() == 32) - // Check every pixel for blank (computationally expensive, but the process is limited - // by the amount of film on the station, only happens when we hit something that's - // turned, and bails at the very first pixel it sees. - var/blankpixel; - for(var/y;y<=32;y++) - for(var/x;x<32;x++) - blankpixel = isnull(add.GetPixel(x,y)) - if(!blankpixel) - break - if(!blankpixel) - break - // If we ALWAYS returned a null (which happens when GetPixel encounters something with alpha 0) - if(blankpixel) - // Pull the default direction. - add = icon(I:icon, I:icon_state) - else // 'I' is an appearance object. - add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend) + if(flat_size ~! add_size) + // Resize the flattened icon so the new icon fits + flat.Crop( + addX1 - flatX1 + 1, + addY1 - flatY1 + 1, + addX2 - flatX1 + 1, + addY2 - flatY1 + 1 + ) + flat_size = add_size.Copy() - // Find the new dimensions of the flat icon to fit the added overlay - addX1 = min(flatX1, I:pixel_x+1) - addX2 = max(flatX2, I:pixel_x+add.Width()) - addY1 = min(flatY1, I:pixel_y+1) - addY2 = max(flatY2, I:pixel_y+add.Height()) + // Blend the overlay into the flattened icon + flat.Blend(add, blendMode2iconMode(curblend), I.pixel_x + 2 - flatX1, I.pixel_y + 2 - flatY1) - if(addX1!=flatX1 || addX2!=flatX2 || addY1!=flatY1 || addY2!=flatY2) - // Resize the flattened icon so the new icon fits - flat.Crop(addX1-flatX1+1, addY1-flatY1+1, addX2-flatX1+1, addY2-flatY1+1) - flatX1=addX1;flatX2=addX2 - flatY1=addY1;flatY2=addY2 + if(A.color) + if(islist(A.color)) + flat.MapColors(arglist(A.color)) + else + flat.Blend(A.color, ICON_MULTIPLY) - // Blend the overlay into the flattened icon - flat.Blend(add, blendMode2iconMode(curblend), I:pixel_x + 2 - flatX1, I:pixel_y + 2 - flatY1) + if(A.alpha < 255) + flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY) - if(A.color) - flat.Blend(A.color, ICON_MULTIPLY) - if(A.alpha < 255) - flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY) + if(no_anim) + //Clean up repeated frames + var/icon/cleaned = new /icon() + cleaned.Insert(flat, "", SOUTH, 1, 0) + . = cleaned + else + . = icon(flat, "", SOUTH) + else //There's no overlays. + if(!noIcon) + SET_SELF(.) - return icon(flat, "", SOUTH) + //Clear defines + #undef flatX1 + #undef flatX2 + #undef flatY1 + #undef flatY2 + #undef addX1 + #undef addX2 + #undef addY1 + #undef addY2 + + #undef INDEX_X_LOW + #undef INDEX_X_HIGH + #undef INDEX_Y_LOW + #undef INDEX_Y_HIGH + + #undef BLANK + #undef SET_SELF /proc/getIconMask(atom/A)//By yours truly. Creates a dynamic mask for a mob/whatever. /N var/icon/alpha_mask = new(A.icon,A.icon_state)//So we want the default icon and icon state of A. - for(var/I in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. - if(I:layer>A.layer) continue//If layer is greater than what we need, skip it. - var/icon/image_overlay = new(I:icon,I:icon_state)//Blend only works with icon objects. + for(var/V in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. + var/image/I = V + if(I.layer>A.layer) + continue//If layer is greater than what we need, skip it. + var/icon/image_overlay = new(I.icon,I.icon_state)//Blend only works with icon objects. //Also, icons cannot directly set icon_state. Slower than changing variables but whatever. alpha_mask.Blend(image_overlay,ICON_OR)//OR so they are lumped together in a nice overlay. return alpha_mask//And now return the mask. diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index f1e6f38a2d4..9e01753d492 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -124,9 +124,13 @@ . += A //Like typesof() or subtypesof(), but returns a typecache instead of a list -/proc/typecacheof(path, ignore_root_path) +/proc/typecacheof(path, ignore_root_path, only_root_path = FALSE) if(ispath(path)) - var/list/types = ignore_root_path ? subtypesof(path) : typesof(path) + var/list/types = list() + if(only_root_path) + types = list(path) + else + types = ignore_root_path ? subtypesof(path) : typesof(path) var/list/L = list() for(var/T in types) L[T] = TRUE @@ -140,8 +144,11 @@ L[T] = TRUE else for(var/P in pathlist) - for(var/T in typesof(P)) - L[T] = TRUE + if(only_root_path) + L[P] = TRUE + else + for(var/T in typesof(P)) + L[T] = TRUE return L //Removes any null entries from the list @@ -346,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/mobs.dm b/code/__HELPERS/mobs.dm index fd5fd510e40..aaf33820840 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -298,8 +298,12 @@ This is always put in the attack log. loglevel = ATKLOG_FEW else if(istype(user) && !user.ckey && !target.ckey) // Attacks between NPCs are only shown to admins with ATKLOG_ALL loglevel = ATKLOG_ALL - else if(!target.ckey) // Attacks by players on NPCs are only shown to admins with ATKLOG_ALL or ATKLOG_ALMOSTALL + else if(!user.ckey || !target.ckey) // Player v NPC combat is de-prioritized. loglevel = ATKLOG_ALMOSTALL + else + var/area/A = get_area(target) + if(A && A.hide_attacklogs) + loglevel = ATKLOG_ALMOSTALL msg_admin_attack("[key_name_admin(user)] vs [key_name_admin(target)]: [what_done]", loglevel) @@ -491,7 +495,7 @@ GLOBAL_LIST_INIT(do_after_once_tracker, list()) to_chat(user, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];") to_chat(user, "Location = [location_description];") to_chat(user, "[special_role_description]") - to_chat(user, "(PM) ([ADMIN_PP(M,"PP")]) ([ADMIN_VV(M,"VV")]) ([ADMIN_SM(M,"SM")]) ([ADMIN_FLW(M,"FLW")]) (CA)") + to_chat(user, "(PM) ([ADMIN_PP(M,"PP")]) ([ADMIN_VV(M,"VV")]) ([ADMIN_SM(M,"SM")]) ([ADMIN_FLW(M,"FLW")]) (CA)") // Gets the first mob contained in an atom, and warns the user if there's not exactly one /proc/get_mob_in_atom_with_warning(atom/A, mob/user = usr) diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 930a8ee9de5..d5a1ad8cbfd 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -49,10 +49,10 @@ var/religion_name = null name = "" // Prefix - for(var/holiday_name in holiday_master.holidays) + for(var/holiday_name in SSholiday.holidays) if(holiday_name == "Friday the 13th") random = 13 - var/datum/holiday/holiday = holiday_master.holidays[holiday_name] + var/datum/holiday/holiday = SSholiday.holidays[holiday_name] name = holiday.getStationPrefix() //get normal name if(!name) @@ -112,8 +112,8 @@ var/syndicate_name = null //Traitors and traitor silicons will get these. Revs will not. -var/syndicate_code_phrase//Code phrase for traitors. -var/syndicate_code_response//Code response for traitors. +GLOBAL_VAR(syndicate_code_phrase) //Code phrase for traitors. +GLOBAL_VAR(syndicate_code_response) //Code response for traitors. /* Should be expanded. @@ -161,12 +161,8 @@ var/syndicate_code_response//Code response for traitors. if(1)//1 and 2 can only be selected once each to prevent more than two specific names/places/etc. switch(rand(1,2))//Mainly to add more options later. if(1) - if(names.len&&prob(70)) + if(names.len) code_phrase += pick(names) - else - code_phrase += pick(pick(GLOB.first_names_male,GLOB.first_names_female)) - code_phrase += " " - code_phrase += pick(GLOB.last_names) if(2) code_phrase += pick(GLOB.joblist)//Returns a job. safety -= 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/text.dm b/code/__HELPERS/text.dm index 9dd3c870d51..08af11a128c 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -28,6 +28,11 @@ /* * Text sanitization */ +// Can be used almost the same way as normal input for text +/proc/clean_input(Message, Title, Default, mob/user=usr) + var/txt = input(user, Message, Title, Default) as text | null + if(txt) + return html_encode(txt) //Simply removes < and > and limits the length of the message /proc/strip_html_simple(var/t,var/limit=MAX_MESSAGE_LEN) @@ -109,10 +114,26 @@ else return trim(html_encode(name), max_length) //trim is "outside" because html_encode can expand single symbols into multiple symbols (such as turning < into <) +// Uses client.typing to check if the popup should appear or not +/proc/typing_input(mob/user, message = "", title = "", default = "") + if(user.client.checkTyping()) // Prevent double windows + return null + var/client/C = user.client // Save it in a var in case the client disconnects from the mob + C.typing = TRUE + var/msg = input(user, message, title, default) as text|null + if(!C) + return null + C.typing = FALSE + if(!user || C != user.client) // User got out of the mob for some reason or the mob is gone + return null + return msg + //Filters out undesirable characters from names /proc/reject_bad_name(var/t_in, var/allow_numbers=0, var/max_length=MAX_NAME_LEN) + // Decode so that names with characters like < are still rejected. Will be encoded again at the end + t_in = html_decode(t_in) if(!t_in || length(t_in) > max_length) - return //Rejects the input if it is null or if it is longer then the max length allowed + return //Rejects the input if it is null or if it is longer than the max length allowed var/number_of_alphanumeric = 0 var/last_char_group = 0 @@ -171,7 +192,7 @@ for(var/bad_name in list("space","floor","wall","r-wall","monkey","unknown","inactive ai","plating")) //prevents these common metagamey names if(cmptext(t_out,bad_name)) return //(not case sensitive) - return t_out + return html_encode(t_out) //checks text for html tags //if tag is not in whitelist (var/list/paper_tag_whitelist in global.dm) @@ -524,6 +545,43 @@ proc/checkhtml(var/t) text = copytext(text, 1, MAX_PAPER_MESSAGE_LEN) return text +/proc/convert_pencode_arg(text, tag, arg) + arg = sanitize_simple(html_encode(arg), list("''"="","\""="", "?"="")) + // https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html#rule-4---css-escape-and-strictly-validate-before-inserting-untrusted-data-into-html-style-property-values + var/list/style_attacks = list("javascript:", "expression", "byond:", "file:") + + for(var/style_attack in style_attacks) + if(findtext(arg, style_attack)) + // Do not attempt to render dangerous things + return text + + if(tag == "class") + return "" + + if(tag == "style") + return "" + + if(tag == "img") + var/list/img_props = splittext(arg, ";") + if(img_props.len == 3) + return "" + if(img_props.len == 2) + return "" + return "" + + return text + +/proc/admin_pencode_to_html() + var/text = pencode_to_html(arglist(args)) + var/regex/R = new(@"\[(.*?) (.*?)\]", "ge") + text = R.Replace(text, /proc/convert_pencode_arg) + + text = replacetext(text, "\[/class\]", "") + text = replacetext(text, "\[/style\]", "") + text = replacetext(text, "\[/img\]", "") + + return text + /proc/html_to_pencode(text) text = replacetext(text, "
", "\n") text = replacetext(text, "
", "\[center\]") diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 54fd47a220d..d13bf08c58b 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -35,7 +35,7 @@ * If you want to display the canonical station "time" (aka the in-character time of the station) use station_time_timestamp */ /proc/classic_worldtime2text(time = world.time) - time = (round_start_time ? (time - round_start_time) : (time - world.time)) + time = (SSticker.round_start_time ? (time - SSticker.round_start_time) : (time - world.time)) return "[round(time / 36000)+12]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]" //Returns the world time in english @@ -59,7 +59,7 @@ - You can use this, for example, to do "This will expire at [station_time_at(world.time + 500)]" to display a "station time" expiration date which is much more useful for a player)*/ /proc/station_time(time=world.time, display_only=FALSE) - return ((((time - round_start_time)) + GLOB.gametime_offset) % 864000) - (display_only ? GLOB.timezoneOffset : 0) + return ((((time - SSticker.round_start_time)) + GLOB.gametime_offset) % 864000) - (display_only ? GLOB.timezoneOffset : 0) /proc/station_time_timestamp(format = "hh:mm:ss", time=world.time) return time2text(station_time(time, TRUE), format) 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 287de3fb424..10759fe336a 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1,2056 +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(var/turf/T) - var/cant_pass = 0 - if(T.density) cant_pass = 1 - for(var/atom/A in T) - if(A.density)//&&A.anchored - cant_pass = 1 - return cant_pass - -/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(/turf/space) - - 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/rotate_icon(file, state, step = 1, aa = FALSE) - var icon/base = icon(file, state) - - var w, h, w2, h2 - - if(aa) - aa++ - w = base.Width() - w2 = w * aa - h = base.Height() - h2 = h * aa - - var icon{result = icon(base); temp} - - for(var/angle in 0 to 360 step step) - if(angle == 0 ) continue - if(angle == 360) continue - temp = icon(base) - if(aa) temp.Scale(w2, h2) - temp.Turn(angle) - if(aa) temp.Scale(w, h) - result.Insert(temp, "[angle]") - - return result - -/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 0 - return 1 - -/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. -/proc/stoplag() - . = 1 - sleep(world.tick_lag) - if(world.tick_usage > TICK_LIMIT_TO_RUN) //woke up, still not enough tick, sleep for more. - . += 2 - sleep(world.tick_lag*2) - if(world.tick_usage > TICK_LIMIT_TO_RUN) //woke up, STILL not enough tick, sleep for more. - . += 4 - sleep(world.tick_lag*4) - //you might be thinking of adding more steps to this, or making it use a loop and a counter var - // not worth it. - -// This proc gets a list of all "points of interest" (poi's) that can be used by admins to track valuable mobs or atoms (such as the nuke disk). -/proc/getpois(mobs_only=0,skip_mindless=0) - var/list/mobs = sortmobs() - var/list/names = list() - var/list/pois = list() - var/list/namecounts = list() - - for(var/mob/M in mobs) - if(skip_mindless && (!M.mind && !M.ckey)) - if(!isbot(M) && !istype(M, /mob/camera/)) - continue - if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins - continue - var/name = M.name - if(name in names) - namecounts[name]++ - name = "[name] ([namecounts[name]])" - else - names.Add(name) - namecounts[name] = 1 - if(M.real_name && M.real_name != M.name) - name += " \[[M.real_name]\]" - if(M.stat == DEAD) - if(istype(M, /mob/dead/observer/)) - name += " \[ghost\]" - else - name += " \[dead\]" - pois[name] = M - - if(!mobs_only) - for(var/atom/A in 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 +/* + * 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/_compile_options.dm b/code/_compile_options.dm index 436970567a0..968a2f4d577 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -27,7 +27,5 @@ Due to BYOND features used in this codebase, you must update to version 510 or l This may require updating to a beta release. #endif -var/global/list/processing_objects = list() //This has to be initialized BEFORE world - // Macros that must exist before world.dm -#define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat +#define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat \ No newline at end of file diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index 1e35e150a25..3d7259eef55 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -3,7 +3,7 @@ var/datum/configuration/config = null var/host = null var/join_motd = null GLOBAL_VAR(join_tos) -var/game_version = "Custom ParaCode" +var/game_version = "ParaCode" var/changelog_hash = md5('html/changelog.html') //used to check if the CL changed var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 544) @@ -43,8 +43,3 @@ var/eventchance = 10 //% per 5 mins var/event = 0 var/hadevent = 0 var/blobevent = 0 - -//Medals hub related variables -var/global/medal_hub = null -var/global/medal_pass = " " -var/global/medals_enabled = TRUE //will be auto set to false if the game fails contacting the medal hub to prevent unneeded calls. diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index ff902473329..b6fcae25061 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -3,7 +3,6 @@ GLOBAL_LIST_EMPTY(all_species) GLOBAL_LIST_EMPTY(all_languages) GLOBAL_LIST_EMPTY(language_keys) // Table of say codes for all languages GLOBAL_LIST_EMPTY(all_superheroes) -GLOBAL_LIST_EMPTY(all_nations) GLOBAL_LIST_INIT(whitelisted_species, list()) GLOBAL_LIST_INIT(clients, list()) //list of all clients @@ -23,8 +22,7 @@ GLOBAL_LIST_INIT(living_mob_list, list()) //List of all alive mobs, including GLOBAL_LIST_INIT(dead_mob_list, list()) //List of all dead mobs, including clientless. Excludes /mob/new_player GLOBAL_LIST_INIT(respawnable_list, list()) //List of all mobs, dead or in mindless creatures that still be respawned. GLOBAL_LIST_INIT(non_respawnable_keys, list()) //List of ckeys that are excluded from respawning for remainder of round. -GLOBAL_LIST_INIT(simple_animal_list, list()) //List of all simple animals, including clientless -GLOBAL_LIST_INIT(snpc_list, list()) //List of all snpc's, including clientless +GLOBAL_LIST_INIT(simple_animals, list(list(), list(), list(), list())) //One for each AI_* status define, List of all simple animals, including clientless GLOBAL_LIST_INIT(bots_list, list()) //List of all bots(beepsky, medibots,etc) GLOBAL_LIST_INIT(med_hud_users, list()) 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/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index c7217221585..5ff132a7ee6 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -19,8 +19,6 @@ GLOBAL_LIST_INIT(navigation_computers, list()) GLOBAL_LIST_INIT(all_areas, list()) GLOBAL_LIST_INIT(machines, list()) -GLOBAL_LIST_INIT(fast_processing, list()) -GLOBAL_LIST_INIT(processing_power_items, list()) //items that ask to be called every cycle GLOBAL_LIST_INIT(rcd_list, list()) //list of Rapid Construction Devices. GLOBAL_LIST_INIT(apcs, list()) @@ -48,3 +46,5 @@ GLOBAL_LIST_INIT(active_jammers, list()) // List of active radio jam GLOBAL_LIST_INIT(active_diseases, list()) //List of Active disease in all mobs; purely for quick referencing. GLOBAL_LIST_EMPTY(mob_spawners) // All mob_spawn objects + +GLOBAL_LIST_EMPTY(explosive_walls) \ No newline at end of file diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 874c87c0758..f4cdd766cb9 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -1,9 +1,9 @@ var/global/obj/effect/overlay/plmaster = null var/global/obj/effect/overlay/slmaster = null -var/global/obj/effect/overlay/icemaster = null -// Event Manager, the manager for events. -var/datum/event_manager/event_manager = new() +GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule +GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) + // Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it. var/global/obj/item/radio/intercom/global_announcer = create_global_announcer() var/global/obj/item/radio/intercom/command/command_announcer = create_command_announcer() @@ -83,4 +83,11 @@ GLOBAL_VAR_INIT(gametime_offset, 432000) // 12:00 in seconds //printers shutdown if too much shit printed var/copier_items_printed = 0 var/copier_max_items = 300 -var/copier_items_printed_logged = FALSE \ No newline at end of file +var/copier_items_printed_logged = FALSE + + +GLOBAL_VAR(map_name) // Self explanatory + +var/global/datum/datacore/data_core = null // Station datacore, manifest, etc + +GLOBAL_VAR_INIT(panic_bunker_enabled, 0) // Is the panic bunker enabled \ No newline at end of file diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm deleted file mode 100644 index 2d635996b30..00000000000 --- a/code/_globalvars/station.dm +++ /dev/null @@ -1,6 +0,0 @@ -var/global/datum/datacore/data_core = null - -var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) -var/CHARGELEVEL = 0.001 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) - -var/map_name = "Unknown" //The name of the map that is loaded. Assigned in world/New() \ No newline at end of file diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index c84a64722c5..22921f5228d 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -49,7 +49,7 @@ if(!can_see(A)) if(isturf(A)) //On unmodified clients clicking the static overlay clicks the turf underneath return // So there's no point messaging admins - message_admins("[key_name_admin(src)] might be running a modified client! (failed can_see on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))") + add_attack_logs(src, src, "[key_name_admin(src)] might be running a modified client! (failed can_see on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))", ATKLOG_ALL) var/message = "[key_name(src)] might be running a modified client! (failed can_see on AI click of [A]([COORD(pixel_turf)]))" log_admin(message) send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))") @@ -64,7 +64,7 @@ else if(pixel_turf.obscured) log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)])") - message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))") + add_attack_logs(src, src, "[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))", ATKLOG_ALL) send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))") return diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 24e58b502ad..b823efe2563 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -122,6 +122,10 @@ throw_item(A) return + if(isLivingSSD(A)) + if(client && client.send_ssd_warning(A)) + return + var/obj/item/W = get_active_hand() if(W == A) @@ -399,7 +403,25 @@ icon_state = "passage0" plane = CLICKCATCHER_PLANE mouse_opacity = MOUSE_OPACITY_OPAQUE - screen_loc = "CENTER-7,CENTER-7" + screen_loc = "CENTER" + +#define MAX_SAFE_BYOND_ICON_SCALE_TILES (MAX_SAFE_BYOND_ICON_SCALE_PX / world.icon_size) +#define MAX_SAFE_BYOND_ICON_SCALE_PX (33 * 32) //Not using world.icon_size on purpose. + +/obj/screen/click_catcher/proc/UpdateGreed(view_size_x = 15, view_size_y = 15) + var/icon/newicon = icon('icons/mob/screen_gen.dmi', "catcher") + var/ox = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_x) + var/oy = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_y) + var/px = view_size_x * world.icon_size + var/py = view_size_y * world.icon_size + var/sx = min(MAX_SAFE_BYOND_ICON_SCALE_PX, px) + var/sy = min(MAX_SAFE_BYOND_ICON_SCALE_PX, py) + newicon.Scale(sx, sy) + icon = newicon + screen_loc = "CENTER-[(ox-1)*0.5],CENTER-[(oy-1)*0.5]" + var/matrix/M = new + M.Scale(px/sx, py/sy) + transform = M /obj/screen/click_catcher/Click(location, control, params) var/list/modifiers = params2list(params) @@ -407,6 +429,6 @@ var/mob/living/carbon/C = usr C.swap_hand() else - var/turf/T = screen_loc2turf(modifiers["screen-loc"], get_turf(usr)) + var/turf/T = params2turf(modifiers["screen-loc"], get_turf(usr)) T.Click(location, control, params) return 1 diff --git a/code/_onclick/click_override.dm b/code/_onclick/click_override.dm index 7dfa8020cb8..a6042386b3d 100644 --- a/code/_onclick/click_override.dm +++ b/code/_onclick/click_override.dm @@ -43,26 +43,50 @@ ..() /datum/middleClickOverride/power_gloves - var/last_shocked = 0 - var/shock_delay = 120 -/datum/middleClickOverride/power_gloves/onClick(var/atom/A, var/mob/living/user) +/datum/middleClickOverride/power_gloves/onClick(atom/A, mob/living/carbon/human/user) + if(A == user || user.a_intent == INTENT_HELP || user.a_intent == INTENT_GRAB) + return if(user.incapacitated()) return - if(world.time < last_shocked + shock_delay) + var/obj/item/clothing/gloves/color/yellow/power/P = user.gloves + if(world.time < P.last_shocked + P.shock_delay) to_chat(user, "The gloves are still recharging.") return - if(!isliving(A)) - to_chat(user, "Shocking an inanimate object would be pointless.") - return - var/mob/living/L = A var/turf/T = get_turf(user) var/obj/structure/cable/C = locate() in T - if(!C || !istype(C)) - to_chat(user, "There is no cable here to power the gloves.") - return - user.visible_message("[user.name] fires an arc of electricity at [L]!", "You fire an arc of electricity at [L]!", "You hear the loud crackle of electricity!") - playsound(user.loc, 'sound/effects/eleczap.ogg', 75, 1) - user.Beam(L,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) - electrocute_mob(L, C, user) - last_shocked = world.time + if(!P.unlimited_power) + if(!C || !istype(C)) + to_chat(user, "There is no cable here to power the gloves.") + return + var/turf/target_turf = get_turf(A) + target_turf.hotspot_expose(2000, 400) + playsound(user.loc, 'sound/effects/eleczap.ogg', 40, 1) + + var/atom/beam_from = user + var/atom/target_atom = A + + for(var/i in 0 to 3) + beam_from.Beam(target_atom, icon_state = "lightning[rand(1, 12)]", icon = 'icons/effects/effects.dmi', time = 6) + if(isliving(target_atom)) + var/mob/living/L = target_atom + if(user.a_intent == INTENT_DISARM) + L.Weaken(3) + else + if(P.unlimited_power) + L.electrocute_act(1000, P, safety = TRUE, override = TRUE) //Just kill them + else + electrocute_mob(L, C, P) + break + var/list/next_shocked = list() + for(var/atom/movable/AM in orange(3, target_atom)) + if(AM == user || istype(AM, /obj/effect) || isobserver(AM)) + continue + next_shocked.Add(AM) + + beam_from = target_atom + target_atom = pick(next_shocked) + A = target_atom + next_shocked.Cut() + + P.last_shocked = world.time \ No newline at end of file diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 24a2442faeb..58e82733abe 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -107,14 +107,20 @@ #define ui_healthdoll "EAST-1:28,CENTER-1:15" #define ui_health "EAST-1:28,CENTER:17" #define ui_internal "EAST-1:28,CENTER+1:19" - //borgs + +//borgs #define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. + +//aliens #define ui_alien_health "EAST-1:28,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. - +//constructs #define ui_construct_pull "EAST-1:28,SOUTH+1:10" //above the zone_sel icon #define ui_construct_health "EAST,CENTER:15" //same height as humans, hugging the right border +//slimes +#define ui_slime_health "EAST,CENTER:15" //same as borgs, constructs and humans + //Pop-up inventory #define ui_shoes "WEST+1:8,SOUTH:5" @@ -154,6 +160,12 @@ #define ui_bot_radio "EAST-1:28,SOUTH:7" #define ui_bot_pull "EAST-2:26,SOUTH:7" +//Ghosts +#define ui_ghost_jumptomob "SOUTH:6,CENTER-2:24" +#define ui_ghost_orbit "SOUTH:6,CENTER-1:24" +#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24" +#define ui_ghost_teleport "SOUTH:6,CENTER+1:24" + //HUD styles. Please ensure HUD_VERSIONS is the same as the maximum index. Index order defines how they are cycled in F12. #define HUD_STYLE_STANDARD 1 #define HUD_STYLE_REDUCED 2 diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 32a9d7cf46d..b70c98908f5 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -1,31 +1,82 @@ - /obj/screen/movable/action_button var/datum/action/linked_action screen_loc = null +/obj/screen/movable/action_button/MouseDrop(over_object) + if((istype(over_object, /obj/screen/movable/action_button) && !istype(over_object, /obj/screen/movable/action_button/hide_toggle))) + if(locked) + to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") + closeToolTip(usr) + return + var/obj/screen/movable/action_button/B = over_object + var/list/actions = usr.actions + actions.Swap(actions.Find(linked_action), actions.Find(B.linked_action)) + moved = FALSE + B.moved = FALSE + closeToolTip(usr) + usr.update_action_buttons() + else if(istype(over_object, /obj/screen/movable/action_button/hide_toggle)) + closeToolTip(usr) + else + closeToolTip(usr) + return ..() + /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, 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 +/obj/screen/movable/action_button/hide_toggle/MouseDrop(over_object) + if(istype(over_object, /obj/screen/movable/action_button)) + closeToolTip(usr) + else + closeToolTip(usr) + return ..() + /obj/screen/movable/action_button/hide_toggle/Click(location,control,params) var/list/modifiers = params2list(params) if(modifiers["shift"]) - moved = 0 - return 1 + 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 + var/obj/screen/movable/action_button/B = A.button + B.moved = FALSE + moved = FALSE + usr.update_action_buttons(TRUE) + to_chat(usr, "Action button positions have been reset.") + return TRUE usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden hidden = usr.hud_used.action_buttons_hidden @@ -36,6 +87,15 @@ UpdateIcon() usr.update_action_buttons() +/obj/screen/movable/action_button/hide_toggle/AltClick(mob/user) + for(var/V in user.actions) + var/datum/action/A = V + var/obj/screen/movable/action_button/B = A.button + B.moved = FALSE + if(moved) + moved = FALSE + user.update_action_buttons(TRUE) + to_chat(user, "Action button positions have been reset.") /obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(mob/living/user) if(isalien(user)) @@ -49,15 +109,13 @@ 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) - +/obj/screen/movable/action_button/MouseEntered(location, control, params) + if(!QDELETED(src)) + openToolTip(usr, src, params, title = name, content = desc) /obj/screen/movable/action_button/MouseExited() closeToolTip(usr) - /mob/proc/update_action_buttons_icon() for(var/X in actions) var/datum/action/A = X @@ -102,7 +160,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/ai.dm b/code/_onclick/hud/ai.dm index 0b1a6d1c6c4..dc98d887279 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -256,4 +256,10 @@ //Add multicamera camera using = new /obj/screen/ai/add_multicam() using.screen_loc = ui_ai_add_multicam - static_inventory += using \ No newline at end of file + static_inventory += using + +//Intent + using = new /obj/screen/act_intent/robot/AI() + using.icon_state = mymob.a_intent + static_inventory += using + action_intent = using \ No newline at end of file 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/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm new file mode 100644 index 00000000000..1e8f99814df --- /dev/null +++ b/code/_onclick/hud/blob_overmind.dm @@ -0,0 +1,199 @@ +/mob/camera/blob/create_mob_hud() + if(client && !hud_used) + hud_used = new /datum/hud/blob_overmind(src) + +/obj/screen/blob + icon = 'icons/mob/blob.dmi' + +/obj/screen/blob/MouseEntered(location,control,params) + openToolTip(usr,src,params,title = name,content = desc, theme = "blob") + +/obj/screen/blob/MouseExited() + closeToolTip(usr) + +/obj/screen/blob/BlobHelp + icon_state = "ui_help" + name = "Blob Help" + desc = "Help on playing blob!" + +/obj/screen/blob/BlobHelp/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.blob_help() + +/obj/screen/blob/JumpToNode + icon_state = "ui_tonode" + name = "Jump to Node" + desc = "Moves your camera to a selected blob node." + +/obj/screen/blob/JumpToNode/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.jump_to_node() + +/obj/screen/blob/JumpToCore + icon_state = "ui_tocore" + name = "Jump to Core" + desc = "Moves your camera to your blob core." + +/obj/screen/blob/JumpToCore/MouseEntered(location,control,params) + if(hud && hud.mymob && isovermind(hud.mymob)) + name = initial(name) + desc = initial(desc) + ..() + +/obj/screen/blob/JumpToCore/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.transport_core() + +/obj/screen/blob/Blobbernaut + icon_state = "ui_blobbernaut" + name = "Produce Blobbernaut (20)" + desc = "Produces a strong, but dumb blobbernaut from a factory blob for 20 resources.
The factory blob will be destroyed in the process." + +/obj/screen/blob/Blobbernaut/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.create_blobbernaut() + +/obj/screen/blob/StorageBlob + icon_state = "ui_storage" + name = "Produce Storage Blob (40)" + desc = "Produces a storage blob for 40 resources.
Storage blobs will raise your max resource cap by 50." + +/obj/screen/blob/StorageBlob/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.create_storage() + +/obj/screen/blob/ResourceBlob + icon_state = "ui_resource" + name = "Produce Resource Blob (40)" + desc = "Produces a resource blob for 40 resources.
Resource blobs will give you resources every few seconds." + +/obj/screen/blob/ResourceBlob/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.create_resource() + +/obj/screen/blob/NodeBlob + icon_state = "ui_node" + name = "Produce Node Blob (60)" + desc = "Produces a node blob for 60 resources.
Node blobs will expand and activate nearby resource and factory blobs." + +/obj/screen/blob/NodeBlob/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.create_node() + +/obj/screen/blob/FactoryBlob + icon_state = "ui_factory" + name = "Produce Factory Blob (60)" + desc = "Produces a factory blob for 60 resources.
Factory blobs will produce spores every few seconds." + +/obj/screen/blob/FactoryBlob/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.create_factory() + +/obj/screen/blob/ReadaptChemical + icon_state = "ui_chemswap" + name = "Readapt Chemical (50)" + desc = "Randomly rerolls your chemical for 50 resources." + +/obj/screen/blob/ReadaptChemical/MouseEntered(location,control,params) + if(hud && hud.mymob && isovermind(hud.mymob)) + name = initial(name) + desc = initial(desc) + ..() + +/obj/screen/blob/ReadaptChemical/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.chemical_reroll() + +/obj/screen/blob/RelocateCore + icon_state = "ui_swap" + name = "Relocate Core (80)" + desc = "Swaps a node and your core for 80 resources." + +/obj/screen/blob/RelocateCore/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.relocate_core() + +/obj/screen/blob/Split + icon_state = "ui_split" + name = "Split consciousness (100)" + desc = "Creates another Blob Overmind at the targeted node. One use only.
Offspring are unable to use this ability." + +/obj/screen/blob/Split/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.split_consciousness() + +/datum/hud/blob_overmind/New(mob/user) + ..() + var/obj/screen/using + + blobpwrdisplay = new /obj/screen() + blobpwrdisplay.name = "blob power" + blobpwrdisplay.icon_state = "block" + blobpwrdisplay.screen_loc = ui_health + blobpwrdisplay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + blobpwrdisplay.layer = ABOVE_HUD_LAYER + blobpwrdisplay.plane = ABOVE_HUD_PLANE + static_inventory += blobpwrdisplay + + blobhealthdisplay = new /obj/screen() + blobhealthdisplay.name = "blob health" + blobhealthdisplay.icon_state = "block" + blobhealthdisplay.screen_loc = ui_internal + static_inventory += blobhealthdisplay + + using = new /obj/screen/blob/BlobHelp() + using.screen_loc = "WEST:6,NORTH:-3" + static_inventory += using + + using = new /obj/screen/blob/JumpToNode() + using.screen_loc = ui_inventory + static_inventory += using + + using = new /obj/screen/blob/JumpToCore() + using.screen_loc = ui_zonesel + using.hud = src + static_inventory += using + + using = new /obj/screen/blob/Blobbernaut() + using.screen_loc = ui_id + static_inventory += using + + using = new /obj/screen/blob/StorageBlob() + using.screen_loc = ui_belt + static_inventory += using + + using = new /obj/screen/blob/ResourceBlob() + using.screen_loc = ui_back + static_inventory += using + + using = new /obj/screen/blob/NodeBlob() + using.screen_loc = using.screen_loc = ui_rhand + static_inventory += using + + using = new /obj/screen/blob/FactoryBlob() + using.screen_loc = using.screen_loc = ui_lhand + static_inventory += using + + using = new /obj/screen/blob/ReadaptChemical() + using.screen_loc = ui_storage1 + using.hud = src + static_inventory += using + + using = new /obj/screen/blob/RelocateCore() + using.screen_loc = ui_storage2 + static_inventory += using + + using = new /obj/screen/blob/Split() + using.screen_loc = ui_acti + static_inventory += using \ No newline at end of file diff --git a/code/_onclick/hud/devil.dm b/code/_onclick/hud/devil.dm index 2a7dab21a03..1e17cae1708 100644 --- a/code/_onclick/hud/devil.dm +++ b/code/_onclick/hud/devil.dm @@ -40,7 +40,6 @@ using.icon = ui_style using.icon_state = "swap_1" using.screen_loc = ui_swaphand1 - using.layer = 19 static_inventory += using using = new /obj/screen/swap_hand() @@ -48,7 +47,6 @@ using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand2 - using.layer = 19 static_inventory += using mymob.zone_sel = new /obj/screen/zone_sel() diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 673a49ffd22..9d00f216eac 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -2,23 +2,21 @@ var/list/screens = list() /mob/proc/overlay_fullscreen(category, type, severity) - var/obj/screen/fullscreen/screen - if(screens[category]) - screen = screens[category] - if(screen.type != type) - clear_fullscreen(category, FALSE) - return .() - else if(!severity || severity == screen.severity) - return null - else - screen = new type + var/obj/screen/fullscreen/screen = screens[category] + if (!screen || screen.type != type) + // needs to be recreated + clear_fullscreen(category, FALSE) + screens[category] = screen = new type() + else if ((!severity || severity == screen.severity) && (!client || screen.screen_loc != "CENTER-7,CENTER-7" || screen.view == client.view)) + // doesn't need to be updated + return screen screen.icon_state = "[initial(screen.icon_state)][severity]" screen.severity = severity - - screens[category] = screen - if(client) + if (client && screen.should_show_to(src)) + screen.update_for_view(client.view) client.screen += screen + return screen /mob/proc/clear_fullscreen(category, animated = 10) @@ -45,17 +43,38 @@ clear_fullscreen(category) /datum/hud/proc/reload_fullscreen() - var/list/screens = mymob.screens - for(var/category in screens) - mymob.client.screen |= screens[category] + if(mymob.client) + var/obj/screen/fullscreen/screen + var/list/screens = mymob.screens + for(var/category in screens) + screen = screens[category] + if(screen.should_show_to(mymob)) + screen.update_for_view(mymob.client.view) + mymob.client.screen |= screen + else + mymob.client.screen -= screen /obj/screen/fullscreen icon = 'icons/mob/screen_full.dmi' icon_state = "default" screen_loc = "CENTER-7,CENTER-7" layer = FULLSCREEN_LAYER + plane = FULLSCREEN_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT + var/view = 7 var/severity = 0 + var/show_when_dead = FALSE + +/obj/screen/fullscreen/proc/update_for_view(client_view) + if (screen_loc == "CENTER-7,CENTER-7" && view != client_view) + var/list/actualview = getviewsize(client_view) + view = client_view + transform = matrix(actualview[1]/FULLSCREEN_OVERLAY_RESOLUTION_X, 0, 0, 0, actualview[2]/FULLSCREEN_OVERLAY_RESOLUTION_Y, 0) + +/obj/screen/fullscreen/proc/should_show_to(mob/mymob) + if(!show_when_dead && mymob.stat == DEAD) + return FALSE + return TRUE /obj/screen/fullscreen/Destroy() severity = 0 @@ -100,6 +119,33 @@ screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "druggy" +/obj/screen/fullscreen/lighting_backdrop + icon = 'icons/mob/screen_gen.dmi' + icon_state = "flash" + transform = matrix(200, 0, 0, 0, 200, 0) + plane = LIGHTING_PLANE + blend_mode = BLEND_OVERLAY + show_when_dead = TRUE + +//Provides darkness to the back of the lighting plane +/obj/screen/fullscreen/lighting_backdrop/lit + invisibility = INVISIBILITY_LIGHTING + layer = BACKGROUND_LAYER+21 + color = "#000" + show_when_dead = TRUE + +//Provides whiteness in case you don't see lights so everything is still visible +/obj/screen/fullscreen/lighting_backdrop/unlit + layer = BACKGROUND_LAYER+20 + show_when_dead = TRUE + +/obj/screen/fullscreen/see_through_darkness + icon_state = "nightvision" + plane = LIGHTING_PLANE + layer = LIGHTING_LAYER + blend_mode = BLEND_ADD + show_when_dead = TRUE + #undef FULLSCREEN_LAYER #undef BLIND_LAYER #undef CRIT_LAYER diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm new file mode 100644 index 00000000000..4e92395f4cc --- /dev/null +++ b/code/_onclick/hud/ghost.dm @@ -0,0 +1,61 @@ +/mob/dead/observer/create_mob_hud() + if(client && !hud_used) + hud_used = new /datum/hud/ghost(src) + +/obj/screen/ghost + icon = 'icons/mob/screen_ghost.dmi' + +/obj/screen/ghost/MouseEntered() + flick(icon_state + "_anim", src) + +/obj/screen/ghost/jumptomob + name = "Jump to mob" + icon_state = "jumptomob" + +/obj/screen/ghost/jumptomob/Click() + var/mob/dead/observer/G = usr + G.jumptomob() + +/obj/screen/ghost/orbit + name = "Orbit" + icon_state = "orbit" + +/obj/screen/ghost/orbit/Click() + var/mob/dead/observer/G = usr + G.follow() + +/obj/screen/ghost/reenter_corpse + name = "Re-enter corpse" + icon_state = "reenter_corpse" + +/obj/screen/ghost/reenter_corpse/Click() + var/mob/dead/observer/G = usr + G.reenter_corpse() + +/obj/screen/ghost/teleport + name = "Teleport" + icon_state = "teleport" + +/obj/screen/ghost/teleport/Click() + var/mob/dead/observer/G = usr + G.dead_tele() + +/datum/hud/ghost/New(mob/owner) + ..() + var/obj/screen/using + + using = new /obj/screen/ghost/jumptomob() + using.screen_loc = ui_ghost_jumptomob + static_inventory += using + + using = new /obj/screen/ghost/orbit() + using.screen_loc = ui_ghost_orbit + static_inventory += using + + using = new /obj/screen/ghost/reenter_corpse() + using.screen_loc = ui_ghost_reenter_corpse + static_inventory += using + + using = new /obj/screen/ghost/teleport() + using.screen_loc = ui_ghost_teleport + static_inventory += using diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 410d49f973e..0063feae9cf 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -38,15 +38,23 @@ var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle var/action_buttons_hidden = 0 + var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object + /mob/proc/create_mob_hud() if(client && !hud_used) hud_used = new /datum/hud(src) + update_sight() /datum/hud/New(mob/owner) mymob = owner hide_actions_toggle = new hide_actions_toggle.InitialiseIcon(mymob) + for(var/mytype in subtypesof(/obj/screen/plane_master)) + var/obj/screen/plane_master/instance = new mytype() + plane_masters["[instance.plane]"] = instance + instance.backdrop(mymob) + /datum/hud/Destroy() if(mymob.hud_used == src) mymob.hud_used = null @@ -83,14 +91,16 @@ nightvisionicon = null devilsouldisplay = null + QDEL_LIST_ASSOC_VAL(plane_masters) + mymob = null return ..() /datum/hud/proc/show_hud(version = 0) if(!ismob(mymob)) - return 0 + return FALSE if(!mymob.client) - return 0 + return FALSE mymob.client.screen = list() @@ -162,13 +172,25 @@ mymob.update_action_buttons(1) reorganize_alerts() reload_fullscreen() + plane_masters_update() + +/datum/hud/proc/plane_masters_update() + // Plane masters are always shown to OUR mob, never to observers + for(var/thing in plane_masters) + var/obj/screen/plane_master/PM = plane_masters[thing] + PM.backdrop(mymob) + mymob.client.screen += PM /datum/hud/human/show_hud(version = 0) - ..() + . = ..() + if(!.) + return hidden_inventory_update() /datum/hud/robot/show_hud(version = 0) - ..() + . = ..() + if(!.) + return update_robot_modules_display() /datum/hud/proc/hidden_inventory_update() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 6f5c8ee0548..811a7e89cdb 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -83,6 +83,7 @@ /datum/hud/human/New(mob/living/carbon/human/owner, var/ui_style = 'icons/mob/screen_white.dmi', var/ui_color = "#ffffff", var/ui_alpha = 255) ..() + owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness) var/obj/screen/using var/obj/screen/inventory/inv_box 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/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index 8cf38a88eb9..a82c847a246 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -24,24 +24,4 @@ mymob.pullin.icon = 'icons/mob/screen_corgi.dmi' mymob.pullin.update_icon(mymob) mymob.pullin.screen_loc = ui_construct_pull - static_inventory += mymob.pullin - - -/mob/camera/blob/create_mob_hud() - if(client && !hud_used) - hud_used = new /datum/hud/blob_overmind(src) - -/datum/hud/blob_overmind/New(mob/user) - ..() - - blobpwrdisplay = new /obj/screen() - blobpwrdisplay.name = "blob power" - blobpwrdisplay.icon_state = "block" - blobpwrdisplay.screen_loc = ui_health - static_inventory += blobpwrdisplay - - blobhealthdisplay = new /obj/screen() - blobhealthdisplay.name = "blob health" - blobhealthdisplay.icon_state = "block" - blobhealthdisplay.screen_loc = ui_internal - static_inventory += blobhealthdisplay \ No newline at end of file + static_inventory += mymob.pullin \ No newline at end of file diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index bbac6e36df3..e011aea037c 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -1,7 +1,7 @@ /obj/screen/movable/pic_in_pic name = "Picture-in-picture" screen_loc = "CENTER" - plane = GAME_PLANE + plane = FLOOR_PLANE var/atom/center var/width = 0 var/height = 0 diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm new file mode 100644 index 00000000000..a5586578b3f --- /dev/null +++ b/code/_onclick/hud/plane_master.dm @@ -0,0 +1,54 @@ +/obj/screen/plane_master + screen_loc = "CENTER" + icon_state = "blank" + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + blend_mode = BLEND_OVERLAY + var/show_alpha = 255 + var/hide_alpha = 0 + +/obj/screen/plane_master/proc/Show(override) + alpha = override || show_alpha + +/obj/screen/plane_master/proc/Hide(override) + alpha = override || hide_alpha + +/obj/screen/plane_master/proc/outline(_size, _color) + filters += filter(type = "outline", size = _size, color = _color) + +/obj/screen/plane_master/proc/shadow(_size, _border, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") + filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset, border = _border) + +/obj/screen/plane_master/proc/clear_filters() + filters = list() + +//Why do plane masters need a backdrop sometimes? Read http://www.byond.com/forum/?post=2141928 +//Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong. +/obj/screen/plane_master/proc/backdrop(mob/mymob) + +/obj/screen/plane_master/floor + name = "floor plane master" + plane = FLOOR_PLANE + appearance_flags = PLANE_MASTER + blend_mode = BLEND_OVERLAY + +/obj/screen/plane_master/game_world + name = "game world plane master" + plane = GAME_PLANE + appearance_flags = PLANE_MASTER + blend_mode = BLEND_OVERLAY + +/obj/screen/plane_master/game_world/backdrop(mob/mymob) + clear_filters() + if(istype(mymob) && mymob.client && mymob.client.prefs && (mymob.client.prefs.toggles & AMBIENT_OCCLUSION)) + filters += FILTER_AMBIENT_OCCLUSION + +/obj/screen/plane_master/lighting + name = "lighting plane master" + plane = LIGHTING_PLANE + appearance_flags = PLANE_MASTER + blend_mode = BLEND_MULTIPLY + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/screen/plane_master/lighting/backdrop(mob/mymob) + mymob.overlay_fullscreen("lighting_backdrop_lit", /obj/screen/fullscreen/lighting_backdrop/lit) + mymob.overlay_fullscreen("lighting_backdrop_unlit", /obj/screen/fullscreen/lighting_backdrop/unlit) \ No newline at end of file diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index a542c0345fd..ea23a56d8e4 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -226,8 +226,8 @@ A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" else A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" - A.layer = 20 - A.plane = HUD_PLANE + A.layer = ABOVE_HUD_LAYER + A.plane = ABOVE_HUD_PLANE x++ if(x == 4) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index d9f6653b0ff..8bc65fcf691 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -9,9 +9,10 @@ /obj/screen name = "" icon = 'icons/mob/screen_gen.dmi' - layer = HUD_LAYER_SCREEN + layer = HUD_LAYER plane = HUD_PLANE - unacidable = 1 + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF + unacidable = TRUE var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. var/datum/hud/hud = null appearance_flags = NO_CLIENT_COLOR @@ -36,6 +37,8 @@ /obj/screen/close name = "close" + layer = ABOVE_HUD_LAYER + plane = ABOVE_HUD_PLANE /obj/screen/close/Click() if(master) @@ -47,7 +50,6 @@ /obj/screen/drop name = "drop" icon_state = "act_drop" - layer = 19 /obj/screen/drop/Click() usr.drop_item_v() @@ -93,6 +95,9 @@ icon = 'icons/mob/screen_robot.dmi' screen_loc = ui_borg_intents +/obj/screen/act_intent/robot/AI + screen_loc = "EAST-1:32,SOUTH:70" + /obj/screen/mov_intent name = "run/walk toggle" icon_state = "running" @@ -143,7 +148,6 @@ name = "resist" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_resist" - layer = 19 /obj/screen/resist/Click() if(isliving(usr)) @@ -327,7 +331,6 @@ /obj/screen/inventory var/slot_id //The indentifier for the slot. It has nothing to do with ID cards. var/list/object_overlays = list() - layer = 19 /obj/screen/inventory/MouseEntered() ..() @@ -417,7 +420,6 @@ return 1 /obj/screen/swap_hand - layer = 19 name = "swap hand" /obj/screen/swap_hand/Click() @@ -454,6 +456,11 @@ /obj/screen/healths/corgi icon = 'icons/mob/screen_corgi.dmi' +/obj/screen/healths/slime + icon = 'icons/mob/screen_slime.dmi' + icon_state = "slime_health0" + screen_loc = ui_slime_health + mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/screen/healths/guardian name = "summoner health" @@ -468,14 +475,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/_onclick/hud/slime.dm b/code/_onclick/hud/slime.dm new file mode 100644 index 00000000000..9f5621b75ee --- /dev/null +++ b/code/_onclick/hud/slime.dm @@ -0,0 +1,18 @@ +/mob/living/carbon/slime/create_mob_hud() + if(client && !hud_used) + hud_used = new /datum/hud/slime(src) + +/mob/living/simple_animal/slime/create_mob_hud() + if(client && !hud_used) + hud_used = new /datum/hud/slime(src) + +/datum/hud/slime/New(mob/owner) + ..() + mymob.healths = new /obj/screen/healths/slime() + infodisplay += mymob.healths + + mymob.pullin = new /obj/screen/pull() + mymob.pullin.icon = 'icons/mob/screen_slime.dmi' + mymob.pullin.update_icon(mymob) + mymob.pullin.screen_loc = ui_construct_pull + hotkeybuttons += mymob.pullin diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 47036da9cf8..bed8c64b054 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -24,7 +24,7 @@ return FALSE /obj/attackby(obj/item/I, mob/living/user, params) - return ..() || (can_be_hit && isitem(I) && I.attack_obj(src, user)) + return ..() || (can_be_hit && I.attack_obj(src, user)) /mob/living/attackby(obj/item/I, mob/living/user, params) user.changeNext_move(CLICK_CD_MELEE) @@ -37,8 +37,6 @@ SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, M, user) if(flags & (NOBLUDGEON)) return 0 - if(check_martial_counter(M, user)) - return 0 if(can_operate(M)) //Checks if mob is lying down on table for surgery if(istype(src,/obj/item/robot_parts))//popup override for direct attach if(!attempt_initiate_surgery(src, M, user,1)) diff --git a/code/_onclick/overmind.dm b/code/_onclick/overmind.dm index 91f24465569..8ace273dd8f 100644 --- a/code/_onclick/overmind.dm +++ b/code/_onclick/overmind.dm @@ -1,17 +1,35 @@ // Blob Overmind Controls -/mob/camera/blob/CtrlClickOn(var/atom/A) // Expand blob +/mob/camera/blob/ClickOn(var/atom/A, var/params) //Expand blob + var/list/modifiers = params2list(params) + if(modifiers["middle"]) + MiddleClickOn(A) + return + if(modifiers["shift"]) + ShiftClickOn(A) + return + if(modifiers["alt"]) + AltClickOn(A) + return + if(modifiers["ctrl"]) + CtrlClickOn(A) + return var/turf/T = get_turf(A) if(T) expand_blob(T) -/mob/camera/blob/MiddleClickOn(var/atom/A) // Rally spores +/mob/camera/blob/MiddleClickOn(atom/A) //Rally spores var/turf/T = get_turf(A) if(T) rally_spores(T) -/mob/camera/blob/AltClickOn(var/atom/A) // Create a shield +/mob/camera/blob/CtrlClickOn(atom/A) //Create a shield var/turf/T = get_turf(A) if(T) - create_shield(T) \ No newline at end of file + create_shield(T) + +/mob/camera/blob/AltClickOn(atom/A) //Remove a blob + var/turf/T = get_turf(A) + if(T) + remove_blob(T) \ No newline at end of file diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 238ce2d5a94..6ef7a797136 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -65,8 +65,8 @@ var/const/tk_maxrange = 15 flags = NOBLUDGEON | ABSTRACT | DROPDEL //item_state = null w_class = WEIGHT_CLASS_GIGANTIC - layer = 20 - plane = HUD_PLANE + layer = ABOVE_HUD_LAYER + plane = ABOVE_HUD_PLANE var/last_throw = 0 var/atom/movable/focus = null diff --git a/code/controllers/ProcessScheduler/.gitignore b/code/controllers/ProcessScheduler/.gitignore deleted file mode 100644 index 5fe19e425bf..00000000000 --- a/code/controllers/ProcessScheduler/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/bower_components -/node_modules -/ProcessScheduler.dmb -/ProcessScheduler.int -/ProcessScheduler.rsc -/*.lk diff --git a/code/controllers/ProcessScheduler/LICENSE-AGPL b/code/controllers/ProcessScheduler/LICENSE-AGPL deleted file mode 100644 index abaa41e8296..00000000000 --- a/code/controllers/ProcessScheduler/LICENSE-AGPL +++ /dev/null @@ -1,212 +0,0 @@ -GNU AFFERO GENERAL PUBLIC LICENSE - -Version 3, 19 November 2007 - -Copyright © 2007 Free Software Foundation, Inc. -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -Preamble - -The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. - -The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. - -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. - -Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. - -A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. - -The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. - -An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. - -The precise terms and conditions for copying, distribution and modification follow. - -TERMS AND CONDITIONS - -0. Definitions. -"This License" refers to version 3 of the GNU Affero General Public License. - -"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. - -"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. - -To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. - -A "covered work" means either the unmodified Program or a work based on the Program. - -To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. - -To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. - -An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. - -1. Source Code. -The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. - -A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. - -The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. - -The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. - -The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -2. Basic Permissions. -All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. -No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. - -4. Conveying Verbatim Copies. -You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. -You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: - -a) The work must carry prominent notices stating that you modified it, and giving a relevant date. -b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". -c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. -d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. -A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. - -6. Conveying Non-Source Forms. -You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: - -a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. -b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. -c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. -d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. -e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. -A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. - -A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. - -"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). - -The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. - -7. Additional Terms. -"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: - -a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or -b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or -c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or -d) Limiting the use for publicity purposes of names of licensors or authors of the material; or -e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or -f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. -All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. - -8. Termination. -You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. - -9. Acceptance Not Required for Having Copies. -You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. - -10. Automatic Licensing of Downstream Recipients. -Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. - -An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. - -11. Patents. -A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". - -A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. - -In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - -A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. - -12. No Surrender of Others' Freedom. -If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. - -13. Remote Network Interaction; Use with the GNU General Public License. -Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. - -Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. - -14. Revised Versions of this License. -The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. - -Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. - -15. Disclaimer of Warranty. -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. -If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -Also add information on how to contact you by electronic and paper mail. - -If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. - -You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/LICENSE-CC-BY-NC b/code/controllers/ProcessScheduler/LICENSE-CC-BY-NC deleted file mode 100644 index d0955f424af..00000000000 --- a/code/controllers/ProcessScheduler/LICENSE-CC-BY-NC +++ /dev/null @@ -1 +0,0 @@ -This work is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/README.md b/code/controllers/ProcessScheduler/README.md deleted file mode 100644 index 610800ba374..00000000000 --- a/code/controllers/ProcessScheduler/README.md +++ /dev/null @@ -1,86 +0,0 @@ -ProcessScheduler -================ -A Goonstation release, maintained by Volundr - -##SUMMARY - -This is a mostly self-contained, fairly well-documented implementation of the main loop process architecture in use in Goonstation. - -##LICENSE - -This work is released under the following licenses. - -[![Creative Commons License](https://licensebuttons.net/l/by-nc/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc/4.0/) - -This work is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License. The complete text of this license is included in the file LICENSE-CC-BY-NC. - - -[![Affero GPL Version 3](http://www.gnu.org/graphics/agplv3-88x31.png)](http://www.gnu.org/licenses/agpl-3.0.html) - -This work is licensed under the Affero General Public License 3.0. The complete text of the license is included in the file LICENSE-AGPL. - -##INSTALLATION - -To integrate the process scheduler to your codebase, you will not need anything except the contents of the core/ folder. The rest of the project is simply for testing and to provide an example for the process scheduler code. - -### Test project setup -To compile and run the test project, you will require: - -- node.js -- BYOND - -Clone the repository to a path of your choosing, then change directory to it and execute: - -``` -npm install -g -bower install -g -``` - -Then you can either compile with DM or open the DM environment in DreamMaker and compile/run from there. - -##USAGE - -###BASICS -To use the process scheduler in your SS13 codebase, you'll need: - -- core/_defines.dm -- core/_stubs.dm -- core/process.dm -- core/processScheduler.dm -- core/processScheduler.js -- core/updateQueue.dm -- core/updateQueueWorker.dm - -To integrate, you can copy the contents of _defines.dm into your global defines file. Most ss13 codebases already have the code from _stubs.dm. - -The processScheduler is intended as a replacement for the old master_controller from r4407 and other fork codebases. To implement it, you need only to add the source files to your DM environment, and add the following code into world.New, above where the old master_controller is initialized. - -``` -processScheduler = new -processScheduler.setup() -processScheduler.start() -``` - -The processScheduler will automatically find all subtypes of process, and begin processing them. - -The interface code in test/processSchedulerView.dm is simply an example frontend, and can easily be rebuilt to use other styles, and/or render simple html without using javascript for refreshing the panel and killing processes. - -###DETAILS - -To implement a process, you have two options: - -1. Implement a raw loop-style processor -2. Implement an updateQueue processor - -There are clear examples of both of these paradigms in the code provided. Both styles are valid, but for processes that are just a loop calling an update proc on a bunch of objects, you should use the updateQueue. - -The updateQueue works by spawn(0)'ing your specified update proc, but it only puts one instance in the scheduler at a time. Examine the code for more details. The overall effect of this is that it doesn't block, and it lets update loops work concurrently. It enables a much smoother user experience. - -##Contributing - -I welcome pull requests and issue reports, and will try to merge/fix them as I have time. - -### Licensing for code submitted via PR: - -By submitting a pull request, you agree to release all original code submitted in the pull request under the [MIT License](http://opensource.org/licenses/MIT). You also agree that any code submitted is either your own work, or is public domain or under a equally or less restrictive license than the MIT license, or that you have the express written permission of the authors of the submitted code to submit the pull request. - diff --git a/code/controllers/ProcessScheduler/bower.json b/code/controllers/ProcessScheduler/bower.json deleted file mode 100644 index 9a6be56140d..00000000000 --- a/code/controllers/ProcessScheduler/bower.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "ProcessScheduler", - "main": "ProcessScheduler.js", - "version": "1.0.0", - "homepage": "https://github.com/goonstation/ProcessScheduler", - "authors": [ - "Volundr " - ], - "description": "BYOND SS13 Process Scheduler", - "keywords": [ - "byond", - "ss13", - "process", - "scheduler" - ], - "license": "CC-BY-NC", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ], - "private": true, - "dependencies": { - "bootstrap2.3.2": "~2.3.2", - "jquery": "1.11.1", - "json2": "*" - } -} diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm deleted file mode 100644 index 134eaec96a6..00000000000 --- a/code/controllers/ProcessScheduler/core/process.dm +++ /dev/null @@ -1,406 +0,0 @@ -// Process - -/datum/controller/process - /** - * State vars - */ - // Main controller ref - var/tmp/datum/controller/processScheduler/main - - // 1 if process is not running or queued - var/tmp/idle = 1 - - // 1 if process is queued - var/tmp/queued = 0 - - // 1 if process is running - var/tmp/running = 0 - - // 1 if process is blocked up - var/tmp/hung = 0 - - // 1 if process was killed - var/tmp/killed = 0 - - // Status text var - var/tmp/status - - // Previous status text var - var/tmp/previousStatus - - // 1 if process is disabled - var/tmp/disabled = 0 - - /** - * Config vars - */ - - // Process schedule interval - // This controls how often the process would run under ideal conditions. - // If the process scheduler sees that the process has finished, it will wait until - // this amount of time has elapsed from the start of the previous run to start the - // process running again. - var/tmp/schedule_interval = PROCESS_DEFAULT_SCHEDULE_INTERVAL // run every 50 ticks - - // Process sleep interval - // This controls how often the process will yield (call sleep(0)) while it is running. - // Every concurrent process should sleep periodically while running in order to allow other - // processes to execute concurrently. - var/tmp/sleep_interval = PROCESS_DEFAULT_SLEEP_INTERVAL - - // Defer usage; the tick usage at which this process will defer until the next tick - var/tmp/defer_usage = PROCESS_DEFAULT_DEFER_USAGE - - // hang_warning_time - this is the time (in 1/10 seconds) after which the server will begin to show "maybe hung" in the context window - var/tmp/hang_warning_time = PROCESS_DEFAULT_HANG_WARNING_TIME - - // hang_alert_time - After this much time(in 1/10 seconds), the server will send an admin debug message saying the process may be hung - var/tmp/hang_alert_time = PROCESS_DEFAULT_HANG_ALERT_TIME - - // hang_restart_time - After this much time(in 1/10 seconds), the server will automatically kill and restart the process. - var/tmp/hang_restart_time = PROCESS_DEFAULT_HANG_RESTART_TIME - - // Number of deciseconds to delay before starting the process - var/start_delay = 0 - - /** - * recordkeeping vars - */ - - // Records the time (1/10s timeofgame) at which the process last began running - var/tmp/run_start = 0 - - // Records the number of times this process has been killed and restarted - var/tmp/times_killed - - // Tick count - var/tmp/ticks = 0 - - var/tmp/last_task = "" - - var/tmp/last_object - - // How many times in the current run has the process deferred work till the next tick? - var/tmp/cpu_defer_count = 0 - - // Counts the number of times an exception has occurred; gets reset after 10 - var/tmp/list/exceptions = list() - - // The next tick_usage the process will sleep at - var/tmp/next_sleep_usage - - // Last run duration, in seconds - var/tmp/last_run_time = 0 - - // Last 20 run durations - var/tmp/list/last_twenty_run_times = list() - - // Highest run duration, in seconds - var/tmp/highest_run_time = 0 - - // Tick usage at start of current run (updates upon deferring) - var/tmp/tick_usage_start - - // Accumulated tick usage from before each deferral - var/tmp/tick_usage_accumulated = 0 - -/datum/controller/process/New(var/datum/controller/processScheduler/scheduler) - ..() - main = scheduler - previousStatus = "idle" - idle() - name = "process" - run_start = 0 - ticks = 0 - last_task = 0 - last_object = null - -/datum/controller/process/Destroy() - ..() - return QDEL_HINT_HARDDEL_NOW - -/datum/controller/process/proc/started() - // Initialize run_start so we can detect hung processes. - run_start = TimeOfGame - - // Initialize defer count - cpu_defer_count = 0 - - // Prepare usage tracking (defer() updates these) - tick_usage_start = world.tick_usage - tick_usage_accumulated = 0 - - running() - main.processStarted(src) - - onStart() - -/datum/controller/process/proc/finished() - ticks++ - recordRunTime() - idle() - main.processFinished(src) - - onFinish() - -/datum/controller/process/proc/recordRunTime() - // Convert from tick usage (100/tick) to seconds of CPU time used - var/total_usage = (tick_usage_accumulated + (world.tick_usage - tick_usage_start)) / 1000 * world.tick_lag - - last_run_time = total_usage - if(total_usage > highest_run_time) - highest_run_time = total_usage - if(last_twenty_run_times.len == 20) - last_twenty_run_times.Cut(1, 2) - last_twenty_run_times += total_usage - -/datum/controller/process/proc/doWork() - -/datum/controller/process/proc/setup() - -/datum/controller/process/proc/process() - started() - doWork() - finished() - -/datum/controller/process/proc/running() - idle = 0 - queued = 0 - running = 1 - hung = 0 - setStatus(PROCESS_STATUS_RUNNING) - -/datum/controller/process/proc/idle() - queued = 0 - running = 0 - idle = 1 - hung = 0 - setStatus(PROCESS_STATUS_IDLE) - -/datum/controller/process/proc/queued() - idle = 0 - running = 0 - queued = 1 - hung = 0 - setStatus(PROCESS_STATUS_QUEUED) - -/datum/controller/process/proc/hung() - hung = 1 - setStatus(PROCESS_STATUS_HUNG) - -/datum/controller/process/proc/handleHung() - var/datum/lastObj = last_object - var/lastObjType = "null" - if(istype(lastObj)) - lastObjType = lastObj.type - - var/msg = "[name] process hung at tick #[ticks]. Process was unresponsive for [(TimeOfGame - run_start) / 10] seconds and was restarted. Last task: [last_task]. Last Object Type: [lastObjType]" - log_debug(msg) - message_admins(msg) - log_runtime(EXCEPTION(msg), src) - - main.restartProcess(src.name) - -/datum/controller/process/proc/kill() - if(!killed) - var/msg = "[name] process was killed at tick #[ticks]." - log_debug(msg) - message_admins(msg) - log_runtime(EXCEPTION(msg), src) - //finished() - - // Allow inheritors to clean up if needed - onKill() - - qdel(src) - -// Do not call this directly - use SHECK -/datum/controller/process/proc/defer() - if(killed) - // The kill proc is the only place where killed is set. - // The kill proc should have deleted this datum, and all sleeping procs that are - // owned by it. - CRASH("A killed process is still running somehow...") - if(hung) - // This will only really help if the doWork proc ends up in an infinite loop. - handleHung() - CRASH("Process [name] hung and was restarted.") - - tick_usage_accumulated += (world.tick_usage - tick_usage_start) - if(world.tick_usage < defer_usage) - sleep(0) - else - sleep(world.tick_lag) - cpu_defer_count++ - tick_usage_start = world.tick_usage - next_sleep_usage = min(world.tick_usage + sleep_interval, defer_usage) - -/datum/controller/process/proc/update() - // Clear delta - if(previousStatus != status) - setStatus(status) - - var/elapsedTime = getElapsedTime() - - if(hung) - handleHung() - return - else if(elapsedTime > hang_restart_time) - hung() - else if(elapsedTime > hang_alert_time) - setStatus(PROCESS_STATUS_PROBABLY_HUNG) - else if(elapsedTime > hang_warning_time) - setStatus(PROCESS_STATUS_MAYBE_HUNG) - - -/datum/controller/process/proc/getElapsedTime() - return TimeOfGame - run_start - -/datum/controller/process/proc/tickDetail() - return - -/datum/controller/process/proc/getContext() - return "[name][getAverageRunTime()][last_run_time][highest_run_time][ticks]\n" - -/datum/controller/process/proc/getContextData() - return list( - "name" = name, - "averageRunTime" = getAverageRunTime(), - "lastRunTime" = last_run_time, - "highestRunTime" = highest_run_time, - "ticks" = ticks, - "schedule" = schedule_interval, - "status" = getStatusText(), - "disabled" = disabled - ) - -/datum/controller/process/proc/getStatus() - return status - -/datum/controller/process/proc/getStatusText(var/s = 0) - if(!s) - s = status - switch(s) - if(PROCESS_STATUS_IDLE) - return "idle" - if(PROCESS_STATUS_QUEUED) - return "queued" - if(PROCESS_STATUS_RUNNING) - return "running" - if(PROCESS_STATUS_MAYBE_HUNG) - return "maybe hung" - if(PROCESS_STATUS_PROBABLY_HUNG) - return "probably hung" - if(PROCESS_STATUS_HUNG) - return "HUNG" - else - return "UNKNOWN" - -/datum/controller/process/proc/getPreviousStatus() - return previousStatus - -/datum/controller/process/proc/getPreviousStatusText() - return getStatusText(previousStatus) - -/datum/controller/process/proc/setStatus(var/newStatus) - previousStatus = status - status = newStatus - -/datum/controller/process/proc/setLastTask(var/task, var/object) - last_task = task - last_object = object - -/datum/controller/process/proc/_copyStateFrom(var/datum/controller/process/target) - main = target.main - name = target.name - schedule_interval = target.schedule_interval - sleep_interval = target.sleep_interval - run_start = 0 - times_killed = target.times_killed - ticks = target.ticks - last_task = target.last_task - last_object = target.last_object - copyStateFrom(target) - -/datum/controller/process/proc/copyStateFrom(var/datum/controller/process/target) - -/datum/controller/process/proc/onKill() - -/datum/controller/process/proc/onStart() - -/datum/controller/process/proc/onFinish() - -/datum/controller/process/proc/disable() - disabled = 1 - -/datum/controller/process/proc/enable() - disabled = 0 - -/datum/controller/process/proc/getAverageRunTime() - var/t = 0 - var/c = 0 - for(var/time in last_twenty_run_times) - t += time - c++ - - if(c > 0) - return t / c - return c - -/datum/controller/process/proc/getLastRunTime() - return last_run_time - -/datum/controller/process/proc/getHighestRunTime() - return highest_run_time - -/datum/controller/process/proc/getTicks() - return ticks - -/datum/controller/process/proc/statProcess() - var/averageRunTime = round(getAverageRunTime(), 0.001) - var/lastRunTime = round(last_run_time, 0.001) - var/highestRunTime = round(highest_run_time, 0.001) - var/deferTime = round(cpu_defer_count / 10 * world.tick_lag, 0.01) - if(!statclick) - statclick = new /obj/effect/statclick/debug(src) - stat("[name]", statclick.update("T#[getTicks()] | AR [averageRunTime] | LR [lastRunTime] | HR [highestRunTime] | D [deferTime]")) - -/datum/controller/process/proc/catchException(var/exception/e, var/thrower) - if(istype(e)) // Real runtimes go to the real error handler - log_runtime(e, thrower, "Caught by process: [name]") - return - var/etext = "[e]" - var/eid = "[e]" // Exception ID, for tracking repeated exceptions - var/ptext = "" // "processing..." text, for what was being processed (if known) - if(istype(e)) - etext += " in [e.file], line [e.line]" - eid = "[e.file]:[e.line]" - if(eid in exceptions) - if(exceptions[eid]++ >= 10) - return - else - exceptions[eid] = 1 - if(istype(thrower, /datum)) - var/datum/D = thrower - ptext = " processing [D.type]" - if(istype(thrower, /atom)) - var/atom/A = thrower - ptext += " ([A]) ([A.x],[A.y],[A.z])" - log_world("\[[time_stamp()]\] Process [name] caught exception[ptext]: [etext]") - if(exceptions[eid] >= 10) - log_world("This exception will now be ignored for ten minutes.") - spawn(6000) - exceptions[eid] = 0 - -/datum/controller/process/proc/catchBadType(var/datum/caught) - if(isnull(caught) || !istype(caught) || QDELETED(caught)) - return // Only bother with types we can identify and that don't belong - catchException("Type [caught.type] does not belong in process' queue") - -// This is called to make a controller THE global authority on a global variable - like `air_master` -/datum/controller/process/proc/assertGlobality() - return - -// Called to let another instance of the controller have the fun -/datum/controller/process/proc/releaseGlobality() - return diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm deleted file mode 100644 index 9fcf6d13759..00000000000 --- a/code/controllers/ProcessScheduler/core/processScheduler.dm +++ /dev/null @@ -1,238 +0,0 @@ -// Singleton instance of game_controller_new, setup in world.New() -var/global/datum/controller/processScheduler/processScheduler - -/datum/controller/processScheduler - // Processes known by the scheduler - var/tmp/datum/controller/process/list/processes = new - - // Processes that are currently running - var/tmp/datum/controller/process/list/running = new - - // Processes that are idle - var/tmp/datum/controller/process/list/idle = new - - // Processes that are queued to run - var/tmp/datum/controller/process/list/queued = new - - // Process name -> process object map - var/tmp/datum/controller/process/list/nameToProcessMap = new - - // Process last queued times (world time) - var/tmp/datum/controller/process/list/last_queued = new - - // How long to sleep between runs (set to tick_lag in New) - var/tmp/scheduler_sleep_interval - - // Controls whether the scheduler is running or not - var/tmp/isRunning = 0 - - // Setup for these processes will be deferred until all the other processes are set up. - var/tmp/list/deferredSetupList = new - -/datum/controller/processScheduler/New() - ..() - // When the process scheduler is first new'd, tick_lag may be wrong, so these - // get re-initialized when the process scheduler is started. - // (These are kept here for any processes that decide to process before round start) - scheduler_sleep_interval = world.tick_lag - -/datum/controller/processScheduler/Destroy() - ..() - return QDEL_HINT_HARDDEL_NOW - -/** - * deferSetupFor - * @param path processPath - * If a process needs to be initialized after everything else, add it to - * the deferred setup list. On goonstation, only the ticker needs to have - * this treatment. - */ -/datum/controller/processScheduler/proc/deferSetupFor(var/processPath) - if(!(processPath in deferredSetupList)) - deferredSetupList += processPath - -/datum/controller/processScheduler/proc/setup() - // There can be only one - if(processScheduler && (processScheduler != src)) - qdel(src) - return 0 - - var/process - // Add all the processes we can find, except for the ticker - for(process in subtypesof(/datum/controller/process)) - if(!(process in deferredSetupList)) - addProcess(new process(src)) - - for(process in deferredSetupList) - addProcess(new process(src)) - -/datum/controller/processScheduler/proc/start() - isRunning = 1 - // tick_lag will have been set by now, so re-initialize these - scheduler_sleep_interval = world.tick_lag - updateStartDelays() - spawn(0) - process() - -/datum/controller/processScheduler/proc/process() - while(isRunning) - checkRunningProcesses() - queueProcesses() - runQueuedProcesses() - sleep(scheduler_sleep_interval) - -/datum/controller/processScheduler/proc/stop() - isRunning = 0 - -/datum/controller/processScheduler/proc/checkRunningProcesses() - for(var/datum/controller/process/p in running) - p.update() - - if(isnull(p)) // Process was killed - continue - - var/status = p.getStatus() - var/previousStatus = p.getPreviousStatus() - - // Check status changes - if(status != previousStatus) - //Status changed. - switch(status) - if(PROCESS_STATUS_PROBABLY_HUNG) - message_admins("Process '[p.name]' may be hung.") - if(PROCESS_STATUS_HUNG) - message_admins("Process '[p.name]' is hung and will be restarted.") - -/datum/controller/processScheduler/proc/queueProcesses() - for(var/datum/controller/process/p in processes) - // Don't double-queue, don't queue running processes - if(p.disabled || p.running || p.queued || !p.idle) - continue - - // If the process should be running by now, go ahead and queue it - if(world.time >= last_queued[p] + p.schedule_interval) - setQueuedProcessState(p) - -/datum/controller/processScheduler/proc/runQueuedProcesses() - for(var/datum/controller/process/p in queued) - runProcess(p) - -/datum/controller/processScheduler/proc/addProcess(var/datum/controller/process/process) - processes.Add(process) - process.idle() - idle.Add(process) - - process.assertGlobality() - // Set up process - process.setup() - - // Save process in the name -> process map - nameToProcessMap[process.name] = process - -/datum/controller/processScheduler/proc/replaceProcess(var/datum/controller/process/oldProcess, var/datum/controller/process/newProcess) - processes.Remove(oldProcess) - processes.Add(newProcess) - - oldProcess.releaseGlobality() - newProcess.assertGlobality() - newProcess.idle() - idle.Remove(oldProcess) - running.Remove(oldProcess) - queued.Remove(oldProcess) - idle.Add(newProcess) - - newProcess.last_run_time = oldProcess.last_run_time - newProcess.last_twenty_run_times = oldProcess.last_twenty_run_times - newProcess.highest_run_time = oldProcess.highest_run_time - - nameToProcessMap[newProcess.name] = newProcess - -/datum/controller/processScheduler/proc/updateStartDelays() - for(var/datum/controller/process/p in processes) - if(p.start_delay) - last_queued[p] = world.time - p.start_delay - -/datum/controller/processScheduler/proc/runProcess(var/datum/controller/process/process) - spawn(0) - process.process() - -/datum/controller/processScheduler/proc/processStarted(var/datum/controller/process/process) - setRunningProcessState(process) - last_queued[process] = world.time - -/datum/controller/processScheduler/proc/processFinished(var/datum/controller/process/process) - setIdleProcessState(process) - -/datum/controller/processScheduler/proc/setIdleProcessState(var/datum/controller/process/process) - if(process in running) - running -= process - if(process in queued) - queued -= process - if(!(process in idle)) - idle += process - -/datum/controller/processScheduler/proc/setQueuedProcessState(var/datum/controller/process/process) - if(process in running) - running -= process - if(process in idle) - idle -= process - if(!(process in queued)) - queued += process - - // The other state transitions are handled internally by the process. - process.queued() - -/datum/controller/processScheduler/proc/setRunningProcessState(var/datum/controller/process/process) - if(process in queued) - queued -= process - if(process in idle) - idle -= process - if(!(process in running)) - running += process - -/datum/controller/processScheduler/proc/getStatusData() - var/list/data = new - - for(var/datum/controller/process/p in processes) - data.len++ - data[data.len] = p.getContextData() - - return data - -/datum/controller/processScheduler/proc/getProcessCount() - return processes.len - -/datum/controller/processScheduler/proc/hasProcess(var/processName as text) - if(nameToProcessMap[processName]) - return 1 - -/datum/controller/processScheduler/proc/killProcess(var/processName as text) - restartProcess(processName) - -/datum/controller/processScheduler/proc/restartProcess(var/processName as text) - if(hasProcess(processName)) - var/datum/controller/process/oldInstance = nameToProcessMap[processName] - var/datum/controller/process/newInstance = new oldInstance.type(src) - newInstance._copyStateFrom(oldInstance) - replaceProcess(oldInstance, newInstance) - oldInstance.kill() - -/datum/controller/processScheduler/proc/enableProcess(var/processName as text) - if(hasProcess(processName)) - var/datum/controller/process/process = nameToProcessMap[processName] - process.enable() - -/datum/controller/processScheduler/proc/disableProcess(var/processName as text) - if(hasProcess(processName)) - var/datum/controller/process/process = nameToProcessMap[processName] - process.disable() - -/datum/controller/processScheduler/proc/statProcesses() - if(!isRunning) - stat("Processes", "Scheduler not running") - return - if(!statclick) - statclick = new /obj/effect/statclick/debug(src) - stat("Processes", statclick.update("[processes.len] (R [running.len] / Q [queued.len] / I [idle.len])")) - for(var/datum/controller/process/p in processes) - p.statProcess() diff --git a/code/controllers/ProcessScheduler/package.json b/code/controllers/ProcessScheduler/package.json deleted file mode 100644 index f699553fc61..00000000000 --- a/code/controllers/ProcessScheduler/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "ProcessScheduler", - "version": "1.0.0", - "description": "BYOND SS13 Process Scheduler", - "main": "processScheduler.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "https://github.com/goonstation/ProcessScheduler.git" - }, - "keywords": [ - "byond", - "ss13", - "process", - "scheduler" - ], - "author": "Volundr", - "license": "CC-BY-NC", - "bugs": { - "url": "https://github.com/goonstation/ProcessScheduler/issues" - }, - "homepage": "https://github.com/goonstation/ProcessScheduler", - "dependencies": { - "bower": "*" - } -} diff --git a/code/controllers/Processes/alarm.dm b/code/controllers/Processes/alarm.dm deleted file mode 100644 index 068ef0c1213..00000000000 --- a/code/controllers/Processes/alarm.dm +++ /dev/null @@ -1,37 +0,0 @@ -// We manually initialize the alarm handlers instead of looping over all existing types -// to make it possible to write: camera.triggerAlarm() rather than alarm_manager.managers[datum/alarm_handler/camera].triggerAlarm() or a variant thereof. -/var/global/datum/alarm_handler/atmosphere/atmosphere_alarm = new() -/var/global/datum/alarm_handler/burglar/burglar_alarm = new() -/var/global/datum/alarm_handler/camera/camera_alarm = new() -/var/global/datum/alarm_handler/fire/fire_alarm = new() -/var/global/datum/alarm_handler/motion/motion_alarm = new() -/var/global/datum/alarm_handler/power/power_alarm = new() - -// Alarm Manager, the manager for alarms. -var/datum/controller/process/alarm/alarm_manager - -/datum/controller/process/alarm - var/list/datum/alarm/all_handlers - -/datum/controller/process/alarm/setup() - name = "alarm" - schedule_interval = 20 // every 2 seconds - all_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) - -/datum/controller/process/alarm/doWork() - for(var/datum/alarm_handler/AH in all_handlers) - AH.process() - -DECLARE_GLOBAL_CONTROLLER(alarm, alarm_manager) - -/datum/controller/process/alarm/proc/active_alarms() - var/list/all_alarms = new - for(var/datum/alarm_handler/AH in all_handlers) - var/list/alarms = AH.alarms - all_alarms += alarms - - return all_alarms - -/datum/controller/process/alarm/proc/number_of_active_alarms() - var/list/alarms = active_alarms() - return alarms.len diff --git a/code/controllers/Processes/event.dm b/code/controllers/Processes/event.dm deleted file mode 100644 index 42e8c4bcc1d..00000000000 --- a/code/controllers/Processes/event.dm +++ /dev/null @@ -1,48 +0,0 @@ -/datum/controller/process/event/setup() - name = "event" - schedule_interval = 20 // every 2 seconds - if(!holiday_master) - holiday_master = new - holiday_master.Setup() - -/datum/controller/process/event/doWork() - event_manager.process() - holiday_master.process() - -///////// -//Holiday controller -///////// - -var/global/datum/controller/holiday/holiday_master //This has to be defined before world. - -/datum/controller/holiday - var/list/holidays - -/datum/controller/holiday/proc/Setup() - getHoliday() - -/datum/controller/holiday/proc/process() - if(holiday_master.holidays) - for(var/datum/holiday/H in holiday_master.holidays) - if(H.eventChance) - if(prob(H.eventChance)) - H.handle_event() - -/datum/controller/holiday/proc/getHoliday() - if(!config.allow_holidays) return //Holiday stuff was not enabled in the config! - - var/YY = text2num(time2text(world.timeofday, "YY")) // get the current year - var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month - var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day - - for(var/H in subtypesof(/datum/holiday)) - var/datum/holiday/holiday = new H() - if(holiday.shouldCelebrate(DD, MM, YY)) - holiday.celebrate() - if(!holidays) - holidays = list() - holidays[holiday.name] = holiday - - if(holidays) - holidays = shuffle(holidays) - world.update_status() diff --git a/code/controllers/Processes/fast_process.dm b/code/controllers/Processes/fast_process.dm deleted file mode 100644 index c27a749f526..00000000000 --- a/code/controllers/Processes/fast_process.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/controller/process/fast_process/setup() - name = "fast processing" - schedule_interval = 2 //every 0.2 seconds - start_delay = 9 - log_startup_progress("Fast Processing starting up.") - -/datum/controller/process/fast_process/statProcess() - ..() - stat(null, "[GLOB.fast_processing.len] fast processes") - -/datum/controller/process/fast_process/doWork() - for(last_object in GLOB.fast_processing) - var/obj/O = last_object - try - O.process() - catch(var/exception/e) - catchException(e, O) \ No newline at end of file diff --git a/code/controllers/Processes/lighting.dm b/code/controllers/Processes/lighting.dm deleted file mode 100644 index d46cab1d19f..00000000000 --- a/code/controllers/Processes/lighting.dm +++ /dev/null @@ -1,98 +0,0 @@ -/var/lighting_overlays_initialised = FALSE - -/var/list/lighting_update_lights = list() // List of lighting sources queued for update. -/var/list/lighting_update_corners = list() // List of lighting corners queued for update. -/var/list/lighting_update_overlays = list() // List of lighting overlays queued for update. - -/var/list/lighting_update_lights_old = list() // List of lighting sources currently being updated. -/var/list/lighting_update_corners_old = list() // List of lighting corners currently being updated. -/var/list/lighting_update_overlays_old = list() // List of lighting overlays currently being updated. - - -/datum/controller/process/lighting - // Queues of update counts, waiting to be rolled into stats lists - var/list/stats_queues = list( - "Source" = list(), "Corner" = list(), "Overlay" = list()) - // Stats lists - var/list/stats_lists = list( - "Source" = list(), "Corner" = list(), "Overlay" = list()) - var/update_stats_every = (1 SECONDS) - var/next_stats_update = 0 - var/stat_updates_to_keep = 5 - -/datum/controller/process/lighting/setup() - name = "lighting" - - schedule_interval = 0 // run as fast as you possibly can - sleep_interval = 10 // Yield every 10% of a tick - defer_usage = 80 // Defer at 80% of a tick - create_all_lighting_overlays() - lighting_overlays_initialised = TRUE - - // Pre-process lighting once before the round starts. Wait 30 seconds so the away mission has time to load. - spawn(300) - doWork(1) - -/datum/controller/process/lighting/doWork(roundstart) - - lighting_update_lights_old = lighting_update_lights //We use a different list so any additions to the update lists during a delay from scheck() don't cause things to be cut from the list without being updated. - lighting_update_lights = list() - for(var/datum/light_source/L in lighting_update_lights_old) - - if(L.check() || L.destroyed || L.force_update) - L.remove_lum() - if(!L.destroyed) - L.apply_lum() - - else if(L.vis_update) //We smartly update only tiles that became (in) visible to use. - L.smart_vis_update() - - L.vis_update = FALSE - L.force_update = FALSE - L.needs_update = FALSE - - SCHECK - - lighting_update_corners_old = lighting_update_corners //Same as above. - lighting_update_corners = list() - for(var/A in lighting_update_corners_old) - var/datum/lighting_corner/C = A - - C.update_overlays() - - C.needs_update = FALSE - - SCHECK - - lighting_update_overlays_old = lighting_update_overlays //Same as above. - lighting_update_overlays = list() - - for(var/A in lighting_update_overlays_old) - var/atom/movable/lighting_overlay/O = A - O.update_overlay() - O.needs_update = 0 - SCHECK - - stats_queues["Source"] += lighting_update_lights_old.len - stats_queues["Corner"] += lighting_update_corners_old.len - stats_queues["Overlay"] += lighting_update_overlays_old.len - - if(next_stats_update <= world.time) - next_stats_update = world.time + update_stats_every - for(var/stat_name in stats_queues) - var/stat_sum = 0 - var/list/stats_queue = stats_queues[stat_name] - for(var/count in stats_queue) - stat_sum += count - stats_queue.Cut() - - var/list/stats_list = stats_lists[stat_name] - stats_list.Insert(1, stat_sum) - if(stats_list.len > stat_updates_to_keep) - stats_list.Cut(stats_list.len) - -/datum/controller/process/lighting/statProcess() - ..() - stat(null, "[total_lighting_sources] sources, [total_lighting_corners] corners, [total_lighting_overlays] overlays") - for(var/stat_type in stats_lists) - stat(null, "[stat_type] updates: [jointext(stats_lists[stat_type], " | ")]") diff --git a/code/controllers/Processes/npcai.dm b/code/controllers/Processes/npcai.dm deleted file mode 100644 index 127429efd34..00000000000 --- a/code/controllers/Processes/npcai.dm +++ /dev/null @@ -1,41 +0,0 @@ -var/global/datum/controller/process/npcai/npcai_master - -/datum/controller/process/npcai - var/current_cycle - -/datum/controller/process/npcai/setup() - name = "npc ai" - schedule_interval = 20 // every 2 seconds - start_delay = 16 - log_startup_progress("NPC ticker starting up.") - -/datum/controller/process/npcai/started() - ..() - if(!GLOB.simple_animal_list) - GLOB.simple_animal_list = list() - if(!GLOB.snpc_list) - GLOB.snpc_list = list() - -/datum/controller/process/npcai/statProcess() - ..() - stat(null, "[GLOB.simple_animal_list.len] simple animals") - stat(null, "[GLOB.snpc_list.len] SNPC's") - -/datum/controller/process/npcai/doWork() - for(last_object in GLOB.simple_animal_list) - var/mob/living/simple_animal/M = last_object - if(istype(M) && !QDELETED(M)) - if(!M.client && M.stat == CONSCIOUS) - try - M.process_ai() - catch(var/exception/e) - catchException(e, M) - SCHECK - else - catchBadType(M) - GLOB.simple_animal_list -= M - - current_cycle++ - - -DECLARE_GLOBAL_CONTROLLER(npcai, npcai_master) diff --git a/code/controllers/Processes/obj.dm b/code/controllers/Processes/obj.dm deleted file mode 100644 index 454709b6194..00000000000 --- a/code/controllers/Processes/obj.dm +++ /dev/null @@ -1,28 +0,0 @@ -/datum/controller/process/obj/setup() - name = "obj" - schedule_interval = 20 // every 2 seconds - start_delay = 8 - -/datum/controller/process/obj/started() - ..() - if(!processing_objects) - processing_objects = list() - -/datum/controller/process/obj/statProcess() - ..() - stat(null, "[processing_objects.len] objects") - -/datum/controller/process/obj/doWork() - for(last_object in processing_objects) - var/datum/O = last_object - if(istype(O) && !QDELETED(O)) - try - // Reagent datums get shoved in here, but the process proc isn't on the - // base datum type, so we just call it blindly. - O:process() - catch(var/exception/e) - catchException(e, O) - SCHECK - else - catchBadType(O) - processing_objects -= O diff --git a/code/controllers/Processes/ticker.dm b/code/controllers/Processes/ticker.dm deleted file mode 100644 index 8fc476116e5..00000000000 --- a/code/controllers/Processes/ticker.dm +++ /dev/null @@ -1,36 +0,0 @@ -var/global/datum/controller/process/ticker/tickerProcess - -/datum/controller/process/ticker - var/lastTickerTimeDuration - var/lastTickerTime - -/datum/controller/process/ticker/setup() - name = "ticker" - schedule_interval = 20 // every 2 seconds - - lastTickerTime = world.timeofday - log_startup_progress("Time ticker starting up.") - - if(!ticker) - ticker = new - - spawn(0) - if(ticker) - ticker.pregame() - -DECLARE_GLOBAL_CONTROLLER(ticker, tickerProcess) - -/datum/controller/process/ticker/doWork() - var/currentTime = world.timeofday - - if(currentTime < lastTickerTime) // check for midnight rollover - lastTickerTimeDuration = (currentTime - (lastTickerTime - TICKS_IN_DAY)) / TICKS_IN_SECOND - else - lastTickerTimeDuration = (currentTime - lastTickerTime) / TICKS_IN_SECOND - - lastTickerTime = currentTime - - ticker.process() - -/datum/controller/process/ticker/proc/getLastTickerTimeDuration() - return lastTickerTimeDuration diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm deleted file mode 100644 index 8d22febee61..00000000000 --- a/code/controllers/communications.dm +++ /dev/null @@ -1,345 +0,0 @@ -/* - HOW IT WORKS - - The radio_controller is a global object maintaining all radio transmissions, think about it as about "ether". - Note that walkie-talkie, intercoms and headsets handle transmission using nonstandard way. - procs: - - add_object(obj/device as obj, var/new_frequency as num, var/filter as text|null = null) - Adds listening object. - parameters: - device - device receiving signals, must have proc receive_signal (see description below). - one device may listen several frequencies, but not same frequency twice. - new_frequency - see possibly frequencies below; - filter - thing for optimization. Optional, but recommended. - All filters should be consolidated in this file, see defines later. - Device without listening filter will receive all signals (on specified frequency). - Device with filter will receive any signals sent without filter. - Device with filter will not receive any signals sent with different filter. - returns: - Reference to frequency object. - - remove_object (obj/device, old_frequency) - Obliviously, after calling this proc, device will not receive any signals on old_frequency. - Other frequencies will left unaffected. - - return_frequency(var/frequency as num) - returns: - Reference to frequency object. Use it if you need to send and do not need to listen. - - radio_frequency is a global object maintaining list of devices that listening specific frequency. - procs: - - post_signal(obj/source as obj|null, datum/signal/signal, var/filter as text|null = null, var/range as num|null = null) - Sends signal to all devices that wants such signal. - parameters: - source - object, emitted signal. Usually, devices will not receive their own signals. - signal - see description below. - filter - described above. - range - radius of regular byond's square circle on that z-level. null means everywhere, on all z-levels. - - obj/proc/receive_signal(datum/signal/signal, var/receive_method as num, var/receive_param) - Handler from received signals. By default does nothing. Define your own for your object. - Avoid of sending signals directly from this proc, use spawn(-1). DO NOT use sleep() here or call procs that sleep please. If you must, use spawn() - parameters: - signal - see description below. Extract all needed data from the signal before doing sleep(), spawn() or return! - receive_method - may be TRANSMISSION_WIRE or TRANSMISSION_RADIO. - TRANSMISSION_WIRE is currently unused. - receive_param - for TRANSMISSION_RADIO here comes frequency. - - datum/signal - vars: - source - an object that emitted signal. Used for debug and bearing. - data - list with transmitting data. Usual use pattern: - data["msg"] = "hello world" - encryption - Some number symbolizing "encryption key". - Note that game actually do not use any cryptography here. - If receiving object don't know right key, it must ignore encrypted signal in its receive_signal. - -*/ - -var/const/DISPLAY_FREQ = 1435 //status displays -var/const/ATMOS_FIRE_FREQ = 1437 //air alarms -var/const/ENGINE_FREQ = 1438 //engine components -var/const/ATMOS_VENTSCRUB = 1439 //vents, scrubbers, atmos control -var/const/ATMOS_DISTRO_FREQ = 1443 //distro loop -var/const/ATMOS_TANKS_FREQ = 1441 //atmos supply tanks -var/const/BOT_BEACON_FREQ = 1445 //bot navigation beacons -var/const/AIRLOCK_FREQ = 1449 //airlock controls, electropack, magnets - -var/const/RSD_FREQ = 1457 //radio signal device -var/const/IMPL_FREQ = 1451 //tracking implant - -var/const/RADIO_LOW_FREQ = 1200 //minimum radio freq -var/const/PUBLIC_LOW_FREQ = 1441 //minimum radio chat freq -var/const/PUBLIC_HIGH_FREQ = 1489 //maximum radio chat freq -var/const/RADIO_HIGH_FREQ = 1600 //maximum radio freq - -var/const/SYND_FREQ = 1213 -var/const/SYNDTEAM_FREQ = 1244 -var/const/DTH_FREQ = 1341 //Special Operations -var/const/AI_FREQ = 1343 -var/const/ERT_FREQ = 1345 -var/const/COMM_FREQ = 1353 //Command -var/const/BOT_FREQ = 1447 //mulebot, secbot, ed209 - - -// department channels -var/const/PUB_FREQ = 1459 //standard radio chat -var/const/SEC_FREQ = 1359 //security -var/const/ENG_FREQ = 1357 //engineering -var/const/SCI_FREQ = 1351 //science -var/const/MED_FREQ = 1355 //medical -var/const/SUP_FREQ = 1347 //cargo -var/const/SRV_FREQ = 1349 //service - -// internal department channels -var/const/MED_I_FREQ = 1485 -var/const/SEC_I_FREQ = 1475 - -var/list/radiochannels = list( - "Common" = PUB_FREQ, - "Science" = SCI_FREQ, - "Command" = COMM_FREQ, - "Medical" = MED_FREQ, - "Engineering" = ENG_FREQ, - "Security" = SEC_FREQ, - "Response Team" = ERT_FREQ, - "Special Ops" = DTH_FREQ, - "Syndicate" = SYND_FREQ, - "SyndTeam" = SYNDTEAM_FREQ, - "Supply" = SUP_FREQ, - "Service" = SRV_FREQ, - "AI Private" = AI_FREQ, - "Medical(I)" = MED_I_FREQ, - "Security(I)" = SEC_I_FREQ -) - -// central command channels, i.e deathsquid & response teams -var/list/CENT_FREQS = list(ERT_FREQ, DTH_FREQ) - -// Antag channels, i.e. Syndicate -var/list/ANTAG_FREQS = list(SYND_FREQ, SYNDTEAM_FREQ) - -//Department channels, arranged lexically -var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, MED_FREQ, SEC_FREQ, SCI_FREQ, SRV_FREQ, SUP_FREQ) - -#define TRANSMISSION_WIRE 0 -#define TRANSMISSION_RADIO 1 - -/proc/frequency_span_class(var/frequency) - // Antags! - if(frequency in ANTAG_FREQS) - return "syndradio" - // centcomm channels (deathsquid and ert) - if(frequency in CENT_FREQS) - return "centradio" - // command channel - if(frequency == COMM_FREQ) - return "comradio" - // AI private channel - if(frequency == AI_FREQ) - return "airadio" - // department radio formatting (poorly optimized, ugh) - if(frequency == SEC_FREQ) - return "secradio" - if(frequency == ENG_FREQ) - return "engradio" - if(frequency == SCI_FREQ) - return "sciradio" - if(frequency == MED_FREQ) - return "medradio" - if(frequency == SUP_FREQ) - return "supradio" - if(frequency == SRV_FREQ) - return "srvradio" - if(frequency in DEPT_FREQS) - return "deptradio" - - return "radio" - -/* filters */ -//When devices register with the radio controller, they might register under a certain filter. -//Other devices can then choose to send signals to only those devices that belong to a particular filter. -//This is done for performance, so we don't send signals to lots of machines unnecessarily. - -//This filter is special because devices belonging to default also recieve signals sent to any other filter. -var/const/RADIO_DEFAULT = "radio_default" - -var/const/RADIO_TO_AIRALARM = "radio_airalarm" //air alarms -var/const/RADIO_FROM_AIRALARM = "radio_airalarm_rcvr" //devices interested in recieving signals from air alarms -var/const/RADIO_CHAT = "radio_telecoms" -var/const/RADIO_ATMOSIA = "radio_atmos" -var/const/RADIO_NAVBEACONS = "radio_navbeacon" -var/const/RADIO_AIRLOCK = "radio_airlock" -var/const/RADIO_SECBOT = "radio_secbot" -var/const/RADIO_HONKBOT = "radio_honkbot" -var/const/RADIO_MULEBOT = "radio_mulebot" -var/const/RADIO_CLEANBOT = "10" -var/const/RADIO_FLOORBOT = "11" -var/const/RADIO_MEDBOT = "12" -var/const/RADIO_MAGNETS = "radio_magnet" -var/const/RADIO_LOGIC = "radio_logic" - -var/global/datum/controller/radio/radio_controller - -/hook/startup/proc/createRadioController() - radio_controller = new /datum/controller/radio() - return 1 - -//callback used by objects to react to incoming radio signals -/obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param) - return null - -//The global radio controller -/datum/controller/radio - var/list/datum/radio_frequency/frequencies = list() - -/datum/controller/radio/proc/add_object(obj/device as obj, var/new_frequency as num, var/filter = null as text|null) - var/f_text = num2text(new_frequency) - var/datum/radio_frequency/frequency = frequencies[f_text] - - if(!frequency) - frequency = new - frequency.frequency = new_frequency - frequencies[f_text] = frequency - - frequency.add_listener(device, filter) - return frequency - -/datum/controller/radio/proc/remove_object(obj/device, old_frequency) - var/f_text = num2text(old_frequency) - var/datum/radio_frequency/frequency = frequencies[f_text] - - if(frequency) - frequency.remove_listener(device) - - if(frequency.devices.len == 0) - qdel(frequency) - frequencies -= f_text - - return 1 - -/datum/controller/radio/proc/return_frequency(var/new_frequency as num) - var/f_text = num2text(new_frequency) - var/datum/radio_frequency/frequency = frequencies[f_text] - - if(!frequency) - frequency = new - frequency.frequency = new_frequency - frequencies[f_text] = frequency - - return frequency - -/datum/radio_frequency - var/frequency as num - var/list/list/obj/devices = list() - -/datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, var/filter = null as text|null, var/range = null as num|null) - var/turf/start_point - if(range) - start_point = get_turf(source) - if(!start_point) - qdel(signal) - return 0 - if(filter) - send_to_filter(source, signal, filter, start_point, range) - send_to_filter(source, signal, RADIO_DEFAULT, start_point, range) - else - //Broadcast the signal to everyone! - for(var/next_filter in devices) - send_to_filter(source, signal, next_filter, start_point, range) - -//Sends a signal to all machines belonging to a given filter. Should be called by post_signal() -/datum/radio_frequency/proc/send_to_filter(obj/source, datum/signal/signal, var/filter, var/turf/start_point = null, var/range = null) - if(range && !start_point) - return - - for(var/obj/device in devices[filter]) - if(device == source) - continue - if(range) - var/turf/end_point = get_turf(device) - if(!end_point) - continue - if(start_point.z!=end_point.z || get_dist(start_point, end_point) > range) - continue - - device.receive_signal(signal, TRANSMISSION_RADIO, frequency) - -/datum/radio_frequency/proc/add_listener(obj/device as obj, var/filter as text|null) - if(!filter) - filter = RADIO_DEFAULT - //log_admin("add_listener(device=[device],filter=[filter]) frequency=[frequency]") - var/list/obj/devices_line = devices[filter] - if(!devices_line) - devices_line = new - devices[filter] = devices_line - devices_line+=device -// var/list/obj/devices_line___ = devices[filter_str] -// var/l = devices_line___.len - //log_admin("DEBUG: devices_line.len=[devices_line.len]") - //log_admin("DEBUG: devices(filter_str).len=[l]") - -/datum/radio_frequency/proc/remove_listener(obj/device) - for(var/devices_filter in devices) - var/list/devices_line = devices[devices_filter] - devices_line-=device - while(null in devices_line) - devices_line -= null - if(devices_line.len==0) - devices -= devices_filter - qdel(devices_line) - -/datum/signal - var/obj/source - - var/transmission_method = 0 //unused at the moment - //0 = wire - //1 = radio transmission - //2 = subspace transmission - - var/list/data = list() - var/encryption - - var/frequency = 0 - -/datum/signal/proc/copy_from(datum/signal/model) - source = model.source - transmission_method = model.transmission_method - data = model.data - encryption = model.encryption - frequency = model.frequency - -/datum/signal/proc/debug_print() - if(source) - . = "signal = {source = '[source]' ([source:x],[source:y],[source:z])\n" - else - . = "signal = {source = '[source]' ()\n" - for(var/i in data) - . += "data\[\"[i]\"\] = \"[data[i]]\"\n" - if(islist(data[i])) - var/list/L = data[i] - for(var/t in L) - . += "data\[\"[i]\"\] list has: [t]" - -/datum/signal/proc/get_race(mob/M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - . = H.dna.species.name - else if(isbrain(M)) - var/mob/living/carbon/brain/B = M - . = B.get_race() - else if(issilicon(M)) - . = "Artificial Life" - else if(isslime(M)) - . = "Slime" - else if(isbot(M)) - . = "Bot" - else if(isanimal(M)) - . = "Domestic Animal" - else - . = "Unidentifiable" diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 3a2ff120af3..baa0adc07ec 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -1,5 +1,7 @@ /datum/configuration var/server_name = null // server name (for world name / status) + var/server_tag_line = null // server tagline (for showing on hub entry) + var/server_extra_features = null // server-specific extra features (for hub entry) var/server_suffix = 0 // generate numeric suffix based on server port var/minimum_client_build = 1421 // Build 1421 due to the middle mouse button exploit @@ -53,7 +55,6 @@ var/humans_need_surnames = 0 var/allow_random_events = 0 // enables random events mid-round when set to 1 var/allow_ai = 1 // allow ai job - var/hostedby = null var/respawn = 0 var/guest_jobban = 1 var/usewhitelist = 0 @@ -63,14 +64,23 @@ var/automute_on = 0 //enables automuting/spam prevention var/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. var/round_abandon_penalty_period = 30 MINUTES // Time from round start during which ghosting out is penalized + var/medal_hub_address = null + var/medal_hub_password = null var/reactionary_explosions = 0 //If we use reactionary explosions, explosions that react to walls and doors var/assistantlimit = 0 //enables assistant limiting var/assistantratio = 2 //how many assistants to security members - var/prob_free_golems = 75 //chance for free golems spawners to appear roundstart - var/unrestricted_free_golems = FALSE //if true, free golems can appear on all roundtypes + // 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 + + var/list_afk_minimum = 5 // How long people have to be AFK before it's listed on the "List AFK players" verb var/traitor_objectives_amount = 2 var/shadowling_max_age = 0 @@ -100,10 +110,6 @@ //game_options.txt configs - var/health_threshold_softcrit = 0 - var/health_threshold_crit = 0 - var/health_threshold_dead = -100 - var/bones_can_break = 1 var/revival_pod_plants = 1 @@ -127,6 +133,18 @@ var/slime_delay = 0 var/animal_delay = 0 + //IP Intel vars + var/ipintel_email + var/ipintel_rating_bad = 1 + var/ipintel_save_good = 12 + var/ipintel_save_bad = 1 + var/ipintel_domain = "check.getipintel.net" + var/ipintel_maxplaytime = 0 + var/ipintel_whitelist = 0 + var/ipintel_detailsurl = "https://iphub.info/?ip=" + + var/forum_link_url + var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt var/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database @@ -218,6 +236,12 @@ // Automatic localhost admin disable var/disable_localhost_admin = 0 + //Start now warning + var/start_now_confirmation = 0 + + // Lavaland + var/lavaland_budget = 60 + /datum/configuration/New() for(var/T in subtypesof(/datum/game_mode)) var/datum/game_mode/M = T @@ -285,15 +309,45 @@ if("jobs_have_minimal_access") config.jobs_have_minimal_access = 1 - if("prob_free_golems") - config.prob_free_golems = text2num(value) - - if("unrestricted_free_golems") - config.unrestricted_free_golems = TRUE - 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") + config.ssd_warning = 1 + + if("list_afk_minimum") + config.list_afk_minimum = text2num(value) + + if("ipintel_email") + if(value != "ch@nge.me") + config.ipintel_email = value + if("ipintel_rating_bad") + config.ipintel_rating_bad = text2num(value) + if("ipintel_domain") + config.ipintel_domain = value + if("ipintel_save_good") + config.ipintel_save_good = text2num(value) + if("ipintel_save_bad") + config.ipintel_save_bad = text2num(value) + if("ipintel_maxplaytime") + config.ipintel_maxplaytime = text2num(value) + if("ipintel_whitelist") + config.ipintel_whitelist = 1 + if("ipintel_detailsurl") + config.ipintel_detailsurl = value + + if("forum_link_url") + config.forum_link_url = value + if("log_ooc") config.log_ooc = 1 @@ -307,7 +361,7 @@ config.log_admin = 1 if("log_debug") - config.log_debug = text2num(value) + config.log_debug = 1 if("log_game") config.log_game = 1 @@ -360,6 +414,12 @@ if("no_dead_vote") config.vote_no_dead = 1 + if("vote_autotransfer_initial") + config.vote_autotransfer_initial = text2num(value) + + if("vote_autotransfer_interval") + config.vote_autotransfer_interval = text2num(value) + if("default_no_vote") config.vote_no_default = 1 @@ -381,6 +441,12 @@ if("servername") config.server_name = value + if("server_tag_line") + config.server_tag_line = value + + if("server_extra_features") + config.server_extra_features = value + if("serversuffix") config.server_suffix = 1 @@ -390,9 +456,6 @@ if("nudge_script_path") config.nudge_script_path = value - if("hostedby") - config.hostedby = value - if("server") config.server = value @@ -587,8 +650,7 @@ config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) if("starlight") - var/vvalue = text2num(value) - config.starlight = vvalue >= 0 ? vvalue : 0 + config.starlight = 1 if("player_reroute_cap") var/vvalue = text2num(value) @@ -624,10 +686,10 @@ config.round_abandon_penalty_period = MinutesToTicks(text2num(value)) if("medal_hub_address") - global.medal_hub = value + config.medal_hub_address = value if("medal_hub_password") - global.medal_pass = value + config.medal_hub_password = value if("disable_ooc_emoji") config.disable_ooc_emoji = 1 @@ -641,6 +703,9 @@ if("disable_karma") config.disable_karma = 1 + if("start_now_confirmation") + config.start_now_confirmation = 1 + if("tick_limit_mc_init") config.tick_limit_mc_init = text2num(value) if("base_mc_tick_rate") @@ -663,10 +728,6 @@ value = text2num(value) switch(name) - if("health_threshold_crit") - config.health_threshold_crit = value - if("health_threshold_dead") - config.health_threshold_dead = value if("revival_pod_plants") config.revival_pod_plants = value if("revival_cloning") @@ -719,6 +780,8 @@ config.randomize_shift_time = TRUE if("enable_night_shifts") config.enable_night_shifts = TRUE + if("lavaland_budget") + config.lavaland_budget = text2num(value) else log_config("Unknown setting in configuration: '[name]'") @@ -770,7 +833,7 @@ config.sql_enabled = 0 log_config("WARNING: DB_CONFIG DEFINITION MISMATCH!") spawn(60) - if(ticker.current_state == GAME_STATE_PREGAME) + if(SSticker.current_state == GAME_STATE_PREGAME) going = 0 spawn(600) to_chat(world, "DB_CONFIG MISMATCH, ROUND START DELAYED.
Please check database version for recent upstream changes!
") diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm index 1d597f5e742..8b0f0b1987e 100644 --- a/code/controllers/failsafe.dm +++ b/code/controllers/failsafe.dm @@ -1,5 +1,10 @@ -GLOBAL_REAL(Failsafe, /datum/controller/failsafe) + /** + * Failsafe + * + * Pretty much pokes the MC to make sure it's still alive. + **/ +GLOBAL_REAL(Failsafe, /datum/controller/failsafe) /datum/controller/failsafe // This thing pretty much just keeps poking the master controller name = "Failsafe" @@ -92,6 +97,6 @@ GLOBAL_REAL(Failsafe, /datum/controller/failsafe) /datum/controller/failsafe/stat_entry() if(!statclick) - statclick = new/obj/effect/statclick/debug(src, "Initializing...") + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) stat("Failsafe Controller:", statclick.update("Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])")) diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index 62b83100fb4..543f0aed4b2 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -22,19 +22,19 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) stack_trace("Some fucker qdel'd the global holder!") if(!force) return QDEL_HINT_LETMELIVE - + QDEL_NULL(statclick) gvars_datum_protected_varlist.Cut() gvars_datum_in_built_vars.Cut() - + GLOB = null return ..() /datum/controller/global_vars/stat_entry() if(!statclick) - statclick = new/obj/effect/statclick/debug(src, "Initializing...") - + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) + stat("Globals:", statclick.update("Edit")) /datum/controller/global_vars/can_vv_get(var_name) diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm index 49919279242..59510162e1c 100644 --- a/code/controllers/hooks-defs.dm +++ b/code/controllers/hooks-defs.dm @@ -9,114 +9,3 @@ * Called in gameticker.dm when a round starts. */ /hook/roundstart - -/** - * Roundend hook. - * Called in gameticker.dm when a round ends. - */ -/hook/roundend - -/** - * LateSpawn hook. - * Called in newplayer.dm when a humanoid character joins the round after it started. - * Parameters: var/mob/living/carbon/human - */ -/hook/latespawn - -/** - * Death hook. - * Called in death.dm when someone dies. - * Parameters: var/mob/living/carbon/human, var/gibbed - */ -/hook/death - -/** - * Cloning hook. - * Called in cloning.dm when someone is brought back by the wonders of modern science. - * Parameters: var/mob/living/carbon/human - */ -/hook/clone - -/** - * Debrained hook. - * Called in brain_item.dm when someone gets debrained. - * Parameters: var/obj/item/brain - */ -/hook/debrain - -/** - * Borged hook. - * Called in robot_parts.dm when someone gets turned into a cyborg. - * Parameters: var/mob/living/silicon/robot - */ -/hook/borgify - -/** - * Podman hook. - * Called in podmen.dm when someone is brought back as a Diona. - * Parameters: var/mob/living/carbon/primitive/diona - */ -/hook/harvest_podman - -/** - * Payroll revoked hook. - * Called in Accounts_DB.dm when someone's payroll is stolen at the Accounts terminal. - * Parameters: var/datum/money_account - */ -/hook/revoke_payroll - -/** - * Account suspension hook. - * Called in Accounts_DB.dm when someone's account is suspended or unsuspended at the Accounts terminal. - * Parameters: var/datum/money_account - */ -/hook/change_account_status - -/** - * Employee reassignment hook. - * Called in card.dm when someone's card is reassigned at the HoP's desk. - * Parameters: var/obj/item/card/id - */ -/hook/reassign_employee - -/** - * Employee terminated hook. - * Called in card.dm when someone's card is terminated at the HoP's desk. - * Parameters: var/obj/item/card/id - */ -/hook/terminate_employee - -/** - * Crate sold hook. - * Called in supplyshuttle.dm when a crate is sold on the shuttle. - * Parameters: var/obj/structure/closet/crate/sold, var/area/shuttle - */ -/hook/sell_crate - -/** - * Captain spawned hook. - * Called in supervisor.dm when a captain spawns - * Parameters: var/mob/living/carbon/human/captain - */ -/hook/captain_spawned - -/** - * Mob login hook. - * Called in login.dm when a player logs in to a mob. - * Parameters: var/client/client, var/mob/mob - */ -/hook/mob_login - - /** - * Mob logout hook. - * Called in logout.dm when a player logs out of a mob. - * Parameters: var/client/client, var/mob/mob - */ -/hook/mob_logout - -/** - * Mob area change hook. - * Called in area.dm when a mob moves from one area to another. - * Parameters: var/mob/mob, var/area/newarea, var/area/oldarea - */ -/hook/mob_area_change diff --git a/code/controllers/master.dm b/code/controllers/master.dm index a9c7e0dbb7b..10c6b42a369 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -194,8 +194,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new to_chat(world, "[msg]") log_world(msg) - if(config.developer_express_start & ticker.current_state == GAME_STATE_PREGAME) - ticker.current_state = GAME_STATE_SETTING_UP + if(config.developer_express_start & SSticker.current_state == GAME_STATE_PREGAME) + SSticker.current_state = GAME_STATE_SETTING_UP if(!current_runlevel) SetRunLevel(1) @@ -203,12 +203,14 @@ GLOBAL_REAL(Master, /datum/controller/master) = new // Sort subsystems by display setting for easy access. sortTim(subsystems, /proc/cmp_subsystem_display) // Set world options. - if(sleep_offline_after_initializations) - world.sleep_offline = TRUE // world.fps = CONFIG_GET(number/fps) // TIGER TODO world.tick_lag = config.Ticklag var/initialized_tod = REALTIMEOFDAY + + if(sleep_offline_after_initializations) + world.sleep_offline = TRUE sleep(1) + initializations_finished_with_no_players_logged_in = initialized_tod < REALTIMEOFDAY - 10 // Loop. Master.StartProcessing(0) @@ -249,7 +251,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new //all this shit is here so that flag edits can be refreshed by restarting the MC. (and for speed) var/list/tickersubsystems = list() - var/list/runlevel_sorted_subsystems = list(list(), list(), list(), list(), list(), list(), list(), list()) //ensure we always have as many runlevels as we need to operate with no subsystems (8 currently) + var/list/runlevel_sorted_subsystems = list(list()) //ensure we always have at least one runlevel var/timer = world.time for(var/thing in subsystems) var/datum/controller/subsystem/SS = thing @@ -470,7 +472,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new else tick_precentage = tick_remaining - tick_precentage = max(tick_precentage*0.5, tick_precentage - queue_node.tick_overrun) + tick_precentage = max(tick_precentage * 0.5, tick_precentage - queue_node.tick_overrun) current_ticklimit = round(TICK_USAGE + tick_precentage) @@ -584,10 +586,10 @@ GLOBAL_REAL(Master, /datum/controller/master) = new /datum/controller/master/stat_entry() if(!statclick) - statclick = new/obj/effect/statclick/debug(src, "Initializing...") + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - stat("Byond", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%))") - stat("Master Controller", statclick.update("(TickRate:[Master.processing]) (Iteration:[Master.iteration])")) + stat("Byond:", "(FPS:[world.fps]) (TickCount:[world.time / world.tick_lag]) (TickDrift:[round(Master.tickdrift, 1)]([round((Master.tickdrift / (world.time / world.tick_lag)) * 100, 0.1)]%))") + stat("Master Controller:", statclick.update("(TickRate:[Master.processing]) (Iteration:[Master.iteration])")) // Currently unimplemented /datum/controller/master/StartLoadingMap() @@ -613,4 +615,4 @@ GLOBAL_REAL(Master, /datum/controller/master) = new if(client_count < config.disable_high_pop_mc_mode_amount) processing = config.base_mc_tick_rate else if(client_count > config.high_pop_mc_mode_amount) - processing = config.high_pop_mc_tick_rate + processing = config.high_pop_mc_tick_rate \ No newline at end of file diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm deleted file mode 100644 index 1fd81402544..00000000000 --- a/code/controllers/master_controller.dm +++ /dev/null @@ -1,64 +0,0 @@ -// old deprecated rusted piece of shit MC -// All this does now is misc. world init stuff because too lazy to put it somewhere else -// It used to run all of the repeating processes controlling the game but now the SMC and Process Scheduler do that - -var/global/datum/controller/game_controller/master_controller //Set in world.New() - -var/global/controller_iteration = 0 -var/global/last_tick_duration = 0 - -var/global/air_processing_killed = 0 -var/global/pipe_processing_killed = 0 - -/datum/controller/game_controller - var/list/shuttle_list // For debugging and VV - -/datum/controller/game_controller/New() - //There can be only one master_controller. Out with the old and in with the new. - if(master_controller != src) - if(istype(master_controller)) - qdel(master_controller) - master_controller = src - - var/watch=0 - if(!job_master) - watch = start_watch() - job_master = new /datum/controller/occupations() - job_master.SetupOccupations() - job_master.LoadJobs("config/jobs.txt") - log_startup_progress("Job setup complete in [stop_watch(watch)]s.") - - if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase() - if(!syndicate_code_response) syndicate_code_response = generate_code_phrase() - -/datum/controller/game_controller/Destroy() - ..() - return QDEL_HINT_HARDDEL_NOW - -/datum/controller/game_controller/proc/setup() - preloadTemplates() - if(!config.disable_away_missions) - createRandomZlevel() - // Create 6 extra space levels to put space ruins on - if(!config.disable_space_ruins) - var/timer = start_watch() - log_startup_progress("Creating random space levels...") - seedRuins(level_name_to_num(EMPTY_AREA), rand(0, 3), /area/space, space_ruins_templates) - log_startup_progress("Loaded random space levels in [stop_watch(timer)]s.") - - // load in extra levels of space ruins - - var/num_extra_space = rand(config.extra_space_ruin_levels_min, config.extra_space_ruin_levels_max) - for(var/i = 1, i <= num_extra_space, i++) - var/zlev = space_manager.add_new_zlevel("[EMPTY_AREA] #[i]", linkage = CROSSLINKED) - seedRuins(zlev, rand(0, 3), /area/space, space_ruins_templates) - - space_manager.do_transition_setup() - - setupfactions() - setup_economy() - - for(var/i=0, iYou 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/air.dm b/code/controllers/subsystem/air.dm index 6c394309a09..fe48494f321 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -14,7 +14,6 @@ SUBSYSTEM_DEF(air) wait = 5 flags = SS_BACKGROUND runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/cost_turfs = 0 var/cost_groups = 0 var/cost_highpressure = 0 @@ -31,6 +30,7 @@ SUBSYSTEM_DEF(air) var/list/networks = list() var/list/atmos_machinery = list() var/list/pipe_init_dirs_cache = list() + var/list/machinery_to_construct = list() @@ -68,8 +68,9 @@ SUBSYSTEM_DEF(air) setup_allturfs() setup_atmos_machinery(GLOB.machines) setup_pipenets(GLOB.machines) - ..() - + for(var/obj/machinery/atmospherics/A in machinery_to_construct) + A.initialize_atmos_network() + return ..() /datum/controller/subsystem/air/fire(resumed = 0) var/timer = TICK_USAGE_REAL @@ -362,20 +363,18 @@ SUBSYSTEM_DEF(air) plmaster = new /obj/effect/overlay() plmaster.icon = 'icons/effects/tile_effects.dmi' plmaster.icon_state = "plasma" - plmaster.layer = FLY_LAYER plmaster.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + plmaster.anchored = TRUE // should only appear in vis_contents, but to be safe + plmaster.layer = FLY_LAYER + plmaster.appearance_flags = TILE_BOUND slmaster = new /obj/effect/overlay() slmaster.icon = 'icons/effects/tile_effects.dmi' slmaster.icon_state = "sleeping_agent" - slmaster.layer = FLY_LAYER slmaster.mouse_opacity = MOUSE_OPACITY_TRANSPARENT - - icemaster = new /obj/effect/overlay() - icemaster.icon = 'icons/turf/overlays.dmi' - icemaster.icon_state = "snowfloor" - icemaster.layer = TURF_LAYER + 0.1 - icemaster.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + slmaster.anchored = TRUE // should only appear in vis_contents, but to be safe + slmaster.layer = FLY_LAYER + slmaster.appearance_flags = TILE_BOUND #undef SSAIR_PIPENETS #undef SSAIR_ATMOSMACHINERY @@ -383,4 +382,4 @@ SUBSYSTEM_DEF(air) #undef SSAIR_EXCITEDGROUPS #undef SSAIR_HIGHPRESSURE #undef SSAIR_HOTSPOTS -#undef SSAIR_SUPERCONDUCTIVITY +#undef SSAIR_SUPERCONDUCTIVITY \ No newline at end of file diff --git a/code/controllers/subsystem/alarm.dm b/code/controllers/subsystem/alarm.dm new file mode 100644 index 00000000000..90e3ff960f1 --- /dev/null +++ b/code/controllers/subsystem/alarm.dm @@ -0,0 +1,30 @@ +SUBSYSTEM_DEF(alarms) + name = "Alarms" + init_order = INIT_ORDER_ALARMS // 2 + var/datum/alarm_handler/atmosphere/atmosphere_alarm = new() + var/datum/alarm_handler/burglar/burglar_alarm = new() + var/datum/alarm_handler/camera/camera_alarm = new() + var/datum/alarm_handler/fire/fire_alarm = new() + var/datum/alarm_handler/motion/motion_alarm = new() + var/datum/alarm_handler/power/power_alarm = new() + var/list/datum/alarm/all_handlers + +/datum/controller/subsystem/alarms/Initialize(start_timeofday) + all_handlers = list(SSalarms.atmosphere_alarm, SSalarms.burglar_alarm, SSalarms.camera_alarm, SSalarms.fire_alarm, SSalarms.motion_alarm, SSalarms.power_alarm) + return ..() + +/datum/controller/subsystem/alarms/fire() + for(var/datum/alarm_handler/AH in all_handlers) + AH.process() + +/datum/controller/subsystem/alarms/proc/active_alarms() + var/list/all_alarms = new () + for(var/datum/alarm_handler/AH in all_handlers) + var/list/alarms = AH.alarms + all_alarms += alarms + + return all_alarms + +/datum/controller/subsystem/alarms/proc/number_of_active_alarms() + var/list/alarms = active_alarms() + return alarms.len diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm index 1423c6cf9bd..cd531db614a 100644 --- a/code/controllers/subsystem/assets.dm +++ b/code/controllers/subsystem/assets.dm @@ -14,4 +14,4 @@ SUBSYSTEM_DEF(assets) for(var/client/C in GLOB.clients) addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, preload, FALSE), 10) - ..() \ No newline at end of file + return ..() \ No newline at end of file diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index a0b2d49d958..cbe8806fc15 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -19,6 +19,7 @@ SUBSYSTEM_DEF(atoms) setupgenetics() initialized = INITIALIZATION_INNEW_MAPLOAD InitializeAtoms() + return ..() diff --git a/code/modules/events/event_manager.dm b/code/controllers/subsystem/events.dm similarity index 72% rename from code/modules/events/event_manager.dm rename to code/controllers/subsystem/events.dm index 1545ddbbdf0..2f415efa38d 100644 --- a/code/modules/events/event_manager.dm +++ b/code/controllers/subsystem/events.dm @@ -1,19 +1,25 @@ -/datum/event_manager +SUBSYSTEM_DEF(events) + name = "Events" + init_order = INIT_ORDER_EVENTS + runlevels = RUNLEVEL_GAME + // Report events at the end of the rouund + var/report_at_round_end = 0 + + // UI vars var/window_x = 700 var/window_y = 600 - var/report_at_round_end = 0 var/table_options = " align='center'" var/head_options = " style='font-weight:bold;'" var/row_options1 = " width='85px'" var/row_options2 = " width='260px'" var/row_options3 = " width='150px'" + + // Event vars var/datum/event_container/selected_event_container = null - - var/list/datum/event/active_events = list() - var/list/datum/event/finished_events = list() - - var/list/datum/event/allEvents - var/list/datum/event_container/event_containers = list( + var/list/active_events = list() + var/list/finished_events = list() + var/list/allEvents + var/list/event_containers = list( EVENT_LEVEL_MUNDANE = new/datum/event_container/mundane, EVENT_LEVEL_MODERATE = new/datum/event_container/moderate, EVENT_LEVEL_MAJOR = new/datum/event_container/major @@ -21,18 +27,19 @@ var/datum/event_meta/new_event = new -/datum/event_manager/New() +/datum/controller/subsystem/events/Initialize() allEvents = subtypesof(/datum/event) + return ..() -/datum/event_manager/proc/process() - for(var/datum/event/E in event_manager.active_events) +/datum/controller/subsystem/events/fire() + for(var/datum/event/E in active_events) E.process() for(var/i = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR) var/list/datum/event_container/EC = event_containers[i] EC.process() -/datum/event_manager/proc/event_complete(var/datum/event/E) +/datum/controller/subsystem/events/proc/event_complete(var/datum/event/E) if(!E.event_meta) // datum/event is used here and there for random reasons, maintaining "backwards compatibility" log_debug("Event of '[E.type]' with missing meta-data has completed.") return @@ -57,11 +64,11 @@ log_debug("Event '[EM.name]' has completed at [station_time_timestamp()].") -/datum/event_manager/proc/delay_events(var/severity, var/delay) +/datum/controller/subsystem/events/proc/delay_events(var/severity, var/delay) var/list/datum/event_container/EC = event_containers[severity] EC.next_event_time += delay -/datum/event_manager/proc/Interact(var/mob/living/user) +/datum/controller/subsystem/events/proc/Interact(var/mob/living/user) var/html = GetInteractWindow() @@ -69,7 +76,7 @@ popup.set_content(html) popup.open() -/datum/event_manager/proc/RoundEnd() +/datum/controller/subsystem/events/proc/RoundEnd() if(!report_at_round_end) return @@ -89,7 +96,7 @@ to_chat(world, message) -/datum/event_manager/proc/GetInteractWindow() +/datum/controller/subsystem/events/proc/GetInteractWindow() var/html = "Refresh" if(selected_event_container) @@ -197,7 +204,7 @@ return html -/datum/event_manager/Topic(href, href_list) +/datum/controller/subsystem/events/Topic(href, href_list) if(..()) return @@ -242,7 +249,7 @@ else if(href_list["back"]) selected_event_container = null else if(href_list["set_name"]) - var/name = input("Enter event name.", "Set Name") as text|null + var/name = clean_input("Enter event name.", "Set Name") if(name) var/datum/event_meta/EM = locate(href_list["set_name"]) EM.name = name @@ -290,123 +297,3 @@ EC.next_event = null Interact(usr) - -/client/proc/forceEvent(var/type in event_manager.allEvents) - set name = "Trigger Event (Debug Only)" - set category = "Debug" - - if(!holder) - return - - if(ispath(type)) - new type(new /datum/event_meta(EVENT_LEVEL_MAJOR)) - message_admins("[key_name_admin(usr)] has triggered an event. ([type])", 1) - -/client/proc/event_manager_panel() - set name = "Event Manager Panel" - set category = "Event" - if(event_manager) - event_manager.Interact(usr) - feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return - -/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in! - var/area/candidate = null - - var/list/safe_areas = list( - /area/turret_protected/ai, - /area/turret_protected/ai_upload, - /area/engine, - /area/solar, - /area/holodeck, - /area/shuttle/arrival, - /area/shuttle/escape, - /area/shuttle/escape_pod1/station, - /area/shuttle/escape_pod2/station, - /area/shuttle/escape_pod3/station, - /area/shuttle/escape_pod5/station, - /area/shuttle/specops/station, - /area/shuttle/prison/station, - /area/shuttle/administration/station - ) - - //These are needed because /area/engine has to be removed from the list, but we still want these areas to get fucked up. - var/list/danger_areas = list( - /area/engine/break_room, - /area/engine/chiefs_office) - - var/list/event_areas = list() - - for(var/areapath in the_station_areas) - event_areas += typesof(areapath) - for(var/areapath in safe_areas) - event_areas -= typesof(areapath) - for(var/areapath in danger_areas) - event_areas += typesof(areapath) - - while(event_areas.len > 0) - var/list/event_turfs = null - candidate = locate(pick_n_take(event_areas)) - event_turfs = get_area_turfs(candidate) - if(event_turfs.len > 0) - break - - return candidate - -/datum/event/proc/num_players() - var/players = 0 - for(var/mob/living/carbon/human/P in GLOB.player_list) - if(P.client) - players++ - return players - -// Returns how many characters are currently active(not logged out, not AFK for more than 10 minutes) -// with a specific role. -// Note that this isn't sorted by department, because e.g. having a roboticist shouldn't make meteors spawn. -/proc/number_active_with_role() - var/list/active_with_role = list() - active_with_role["Engineer"] = 0 - active_with_role["Medical"] = 0 - active_with_role["Security"] = 0 - active_with_role["Scientist"] = 0 - active_with_role["AI"] = 0 - active_with_role["Cyborg"] = 0 - active_with_role["Janitor"] = 0 - active_with_role["Botanist"] = 0 - active_with_role["Any"] = GLOB.player_list.len - - for(var/mob/M in GLOB.player_list) - if(!M.mind || !M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive - continue - - if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "engineering robot module") - active_with_role["Engineer"]++ - if(M.mind.assigned_role in list("Chief Engineer", "Station Engineer")) - active_with_role["Engineer"]++ - - if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "medical robot module") - active_with_role["Medical"]++ - if(M.mind.assigned_role in list("Chief Medical Officer", "Medical Doctor")) - active_with_role["Medical"]++ - - if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "security robot module") - active_with_role["Security"]++ - if(M.mind.assigned_role in security_positions) - active_with_role["Security"]++ - - if(M.mind.assigned_role in list("Research Director", "Scientist")) - active_with_role["Scientist"]++ - - if(M.mind.assigned_role == "AI") - active_with_role["AI"]++ - - if(M.mind.assigned_role == "Cyborg") - active_with_role["Cyborg"]++ - - if(M.mind.assigned_role == "Janitor") - active_with_role["Janitor"]++ - - if(M.mind.assigned_role == "Botanist") - active_with_role["Botanist"]++ - - return active_with_role diff --git a/code/controllers/subsystem/holiday.dm b/code/controllers/subsystem/holiday.dm new file mode 100644 index 00000000000..be9d6d4fc7d --- /dev/null +++ b/code/controllers/subsystem/holiday.dm @@ -0,0 +1,31 @@ +SUBSYSTEM_DEF(holiday) + name = "Holiday" + init_order = INIT_ORDER_HOLIDAY // 3 + flags = SS_NO_FIRE + var/list/holidays + +/datum/controller/subsystem/holiday/Initialize(start_timeofday) + if(!config.allow_holidays) + return ..() //Holiday stuff was not enabled in the config! + + var/YY = text2num(time2text(world.timeofday, "YY")) // get the current year + var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month + var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day + + for(var/H in subtypesof(/datum/holiday)) + var/datum/holiday/holiday = new H() + if(holiday.shouldCelebrate(DD, MM, YY)) + holiday.celebrate() + if(!holidays) + holidays = list() + holidays[holiday.name] = holiday + + if(holidays) + holidays = shuffle(holidays) + world.update_status() + for(var/datum/holiday/H in holidays) + if(H.eventChance) + if(prob(H.eventChance)) + H.handle_event() + + return ..() \ No newline at end of file diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index 65260e5af55..531b6af2e78 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -29,4 +29,4 @@ SUBSYSTEM_DEF(icon_smooth) smooth_icon(A) CHECK_TICK - ..() + return ..() diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm new file mode 100644 index 00000000000..2dad0abca0f --- /dev/null +++ b/code/controllers/subsystem/idlenpcpool.dm @@ -0,0 +1,41 @@ +SUBSYSTEM_DEF(idlenpcpool) + name = "Idling NPC Pool" + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND + priority = FIRE_PRIORITY_IDLE_NPC + wait = 60 + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/list/currentrun = list() + var/static/list/idle_mobs_by_zlevel[][] + +/datum/controller/subsystem/idlenpcpool/stat_entry() + var/list/idlelist = GLOB.simple_animals[AI_IDLE] + var/list/zlist = GLOB.simple_animals[AI_Z_OFF] + ..("IdleNPCS:[idlelist.len]|Z:[zlist.len]") + +/datum/controller/subsystem/idlenpcpool/Initialize(start_timeofday) + idle_mobs_by_zlevel = new /list(world.maxz,0) + return ..() + +/datum/controller/subsystem/idlenpcpool/fire(resumed = FALSE) + if(!resumed) + var/list/idlelist = GLOB.simple_animals[AI_IDLE] + src.currentrun = idlelist.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + + while(currentrun.len) + var/mob/living/simple_animal/SA = currentrun[currentrun.len] + --currentrun.len + if(!SA) + GLOB.simple_animals[AI_IDLE] -= SA + continue + + if(!SA.ckey) + if(SA.stat != DEAD) + SA.handle_automated_movement() + if(SA.stat != DEAD) + SA.consider_wakeup() + if(MC_TICK_CHECK) + return \ 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/ipintel.dm b/code/controllers/subsystem/ipintel.dm new file mode 100644 index 00000000000..92f02a404a1 --- /dev/null +++ b/code/controllers/subsystem/ipintel.dm @@ -0,0 +1,15 @@ +SUBSYSTEM_DEF(ipintel) + name = "XKeyScore" + wait = 1 + flags = SS_NO_FIRE + init_order = INIT_ORDER_XKEYSCORE // 10 + var/enabled = 0 //disable at round start to avoid checking reconnects + var/throttle = 0 + var/errors = 0 + + var/list/cache = list() + +/datum/controller/subsystem/ipintel/Initialize(timeofday, zlevel) + enabled = 1 + . = ..() + diff --git a/code/game/jobs/job_controller.dm b/code/controllers/subsystem/jobs.dm similarity index 77% rename from code/game/jobs/job_controller.dm rename to code/controllers/subsystem/jobs.dm index 0b858a744ed..166083b36ff 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/controllers/subsystem/jobs.dm @@ -1,598 +1,693 @@ - -var/global/datum/controller/occupations/job_master - -/datum/controller/occupations - //List of all jobs - var/list/occupations = list() - var/list/name_occupations = list() //Dict of all jobs, keys are titles - var/list/type_occupations = list() //Dict of all jobs, keys are types - var/list/prioritized_jobs = list() // List of jobs set to priority by HoP/Captain - //Players who need jobs - var/list/unassigned = list() - //Debug info - var/list/job_debug = list() - - -/datum/controller/occupations/proc/SetupOccupations(var/list/faction = list("Station")) - occupations = list() - - var/list/all_jobs = subtypesof(/datum/job) - if(!all_jobs.len) - to_chat(world, "Error setting up jobs, no job datums found") - return 0 - - for(var/J in all_jobs) - var/datum/job/job = new J() - if(!job) - continue - if(!job.faction in faction) - continue - occupations += job - name_occupations[job.title] = job - type_occupations[J] = job - - return 1 - - -/datum/controller/occupations/proc/Debug(var/text) - if(!Debug2) - return 0 - job_debug.Add(text) - return 1 - - -/datum/controller/occupations/proc/GetJob(rank) - if(!occupations.len) - SetupOccupations() - return name_occupations[rank] - -/datum/controller/occupations/proc/GetJobType(jobtype) - if(!occupations.len) - SetupOccupations() - return type_occupations[jobtype] - -/datum/controller/occupations/proc/GetPlayerAltTitle(mob/new_player/player, rank) - return player.client.prefs.GetPlayerAltTitle(GetJob(rank)) - -/datum/controller/occupations/proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0) - Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]") - if(player && player.mind && rank) - var/datum/job/job = GetJob(rank) - if(!job) - return 0 - if(jobban_isbanned(player, rank)) - return 0 - if(!job.player_old_enough(player.client)) - return 0 - if(job.available_in_playtime(player.client)) - return 0 - if(job.barred_by_disability(player.client)) - return 0 - if(!is_job_whitelisted(player, rank)) - return 0 - - var/position_limit = job.total_positions - if(!latejoin) - position_limit = job.spawn_positions - - if((job.current_positions < position_limit) || position_limit == -1) - Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]") - player.mind.assigned_role = rank - player.mind.role_alt_title = GetPlayerAltTitle(player, rank) - - // JOB OBJECTIVES OH SHIT - player.mind.job_objectives.Cut() - for(var/objectiveType in job.required_objectives) - new objectiveType(player.mind) - - // 50/50 chance of getting optional objectives. - for(var/objectiveType in job.optional_objectives) - if(prob(50)) - new objectiveType(player.mind) - - unassigned -= player - job.current_positions++ - return 1 - - Debug("AR has failed, Player: [player], Rank: [rank]") - return 0 - -/datum/controller/occupations/proc/FreeRole(var/rank) //making additional slot on the fly - var/datum/job/job = GetJob(rank) - if(job && job.current_positions >= job.total_positions && job.total_positions != -1) - job.total_positions++ - return 1 - return 0 - -/datum/controller/occupations/proc/FindOccupationCandidates(datum/job/job, level, flag) - Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]") - var/list/candidates = list() - for(var/mob/new_player/player in unassigned) - Debug(" - Player: [player] Banned: [jobban_isbanned(player, job.title)] Old Enough: [!job.player_old_enough(player.client)] AvInPlaytime: [job.available_in_playtime(player.client)] Flag && Be Special: [flag] && [player.client.prefs.be_special] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Flag: [job.flag] Job Department Flag = [job.department_flag]") - if(jobban_isbanned(player, job.title)) - Debug("FOC isbanned failed, Player: [player]") - continue - if(!job.player_old_enough(player.client)) - Debug("FOC player not old enough, Player: [player]") - continue - if(job.available_in_playtime(player.client)) - Debug("FOC player not enough playtime, Player: [player]") - continue - if(job.barred_by_disability(player.client)) - Debug("FOC player has disability rendering them ineligible for job, Player: [player]") - continue - if(flag && !(flag in player.client.prefs.be_special)) - Debug("FOC flag failed, Player: [player], Flag: [flag], ") - continue - if(player.mind && job.title in player.mind.restricted_roles) - Debug("FOC incompatbile with antagonist role, Player: [player]") - continue - if(player.client.prefs.GetJobDepartment(job, level) & job.flag) - Debug("FOC pass, Player: [player], Level:[level]") - candidates += player - return candidates - -/datum/controller/occupations/proc/GiveRandomJob(var/mob/new_player/player) - Debug("GRJ Giving random job, Player: [player]") - for(var/datum/job/job in shuffle(occupations)) - if(!job) - continue - - if(istype(job, GetJob("Civilian"))) // We don't want to give him assistant, that's boring! - continue - - if(job.title in command_positions) //If you want a command position, select it! - continue - - if(job.title in whitelisted_positions) // No random whitelisted job, sorry! - continue - - if(job.admin_only) // No admin positions either. - continue - - if(jobban_isbanned(player, job.title)) - Debug("GRJ isbanned failed, Player: [player], Job: [job.title]") - continue - - if(!job.player_old_enough(player.client)) - Debug("GRJ player not old enough, Player: [player]") - continue - - if(job.available_in_playtime(player.client)) - Debug("GRJ player not enough playtime, Player: [player]") - continue - - if(job.barred_by_disability(player.client)) - Debug("GRJ player has disability rendering them ineligible for job, Player: [player]") - continue - - if(player.mind && job.title in player.mind.restricted_roles) - Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]") - continue - - if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1) - Debug("GRJ Random job given, Player: [player], Job: [job]") - AssignRole(player, job.title) - unassigned -= player - break - -/datum/controller/occupations/proc/ResetOccupations() - for(var/mob/new_player/player in GLOB.player_list) - if((player) && (player.mind)) - player.mind.assigned_role = null - player.mind.special_role = null - SetupOccupations() - unassigned = list() - return - - -///This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check -/datum/controller/occupations/proc/FillHeadPosition() - for(var/level = 1 to 3) - for(var/command_position in command_positions) - var/datum/job/job = GetJob(command_position) - if(!job) - continue - var/list/candidates = FindOccupationCandidates(job, level) - if(!candidates.len) - continue - - var/list/filteredCandidates = list() - - for(var/mob/V in candidates) - // Log-out during round-start? What a bad boy, no head position for you! - if(!V.client) - continue - filteredCandidates += V - - if(!filteredCandidates.len) - continue - - var/mob/new_player/candidate = pick(filteredCandidates) - if(AssignRole(candidate, command_position)) - return 1 - - return 0 - - -///This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level -/datum/controller/occupations/proc/CheckHeadPositions(var/level) - for(var/command_position in command_positions) - var/datum/job/job = GetJob(command_position) - if(!job) - continue - var/list/candidates = FindOccupationCandidates(job, level) - if(!candidates.len) - continue - var/mob/new_player/candidate = pick(candidates) - AssignRole(candidate, command_position) - - -/datum/controller/occupations/proc/FillAIPosition() - if(config && !config.allow_ai) - return 0 - - var/ai_selected = 0 - var/datum/job/job = GetJob("AI") - if(!job) - return 0 - - for(var/i = job.total_positions, i > 0, i--) - for(var/level = 1 to 3) - var/list/candidates = list() - candidates = FindOccupationCandidates(job, level) - if(candidates.len) - var/mob/new_player/candidate = pick(candidates) - if(AssignRole(candidate, "AI")) - ai_selected++ - break - - if(ai_selected) - return 1 - - return 0 - - -/** Proc DivideOccupations -* fills var "assigned_role" for all ready players. -* This proc must not have any side effect besides of modifying "assigned_role". -**/ -/datum/controller/occupations/proc/DivideOccupations() - //Setup new player list and get the jobs list - Debug("Running DO") - SetupOccupations() - - //Holder for Triumvirate is stored in the ticker, this just processes it - if(ticker) - for(var/datum/job/ai/A in occupations) - if(ticker.triai) - A.spawn_positions = 3 - - //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) - unassigned += player - if(player.client.prefs.randomslot) - player.client.prefs.load_random_character_slot(player.client) - - Debug("DO, Len: [unassigned.len]") - if(unassigned.len == 0) - return 0 - - //Shuffle players and jobs - unassigned = shuffle(unassigned) - - HandleFeedbackGathering() - - //People who wants to be assistants, sure, go on. - Debug("DO, Running Civilian Check 1") - var/datum/job/civ = new /datum/job/civilian() - var/list/civilian_candidates = FindOccupationCandidates(civ, 3) - Debug("AC1, Candidates: [civilian_candidates.len]") - for(var/mob/new_player/player in civilian_candidates) - Debug("AC1 pass, Player: [player]") - AssignRole(player, "Civilian") - civilian_candidates -= player - Debug("DO, AC1 end") - - //Select one head - Debug("DO, Running Head Check") - FillHeadPosition() - Debug("DO, Head Check end") - - //Check for an AI - Debug("DO, Running AI Check") - FillAIPosition() - Debug("DO, AI Check end") - - //Other jobs are now checked - Debug("DO, Running Standard Check") - - - // New job giving system by Donkie - // This will cause lots of more loops, but since it's only done once it shouldn't really matter much at all. - // Hopefully this will add more randomness and fairness to job giving. - - // Loop through all levels from high to low - var/list/shuffledoccupations = shuffle(occupations) - for(var/level = 1 to 3) - //Check the head jobs first each level - CheckHeadPositions(level) - - // Loop through all unassigned players - for(var/mob/new_player/player in unassigned) - - // Loop through all jobs - for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY - if(!job) - continue - - if(jobban_isbanned(player, job.title)) - Debug("DO isbanned failed, Player: [player], Job:[job.title]") - continue - - if(!job.player_old_enough(player.client)) - Debug("DO player not old enough, Player: [player], Job:[job.title]") - continue - - if(job.available_in_playtime(player.client)) - Debug("DO player not enough playtime, Player: [player], Job:[job.title]") - continue - - if(job.barred_by_disability(player.client)) - Debug("DO player has disability rendering them ineligible for job, Player: [player], Job:[job.title]") - continue - - if(player.mind && job.title in player.mind.restricted_roles) - Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]") - continue - - if(!is_job_whitelisted(player, job.title)) - Debug("DO player not whitelisted, Player: [player], Job:[job.title]") - continue - - // If the player wants that job on this level, then try give it to him. - if(player.client.prefs.GetJobDepartment(job, level) & job.flag) - - // If the job isn't filled - if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1) - Debug("DO pass, Player: [player], Level:[level], Job:[job.title]") - Debug(" - Job Flag: [job.flag] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Current Pos: [job.current_positions] Job Spawn Positions = [job.spawn_positions]") - AssignRole(player, job.title) - unassigned -= player - break - - // Hand out random jobs to the people who didn't get any in the last check - // Also makes sure that they got their preference correct - for(var/mob/new_player/player in unassigned) - if(player.client.prefs.alternate_option == GET_RANDOM_JOB) - GiveRandomJob(player) - - Debug("DO, Standard Check end") - - Debug("DO, Running AC2") - - // Antags, who have to get in, come first - for(var/mob/new_player/player in unassigned) - if(player.mind.special_role) - GiveRandomJob(player) - if(player in unassigned) - AssignRole(player, "Civilian") - - // Then we assign what we can to everyone else. - for(var/mob/new_player/player in unassigned) - if(player.client.prefs.alternate_option == BE_ASSISTANT) - Debug("AC2 Assistant located, Player: [player]") - AssignRole(player, "Civilian") - else if(player.client.prefs.alternate_option == RETURN_TO_LOBBY) - player.ready = 0 - unassigned -= player - - return 1 - -/datum/controller/occupations/proc/AssignRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) - if(!H) - return null - var/datum/job/job = GetJob(rank) - - H.job = rank - - var/alt_title = null - - if(H.mind) - H.mind.assigned_role = rank - alt_title = H.mind.role_alt_title - - CreateMoneyAccount(H, rank, job) - - to_chat(H, "You are the [alt_title ? alt_title : rank].") - to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.") - to_chat(H, "For more information on how the station works, see Standard Operating Procedure (SOP)") - if(job.is_service) - to_chat(H, "As a member of Service, make sure to read up on your Department SOP") - if(job.is_supply) - to_chat(H, "As a member of Supply, make sure to read up on your Department SOP") - if(job.is_command) - to_chat(H, "As an important member of Command, read up on your Department SOP") - if(job.is_legal) - to_chat(H, "Your job requires complete knowledge of Space Law and Legal Standard Operating Procedure") - if(job.is_engineering) - to_chat(H, "As a member of Engineering, make sure to read up on your Department SOP") - if(job.is_medical) - to_chat(H, "As a member of Medbay, make sure to read up on your Department SOP") - if(job.is_science) - to_chat(H, "As a member of Science, make sure to read up on your Department SOP") - if(job.is_security) - to_chat(H, "As a member of Security, you are to know Space Law, Legal Standard Operating Procedure, as well as your Department SOP") - if(job.req_admin_notify) - to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp.") - - return H -/datum/controller/occupations/proc/EquipRank(mob/living/carbon/human/H, rank, joined_late = 0) // Equip and put them in an area - if(!H) - return null - - var/datum/job/job = GetJob(rank) - - H.job = rank - - if(!joined_late) - var/turf/T = null - var/obj/S = null - for(var/obj/effect/landmark/start/sloc in GLOB.landmarks_list) - if(sloc.name != rank) - continue - if(locate(/mob/living) in sloc.loc) - continue - S = sloc - break - if(!S) - S = locate("start*[rank]") // use old stype - if(!S) // still no spawn, fall back to the arrivals shuttle - for(var/turf/TS in get_area_turfs(/area/shuttle/arrival)) - if(!TS.density) - var/clear = 1 - for(var/obj/O in TS) - if(O.density) - clear = 0 - break - if(clear) - T = TS - continue - - if(isturf(S)) - T = S - else if(istype(S, /obj/effect/landmark/start) && isturf(S.loc)) - T = S.loc - - if(T) - H.loc = T - // Moving wheelchair if they have one - if(H.buckled && istype(H.buckled, /obj/structure/chair/wheelchair)) - H.buckled.loc = H.loc - H.buckled.dir = H.dir - - if(job) - var/new_mob = job.equip(H) - if(ismob(new_mob)) - H = new_mob - - if(job && H) - job.after_spawn(H) - - //Gives glasses to the vision impaired - if(H.disabilities & DISABILITY_FLAG_NEARSIGHTED) - var/equipped = H.equip_to_slot_or_del(new /obj/item/clothing/glasses/regular(H), slot_glasses) - if(equipped != 1) - var/obj/item/clothing/glasses/G = H.glasses - if(istype(G) && !G.prescription) - G.prescription = 1 - G.name = "prescription [G.name]" - return H - - - - - -/datum/controller/occupations/proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist - if(!config.load_jobs_from_txt) - return 0 - - var/list/jobEntries = file2list(jobsfile) - - for(var/job in jobEntries) - if(!job) - continue - - job = trim(job) - if(!length(job)) - continue - - var/pos = findtext(job, "=") - var/name = null - var/value = null - - if(pos) - name = copytext(job, 1, pos) - value = copytext(job, pos + 1) - else - continue - - if(name && value) - var/datum/job/J = GetJob(name) - if(!J) continue - J.total_positions = text2num(value) - J.spawn_positions = text2num(value) - if(name == "AI" || name == "Cyborg")//I dont like this here but it will do for now - J.total_positions = 0 - - return 1 - - -/datum/controller/occupations/proc/HandleFeedbackGathering() - for(var/datum/job/job in occupations) - var/tmp_str = "|[job.title]|" - - var/level1 = 0 //high - var/level2 = 0 //medium - var/level3 = 0 //low - var/level4 = 0 //never - var/level5 = 0 //banned - var/level6 = 0 //account too young - var/level7 = 0 //has disability rendering them ineligible - for(var/mob/new_player/player in GLOB.player_list) - if(!(player.ready && player.mind && !player.mind.assigned_role)) - continue //This player is not ready - if(jobban_isbanned(player, job.title)) - level5++ - continue - if(!job.player_old_enough(player.client)) - level6++ - continue - if(job.available_in_playtime(player.client)) - level6++ - continue - if(job.barred_by_disability(player.client)) - level7++ - continue - if(player.client.prefs.GetJobDepartment(job, 1) & job.flag) - level1++ - else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag) - level2++ - else if(player.client.prefs.GetJobDepartment(job, 3) & job.flag) - level3++ - else level4++ //not selected - - tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|DISABILITY=[level7]|-" - feedback_add_details("job_preferences",tmp_str) - - -/datum/controller/occupations/proc/CreateMoneyAccount(mob/living/H, rank, datum/job/job) - var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null) - var/remembered_info = "" - - remembered_info += "Your account number is: #[M.account_number]
" - remembered_info += "Your account pin is: [M.remote_access_pin]
" - remembered_info += "Your account funds are: $[M.money]
" - - if(M.transaction_log.len) - var/datum/transaction/T = M.transaction_log[1] - remembered_info += "Your account was created: [T.time], [T.date] at [T.source_terminal]
" - H.mind.store_memory(remembered_info) - - // If they're head, give them the account info for their department - if(job && job.head_position) - remembered_info = "" - var/datum/money_account/department_account = department_accounts[job.department] - - if(department_account) - remembered_info += "Your department's account number is: #[department_account.account_number]
" - remembered_info += "Your department's account pin is: [department_account.remote_access_pin]
" - remembered_info += "Your department's account funds are: $[department_account.money]
" - - H.mind.store_memory(remembered_info) - - H.mind.initial_account = M - - spawn(0) - to_chat(H, "Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]") +SUBSYSTEM_DEF(jobs) + name = "Jobs" + init_order = INIT_ORDER_JOBS // 12 + wait = 3000 // 5 minutes (Deciseconds) + runlevels = RUNLEVEL_GAME + + //List of all jobs + var/list/occupations = list() + var/list/name_occupations = list() //Dict of all jobs, keys are titles + var/list/type_occupations = list() //Dict of all jobs, keys are types + var/list/prioritized_jobs = list() // List of jobs set to priority by HoP/Captain + var/list/id_change_records = list() // List of all job transfer records + var/list/id_change_counter = 1 + //Players who need jobs + var/list/unassigned = list() + //Debug info + var/list/job_debug = list() + +/datum/controller/subsystem/jobs/Initialize(timeofday) + if(!occupations.len) + SetupOccupations() + LoadJobs("config/jobs.txt") + return ..() + +// Only fires every 5 minutes +/datum/controller/subsystem/jobs/fire() + if(!config.sql_enabled || !config.use_exp_tracking) + 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) + if(!all_jobs.len) + to_chat(world, "Error setting up jobs, no job datums found") + return 0 + + for(var/J in all_jobs) + var/datum/job/job = new J() + if(!job) + continue + if(!job.faction in faction) + continue + occupations += job + name_occupations[job.title] = job + type_occupations[J] = job + + return 1 + + +/datum/controller/subsystem/jobs/proc/Debug(var/text) + if(!Debug2) + return 0 + job_debug.Add(text) + return 1 + + +/datum/controller/subsystem/jobs/proc/GetJob(rank) + if(!occupations.len) + SetupOccupations() + return name_occupations[rank] + +/datum/controller/subsystem/jobs/proc/GetJobType(jobtype) + if(!occupations.len) + SetupOccupations() + return type_occupations[jobtype] + +/datum/controller/subsystem/jobs/proc/GetPlayerAltTitle(mob/new_player/player, rank) + return player.client.prefs.GetPlayerAltTitle(GetJob(rank)) + +/datum/controller/subsystem/jobs/proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0) + Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]") + if(player && player.mind && rank) + var/datum/job/job = GetJob(rank) + if(!job) + return 0 + if(jobban_isbanned(player, rank)) + return 0 + if(!job.player_old_enough(player.client)) + return 0 + if(job.available_in_playtime(player.client)) + return 0 + if(job.barred_by_disability(player.client)) + return 0 + if(!is_job_whitelisted(player, rank)) + return 0 + + var/position_limit = job.total_positions + if(!latejoin) + position_limit = job.spawn_positions + + if((job.current_positions < position_limit) || position_limit == -1) + Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]") + player.mind.assigned_role = rank + player.mind.role_alt_title = GetPlayerAltTitle(player, rank) + + // JOB OBJECTIVES OH SHIT + player.mind.job_objectives.Cut() + for(var/objectiveType in job.required_objectives) + new objectiveType(player.mind) + + // 50/50 chance of getting optional objectives. + for(var/objectiveType in job.optional_objectives) + if(prob(50)) + new objectiveType(player.mind) + + unassigned -= player + job.current_positions++ + return 1 + + Debug("AR has failed, Player: [player], Rank: [rank]") + return 0 + +/datum/controller/subsystem/jobs/proc/FreeRole(var/rank) //making additional slot on the fly + var/datum/job/job = GetJob(rank) + if(job && job.current_positions >= job.total_positions && job.total_positions != -1) + job.total_positions++ + return 1 + return 0 + +/datum/controller/subsystem/jobs/proc/FindOccupationCandidates(datum/job/job, level, flag) + Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]") + var/list/candidates = list() + for(var/mob/new_player/player in unassigned) + Debug(" - Player: [player] Banned: [jobban_isbanned(player, job.title)] Old Enough: [!job.player_old_enough(player.client)] AvInPlaytime: [job.available_in_playtime(player.client)] Flag && Be Special: [flag] && [player.client.prefs.be_special] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Flag: [job.flag] Job Department Flag = [job.department_flag]") + if(jobban_isbanned(player, job.title)) + Debug("FOC isbanned failed, Player: [player]") + continue + if(!job.player_old_enough(player.client)) + Debug("FOC player not old enough, Player: [player]") + continue + if(job.available_in_playtime(player.client)) + Debug("FOC player not enough playtime, Player: [player]") + continue + if(job.barred_by_disability(player.client)) + Debug("FOC player has disability rendering them ineligible for job, Player: [player]") + continue + if(flag && !(flag in player.client.prefs.be_special)) + Debug("FOC flag failed, Player: [player], Flag: [flag], ") + continue + if(player.mind && job.title in player.mind.restricted_roles) + Debug("FOC incompatbile with antagonist role, Player: [player]") + continue + if(player.client.prefs.GetJobDepartment(job, level) & job.flag) + Debug("FOC pass, Player: [player], Level:[level]") + candidates += player + return candidates + +/datum/controller/subsystem/jobs/proc/GiveRandomJob(var/mob/new_player/player) + Debug("GRJ Giving random job, Player: [player]") + for(var/datum/job/job in shuffle(occupations)) + if(!job) + continue + + if(istype(job, GetJob("Civilian"))) // We don't want to give him assistant, that's boring! + continue + + if(job.title in command_positions) //If you want a command position, select it! + continue + + if(job.title in whitelisted_positions) // No random whitelisted job, sorry! + continue + + if(job.admin_only) // No admin positions either. + continue + + if(jobban_isbanned(player, job.title)) + Debug("GRJ isbanned failed, Player: [player], Job: [job.title]") + continue + + if(!job.player_old_enough(player.client)) + Debug("GRJ player not old enough, Player: [player]") + continue + + if(job.available_in_playtime(player.client)) + Debug("GRJ player not enough playtime, Player: [player]") + continue + + if(job.barred_by_disability(player.client)) + Debug("GRJ player has disability rendering them ineligible for job, Player: [player]") + continue + + if(player.mind && job.title in player.mind.restricted_roles) + Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]") + continue + + if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1) + Debug("GRJ Random job given, Player: [player], Job: [job]") + AssignRole(player, job.title) + unassigned -= player + break + +/datum/controller/subsystem/jobs/proc/ResetOccupations() + for(var/mob/new_player/player in GLOB.player_list) + if((player) && (player.mind)) + player.mind.assigned_role = null + player.mind.special_role = null + SetupOccupations() + unassigned = list() + return + + +///This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check +/datum/controller/subsystem/jobs/proc/FillHeadPosition() + for(var/level = 1 to 3) + for(var/command_position in command_positions) + var/datum/job/job = GetJob(command_position) + if(!job) + continue + var/list/candidates = FindOccupationCandidates(job, level) + if(!candidates.len) + continue + + var/list/filteredCandidates = list() + + for(var/mob/V in candidates) + // Log-out during round-start? What a bad boy, no head position for you! + if(!V.client) + continue + filteredCandidates += V + + if(!filteredCandidates.len) + continue + + var/mob/new_player/candidate = pick(filteredCandidates) + if(AssignRole(candidate, command_position)) + return 1 + + return 0 + + +///This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level +/datum/controller/subsystem/jobs/proc/CheckHeadPositions(var/level) + for(var/command_position in command_positions) + var/datum/job/job = GetJob(command_position) + if(!job) + continue + var/list/candidates = FindOccupationCandidates(job, level) + if(!candidates.len) + continue + var/mob/new_player/candidate = pick(candidates) + AssignRole(candidate, command_position) + + +/datum/controller/subsystem/jobs/proc/FillAIPosition() + if(config && !config.allow_ai) + return 0 + + var/ai_selected = 0 + var/datum/job/job = GetJob("AI") + if(!job) + return 0 + + for(var/i = job.total_positions, i > 0, i--) + for(var/level = 1 to 3) + var/list/candidates = list() + candidates = FindOccupationCandidates(job, level) + if(candidates.len) + var/mob/new_player/candidate = pick(candidates) + if(AssignRole(candidate, "AI")) + ai_selected++ + break + + if(ai_selected) + return 1 + + return 0 + + +/** Proc DivideOccupations +* fills var "assigned_role" for all ready players. +* This proc must not have any side effect besides of modifying "assigned_role". +**/ +/datum/controller/subsystem/jobs/proc/DivideOccupations() + //Setup new player list and get the jobs list + Debug("Running DO") + SetupOccupations() + + //Holder for Triumvirate is stored in the ticker, this just processes it + if(SSticker) + for(var/datum/job/ai/A in occupations) + if(SSticker.triai) + A.spawn_positions = 3 + + //Get the players who are ready + for(var/mob/new_player/player in GLOB.player_list) + 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) + + Debug("DO, Len: [unassigned.len]") + if(unassigned.len == 0) + return 0 + + //Shuffle players and jobs + unassigned = shuffle(unassigned) + + HandleFeedbackGathering() + + //People who wants to be assistants, sure, go on. + Debug("DO, Running Civilian Check 1") + var/datum/job/civ = new /datum/job/civilian() + var/list/civilian_candidates = FindOccupationCandidates(civ, 3) + Debug("AC1, Candidates: [civilian_candidates.len]") + for(var/mob/new_player/player in civilian_candidates) + Debug("AC1 pass, Player: [player]") + AssignRole(player, "Civilian") + civilian_candidates -= player + Debug("DO, AC1 end") + + //Select one head + Debug("DO, Running Head Check") + FillHeadPosition() + Debug("DO, Head Check end") + + //Check for an AI + Debug("DO, Running AI Check") + FillAIPosition() + Debug("DO, AI Check end") + + //Other jobs are now checked + Debug("DO, Running Standard Check") + + + // New job giving system by Donkie + // This will cause lots of more loops, but since it's only done once it shouldn't really matter much at all. + // Hopefully this will add more randomness and fairness to job giving. + + // Loop through all levels from high to low + var/list/shuffledoccupations = shuffle(occupations) + for(var/level = 1 to 3) + //Check the head jobs first each level + CheckHeadPositions(level) + + // Loop through all unassigned players + for(var/mob/new_player/player in unassigned) + + // Loop through all jobs + for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY + if(!job) + continue + + if(jobban_isbanned(player, job.title)) + Debug("DO isbanned failed, Player: [player], Job:[job.title]") + continue + + if(!job.player_old_enough(player.client)) + Debug("DO player not old enough, Player: [player], Job:[job.title]") + continue + + if(job.available_in_playtime(player.client)) + Debug("DO player not enough playtime, Player: [player], Job:[job.title]") + continue + + if(job.barred_by_disability(player.client)) + Debug("DO player has disability rendering them ineligible for job, Player: [player], Job:[job.title]") + continue + + if(player.mind && job.title in player.mind.restricted_roles) + Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]") + continue + + if(!is_job_whitelisted(player, job.title)) + Debug("DO player not whitelisted, Player: [player], Job:[job.title]") + continue + + // If the player wants that job on this level, then try give it to him. + if(player.client.prefs.GetJobDepartment(job, level) & job.flag) + + // If the job isn't filled + if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1) + Debug("DO pass, Player: [player], Level:[level], Job:[job.title]") + Debug(" - Job Flag: [job.flag] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Current Pos: [job.current_positions] Job Spawn Positions = [job.spawn_positions]") + AssignRole(player, job.title) + unassigned -= player + break + + // Hand out random jobs to the people who didn't get any in the last check + // Also makes sure that they got their preference correct + for(var/mob/new_player/player in unassigned) + if(player.client.prefs.alternate_option == GET_RANDOM_JOB) + GiveRandomJob(player) + + Debug("DO, Standard Check end") + + Debug("DO, Running AC2") + + // Antags, who have to get in, come first + for(var/mob/new_player/player in unassigned) + if(player.mind.special_role) + GiveRandomJob(player) + if(player in unassigned) + AssignRole(player, "Civilian") + + // Then we assign what we can to everyone else. + for(var/mob/new_player/player in unassigned) + if(player.client.prefs.alternate_option == BE_ASSISTANT) + Debug("AC2 Assistant located, Player: [player]") + AssignRole(player, "Civilian") + else if(player.client.prefs.alternate_option == RETURN_TO_LOBBY) + player.ready = 0 + unassigned -= player + + return 1 + +/datum/controller/subsystem/jobs/proc/AssignRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) + if(!H) + return null + var/datum/job/job = GetJob(rank) + + H.job = rank + + var/alt_title = null + + if(H.mind) + H.mind.assigned_role = rank + alt_title = H.mind.role_alt_title + + CreateMoneyAccount(H, rank, job) + + to_chat(H, "You are the [alt_title ? alt_title : rank].") + to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.") + to_chat(H, "For more information on how the station works, see Standard Operating Procedure (SOP)") + if(job.is_service) + to_chat(H, "As a member of Service, make sure to read up on your Department SOP") + if(job.is_supply) + to_chat(H, "As a member of Supply, make sure to read up on your Department SOP") + if(job.is_command) + to_chat(H, "As an important member of Command, read up on your Department SOP") + if(job.is_legal) + to_chat(H, "Your job requires complete knowledge of Space Law and Legal Standard Operating Procedure") + if(job.is_engineering) + to_chat(H, "As a member of Engineering, make sure to read up on your Department SOP") + if(job.is_medical) + to_chat(H, "As a member of Medbay, make sure to read up on your Department SOP") + if(job.is_science) + to_chat(H, "As a member of Science, make sure to read up on your Department SOP") + if(job.is_security) + to_chat(H, "As a member of Security, you are to know Space Law, Legal Standard Operating Procedure, as well as your Department SOP") + if(job.req_admin_notify) + to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp.") + + return H +/datum/controller/subsystem/jobs/proc/EquipRank(mob/living/carbon/human/H, rank, joined_late = 0) // Equip and put them in an area + if(!H) + return null + + var/datum/job/job = GetJob(rank) + + H.job = rank + + if(!joined_late) + var/turf/T = null + var/obj/S = null + for(var/obj/effect/landmark/start/sloc in GLOB.landmarks_list) + if(sloc.name != rank) + continue + if(locate(/mob/living) in sloc.loc) + continue + S = sloc + break + if(!S) + S = locate("start*[rank]") // use old stype + if(!S) // still no spawn, fall back to the arrivals shuttle + for(var/turf/TS in get_area_turfs(/area/shuttle/arrival)) + if(!TS.density) + var/clear = 1 + for(var/obj/O in TS) + if(O.density) + clear = 0 + break + if(clear) + T = TS + continue + + if(isturf(S)) + T = S + else if(istype(S, /obj/effect/landmark/start) && isturf(S.loc)) + T = S.loc + + if(T) + H.forceMove(T) + // Moving wheelchair if they have one + if(H.buckled && istype(H.buckled, /obj/structure/chair/wheelchair)) + H.buckled.forceMove(H.loc) + H.buckled.dir = H.dir + + if(job) + var/new_mob = job.equip(H) + if(ismob(new_mob)) + H = new_mob + + if(job && H) + job.after_spawn(H) + + //Gives glasses to the vision impaired + if(H.disabilities & DISABILITY_FLAG_NEARSIGHTED) + var/equipped = H.equip_to_slot_or_del(new /obj/item/clothing/glasses/regular(H), slot_glasses) + if(equipped != 1) + var/obj/item/clothing/glasses/G = H.glasses + if(istype(G) && !G.prescription) + G.prescription = 1 + G.name = "prescription [G.name]" + return H + + + + + +/datum/controller/subsystem/jobs/proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist + if(!config.load_jobs_from_txt) + return 0 + + var/list/jobEntries = file2list(jobsfile) + + for(var/job in jobEntries) + if(!job) + continue + + job = trim(job) + if(!length(job)) + continue + + var/pos = findtext(job, "=") + var/name = null + var/value = null + + if(pos) + name = copytext(job, 1, pos) + value = copytext(job, pos + 1) + else + continue + + if(name && value) + var/datum/job/J = GetJob(name) + if(!J) continue + J.total_positions = text2num(value) + J.spawn_positions = text2num(value) + if(name == "AI" || name == "Cyborg")//I dont like this here but it will do for now + J.total_positions = 0 + + return 1 + + +/datum/controller/subsystem/jobs/proc/HandleFeedbackGathering() + for(var/datum/job/job in occupations) + var/tmp_str = "|[job.title]|" + + var/level1 = 0 //high + var/level2 = 0 //medium + var/level3 = 0 //low + var/level4 = 0 //never + var/level5 = 0 //banned + var/level6 = 0 //account too young + var/level7 = 0 //has disability rendering them ineligible + for(var/mob/new_player/player in GLOB.player_list) + if(!(player.ready && player.mind && !player.mind.assigned_role)) + continue //This player is not ready + if(jobban_isbanned(player, job.title)) + level5++ + continue + if(!job.player_old_enough(player.client)) + level6++ + continue + if(job.available_in_playtime(player.client)) + level6++ + continue + if(job.barred_by_disability(player.client)) + level7++ + continue + if(player.client.prefs.GetJobDepartment(job, 1) & job.flag) + level1++ + else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag) + level2++ + else if(player.client.prefs.GetJobDepartment(job, 3) & job.flag) + level3++ + else level4++ //not selected + + tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|DISABILITY=[level7]|-" + feedback_add_details("job_preferences",tmp_str) + + +/datum/controller/subsystem/jobs/proc/CreateMoneyAccount(mob/living/H, rank, datum/job/job) + var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null) + var/remembered_info = "" + + remembered_info += "Your account number is: #[M.account_number]
" + remembered_info += "Your account pin is: [M.remote_access_pin]
" + remembered_info += "Your account funds are: $[M.money]
" + + if(M.transaction_log.len) + var/datum/transaction/T = M.transaction_log[1] + remembered_info += "Your account was created: [T.time], [T.date] at [T.source_terminal]
" + H.mind.store_memory(remembered_info) + + // If they're head, give them the account info for their department + if(job && job.head_position) + remembered_info = "" + var/datum/money_account/department_account = department_accounts[job.department] + + if(department_account) + remembered_info += "Your department's account number is: #[department_account.account_number]
" + remembered_info += "Your department's account pin is: [department_account.remote_access_pin]
" + remembered_info += "Your department's account funds are: $[department_account.money]
" + + H.mind.store_memory(remembered_info) + + H.mind.initial_account = M + + spawn(0) + to_chat(H, "Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]") + +/datum/controller/subsystem/jobs/proc/format_jobs_for_id_computer(obj/item/card/id/tgtcard) + var/list/jobs_to_formats = list() + if(tgtcard) + var/mob/M = tgtcard.getPlayer() + for(var/datum/job/job in occupations) + if(tgtcard.assignment && tgtcard.assignment == job.title) + jobs_to_formats[job.title] = "disabled" // the job they already have is pre-selected + else if(!job.would_accept_job_transfer_from_player(M)) + jobs_to_formats[job.title] = "linkDiscourage" // karma jobs they don't have available are discouraged + else if(job.total_positions && !job.current_positions && job.title != "Civilian") + jobs_to_formats[job.title] = "linkEncourage" // jobs with nobody doing them at all are encouraged + else if(job.total_positions >= 0 && job.current_positions >= job.total_positions) + jobs_to_formats[job.title] = "linkDiscourage" // jobs that are full (no free positions) are discouraged + return jobs_to_formats + + +/datum/controller/subsystem/jobs/proc/log_job_transfer(transferee, oldvalue, newvalue, whodidit) + id_change_records["[id_change_counter]"] = list("transferee" = transferee, "oldvalue" = oldvalue, "newvalue" = newvalue, "whodidit" = whodidit, "timestamp" = station_time_timestamp()) + id_change_counter++ + +/datum/controller/subsystem/jobs/proc/slot_job_transfer(oldtitle, newtitle) + var/datum/job/oldjobdatum = SSjobs.GetJob(oldtitle) + var/datum/job/newjobdatum = SSjobs.GetJob(newtitle) + if(istype(oldjobdatum) && oldjobdatum.current_positions > 0 && istype(newjobdatum)) + if(!(oldjobdatum.title in command_positions) && !(newjobdatum.title in command_positions)) + oldjobdatum.current_positions-- + newjobdatum.current_positions++ + + +/datum/controller/subsystem/jobs/proc/fetch_transfer_record_html(var/centcom) + var/record_html = "" + + var/table_headers = list("Crewman", "Old Rank", "New Rank", "Authorized By", "Time") + var/hidden_fields = list("deletedby") + if(centcom) + table_headers += "Deleted By" + record_html += "" + for(var/thisheader in table_headers) + record_html += "" + record_html += "" + + var/visible_record_count = 0 + for(var/thisid in id_change_records) + var/thisrecord = id_change_records[thisid] + + if(thisrecord["deletedby"] && !centcom) + continue + + record_html += "" + for(var/lkey in thisrecord) + if(lkey in hidden_fields) + if(centcom) + record_html += "" + else + continue + else + record_html += "" + record_html += "" + visible_record_count++ + + record_html += "
[thisheader]
[thisrecord[lkey]][thisrecord[lkey]]
" + + if(!visible_record_count) + return "No records on file yet." + return record_html + +/datum/controller/subsystem/jobs/proc/delete_log_records(sourceuser, delete_all) + . = 0 + if(!sourceuser) + return + var/list/new_id_change_records = list() + for(var/thisid in id_change_records) + var/thisrecord = id_change_records[thisid] + if(!thisrecord["deletedby"]) + if(delete_all || thisrecord["whodidit"] == sourceuser) + thisrecord["deletedby"] = sourceuser + .++ + new_id_change_records["[id_change_counter]"] = thisrecord + id_change_counter++ + id_change_records = new_id_change_records \ No newline at end of file diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm new file mode 100644 index 00000000000..82bbd52471a --- /dev/null +++ b/code/controllers/subsystem/lighting.dm @@ -0,0 +1,87 @@ +GLOBAL_LIST_EMPTY(lighting_update_lights) // List of lighting sources queued for update. +GLOBAL_LIST_EMPTY(lighting_update_corners) // List of lighting corners queued for update. +GLOBAL_LIST_EMPTY(lighting_update_objects) // List of lighting objects queued for update. + +SUBSYSTEM_DEF(lighting) + name = "Lighting" + wait = 2 + init_order = INIT_ORDER_LIGHTING + flags = SS_TICKER + +/datum/controller/subsystem/lighting/stat_entry() + ..("L:[GLOB.lighting_update_lights.len]|C:[GLOB.lighting_update_corners.len]|O:[GLOB.lighting_update_objects.len]") + +/datum/controller/subsystem/lighting/Initialize(timeofday) + if(!initialized) + if(config.starlight) + for(var/I in GLOB.all_areas) + var/area/A = I + if(A.dynamic_lighting == DYNAMIC_LIGHTING_IFSTARLIGHT) + A.luminosity = 0 + + create_all_lighting_objects() + initialized = TRUE + + fire(FALSE, TRUE) + + return ..() + +/datum/controller/subsystem/lighting/fire(resumed, init_tick_checks) + MC_SPLIT_TICK_INIT(3) + if(!init_tick_checks) + MC_SPLIT_TICK + var/i = 0 + for(i in 1 to GLOB.lighting_update_lights.len) + var/datum/light_source/L = GLOB.lighting_update_lights[i] + + L.update_corners() + + L.needs_update = LIGHTING_NO_UPDATE + + if(init_tick_checks) + CHECK_TICK + else if(MC_TICK_CHECK) + break + if(i) + GLOB.lighting_update_lights.Cut(1, i+1) + i = 0 + + if(!init_tick_checks) + MC_SPLIT_TICK + + for (i in 1 to GLOB.lighting_update_corners.len) + var/datum/lighting_corner/C = GLOB.lighting_update_corners[i] + + C.update_objects() + C.needs_update = FALSE + if(init_tick_checks) + CHECK_TICK + else if(MC_TICK_CHECK) + break + if(i) + GLOB.lighting_update_corners.Cut(1, i+1) + i = 0 + + + if(!init_tick_checks) + MC_SPLIT_TICK + + for (i in 1 to GLOB.lighting_update_objects.len) + var/atom/movable/lighting_object/O = GLOB.lighting_update_objects[i] + + if(QDELETED(O)) + continue + + O.update() + O.needs_update = FALSE + if(init_tick_checks) + CHECK_TICK + else if(MC_TICK_CHECK) + break + if(i) + GLOB.lighting_update_objects.Cut(1, i+1) + + +/datum/controller/subsystem/lighting/Recover() + initialized = SSlighting.initialized + ..() \ No newline at end of file diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm index af6898c39bd..9a73c1dbabb 100644 --- a/code/controllers/subsystem/machinery.dm +++ b/code/controllers/subsystem/machinery.dm @@ -17,7 +17,7 @@ SUBSYSTEM_DEF(machines) /datum/controller/subsystem/machines/Initialize() makepowernets() fire() - ..() + return ..() /datum/controller/subsystem/machines/proc/makepowernets() for(var/datum/powernet/PN in powernets) @@ -64,23 +64,6 @@ SUBSYSTEM_DEF(machines) if(MC_TICK_CHECK) return -/datum/controller/subsystem/machines/proc/process_premachines(resumed = 0) - /* Literally exists as snowflake for fucking powersinks goddamnit */ - if(!resumed) - src.currentrun = GLOB.processing_power_items.Copy() - //cache for sanid speed (lists are references anyways) - var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/item/I = currentrun[currentrun.len] - currentrun.len-- - if(!QDELETED(I)) - if(!I.pwr_drain()) - GLOB.processing_power_items.Remove(I) - else - GLOB.processing_power_items.Remove(I) - if(MC_TICK_CHECK) - return - /datum/controller/subsystem/machines/proc/process_machines(resumed = 0) var/seconds = wait * 0.1 if(!resumed) @@ -113,13 +96,6 @@ SUBSYSTEM_DEF(machines) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSMACHINES_PREMACHINERY - - if(currentpart == SSMACHINES_PREMACHINERY || !resumed) - process_premachines(resumed) - if(state != SS_RUNNING) - return - resumed = 0 currentpart = SSMACHINES_MACHINERY if(currentpart == SSMACHINES_MACHINERY || !resumed) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm new file mode 100644 index 00000000000..ec53c4b4d6b --- /dev/null +++ b/code/controllers/subsystem/mapping.dm @@ -0,0 +1,42 @@ +SUBSYSTEM_DEF(mapping) + name = "Mapping" + init_order = INIT_ORDER_MAPPING // 9 + flags = SS_NO_FIRE + +/datum/controller/subsystem/mapping/Initialize(timeofday) + // Load all Z level templates + preloadTemplates() + // Pick a random away mission. + if(!config.disable_away_missions) + createRandomZlevel() + // Seed space ruins + if(!config.disable_space_ruins) + var/timer = start_watch() + log_startup_progress("Creating random space levels...") + seedRuins(list(level_name_to_num(EMPTY_AREA)), rand(0, 3), /area/space, space_ruins_templates) + log_startup_progress("Loaded random space levels in [stop_watch(timer)]s.") + + // load in extra levels of space ruins + + var/num_extra_space = rand(config.extra_space_ruin_levels_min, config.extra_space_ruin_levels_max) + for(var/i = 1, i <= num_extra_space, i++) + var/zlev = space_manager.add_new_zlevel("[EMPTY_AREA] #[i]", linkage = CROSSLINKED, traits = list(REACHABLE)) + seedRuins(list(zlev), rand(0, 3), /area/space, space_ruins_templates) + + // Setup the Z-level linkage + space_manager.do_transition_setup() + + // Handle the mining z-level ruins or secrets. + var/mining_type = MINETYPE + if (mining_type == "lavaland") + // Spawn Lavaland ruins and rivers. + seedRuins(list(level_name_to_num(MINING)), config.lavaland_budget, /area/lavaland/surface/outdoors/unexplored, lava_ruins_templates) + spawn_rivers() + else + // Populate mining Z-level hidden rooms + for(var/i = 0, i < max_secret_rooms, i++) + make_mining_asteroid_secret() + return ..() + +/datum/controller/subsystem/mapping/Recover() + flags |= SS_NO_INIT \ No newline at end of file diff --git a/code/controllers/subsystem/medals.dm b/code/controllers/subsystem/medals.dm new file mode 100644 index 00000000000..f3c2752ddf2 --- /dev/null +++ b/code/controllers/subsystem/medals.dm @@ -0,0 +1,86 @@ +SUBSYSTEM_DEF(medals) + name = "Medals" + flags = SS_NO_FIRE + var/hub_enabled = FALSE + +/datum/controller/subsystem/medals/Initialize(timeofday) + if(config.medal_hub_address && config.medal_hub_password) + hub_enabled = TRUE + ..() + +/datum/controller/subsystem/medals/proc/UnlockMedal(medal, client/player) + set waitfor = FALSE + if(!medal || !hub_enabled) + return + if(isnull(world.SetMedal(medal, player, config.medal_hub_address, config.medal_hub_password))) + hub_enabled = FALSE + log_game("MEDAL ERROR: Could not contact hub to award medal [medal] to player [player.ckey].") + message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!") + return + to_chat(player, "Achievement unlocked: [medal]!") + +/datum/controller/subsystem/medals/proc/SetScore(score, client/player, increment, force) + set waitfor = FALSE + if(!score || !hub_enabled) + return + + var/list/oldscore = GetScore(score, player, TRUE) + if(increment) + if(!oldscore[score]) + oldscore[score] = 1 + else + oldscore[score] = (text2num(oldscore[score]) + 1) + else + oldscore[score] = force + + var/newscoreparam = list2params(oldscore) + + if(isnull(world.SetScores(player.ckey, newscoreparam, config.medal_hub_address, config.medal_hub_password))) + hub_enabled = FALSE + log_game("SCORE ERROR: Could not contact hub to set score. Score [score] for player [player.ckey].") + message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!") + +/datum/controller/subsystem/medals/proc/GetScore(score, client/player, returnlist) + if(!score || !hub_enabled) + return + + var/scoreget = world.GetScores(player.ckey, score, config.medal_hub_address, config.medal_hub_password) + if(isnull(scoreget)) + hub_enabled = FALSE + log_game("SCORE ERROR: Could not contact hub to get score. Score [score] for player [player.ckey].") + message_admins("Error! Failed to contact hub to get score [score] for [player.ckey]!") + return + . = params2list(scoreget) + if(!returnlist) + return .[score] + +/datum/controller/subsystem/medals/proc/CheckMedal(medal, client/player) + if(!medal || !hub_enabled) + return + + if(isnull(world.GetMedal(medal, player, config.medal_hub_address, config.medal_hub_password))) + hub_enabled = FALSE + log_game("MEDAL ERROR: Could not contact hub to get medal [medal] for player [player.ckey]") + message_admins("Error! Failed to contact hub to get [medal] medal for [player.ckey]!") + return + to_chat(player, "[medal] is unlocked") + +/datum/controller/subsystem/medals/proc/LockMedal(medal, client/player) + if(!player || !medal || !hub_enabled) + return + var/result = world.ClearMedal(medal, player, config.medal_hub_address, config.medal_hub_password) + switch(result) + if(null) + hub_enabled = FALSE + log_game("MEDAL ERROR: Could not contact hub to clear medal [medal] for player [player.ckey].") + message_admins("Error! Failed to contact hub to clear [medal] medal for [player.ckey]!") + if(TRUE) + message_admins("Medal: [medal] removed for [player.ckey]") + if(FALSE) + message_admins("Medal: [medal] was not found for [player.ckey]. Unable to clear.") + + +/datum/controller/subsystem/medals/proc/ClearScore(client/player) + if(isnull(world.SetScores(player.ckey, "", config.medal_hub_address, config.medal_hub_password))) + log_game("MEDAL ERROR: Could not contact hub to clear scores for [player.ckey].") + message_admins("Error! Failed to contact hub to clear scores for [player.ckey]!") \ No newline at end of file diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index d19396af767..17edb6410fa 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -1,14 +1,21 @@ SUBSYSTEM_DEF(mobs) name = "Mobs" priority = FIRE_PRIORITY_MOBS - flags = SS_KEEP_TIMING | SS_NO_INIT + flags = SS_KEEP_TIMING runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME var/list/currentrun = list() + var/static/list/clients_by_zlevel[][] + var/static/list/dead_players_by_zlevel[][] = list(list()) // Needs to support zlevel 1 here, MaxZChanged only happens when z2 is created and new_players can login before that. /datum/controller/subsystem/mobs/stat_entry() ..("P:[GLOB.mob_list.len]") +/datum/controller/subsystem/mobs/Initialize(start_timeofday) + clients_by_zlevel = new /list(world.maxz,0) + dead_players_by_zlevel = new /list(world.maxz,0) + return ..() + /datum/controller/subsystem/mobs/fire(resumed = 0) var/seconds = wait * 0.1 if(!resumed) diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index 358076c5652..4ebe1dceb0e 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -20,7 +20,7 @@ SUBSYSTEM_DEF(nightshift) return ..() /datum/controller/subsystem/nightshift/fire(resumed = FALSE) - if(world.time - round_start_time < nightshift_first_check) + if(world.time - SSticker.round_start_time < nightshift_first_check) return check_nightshift() diff --git a/code/controllers/subsystem/npcai.dm b/code/controllers/subsystem/npcai.dm deleted file mode 100644 index f8fa3a5aa0f..00000000000 --- a/code/controllers/subsystem/npcai.dm +++ /dev/null @@ -1,24 +0,0 @@ -SUBSYSTEM_DEF(npcai) - name = "NPC AI" // Simple AI controller, isolated from the SNPC one (NPCPool). - flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND - priority = FIRE_PRIORITY_NPC - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/list/simple_animal_list = list() - -/datum/controller/subsystem/npcai/stat_entry() - ..("SimAnimals:[simple_animal_list.len]") - -/datum/controller/subsystem/npcai/fire(resumed = FALSE) - if(!resumed) - src.simple_animal_list = simple_animal_list.Copy() - for(var/mob/living/simple_animal/M in simple_animal_list) - if(istype(M) && !QDELETED(M)) - if(!M.client && M.stat == CONSCIOUS) - M.process_ai() - if(MC_TICK_CHECK) - return - else - simple_animal_list -= M - -/datum/controller/subsystem/npcai/Recover() - simple_animal_list = SSnpcai.simple_animal_list \ No newline at end of file diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index b06d33f6f32..0de306b12eb 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -1,127 +1,33 @@ -#define PROCESSING_NPCS 0 -#define PROCESSING_DELEGATES 1 -#define PROCESSING_ASSISTANTS 2 - SUBSYSTEM_DEF(npcpool) - name = "NPC Pool" - flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND - priority = FIRE_PRIORITY_NPC - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + name = "NPC Pool" + flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND + priority = FIRE_PRIORITY_NPC + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/list/canBeUsed = list() - var/list/needsDelegate = list() - var/list/needsAssistant = list() - - var/list/processing = list() - var/list/currentrun = list() - var/stage + var/list/currentrun = list() /datum/controller/subsystem/npcpool/stat_entry() - ..("NPCS:[processing.len]|D:[needsDelegate.len]|A:[needsAssistant.len]|U:[canBeUsed.len]") - -/datum/controller/subsystem/npcpool/proc/stop_processing(mob/living/carbon/human/interactive/I) - processing -= I - currentrun -= I - needsDelegate -= I - canBeUsed -= I - needsAssistant -= I + var/list/activelist = GLOB.simple_animals[AI_ON] + ..("SimpleAnimals:[activelist.len]") /datum/controller/subsystem/npcpool/fire(resumed = FALSE) - //bot delegation and coordination systems - //General checklist/Tasks for delegating a task or coordinating it (for SNPCs) - // 1. Bot proximity to task target: if too far, delegate, if close, coordinate - // 2. Bot Health/status: check health with bots in local area, if their health is higher, delegate task to them, else coordinate - // 3. Process delegation: if a bot (or bots) has been delegated, assign them to the task. - // 4. Process coordination: if a bot(or bots) has been asked to coordinate, assign them to help. - // 5. Do all assignments: goes through the delegated/coordianted bots and assigns the right variables/tasks to them. - if (!resumed) - currentrun = processing.Copy() - stage = PROCESSING_NPCS - //cache for sanic speed (lists are references anyways) - var/list/cachecurrentrun = currentrun - var/list/cachecanBeUsed = canBeUsed + if(!resumed) + var/list/activelist = GLOB.simple_animals[AI_ON] + src.currentrun = activelist.Copy() - if(stage == PROCESSING_NPCS) - while(cachecurrentrun.len) - var/mob/living/carbon/human/interactive/thing = cachecurrentrun[cachecurrentrun.len] - --cachecurrentrun.len + var/list/currentrun = src.currentrun - thing.InteractiveProcess() + while(currentrun.len) + var/mob/living/simple_animal/SA = currentrun[currentrun.len] + --currentrun.len - var/checkInRange = view(SNPC_MAX_RANGE_FIND,thing) - if(thing.IsDeadOrIncap(FALSE) || !(locate(thing.TARGET) in checkInRange)) - needsDelegate += thing - else if(thing.doing & SNPC_FIGHTING) - needsAssistant += thing - else - cachecanBeUsed += thing - - if (MC_TICK_CHECK) - return - stage = PROCESSING_DELEGATES - cachecurrentrun = needsDelegate //localcache - currentrun = cachecurrentrun - - if(stage == PROCESSING_DELEGATES) - while(cachecurrentrun.len && cachecanBeUsed.len) - var/mob/living/carbon/human/interactive/check = cachecurrentrun[cachecurrentrun.len] - var/mob/living/carbon/human/interactive/candidate = cachecanBeUsed[cachecanBeUsed.len] - --cachecurrentrun.len - - var/helpProb = 0 - var/list/chfac = check.faction - var/list/canfac = candidate.faction - var/facCount = LAZYLEN(chfac) * LAZYLEN(canfac) - - for(var/C in chfac) - if(C in canfac) - helpProb = min(100,helpProb + 25) - if(helpProb >= 100) - break - - if(facCount == 1 && helpProb) - helpProb = 100 - - if(prob(helpProb) && candidate.takeDelegate(check)) - --cachecanBeUsed.len - candidate.change_eye_color(255, 0, 0) - candidate.update_icons() - - if(MC_TICK_CHECK) - return - stage = PROCESSING_ASSISTANTS - cachecurrentrun = needsAssistant //localcache - currentrun = cachecurrentrun - - //no need for the stage check - - while(cachecurrentrun.len && cachecanBeUsed.len) - var/mob/living/carbon/human/interactive/check = cachecurrentrun[cachecurrentrun.len] - var/mob/living/carbon/human/interactive/candidate = cachecanBeUsed[cachecanBeUsed.len] - --cachecurrentrun.len - - var/helpProb = 0 - var/list/chfac = check.faction - var/list/canfac = candidate.faction - var/facCount = LAZYLEN(chfac) * LAZYLEN(canfac) - - for(var/C in chfac) - if(C in canfac) - helpProb = min(100,helpProb + 25) - if(helpProb >= 100) - break - - if(facCount == 1 && helpProb) - helpProb = 100 - - if(prob(helpProb) && candidate.takeDelegate(check,FALSE)) - --cachecanBeUsed.len - candidate.change_eye_color(255, 255, 0) - candidate.update_icons() - - if(!cachecurrentrun.len || MC_TICK_CHECK) //don't change SS state if it isn't necessary - return - -/datum/controller/subsystem/npcpool/Recover() - processing = SSnpcpool.processing \ No newline at end of file + if(!SA.ckey && !SA.notransform) + if(SA.stat != DEAD) + SA.handle_automated_movement() + if(SA.stat != DEAD) + SA.handle_automated_action() + if(SA.stat != DEAD) + SA.handle_automated_speech() + if(MC_TICK_CHECK) + return \ No newline at end of file diff --git a/code/controllers/subsystem/processing/fastprocess.dm b/code/controllers/subsystem/processing/fastprocess.dm new file mode 100644 index 00000000000..732c5a3ba55 --- /dev/null +++ b/code/controllers/subsystem/processing/fastprocess.dm @@ -0,0 +1,6 @@ +//Fires five times every second. + +PROCESSING_SUBSYSTEM_DEF(fastprocess) + name = "Fast Processing" + wait = 2 + stat_tag = "FP" \ No newline at end of file diff --git a/code/controllers/subsystem/processing/obj.dm b/code/controllers/subsystem/processing/obj.dm new file mode 100644 index 00000000000..7ee2bb1f0f3 --- /dev/null +++ b/code/controllers/subsystem/processing/obj.dm @@ -0,0 +1,5 @@ +PROCESSING_SUBSYSTEM_DEF(obj) + name = "Objects" + priority = FIRE_PRIORITY_OBJ + flags = SS_NO_INIT + wait = 20 \ No newline at end of file diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index 92254454219..2e06d7ebcc6 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -1,7 +1,5 @@ //Used to process objects. Fires once every second. -//TODO: Implement fully when process scheduler dies -/* SUBSYSTEM_DEF(processing) name = "Processing" priority = FIRE_PRIORITY_PROCESS @@ -16,7 +14,7 @@ SUBSYSTEM_DEF(processing) ..("[stat_tag]:[processing.len]") /datum/controller/subsystem/processing/fire(resumed = 0) - if (!resumed) + if(!resumed) currentrun = processing.Copy() //cache for sanic speed (lists are references anyways) var/list/current_run = currentrun @@ -24,15 +22,16 @@ SUBSYSTEM_DEF(processing) while(current_run.len) var/datum/thing = current_run[current_run.len] current_run.len-- - if(QDELETED(thing) || thing.process(wait) == PROCESS_KILL) + if(QDELETED(thing)) processing -= thing - if (MC_TICK_CHECK) + else if(thing.process(wait) == PROCESS_KILL) + // fully stop so that a future START_PROCESSING will work + STOP_PROCESSING(src, thing) + if(MC_TICK_CHECK) return -*/ + /datum/var/isprocessing = FALSE -/* + /datum/proc/process() set waitfor = 0 - STOP_PROCESSING(SSobj, src) - return 0 -*/ \ No newline at end of file + return PROCESS_KILL \ No newline at end of file diff --git a/code/controllers/subsystem/radio.dm b/code/controllers/subsystem/radio.dm new file mode 100644 index 00000000000..93b5152ee45 --- /dev/null +++ b/code/controllers/subsystem/radio.dm @@ -0,0 +1,99 @@ +SUBSYSTEM_DEF(radio) + name = "Radio" + flags = SS_NO_INIT | SS_NO_FIRE + + var/list/radiochannels = list( + "Common" = PUB_FREQ, + "Science" = SCI_FREQ, + "Command" = COMM_FREQ, + "Medical" = MED_FREQ, + "Engineering" = ENG_FREQ, + "Security" = SEC_FREQ, + "Response Team" = ERT_FREQ, + "Special Ops" = DTH_FREQ, + "Syndicate" = SYND_FREQ, + "SyndTeam" = SYNDTEAM_FREQ, + "Supply" = SUP_FREQ, + "Service" = SRV_FREQ, + "AI Private" = AI_FREQ, + "Medical(I)" = MED_I_FREQ, + "Security(I)" = SEC_I_FREQ + ) + var/list/CENT_FREQS = list(ERT_FREQ, DTH_FREQ) + var/list/ANTAG_FREQS = list(SYND_FREQ, SYNDTEAM_FREQ) + var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, MED_FREQ, SEC_FREQ, SCI_FREQ, SRV_FREQ, SUP_FREQ) + var/list/datum/radio_frequency/frequencies = list() + +// This is fucking disgusting and needs to die +/datum/controller/subsystem/radio/proc/frequency_span_class(var/frequency) + // Antags! + if(frequency in ANTAG_FREQS) + return "syndradio" + // centcomm channels (deathsquid and ert) + if(frequency in CENT_FREQS) + return "centradio" + // This switch used to be a shit tonne of if statements. I am gonna find who made this and give them a kind talking to + switch(frequency) + if(COMM_FREQ) + return "comradio" + if(AI_FREQ) + return "airadio" + if(SEC_FREQ) + return "secradio" + if(ENG_FREQ) + return "engradio" + if(SCI_FREQ) + return "sciradio" + if(MED_FREQ) + return "medradio" + if(SUP_FREQ) + return "supradio" + if(SRV_FREQ) + return "srvradio" + + // If the above switch somehow failed. And it needs the SSradio. part otherwise it fails to compile + if(frequency in DEPT_FREQS) + return "deptradio" + + // If its none of the others + return "radio" + + +/datum/controller/subsystem/radio/proc/add_object(obj/device as obj, var/new_frequency as num, var/filter = null as text|null) + var/f_text = num2text(new_frequency) + var/datum/radio_frequency/frequency = frequencies[f_text] + + if(!frequency) + frequency = new + frequency.frequency = new_frequency + frequencies[f_text] = frequency + + frequency.add_listener(device, filter) + return frequency + +/datum/controller/subsystem/radio/proc/remove_object(obj/device, old_frequency) + var/f_text = num2text(old_frequency) + var/datum/radio_frequency/frequency = frequencies[f_text] + + if(frequency) + frequency.remove_listener(device) + + if(frequency.devices.len == 0) + qdel(frequency) + frequencies -= f_text + + return 1 + +/datum/controller/subsystem/radio/proc/return_frequency(var/new_frequency as num) + var/f_text = num2text(new_frequency) + var/datum/radio_frequency/frequency = frequencies[f_text] + + if(!frequency) + frequency = new + frequency.frequency = new_frequency + frequencies[f_text] = frequency + + return frequency + + +// ALL THE SHIT BELOW THIS LINE ISNT PART OF THE SUBSYSTEM AND REALLY NEEDS ITS OWN FILE diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index 30021df4fb1..a1ca9b5fdad 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -106,8 +106,8 @@ SUBSYSTEM_DEF(shuttle) return emergency = backup_shuttle - if(world.time - round_start_time < config.shuttle_refuel_delay) - to_chat(user, "The emergency shuttle is refueling. Please wait another [abs(round(((world.time - round_start_time) - config.shuttle_refuel_delay)/600))] minutes before trying again.") + if(world.time - SSticker.round_start_time < config.shuttle_refuel_delay) + to_chat(user, "The emergency shuttle is refueling. Please wait another [abs(round(((world.time - SSticker.round_start_time) - config.shuttle_refuel_delay)/600))] minutes before trying again.") return switch(emergency.mode) @@ -169,7 +169,7 @@ SUBSYSTEM_DEF(shuttle) return if(!emergency.canRecall) return - if(ticker.mode.name == "meteor") + if(SSticker.mode.name == "meteor") return if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) if(emergency.timeLeft(1) < emergencyCallTime * 0.25) diff --git a/code/game/gamemodes/gameticker.dm b/code/controllers/subsystem/ticker.dm similarity index 73% rename from code/game/gamemodes/gameticker.dm rename to code/controllers/subsystem/ticker.dm index 376668c16c4..4aa30657778 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -1,77 +1,125 @@ -var/global/datum/controller/gameticker/ticker -var/round_start_time = 0 +SUBSYSTEM_DEF(ticker) + name = "Ticker" + init_order = INIT_ORDER_TICKER -/datum/controller/gameticker + priority = FIRE_PRIORITY_TICKER + flags = SS_KEEP_TIMING + runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME + + var/round_start_time = 0 var/const/restart_timeout = 600 - var/current_state = GAME_STATE_PREGAME + var/current_state = GAME_STATE_STARTUP + var/force_start = 0 // Do we want to force-start as soon as we can var/force_ending = 0 - var/hide_mode = 0 // leave here at 0 ! setup() will take care of it when needed for Secret mode -walter0o var/datum/game_mode/mode = null var/event_time = null var/event = 0 - var/login_music // music played in pregame lobby - var/list/datum/mind/minds = list()//The people in the game. Used for objective tracking. - var/Bible_icon_state // icon_state the chaplain has chosen for his bible var/Bible_item_state // item_state the chaplain has chosen for his bible var/Bible_name // name of the bible var/Bible_deity_name - var/datum/cult_info/cultdat = null //here instead of cult for adminbus purposes - var/random_players = 0 // if set to nonzero, ALL players who latejoin or declare-ready join will have random appearances/genders - var/list/syndicate_coalition = list() // list of traitor-compatible factions var/list/factions = list() // list of all factions var/list/availablefactions = list() // list of factions with openings - - var/pregame_timeleft = 0 + var/tipped = FALSE //Did we broadcast the tip of the day yet? + var/selected_tip // What will be the tip of the day? + var/pregame_timeleft // This is used for calculations var/delay_end = 0 //if set to nonzero, the round will not restart on it's own - var/triai = 0//Global holder for Triumvirate var/initialtpass = 0 //holder for inital autotransfer vote timer - var/obj/screen/cinematic = null //used for station explosion cinematic - var/round_end_announced = 0 // Spam Prevention. Announce round end only once.\ - -/datum/controller/gameticker/proc/pregame() +/datum/controller/subsystem/ticker/Initialize() login_music = pick(\ 'sound/music/thunderdome.ogg',\ 'sound/music/space.ogg',\ 'sound/music/title1.ogg',\ 'sound/music/title2.ogg',\ 'sound/music/title3.ogg',) - do - pregame_timeleft = config.pregame_timestart - to_chat(world, "Welcome to the pre-game lobby!") - to_chat(world, "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds") - while(current_state == GAME_STATE_PREGAME) - sleep(10) - if(going) - pregame_timeleft-- - if(pregame_timeleft <= 0) + // Map name + if(using_map && using_map.name) + GLOB.map_name = "[using_map.name]" + else + GLOB.map_name = "Unknown" + + // World name + if(config && config.server_name) + world.name = "[config.server_name]: [station_name()]" + else + world.name = station_name() + + return ..() + + +/datum/controller/subsystem/ticker/fire() + switch(current_state) + if(GAME_STATE_STARTUP) + // This is ran as soon as the MC starts firing, and should only run ONCE, unless startup fails + round_start_time = world.time + (config.pregame_timestart * 10) + to_chat(world, "Welcome to the pre-game lobby!") + to_chat(world, "Please, setup your character and select ready. Game will start in [config.pregame_timestart] seconds") + current_state = GAME_STATE_PREGAME + fire() // TG says this is a good idea + if(GAME_STATE_PREGAME) + // This is so we dont have sleeps in controllers, because that is a bad, bad thing + pregame_timeleft = max(0,round_start_time - world.time) + + if(pregame_timeleft <= 600 && !tipped) // 60 seconds + send_tip_of_the_round() + tipped = TRUE + + if(pregame_timeleft <= 0 || force_start) current_state = GAME_STATE_SETTING_UP Master.SetRunLevel(RUNLEVEL_SETUP) - while(!setup()) + if(GAME_STATE_SETTING_UP) + if(!setup()) // Setup failed + current_state = GAME_STATE_STARTUP + Master.SetRunLevel(RUNLEVEL_LOBBY) + if(GAME_STATE_PLAYING) + mode.process() + mode.process_job_tasks() + var/game_finished = SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked + if(config.continuous_rounds) + mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result + else + game_finished |= mode.check_finished() + if(game_finished) + current_state = GAME_STATE_FINISHED + if(GAME_STATE_FINISHED) + current_state = GAME_STATE_FINISHED + Master.SetRunLevel(RUNLEVEL_POSTGAME) // This shouldnt process more than once, but you never know + auto_toggle_ooc(1) // Turn it on -/datum/controller/gameticker/proc/votetimer() + spawn(0) + declare_completion() + + spawn(50) + if(mode.station_was_nuked) + world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") + else + world.Reboot("Round ended.", "end_proper", "proper completion") + + +/datum/controller/subsystem/ticker/proc/votetimer() var/timerbuffer = 0 if(initialtpass == 0) timerbuffer = config.vote_autotransfer_initial else timerbuffer = config.vote_autotransfer_interval spawn(timerbuffer) - vote.autotransfer() + SSvote.autotransfer() initialtpass = 1 votetimer() -/datum/controller/gameticker/proc/setup() + +/datum/controller/subsystem/ticker/proc/setup() cultdat = setupcult() //Create and announce mode if(master_mode=="secret") @@ -88,7 +136,7 @@ var/round_start_time = 0 var/datum/game_mode/M = config.pick_mode(secret_force_mode) if(M.can_start()) src.mode = config.pick_mode(secret_force_mode) - job_master.ResetOccupations() + SSjobs.ResetOccupations() if(!src.mode) src.mode = pickweight(runnable_modes) if(src.mode) @@ -100,7 +148,7 @@ var/round_start_time = 0 to_chat(world, "Unable to start [mode.name]. Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby.") mode = null current_state = GAME_STATE_PREGAME - job_master.ResetOccupations() + SSjobs.ResetOccupations() Master.SetRunLevel(RUNLEVEL_LOBBY) return 0 @@ -108,12 +156,12 @@ var/round_start_time = 0 src.mode.pre_pre_setup() var/can_continue can_continue = src.mode.pre_setup()//Setup special modes - job_master.DivideOccupations() //Distribute jobs + SSjobs.DivideOccupations() //Distribute jobs if(!can_continue) qdel(mode) current_state = GAME_STATE_PREGAME to_chat(world, "Error setting up [master_mode]. Reverting to pre-game lobby.") - job_master.ResetOccupations() + SSjobs.ResetOccupations() Master.SetRunLevel(RUNLEVEL_LOBBY) return 0 @@ -128,6 +176,7 @@ var/round_start_time = 0 src.mode.announce() create_characters() //Create player characters and transfer them + populate_spawn_points() collect_minds() equip_characters() data_core.manifest() @@ -138,10 +187,15 @@ var/round_start_time = 0 //here to initialize the random events nicely at round start setup_economy() + setupfactions() //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) @@ -163,10 +217,10 @@ var/round_start_time = 0 to_chat(world, "Enjoy the game!") world << sound('sound/AI/welcome.ogg')// Skie - if(holiday_master.holidays) + if(SSholiday.holidays) to_chat(world, "and...") - for(var/holidayname in holiday_master.holidays) - var/datum/holiday/holiday = holiday_master.holidays[holidayname] + for(var/holidayname in SSholiday.holidays) + var/datum/holiday/holiday = SSholiday.holidays[holidayname] to_chat(world, "

[holiday.greet()]

") spawn(0) // Forking dynamic room selection @@ -223,14 +277,6 @@ var/round_start_time = 0 auto_toggle_ooc(0) // Turn it off round_start_time = world.time - /* DONE THROUGH PROCESS SCHEDULER - supply_controller.process() //Start the supply shuttle regenerating points -- TLE - master_controller.process() //Start master_controller.process() - lighting_controller.process() //Start processing DynamicAreaLighting updates - */ - - processScheduler.start() - if(config.sql_enabled) spawn(3000) statistic_cycle() // Polls population totals regularly and stores them in an SQL DB @@ -243,9 +289,7 @@ var/round_start_time = 0 return 1 - //Plus it provides an easy way to make cinematics for other events. Just use this as a template :) -//Plus it provides an easy way to make cinematics for other events. Just use this as a template -/datum/controller/gameticker/proc/station_explosion_cinematic(station_missed = 0, override = null) +/datum/controller/subsystem/ticker/proc/station_explosion_cinematic(station_missed = 0, override = null) if(cinematic) return //already a cinematic in progress! @@ -341,7 +385,7 @@ var/round_start_time = 0 -/datum/controller/gameticker/proc/create_characters() +/datum/controller/subsystem/ticker/proc/create_characters() for(var/mob/new_player/player in GLOB.player_list) if(player.ready && player.mind) if(player.mind.assigned_role == "AI") @@ -355,67 +399,49 @@ var/round_start_time = 0 qdel(player) -/datum/controller/gameticker/proc/collect_minds() +/datum/controller/subsystem/ticker/proc/collect_minds() for(var/mob/living/player in GLOB.player_list) if(player.mind) - ticker.minds += player.mind + SSticker.minds += player.mind -/datum/controller/gameticker/proc/equip_characters() +/datum/controller/subsystem/ticker/proc/equip_characters() var/captainless=1 for(var/mob/living/carbon/human/player in GLOB.player_list) if(player && player.mind && player.mind.assigned_role) if(player.mind.assigned_role == "Captain") captainless=0 if(player.mind.assigned_role != player.mind.special_role) - job_master.AssignRank(player, player.mind.assigned_role, 0) - job_master.EquipRank(player, player.mind.assigned_role, 0) + SSjobs.AssignRank(player, player.mind.assigned_role, 0) + SSjobs.EquipRank(player, player.mind.assigned_role, 0) EquipCustomItems(player) if(captainless) for(var/mob/M in GLOB.player_list) if(!istype(M,/mob/new_player)) to_chat(M, "Captainship not forced on anyone.") - -/datum/controller/gameticker/proc/process() - if(current_state != GAME_STATE_PLAYING) - return 0 - - mode.process() - mode.process_job_tasks() - - //emergency_shuttle.process() DONE THROUGH PROCESS SCHEDULER - - var/game_finished = SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked - if(config.continuous_rounds) - mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result +/datum/controller/subsystem/ticker/proc/send_tip_of_the_round() + var/m + if(selected_tip) + m = selected_tip else - game_finished |= mode.check_finished() + var/list/randomtips = file2list("strings/tips.txt") + var/list/memetips = file2list("strings/sillytips.txt") + if(randomtips.len && prob(95)) + m = pick(randomtips) + else if(memetips.len) + m = pick(memetips) - if((!mode.explosion_in_progress && game_finished) || force_ending) - current_state = GAME_STATE_FINISHED - Master.SetRunLevel(RUNLEVEL_POSTGAME) - auto_toggle_ooc(1) // Turn it on - spawn - declare_completion() + if(m) + to_chat(world, "Tip of the round: [html_encode(m)]") - spawn(50) - callHook("roundend") - - if(mode.station_was_nuked) - world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") - else - world.Reboot("Round ended.", "end_proper", "proper completion") - - return 1 - -/datum/controller/gameticker/proc/getfactionbyname(var/name) +/datum/controller/subsystem/ticker/proc/getfactionbyname(var/name) for(var/datum/faction/F in factions) if(F.name == name) return F -/datum/controller/gameticker/proc/declare_completion() +/datum/controller/subsystem/ticker/proc/declare_completion() nologevent = 1 //end of round murder and shenanigans are legal; there's no need to jam up attack logs past this point. //Round statistics report var/datum/station_state/end_state = new /datum/station_state() @@ -460,9 +486,9 @@ var/round_start_time = 0 if(dronecount) to_chat(world, "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round.") - if(ticker.mode.eventmiscs.len) + if(mode.eventmiscs.len) var/emobtext = "" - for(var/datum/mind/eventmind in ticker.mode.eventmiscs) + for(var/datum/mind/eventmind in mode.eventmiscs) emobtext += printeventplayer(eventmind) emobtext += "
" emobtext += printobjectives(eventmind) @@ -483,9 +509,18 @@ var/round_start_time = 0 mode.declare_station_goal_completion() //Ask the event manager to print round end information - event_manager.RoundEnd() + SSevents.RoundEnd() + + // Add AntagHUD to everyone, see who was really evil the whole time! + for(var/datum/atom_hud/antag/H in huds) + for(var/m in GLOB.player_list) + var/mob/M = m + H.add_hud_to(M) return 1 -/datum/controller/gameticker/proc/HasRoundStarted() +/datum/controller/subsystem/ticker/proc/HasRoundStarted() return current_state >= GAME_STATE_PLAYING + +/datum/controller/subsystem/ticker/proc/IsRoundInProgress() + return current_state == GAME_STATE_PLAYING \ No newline at end of file diff --git a/code/controllers/subsystem/tickets/mentor_tickets.dm b/code/controllers/subsystem/tickets/mentor_tickets.dm new file mode 100644 index 00000000000..d8bae77840c --- /dev/null +++ b/code/controllers/subsystem/tickets/mentor_tickets.dm @@ -0,0 +1,21 @@ +GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets) + +/datum/controller/subsystem/tickets/mentor_tickets/New() + NEW_SS_GLOBAL(SSmentor_tickets); + PreInit(); + +/datum/controller/subsystem/tickets/mentor_tickets + name = "Mentor Tickets" + ticket_system_name = "Mentor Tickets" + ticket_name = "Mentor Ticket" + span_class = "mentorhelp" + close_rights = R_MENTOR | R_ADMIN + +/datum/controller/subsystem/tickets/mentor_tickets/message_staff(var/msg) + message_mentorTicket(msg) + +/datum/controller/subsystem/tickets/mentor_tickets/Initialize() + close_messages = list("- [ticket_name] Closed -", + "Please try to be as descriptive as possible in mentor helps. Mentors do not know the full situation you're in and need more information to give you a helpful response.", + "Your [ticket_name] has now been closed.") + return ..() diff --git a/code/controllers/subsystem/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm similarity index 55% rename from code/controllers/subsystem/tickets.dm rename to code/controllers/subsystem/tickets/tickets.dm index b8b1f8410a0..1b1735b34c1 100644 --- a/code/controllers/subsystem/tickets.dm +++ b/code/controllers/subsystem/tickets/tickets.dm @@ -1,28 +1,36 @@ //Defines //Deciseconds until ticket becomes stale if unanswered. Alerts admins. -#define ADMIN_TICKET_TIMEOUT 6000 // 10 minutes +#define TICKET_TIMEOUT 6000 // 10 minutes //Decisecions before the user is allowed to open another ticket while their existing one is open. -#define ADMIN_TICKET_DUPLICATE_COOLDOWN 3000 // 5 minutes +#define TICKET_DUPLICATE_COOLDOWN 3000 // 5 minutes //Status defines -#define ADMIN_TICKET_OPEN 1 -#define ADMIN_TICKET_CLOSED 2 -#define ADMIN_TICKET_RESOLVED 3 -#define ADMIN_TICKET_STALE 4 +#define TICKET_OPEN 1 +#define TICKET_CLOSED 2 +#define TICKET_RESOLVED 3 +#define TICKET_STALE 4 SUBSYSTEM_DEF(tickets) - name = "Tickets" + name = "Admin Tickets" + var/span_class = "adminticket" + var/ticket_system_name = "Admin Tickets" + var/ticket_name = "Admin Ticket" + var/close_rights = R_ADMIN + var/list/close_messages init_order = INIT_ORDER_TICKETS wait = 300 priority = FIRE_PRIORITY_TICKETS - + flags = SS_BACKGROUND - + var/list/allTickets var/ticketCounter = 1 /datum/controller/subsystem/tickets/Initialize() + close_messages = list("- [ticket_name] Rejected! -", + "Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.", + "Your [ticket_name] has now been closed.") LAZYINITLIST(allTickets) return ..() @@ -32,7 +40,7 @@ SUBSYSTEM_DEF(tickets) var/report for(var/num in stales) report += "[num], " - message_adminTicket("Tickets [report] have been open for over [ADMIN_TICKET_TIMEOUT / 600] minutes. Changing status to stale.") + message_staff("Tickets [report] have been open for over [TICKET_TIMEOUT / 600] minutes. Changing status to stale.") /datum/controller/subsystem/tickets/stat_entry() ..("Tickets: [LAZYLEN(allTickets)]") @@ -40,10 +48,10 @@ SUBSYSTEM_DEF(tickets) /datum/controller/subsystem/tickets/proc/checkStaleness() var/stales = list() for(var/T in allTickets) - var/datum/admin_ticket/ticket = T - if(!(ticket.ticketState == ADMIN_TICKET_OPEN)) + var/datum/ticket/ticket = T + if(!(ticket.ticketState == TICKET_OPEN)) continue - if(world.time > ticket.timeUntilStale && (!ticket.lastAdminResponse || !ticket.adminAssigned)) + if(world.time > ticket.timeUntilStale && (!ticket.lastStaffResponse || !ticket.staffAssigned)) var/id = ticket.makeStale() stales += id return stales @@ -60,7 +68,7 @@ SUBSYSTEM_DEF(tickets) /datum/controller/subsystem/tickets/proc/resolveAllOpenTickets() // Resolve all open tickets for(var/i in allTickets) - var/datum/admin_ticket/T = i + var/datum/ticket/T = i resolveTicket(T.ticketNum) //Open a new ticket and populate details then add to the list of open tickets @@ -69,56 +77,57 @@ SUBSYSTEM_DEF(tickets) return //Check if the user has an open ticket already within the cooldown period, if so we don't create a new one and re-set the cooldown period - var/datum/admin_ticket/existingTicket = checkForOpenTicket(C) + var/datum/ticket/existingTicket = checkForOpenTicket(C) if(existingTicket) existingTicket.setCooldownPeriod() - to_chat(C.mob, "Your ticket #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.") + to_chat(C.mob, "Your [ticket_name] #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.") return if(!title) title = passedContent - var/datum/admin_ticket/T = new(title, passedContent) + var/datum/ticket/T = new(title, passedContent, getTicketCounterAndInc()) + allTickets += T T.clientName = C T.locationSent = C.mob.loc.name T.mobControlled = C.mob //Inform the user that they have opened a ticket - to_chat(C, "You have opened admin ticket number #[(SStickets.getTicketCounter() - 1)]! Please be patient and we will help you soon!") + to_chat(C, "You have opened [ticket_name] number #[(getTicketCounter() - 1)]! Please be patient and we will help you soon!") //Set ticket state with key N to open /datum/controller/subsystem/tickets/proc/openTicket(N) - var/datum/admin_ticket/T = SStickets.allTickets[N] - if(T.ticketState != ADMIN_TICKET_OPEN) - T.ticketState = ADMIN_TICKET_OPEN + var/datum/ticket/T = allTickets[N] + if(T.ticketState != TICKET_OPEN) + T.ticketState = TICKET_OPEN return TRUE //Set ticket state with key N to resolved /datum/controller/subsystem/tickets/proc/resolveTicket(N) - var/datum/admin_ticket/T = SStickets.allTickets[N] - if(T.ticketState != ADMIN_TICKET_RESOLVED) - T.ticketState = ADMIN_TICKET_RESOLVED + var/datum/ticket/T = allTickets[N] + if(T.ticketState != TICKET_RESOLVED) + T.ticketState = TICKET_RESOLVED return TRUE //Set ticket state with key N to closed /datum/controller/subsystem/tickets/proc/closeTicket(N) - var/datum/admin_ticket/T = SStickets.allTickets[N] - if(T.ticketState != ADMIN_TICKET_CLOSED) - T.ticketState = ADMIN_TICKET_CLOSED + var/datum/ticket/T = allTickets[N] + if(T.ticketState != TICKET_CLOSED) + T.ticketState = TICKET_CLOSED return TRUE //Check if the user already has a ticket open and within the cooldown period. /datum/controller/subsystem/tickets/proc/checkForOpenTicket(client/C) - for(var/datum/admin_ticket/T in allTickets) - if(T.clientName == C && T.ticketState == ADMIN_TICKET_OPEN && (T.ticketCooldown > world.time)) + for(var/datum/ticket/T in allTickets) + if(T.clientName == C && T.ticketState == TICKET_OPEN && (T.ticketCooldown > world.time)) return T return FALSE //Check if the user has ANY ticket not resolved or closed. /datum/controller/subsystem/tickets/proc/checkForTicket(client/C) var/list/tickets = list() - for(var/datum/admin_ticket/T in allTickets) - if(T.clientName == C && (T.ticketState == ADMIN_TICKET_OPEN || T.ticketState == ADMIN_TICKET_STALE)) + for(var/datum/ticket/T in allTickets) + if(T.clientName == C && (T.ticketState == TICKET_OPEN || T.ticketState == TICKET_STALE)) tickets += T if(tickets.len) return tickets @@ -126,78 +135,79 @@ SUBSYSTEM_DEF(tickets) //return the client of a ticket number /datum/controller/subsystem/tickets/proc/returnClient(N) - var/datum/admin_ticket/T = SStickets.allTickets[N] + var/datum/ticket/T = allTickets[N] return T.clientName -/datum/controller/subsystem/tickets/proc/assignAdminToTicket(client/C, var/N) - var/datum/admin_ticket/T = SStickets.allTickets[N] - T.assignAdmin(C) +/datum/controller/subsystem/tickets/proc/assignStaffToTicket(client/C, N) + var/datum/ticket/T = allTickets[N] + if(T.staffAssigned != null && T.staffAssigned != C && alert("Ticket is already assigned to [T.staffAssigned.ckey]. Are you sure you want to take it?","Take ticket","No","Yes") != "Yes") + return FALSE + T.assignStaff(C) return TRUE -//Single admin ticket +//Single staff ticket -/datum/admin_ticket +/datum/ticket var/ticketNum // Ticket number var/clientName // Client which opened the ticket var/timeOpened // Time the ticket was opened var/title //The initial message with links - var/list/content // content of the admin help - var/lastAdminResponse // Last admin who responded - var/lastResponseTime // When the admin last responded + var/list/content // content of the staff help + var/lastStaffResponse // Last staff member who responded + var/lastResponseTime // When the staff last responded var/locationSent // Location the player was when they send the ticket var/mobControlled // Mob they were controlling var/ticketState // State of the ticket, open, closed, resolved etc var/timeUntilStale // When the ticket goes stale var/ticketCooldown // Cooldown before allowing the user to open another ticket. - var/adminAssigned // Admin who has assigned themselves to this ticket + var/client/staffAssigned // Staff member who has assigned themselves to this ticket -/datum/admin_ticket/New(tit, cont) +/datum/ticket/New(tit, cont, num) title = tit content = list() content += cont timeOpened = worldtime2text() - timeUntilStale = world.time + ADMIN_TICKET_TIMEOUT + timeUntilStale = world.time + TICKET_TIMEOUT setCooldownPeriod() - ticketNum = SStickets.getTicketCounterAndInc() - ticketState = ADMIN_TICKET_OPEN - SStickets.allTickets += src + ticketNum = num + ticketState = TICKET_OPEN //Set the cooldown period for the ticket. The time when it's created plus the defined cooldown time. -/datum/admin_ticket/proc/setCooldownPeriod() - ticketCooldown = world.time + ADMIN_TICKET_DUPLICATE_COOLDOWN +/datum/ticket/proc/setCooldownPeriod() + ticketCooldown = world.time + TICKET_DUPLICATE_COOLDOWN -//Set the last admin who responded as the client passed as an arguement. -/datum/admin_ticket/proc/setLastAdminResponse(client/C) - lastAdminResponse = C +//Set the last staff who responded as the client passed as an arguement. +/datum/ticket/proc/setLastStaffResponse(client/C) + lastStaffResponse = C lastResponseTime = worldtime2text() //Return the ticket state as a colour coded text string. -/datum/admin_ticket/proc/state2text() +/datum/ticket/proc/state2text() switch(ticketState) - if(ADMIN_TICKET_OPEN) + if(TICKET_OPEN) return "OPEN" - if(ADMIN_TICKET_RESOLVED) + if(TICKET_RESOLVED) return "RESOLVED" - if(ADMIN_TICKET_CLOSED) + if(TICKET_CLOSED) return "CLOSED" - if(ADMIN_TICKET_STALE) + if(TICKET_STALE) return "STALE" -//Assign the client passed to var/adminAsssigned -/datum/admin_ticket/proc/assignAdmin(client/C) +//Assign the client passed to var/staffAsssigned +/datum/ticket/proc/assignStaff(client/C) if(!C) return - adminAssigned = C + staffAssigned = C return TRUE -/datum/admin_ticket/proc/addResponse(client/C, msg) +/datum/ticket/proc/addResponse(client/C, msg) if(C.holder) - setLastAdminResponse(C) + setLastStaffResponse(C) msg = "[C]: [msg]" content += msg -/datum/admin_ticket/proc/makeStale() - ticketState = ADMIN_TICKET_STALE +/datum/ticket/proc/makeStale() + ticketState = TICKET_STALE return ticketNum /* @@ -206,7 +216,7 @@ UI STUFF */ -/datum/controller/subsystem/tickets/proc/returnUI(tab = ADMIN_TICKET_OPEN) +/datum/controller/subsystem/tickets/proc/returnUI(tab = TICKET_OPEN) set name = "Open Ticket Interface" set category = "Tickets" @@ -214,36 +224,36 @@ UI STUFF var/trStyle = "border-top:2px solid; border-bottom:2px solid; padding-top: 5px; padding-bottom: 5px;" var/tdStyleleft = "border-top:2px solid; border-bottom:2px solid; width:150px; text-align:center;" var/tdStyle = "border-top:2px solid; border-bottom:2px solid;" - var/datum/admin_ticket/ticket + var/datum/ticket/ticket var/dat dat += "" - dat += "

Admin Tickets

" + dat += "

[ticket_system_name]

" dat +="Refresh
Open TicketsResolved TicketsClosed Tickets" - if(tab == ADMIN_TICKET_OPEN) + if(tab == TICKET_OPEN) dat += "

Open Tickets

" dat += "" dat +="" - if(tab == ADMIN_TICKET_OPEN) + if(tab == TICKET_OPEN) for(var/T in allTickets) ticket = T - if(ticket.ticketState == ADMIN_TICKET_OPEN || ticket.ticketState == ADMIN_TICKET_STALE) - dat += "" + if(ticket.ticketState == TICKET_OPEN || ticket.ticketState == TICKET_STALE) + dat += "" else continue - else if(tab == ADMIN_TICKET_RESOLVED) + else if(tab == TICKET_RESOLVED) dat += "

Resolved Tickets

" for(var/T in allTickets) ticket = T - if(ticket.ticketState == ADMIN_TICKET_RESOLVED) + if(ticket.ticketState == TICKET_RESOLVED) dat += "" else continue - else if(tab == ADMIN_TICKET_CLOSED) + else if(tab == TICKET_CLOSED) dat += "

Closed Tickets

" for(var/T in allTickets) ticket = T - if(ticket.ticketState == ADMIN_TICKET_CLOSED) + if(ticket.ticketState == TICKET_CLOSED) dat += "" else continue @@ -255,21 +265,21 @@ UI STUFF /datum/controller/subsystem/tickets/proc/showUI(mob/user, tab) var/dat = null dat = returnUI(tab) - var/datum/browser/popup = new(user, "admintickets", "Admin Tickets", 1400, 600) + var/datum/browser/popup = new(user, ticket_system_name, ticket_system_name, 1400, 600) popup.set_content(dat) popup.open() /datum/controller/subsystem/tickets/proc/showDetailUI(mob/user, ticketID) - var/datum/admin_ticket/T = SStickets.allTickets[ticketID] + var/datum/ticket/T = allTickets[ticketID] var/status = "[T.state2text()]" - var/dat = "

Admin Tickets

" + var/dat = "

[ticket_system_name]

" dat +="Show AllRefresh" dat += "

Ticket #[T.ticketNum]

" - dat += "

[T.clientName] / [T.mobControlled] opened this ticket at [T.timeOpened] at location [T.locationSent]

" + dat += "

[T.clientName] / [T.mobControlled] opened this [ticket_name] at [T.timeOpened] at location [T.locationSent]

" dat += "

Ticket Status: [status]" dat += "

ControlTicket
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened]) [ticket.ticketState == ADMIN_TICKET_STALE ? "STALE" : ""]
[ticket.title]
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened]) [ticket.ticketState == TICKET_STALE ? "STALE" : ""]
[ticket.title]
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened])
[ticket.title]
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened])
[ticket.title]
" dat += "" @@ -281,21 +291,21 @@ UI STUFF dat += "
[T.title]


" dat += "Re-OpenResolve

" - if(!T.adminAssigned) - dat += "No admin assigned to this ticket - Take Ticket
" + if(!T.staffAssigned) + dat += "No staff member assigned to this [ticket_name] - Take Ticket
" else - dat += "[T.adminAssigned] is assigned to this Ticket. - Take Ticket
" + dat += "[T.staffAssigned] is assigned to this Ticket. - Take Ticket
" - if(T.lastAdminResponse) - dat += "Last Admin Response: [T.lastAdminResponse] at [T.lastResponseTime]" + if(T.lastStaffResponse) + dat += "Last Staff response Response: [T.lastStaffResponse] at [T.lastResponseTime]" else - dat +="No Admin Response" + dat +="No Staff Response" dat += "

" dat += "Close Ticket" - var/datum/browser/popup = new(user, "adminticketsdetail", "Admin Ticket #[T.ticketNum]", 1000, 600) + var/datum/browser/popup = new(user, "[ticket_system_name]detail", "[ticket_system_name] #[T.ticketNum]", 1000, 600) popup.set_content(dat) popup.open() @@ -303,15 +313,15 @@ UI STUFF //dat var/tickets = checkForTicket(user.client) var/dat - dat += "

Your open tickets

" + dat += "

Your open [ticket_system_name]

" dat += "" - for(var/datum/admin_ticket/T in tickets) + for(var/datum/ticket/T in tickets) dat += "" for(var/i = 1, i <= T.content.len, i++) dat += "" dat += "

Ticket #[T.ticketNum]

[T.content[i]]
" - var/datum/browser/popup = new(user, "userticketsdetail", "Tickets", 1000, 600) + var/datum/browser/popup = new(user, "[ticket_system_name]userticketsdetail", ticket_system_name, 1000, 600) popup.set_content(dat) popup.open() @@ -326,6 +336,10 @@ UI STUFF to_chat(target, text) return TRUE +//Sends a message to the designated staff +/datum/controller/subsystem/tickets/proc/message_staff(var/msg, var/alt = FALSE) + message_adminTicket(msg, alt) + /datum/controller/subsystem/tickets/Topic(href, href_list) if(href_list["refresh"]) @@ -338,13 +352,13 @@ UI STUFF return if(href_list["showopen"]) - showUI(usr, ADMIN_TICKET_OPEN) + showUI(usr, TICKET_OPEN) return if(href_list["showresolved"]) - showUI(usr, ADMIN_TICKET_RESOLVED) + showUI(usr, TICKET_RESOLVED) return if(href_list["showclosed"]) - showUI(usr, ADMIN_TICKET_CLOSED) + showUI(usr, TICKET_CLOSED) return if(href_list["details"]) @@ -354,40 +368,46 @@ UI STUFF if(href_list["resolve"]) var/indexNum = text2num(href_list["resolve"]) - if(SStickets.resolveTicket(indexNum)) - message_adminTicket("[usr.client] / ([usr]) resolved admin ticket number [indexNum]") - to_chat_safe(returnClient(indexNum), "Your admin ticket has now been resolved.") + if(resolveTicket(indexNum)) + message_staff("[usr.client] / ([usr]) resolved [ticket_name] number [indexNum]") + to_chat_safe(returnClient(indexNum), "Your [ticket_name] has now been resolved.") showUI(usr) if(href_list["detailresolve"]) var/indexNum = text2num(href_list["detailresolve"]) - if(SStickets.resolveTicket(indexNum)) - message_adminTicket("[usr.client] / ([usr]) resolved admin ticket number [indexNum]") - to_chat_safe(returnClient(indexNum), "Your admin ticket has now been resolved.") + if(resolveTicket(indexNum)) + message_staff("[usr.client] / ([usr]) resolved [ticket_name] number [indexNum]") + to_chat_safe(returnClient(indexNum), "Your [ticket_name] has now been resolved.") showDetailUI(usr, indexNum) if(href_list["detailclose"]) var/indexNum = text2num(href_list["detailclose"]) + if(!check_rights(close_rights)) + to_chat(usr, "Not enough rights to close this ticket.") + return if(alert("Are you sure? This will send a negative message.",,"Yes","No") != "Yes") return - if(SStickets.closeTicket(indexNum)) - message_adminTicket("[usr.client] / ([usr]) closed admin ticket number [indexNum]") - to_chat_safe(returnClient(indexNum), list( - "- AdminHelp Rejected! -", - "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.", - "Your ticket has now been closed." - )) + if(closeTicket(indexNum)) + message_staff("[usr.client] / ([usr]) closed [ticket_name] number [indexNum]") + to_chat_safe(returnClient(indexNum), close_messages) showDetailUI(usr, indexNum) + if(href_list["detailreopen"]) var/indexNum = text2num(href_list["detailreopen"]) - if(SStickets.openTicket(indexNum)) - message_adminTicket("[usr.client] / ([usr]) re-opened admin ticket number [indexNum]") + if(openTicket(indexNum)) + message_staff("[usr.client] / ([usr]) re-opened [ticket_name] number [indexNum]") showDetailUI(usr, indexNum) - if(href_list["assignadmin"]) - var/indexNum = text2num(href_list["assignadmin"]) - if(SStickets.assignAdminToTicket(usr.client, indexNum)) - message_adminTicket("[usr.client] / ([usr]) has taken ticket number [indexNum]") - to_chat_safe(returnClient(indexNum), "Your ticket is being handled by [usr.client].") + if(href_list["assignstaff"]) + var/indexNum = text2num(href_list["assignstaff"]) + takeTicket(indexNum) showDetailUI(usr, indexNum) + +/datum/controller/subsystem/tickets/proc/takeTicket(var/index) + if(assignStaffToTicket(usr.client, index)) + if(span_class == "mentorhelp") + message_staff("[usr.client] / ([usr]) has taken [ticket_name] number [index]") + else + message_staff("[usr.client] / ([usr]) has taken [ticket_name] number [index]", TRUE) + to_chat_safe(returnClient(index), "Your [ticket_name] is being handled by [usr.client].") diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 3e7285a79bf..1b2938fc70f 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -71,7 +71,6 @@ SUBSYSTEM_DEF(timer) for(var/I in second_queue) log_world(get_timer_debug_string(I)) - var/cut_start_index = 1 var/next_clienttime_timer_index = 0 var/len = length(clienttime_timers) @@ -94,14 +93,14 @@ SUBSYSTEM_DEF(timer) if(ctime_timer.flags & TIMER_LOOP) ctime_timer.spent = 0 - clienttime_timers.Insert(ctime_timer, 1) - cut_start_index++ + ctime_timer.timeToRun = REALTIMEOFDAY + ctime_timer.wait + BINARY_INSERT(ctime_timer, clienttime_timers, datum/timedevent, timeToRun) else qdel(ctime_timer) if(next_clienttime_timer_index) - clienttime_timers.Cut(cut_start_index,next_clienttime_timer_index+1) + clienttime_timers.Cut(1, next_clienttime_timer_index+1) if(MC_TICK_CHECK) return @@ -269,7 +268,7 @@ SUBSYSTEM_DEF(timer) var/new_bucket_count var/i = 1 for(i in 1 to length(alltimers)) - var/datum/timedevent/timer = alltimers[1] + var/datum/timedevent/timer = alltimers[i] if(!timer) continue @@ -411,10 +410,8 @@ SUBSYSTEM_DEF(timer) prev.next = next next.prev = prev else - if(prev) - prev.next = null - if(next) - next.prev = null + prev?.next = null + next?.prev = null prev = next = null /datum/timedevent/proc/bucketJoin() @@ -521,4 +518,4 @@ SUBSYSTEM_DEF(timer) #undef BUCKET_LEN #undef BUCKET_POS #undef TIMER_MAX -#undef TIMER_ID_MAX +#undef TIMER_ID_MAX \ No newline at end of file diff --git a/code/controllers/voting.dm b/code/controllers/subsystem/vote.dm similarity index 85% rename from code/controllers/voting.dm rename to code/controllers/subsystem/vote.dm index e7ee6f743ca..27d499254a1 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/subsystem/vote.dm @@ -1,8 +1,9 @@ -var/datum/controller/vote/vote = new() +SUBSYSTEM_DEF(vote) + name = "Vote" + wait = 10 + flags = SS_KEEP_TIMING|SS_NO_INIT + runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT -var/global/list/round_voters = list() //Keeps track of the individuals voting for a given round, for use in forcedrafting. - -/datum/controller/vote var/initiator = null var/started_time = null var/time_remaining = 0 @@ -12,26 +13,13 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo var/list/voted = list() var/list/voting = list() var/list/current_votes = list() + var/list/round_voters = list() var/auto_muted = 0 -/datum/controller/vote/New() - if(vote != src) - if(istype(vote)) - qdel(vote) - vote = src - spawn(0) - while(!QDELETED(src)) - try - while(!QDELETED(src)) - sleep(10) - process() - catch(var/exception/e) - log_runtime(e, src, "Caught in vote controller") - -/datum/controller/vote/proc/process() +/datum/controller/subsystem/vote/fire() if(mode) // No more change mode votes after the game has started. - if(mode == "gamemode" && ticker.current_state >= GAME_STATE_SETTING_UP) + if(mode == "gamemode" && SSticker.current_state >= GAME_STATE_SETTING_UP) to_chat(world, "Voting aborted due to game start.") reset() return @@ -51,10 +39,10 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo update_panel(C) CHECK_TICK -/datum/controller/vote/proc/autotransfer() +/datum/controller/subsystem/vote/proc/autotransfer() initiate_vote("crew_transfer","the server") -/datum/controller/vote/proc/reset() +/datum/controller/subsystem/vote/proc/reset() initiator = null time_remaining = 0 mode = null @@ -72,7 +60,7 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo message_admins("OOC has been toggled on automatically.") -/datum/controller/vote/proc/get_result() +/datum/controller/subsystem/vote/proc/get_result() var/greatest_votes = 0 var/total_votes = 0 var/list/sorted_choices = list() @@ -132,12 +120,12 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo . += option return . -/datum/controller/vote/proc/announce_result() +/datum/controller/subsystem/vote/proc/announce_result() var/list/winners = get_result() var/text if(winners.len > 0) if(winners.len > 1) - if(mode != "gamemode" || ticker.hide_mode == 0) // Here we are making sure we don't announce potential game modes + if(mode != "gamemode" || SSticker.hide_mode == 0) // Here we are making sure we don't announce potential game modes text = "Vote Tied Between:\n" for(var/option in winners) text += "\t[option]\n" @@ -146,7 +134,7 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo for(var/key in current_votes) if(choices[current_votes[key]] == .) round_voters += key // Keep track of who voted for the winning round. - if(mode == "gamemode" && (. == "extended" || ticker.hide_mode == 0)) // Announce Extended gamemode, but not other gamemodes + if(mode == "gamemode" && (. == "extended" || SSticker.hide_mode == 0)) // Announce Extended gamemode, but not other gamemodes text += "Vote Result: [.] ([choices[.]] vote\s)" else if(mode == "custom") @@ -167,7 +155,7 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo to_chat(world, "[text]") return . -/datum/controller/vote/proc/result() +/datum/controller/subsystem/vote/proc/result() . = announce_result() var/restart = 0 if(.) @@ -178,7 +166,7 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo if("gamemode") if(master_mode != .) world.save_mode(.) - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) restart = 1 else master_mode = . @@ -195,7 +183,7 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo return . -/datum/controller/vote/proc/submit_vote(var/ckey, var/vote) +/datum/controller/subsystem/vote/proc/submit_vote(var/ckey, var/vote) if(mode) if(config.vote_no_dead && usr.stat == DEAD && !usr.client.holder) return 0 @@ -208,7 +196,7 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo return vote return 0 -/datum/controller/vote/proc/initiate_vote(var/vote_type, var/initiator_key) +/datum/controller/subsystem/vote/proc/initiate_vote(var/vote_type, var/initiator_key) if(!mode) if(started_time != null && !check_rights(R_ADMIN)) var/next_allowed_time = (started_time + config.vote_delay) @@ -220,17 +208,17 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo if("restart") choices.Add("Restart Round","Continue Playing") if("gamemode") - if(ticker.current_state >= 2) + if(SSticker.current_state >= 2) return 0 choices.Add(config.votable_modes) if("crew_transfer") if(check_rights(R_ADMIN|R_MOD)) - if(ticker.current_state <= 2) + if(SSticker.current_state <= 2) return 0 question = "End the shift?" choices.Add("Initiate Crew Transfer", "Continue The Round") else - if(ticker.current_state <= 2) + if(SSticker.current_state <= 2) return 0 question = "End the shift?" choices.Add("Initiate Crew Transfer", "Continue The Round") @@ -291,7 +279,7 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo return 1 return 0 -/datum/controller/vote/proc/browse_to(var/client/C) +/datum/controller/subsystem/vote/proc/browse_to(var/client/C) if(!C) return var/admin = check_rights(R_ADMIN, 0, user = C.mob) @@ -341,10 +329,10 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo popup.set_content(dat) popup.open() -/datum/controller/vote/proc/update_panel(var/client/C) +/datum/controller/subsystem/vote/proc/update_panel(var/client/C) C << output(url_encode(vote_html(C)), "vote.browser:update_vote_div") -/datum/controller/vote/proc/vote_html(var/client/C) +/datum/controller/subsystem/vote/proc/vote_html(var/client/C) . = "" if(question) . += "

Vote: '[question]'

" @@ -363,7 +351,7 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo . += "" -/datum/controller/vote/Topic(href,href_list[],hsrc) +/datum/controller/subsystem/vote/Topic(href,href_list[],hsrc) if(!usr || !usr.client) return //not necessary but meh...just in-case somebody does something stupid var/admin = check_rights(R_ADMIN,0) @@ -409,5 +397,5 @@ var/global/list/round_voters = list() //Keeps track of the individuals voting fo set category = "OOC" set name = "Vote" - if(vote) - vote.browse_to(client) + if(SSvote) + SSvote.browse_to(client) diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 3619fca430f..4b898df0f11 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -45,7 +45,7 @@ SUBSYSTEM_DEF(weather) for(var/z in levels_by_trait(target_trait)) LAZYINITLIST(eligible_zlevels["[z]"]) eligible_zlevels["[z]"][W] = probability - ..() + return ..() /datum/controller/subsystem/weather/proc/run_weather(datum/weather/weather_datum_type, z_levels) if(istext(weather_datum_type)) diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 88c4f9f4ea9..f694b6d2e75 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -2,57 +2,52 @@ //TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done -/client/proc/restart_controller(controller in list("Master","Failsafe")) +/client/proc/restart_controller(controller in list("Master", "Failsafe")) set category = "Debug" set name = "Restart Controller" set desc = "Restart one of the various periodic loop controllers for the game (be careful!)" - if(!holder) return - usr = null - src = null + if(!holder) + return switch(controller) + if("Master") + Recreate_MC() + feedback_add_details("admin_verb","RMaster") if("Failsafe") new /datum/controller/failsafe() feedback_add_details("admin_verb","RFailsafe") - message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.") - return -/client/proc/debug_controller(controller in list("Master", - "failsafe","Scheduler","StonedMaster","Ticker","Air","Jobs","Sun","Radio","Configuration","pAI", - "Cameras","Garbage", "Transfer Controller","Event","Alarm","Nano","Vote","Fires", - "Mob","NPC AI","Shuttle","Timer","Weather","Space","Mob Hunt Server")) + message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.") + +/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","Input")) set category = "Debug" set name = "Debug Controller" set desc = "Debug the various periodic loop controllers for the game (be careful!)" if(!holder) return switch(controller) - if("Master") - debug_variables(master_controller) - feedback_add_details("admin_verb","DMC") if("failsafe") debug_variables(Failsafe) feedback_add_details("admin_verb", "dfailsafe") - if("Scheduler") - debug_variables(processScheduler) - feedback_add_details("admin_verb","DprocessScheduler") - if("StonedMaster") + if("Master") debug_variables(Master) feedback_add_details("admin_verb","Dsmc") if("Ticker") - debug_variables(ticker) + debug_variables(SSticker) feedback_add_details("admin_verb","DTicker") if("Air") debug_variables(SSair) feedback_add_details("admin_verb","DAir") if("Jobs") - debug_variables(job_master) + debug_variables(SSjobs) feedback_add_details("admin_verb","DJobs") if("Sun") debug_variables(SSsun) feedback_add_details("admin_verb","DSun") if("Radio") - debug_variables(radio_controller) + debug_variables(SSradio) feedback_add_details("admin_verb","DRadio") if("Configuration") debug_variables(config) @@ -63,20 +58,20 @@ if("Cameras") debug_variables(cameranet) feedback_add_details("admin_verb","DCameras") - if("Event") - debug_variables(event_manager) - feedback_add_details("admin_verb","DEvent") - if("Alarm") - debug_variables(alarm_manager) - feedback_add_details("admin_verb", "DAlarm") if("Garbage") debug_variables(SSgarbage) feedback_add_details("admin_verb","DGarbage") + if("Event") + debug_variables(SSevents) + feedback_add_details("admin_verb","DEvent") + if("Alarm") + debug_variables(SSalarms) + feedback_add_details("admin_verb", "DAlarm") if("Nano") debug_variables(SSnanoui) feedback_add_details("admin_verb","DNano") if("Vote") - debug_variables(vote) + debug_variables(SSvote) feedback_add_details("admin_verb","DVote") if("Fires") debug_variables(SSfires) @@ -84,9 +79,9 @@ if("Mob") debug_variables(SSmobs) feedback_add_details("admin_verb","DMob") - if("NPC AI") - debug_variables(SSnpcai) - feedback_add_details("admin_verb","DNPCAI") + if("NPC Pool") + debug_variables(SSnpcpool) + feedback_add_details("admin_verb","DNPCPool") if("Shuttle") debug_variables(SSshuttle) feedback_add_details("admin_verb","DShuttle") @@ -102,6 +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.") - return + 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 31b62e868dc..a5f63cc6fe4 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -23,6 +23,8 @@ button = new button.linked_action = src button.name = name + if(desc) + button.desc = desc /datum/action/Destroy() if(owner) @@ -41,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) @@ -50,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() @@ -82,6 +86,7 @@ if(button) button.icon = button_icon button.icon_state = background_icon_state + button.desc = desc ApplyIcon(button) @@ -104,6 +109,7 @@ /datum/action/item_action check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS var/use_itemicon = TRUE + /datum/action/item_action/New(Target, custom_icon, custom_icon_state) ..() var/obj/item/I = target @@ -133,9 +139,10 @@ var/obj/item/I = target var/old_layer = I.layer var/old_plane = I.plane - I.layer = HUD_LAYER_SCREEN + 1 - I.plane = HUD_PLANE - current_button.overlays += I + I.layer = FLOAT_LAYER //AAAH + I.plane = FLOAT_PLANE //^ what that guy said + current_button.cut_overlays() + current_button.add_overlay(I) I.layer = old_layer I.plane = old_plane else @@ -381,6 +388,13 @@ /datum/action/item_action/remove_badge name = "Remove Holobadge" +// Jump boots +/datum/action/item_action/bhop + name = "Activate Jump Boots" + desc = "Activates the jump boot's internal propulsion system, allowing the user to dash over 4-wide gaps." + icon_icon = 'icons/mob/actions/actions.dmi' + button_icon_state = "jetboot" + ///prset for organ actions /datum/action/item_action/organ_action check_flags = AB_CHECK_CONSCIOUS @@ -403,6 +417,19 @@ name = "Use [target.name]" button.name = name +/datum/action/item_action/voice_changer/toggle + name = "Toggle Voice Changer" + +/datum/action/item_action/voice_changer/voice + name = "Set Voice" + +/datum/action/item_action/voice_changer/voice/Trigger() + if(!IsAvailable()) + return FALSE + + var/obj/item/voice_changer/V = target + V.set_voice(usr) + // for clothing accessories like holsters /datum/action/item_action/accessory check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS @@ -434,6 +461,7 @@ var/obj/effect/proc_holder/spell/S = target S.action = src name = S.name + desc = S.desc button_icon = S.action_icon button_icon_state = S.action_icon_state background_icon_state = S.action_background_icon_state 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/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm index a4b3ee21c56..662b0958d5c 100644 --- a/code/datums/cache/air_alarm.dm +++ b/code/datums/cache/air_alarm.dm @@ -11,17 +11,18 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new() if(!refresh) return cache_entry.data - if(ticker && ticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time + if(SSticker && SSticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time alarms = cache_entry.data // Don't deleate the list - if(is_station_contact(passed_alarm.z)) // Still need sanity checks + if(is_station_contact(passed_alarm.z) && passed_alarm.remote_control) // Still need sanity checks alarms[++alarms.len] = passed_alarm.get_nano_data_console() else for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : GLOB.air_alarms)) // Generating the whole list again is a bad habit but I can't be bothered to fix it right now if(!monitored_alarms && !is_station_contact(alarm.z)) continue + if(!alarm.remote_control) + continue alarms[++alarms.len] = alarm.get_nano_data_console() - cache_entry.timestamp = world.time //+ 10 SECONDS cache_entry.data = alarms return alarms diff --git a/code/datums/cache/cache.dm b/code/datums/cache/cache.dm index 2502bb871b2..f401e54517a 100644 --- a/code/datums/cache/cache.dm +++ b/code/datums/cache/cache.dm @@ -1,6 +1,6 @@ /datum/cache_entry var/timestamp - var/data - + var/list/data = list() + /datum/repository var/cache_data \ No newline at end of file diff --git a/code/datums/cache/powermonitor.dm b/code/datums/cache/powermonitor.dm index 5867aa5b904..5112d58ad29 100644 --- a/code/datums/cache/powermonitor.dm +++ b/code/datums/cache/powermonitor.dm @@ -12,7 +12,7 @@ var/global/datum/repository/powermonitor/powermonitor_repository = new() return cache_entry.data for(var/obj/machinery/computer/monitor/pMon in GLOB.power_monitors) - if( !(pMon.stat & (NOPOWER|BROKEN)) ) + if( !(pMon.stat & (NOPOWER|BROKEN)) && !pMon.is_secret_monitor ) pMonData[++pMonData.len] = list ("Name" = pMon.name, "ref" = "\ref[pMon]") cache_entry.timestamp = world.time //+ 30 SECONDS diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 580d397c225..7b3b2ec503a 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -2,6 +2,10 @@ var/dupe_mode = COMPONENT_DUPE_HIGHLANDER var/dupe_type var/datum/parent + //only set to true if you are able to properly transfer this component + //At a minimum RegisterWithParent and UnregisterFromParent should be used + //Make sure you also implement PostTransfer for any post transfer handling + var/can_transfer = FALSE /datum/component/New(datum/P, ...) parent = P @@ -154,7 +158,7 @@ return /datum/component/proc/PostTransfer() - return + return COMPONENT_INCOMPATIBLE //Do not support transfer by default as you must properly support it /datum/component/proc/_GetInverseTypeList(our_type = type) //we can do this one simple trick @@ -281,10 +285,13 @@ if(target.parent) target.RemoveComponent() target.parent = src - if(target.PostTransfer() == COMPONENT_INCOMPATIBLE) - var/c_type = target.type - qdel(target) - CRASH("Incompatible [c_type] transfer attempt to a [type]!") + var/result = target.PostTransfer() + switch(result) + if(COMPONENT_INCOMPATIBLE) + var/c_type = target.type + qdel(target) + CRASH("Incompatible [c_type] transfer attempt to a [type]!") + if(target == AddComponent(target)) target._JoinParent() @@ -294,10 +301,13 @@ return var/comps = dc[/datum/component] if(islist(comps)) - for(var/I in comps) - target.TakeComponent(I) + for(var/datum/component/I in comps) + if(I.can_transfer) + target.TakeComponent(I) else - target.TakeComponent(comps) + var/datum/component/C = comps + if(C.can_transfer) + target.TakeComponent(comps) /datum/component/nano_host() return parent \ No newline at end of file diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm new file mode 100644 index 00000000000..bdc1d3a2f6f --- /dev/null +++ b/code/datums/components/decal.dm @@ -0,0 +1,75 @@ +/datum/component/decal + dupe_mode = COMPONENT_DUPE_ALLOWED + can_transfer = TRUE + var/cleanable + var/description + var/mutable_appearance/pic + + var/first_dir // This only stores the dir arg from init + +/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_GOD, _color, _layer=TURF_LAYER, _description, _alpha=255) + if(!isatom(parent) || !generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha)) + return COMPONENT_INCOMPATIBLE + first_dir = _dir + description = _description + cleanable = _cleanable + + apply() + +/datum/component/decal/RegisterWithParent() + if(first_dir) + RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react) + if(cleanable) + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react) + if(description) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) + +/datum/component/decal/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE)) + +/datum/component/decal/Destroy() + remove() + return ..() + +/datum/component/decal/PreTransfer() + remove() + +/datum/component/decal/PostTransfer() + remove() + apply() + +/datum/component/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha) + if(!_icon || !_icon_state) + return FALSE + // It has to be made from an image or dir breaks because of a byond bug + var/temp_image = image(_icon, null, _icon_state, _layer, _dir) + pic = new(temp_image) + pic.color = _color + pic.alpha = _alpha + return TRUE + +/datum/component/decal/proc/apply(atom/thing) + var/atom/master = thing || parent + master.add_overlay(pic, TRUE) + if(isitem(master)) + addtimer(CALLBACK(master, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) + +/datum/component/decal/proc/remove(atom/thing) + var/atom/master = thing || parent + master.cut_overlay(pic, TRUE) + if(isitem(master)) + addtimer(CALLBACK(master, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) + +/datum/component/decal/proc/rotate_react(datum/source, old_dir, new_dir) + if(old_dir == new_dir) + return + remove() + pic.dir = turn(pic.dir, dir2angle(old_dir) - dir2angle(new_dir)) + apply() + +/datum/component/decal/proc/clean_react(datum/source, strength) + if(strength >= cleanable) + qdel(src) + +/datum/component/decal/proc/examine(datum/source, mob/user) + to_chat(user, description) \ No newline at end of file diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index 3fe88f7d0e9..e5b948f4f26 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -1,5 +1,3 @@ -// Squeak component ported over from tg - /datum/component/squeak var/static/list/default_squeak_sounds = list('sound/items/toysqueak1.ogg'=1, 'sound/items/toysqueak2.ogg'=1, 'sound/items/toysqueak3.ogg'=1) var/list/override_squeak_sounds @@ -49,21 +47,12 @@ else playsound(parent, pickweight(override_squeak_sounds), volume, 1, -1) -/datum/component/squeak/proc/step_squeak(datum/source, mob/living/carbon/human/H) - if(H.m_intent == MOVE_INTENT_RUN) - if(steps > step_delay) - play_squeak() - steps = 0 - else - steps++ - else +/datum/component/squeak/proc/step_squeak() + if(steps > step_delay) play_squeak() - -/datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot) - RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE) - -/datum/component/squeak/proc/on_drop(datum/source, mob/user) - UnregisterSignal(user, COMSIG_MOVABLE_DISPOSING) + steps = 0 + else + steps++ /datum/component/squeak/proc/play_squeak_crossed(atom/movable/AM) if(isitem(AM)) @@ -83,6 +72,13 @@ last_use = world.time play_squeak() +/datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot) + RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE) + +/datum/component/squeak/proc/on_drop(datum/source, mob/user) + UnregisterSignal(user, COMSIG_MOVABLE_DISPOSING) + +// Disposal pipes related shit /datum/component/squeak/proc/disposing_react(datum/source, obj/structure/disposalholder/holder, obj/machinery/disposal/source) //We don't need to worry about unregistering this signal as it will happen for us automaticaly when the holder is qdeleted RegisterSignal(holder, COMSIG_ATOM_DIR_CHANGE, .proc/holder_dir_change) diff --git a/code/datums/components/waddling.dm b/code/datums/components/waddling.dm new file mode 100644 index 00000000000..a1f538e4dd7 --- /dev/null +++ b/code/datums/components/waddling.dm @@ -0,0 +1,15 @@ +/datum/component/waddling + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + +/datum/component/waddling/Initialize() + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Waddle) + +/datum/component/waddling/proc/Waddle() + var/mob/living/L = parent + if(L.incapacitated() || L.lying) + return + animate(L, pixel_z = 4, time = 0) + animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2) + animate(pixel_z = 0, transform = matrix(), time = 0) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 05f430136f0..b7d687d090b 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -624,7 +624,7 @@ var/record_id_num = 1001 clothes_s = new /icon('icons/mob/uniform.dmi', "syndicate_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) clothes_s.Blend(new /icon('icons/mob/hands.dmi', "swat_gl"), ICON_UNDERLAY) - else if(H.mind.assigned_role in get_all_centcom_jobs()) + else if(H.mind && H.mind.assigned_role in get_all_centcom_jobs()) clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) else 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 674557bc839..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()]" @@ -621,6 +621,33 @@ src.give_spell(M) href_list["datumrefresh"] = href_list["give_spell"] + else if(href_list["givemartialart"]) + if(!check_rights(R_SERVER|R_EVENT)) return + + var/mob/living/carbon/C = locateUID(href_list["givemartialart"]) + if(!istype(C)) + to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + return + + var/list/artpaths = subtypesof(/datum/martial_art) + var/list/artnames = list() + for(var/i in artpaths) + var/datum/martial_art/M = i + artnames[initial(M.name)] = M + + var/result = input(usr, "Choose the martial art to teach", "JUDO CHOP") as null|anything in artnames + if(!usr) + return + if(QDELETED(C)) + to_chat(usr, "Mob doesn't exist anymore") + return + + if(result) + var/chosenart = artnames[result] + var/datum/martial_art/MA = new chosenart + MA.teach(C) + + href_list["datumrefresh"] = href_list["givemartialart"] else if(href_list["give_disease"]) if(!check_rights(R_SERVER|R_EVENT)) return @@ -992,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 @@ -1215,13 +1232,28 @@ return switch(Text) - if("brute") L.adjustBruteLoss(amount, robotic=1) - if("fire") L.adjustFireLoss(amount, robotic=1) - if("toxin") L.adjustToxLoss(amount) - if("oxygen")L.adjustOxyLoss(amount) - if("brain") L.adjustBrainLoss(amount) - if("clone") L.adjustCloneLoss(amount) - if("stamina") L.adjustStaminaLoss(amount) + if("brute") + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.adjustBruteLoss(amount, robotic = TRUE) + else + L.adjustBruteLoss(amount) + if("fire") + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.adjustFireLoss(amount, robotic = TRUE) + else + L.adjustFireLoss(amount) + if("toxin") + L.adjustToxLoss(amount) + if("oxygen") + L.adjustOxyLoss(amount) + if("brain") + L.adjustBrainLoss(amount) + if("clone") + L.adjustCloneLoss(amount) + if("stamina") + L.adjustStaminaLoss(amount) else to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") return diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm index 1466bc86459..b88f04d1eea 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -45,13 +45,13 @@ Bonus return /datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A) - var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*2))-(sqrtor0(16+A.totalStealth())) + var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 2)) - (sqrtor0(16 + A.totalStealth())), 1) M.adjust_fire_stacks(get_stacks) - M.adjustFireLoss(get_stacks/2) + M.adjustFireLoss(get_stacks * 0.5) return 1 /datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A) - var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*3))-(sqrtor0(16+A.totalStealth())) + var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 3))-(sqrtor0(16 + A.totalStealth())), 1) M.adjust_fire_stacks(get_stacks) M.adjustFireLoss(get_stacks) - return 1 \ No newline at end of file + return 1 diff --git a/code/datums/diseases/critical.dm b/code/datums/diseases/critical.dm new file mode 100644 index 00000000000..37d77687d8c --- /dev/null +++ b/code/datums/diseases/critical.dm @@ -0,0 +1,136 @@ +/datum/disease/critical + +/datum/disease/critical/stage_act() //overriden to ensure unique behavior + stage = min(stage, max_stages) + + if(prob(stage_prob)) + stage = min(stage + 1, max_stages) + + for(var/C_id in cures) + if(affected_mob.reagents.has_reagent(C_id)) + if(prob(cure_chance)) + cure() + return FALSE + return TRUE + +/datum/disease/critical/shock + name = "Shock" + form = "Medical Emergency" + spread_text = "The patient is in shock" + max_stages = 3 + spread_flags = SPECIAL + cure_text = "Saline-Glucose Solution" + cures = list("salglu_solution") + cure_chance = 10 + viable_mobtypes = list(/mob/living/carbon/human) + stage_prob = 6 + severity = DANGEROUS + disease_flags = CURABLE + bypasses_immunity = TRUE + virus_heal_resistant = TRUE + +/datum/disease/critical/shock/stage_act() + if(..()) + if(affected_mob.health >= 25) + to_chat(affected_mob, "You feel better.") + cure() + return + switch(stage) + if(1) + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(8)) + affected_mob.emote(pick("shiver", "pale", "moan")) + if(prob(5)) + to_chat(affected_mob, "You feel weak!") + if(2) + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(8)) + affected_mob.emote(pick("shiver", "pale", "moan", "shudder", "tremble")) + if(prob(5)) + to_chat(affected_mob, "You feel absolutely terrible!") + if(prob(5)) + affected_mob.emote("faint", "collapse", "groan") + if(3) + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(8)) + affected_mob.emote(pick("shudder", "pale", "tremble", "groan", "bshake")) + if(prob(5)) + to_chat(affected_mob, "You feel horrible!") + if(prob(5)) + affected_mob.emote(pick("faint", "collapse", "groan")) + if(prob(7)) + to_chat(affected_mob, "You can't breathe!") + affected_mob.AdjustLoseBreath(1) + if(prob(5)) + var/datum/disease/D = new /datum/disease/critical/heart_failure + affected_mob.ForceContractDisease(D) + +/datum/disease/critical/heart_failure + name = "Cardiac Failure" + form = "Medical Emergency" + spread_text = "The patient is having a cardiac emergency" + max_stages = 3 + spread_flags = SPECIAL + cure_text = "Atropine or Epinephrine" + cures = list("atropine", "epinephrine") + cure_chance = 10 + needs_all_cures = FALSE + viable_mobtypes = list(/mob/living/carbon/human) + stage_prob = 5 + severity = DANGEROUS + disease_flags = CURABLE + required_organs = list(/obj/item/organ/internal/heart) + bypasses_immunity = TRUE + virus_heal_resistant = TRUE + +/datum/disease/critical/heart_failure/has_cure() + if(affected_mob.has_status_effect(STATUS_EFFECT_EXERCISED)) + return TRUE + + return ..() + +/datum/disease/critical/heart_failure/stage_act() + if(..()) + switch(stage) + if(1) + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(8)) + affected_mob.emote(pick("pale", "shudder")) + if(prob(5)) + to_chat(affected_mob, "Your arm hurts!") + else if(prob(5)) + to_chat(affected_mob, "Your chest hurts!") + if(2) + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(8)) + affected_mob.emote(pick("pale", "groan")) + if(prob(5)) + to_chat(affected_mob, "Your heart lurches in your chest!") + affected_mob.AdjustLoseBreath(1) + if(prob(3)) + to_chat(affected_mob, "Your heart stops beating!") + affected_mob.AdjustLoseBreath(3) + if(prob(5)) + affected_mob.emote(pick("faint", "collapse", "groan")) + if(3) + affected_mob.adjustOxyLoss(1) + if(prob(8)) + affected_mob.emote(pick("twitch", "gasp")) + if(prob(5) && ishuman(affected_mob)) + var/mob/living/carbon/human/H = affected_mob + H.set_heartattack(TRUE) \ No newline at end of file diff --git a/code/datums/diseases/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm index 79a3801ce10..2e7d083455b 100644 --- a/code/datums/diseases/food_poisoning.dm +++ b/code/datums/diseases/food_poisoning.dm @@ -14,20 +14,13 @@ disease_flags = CURABLE spread_flags = NON_CONTAGIOUS virus_heal_resistant = TRUE - var/remissive = 0 /datum/disease/food_poisoning/stage_act() - if(!remissive) - ..() + ..() if(affected_mob.sleeping && prob(33)) to_chat(affected_mob, "You feel better.") - remissive = 1 - if(remissive) - if(prob(stage_prob)) - stage-- - if(stage == 0) - cure() - return + cure() + return switch(stage) if(1) if(prob(5)) diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index 371f38238a1..19d4c287427 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -34,7 +34,7 @@ if(5) to_chat(affected_mob, "Your body feels as if it's trying to rip itself open...") if(prob(50)) - affected_mob.gib() + affected_mob.delayed_gib() else return diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index 7a7571999cf..35cc970aa67 100644 --- a/code/datums/gas_mixture.dm +++ b/code/datums/gas_mixture.dm @@ -203,6 +203,10 @@ What are the archived variables for? /datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample) //Copies variables from sample +/datum/gas_mixture/proc/copy_from_turf(turf/model) + //Copies all gas info from the turf into the gas list along with temperature + //Returns: 1 if we are mutable, 0 otherwise + /datum/gas_mixture/proc/share(datum/gas_mixture/sharer) //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length //Return: amount of gas exchanged (+ if sharer received) @@ -343,6 +347,19 @@ What are the archived variables for? return 1 +/datum/gas_mixture/copy_from_turf(turf/model) + oxygen = model.oxygen + carbon_dioxide = model.carbon_dioxide + nitrogen = model.nitrogen + toxins = model.toxins + + //acounts for changes in temperature + var/turf/model_parent = model.parent_type + if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature)) + temperature = model.temperature + + return 1 + /datum/gas_mixture/check_turf(turf/model, atmos_adjacent_turfs = 4) var/delta_oxygen = (oxygen_archived - model.oxygen)/(atmos_adjacent_turfs+1) var/delta_carbon_dioxide = (carbon_dioxide_archived - model.carbon_dioxide)/(atmos_adjacent_turfs+1) diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm index fdba9542412..e3d14743fe1 100644 --- a/code/datums/helper_datums/global_iterator.dm +++ b/code/datums/helper_datums/global_iterator.dm @@ -109,7 +109,7 @@ Data storage vars: CRASH("The global_iterator loop \ref[src] failed to terminate in designated timeframe. This may be caused by server lagging.") return 1 -/datum/global_iterator/proc/process() +/datum/global_iterator/process() return /datum/global_iterator/proc/active() diff --git a/code/datums/helper_datums/input.dm b/code/datums/helper_datums/input.dm new file mode 100644 index 00000000000..4c3dc6a1cf4 --- /dev/null +++ b/code/datums/helper_datums/input.dm @@ -0,0 +1,189 @@ +/proc/input_async(mob/user=usr, prompt, list/choices) + 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, "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", 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 + +// 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() + var/dat = "
" + dat += render_prompt() + dat += render_choices() + dat += "
" + dat += "
" + dat += render_buttons() + dat += "
" + return dat + +/datum/async_input/proc/render_prompt() + return "

[prompt]

" + +/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/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]" + +/datum/async_input/Topic(href, href_list) + if(href_list["submit"] || href_list["close"]) + close() + return + + if(href_list["choice"]) + result = href_list["choice"] + show() + return + +/datum/async_input/ranked + height = 400 + immediate_submit = TRUE + +/datum/async_input/ranked/New() + ..() + popup.add_script("rankedInput.js", 'html/browser/rankedInput.js') + popup.add_head_content("Drag and drop or use the buttons to reorder") + +/datum/async_input/ranked/render_choices() + var/dat = "
" + dat += "" + for(var/i = 1, i <= choices.len, i++) + var/choice = choices[i] + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
[button("+", i != 1 ? "upvote=[i]" : "", , i == 1)][button("-", i != choices.len ? "downvote=[i]" : "", , i == choices.len)][i]. [choice]
" + dat += "
" + return dat + +/datum/async_input/ranked/Topic(href, href_list) + if(!href_list["close"]) + // Mark that user interacted with interface + result = choices + + if(href_list["upvote"]) + var/index = text2num(href_list["upvote"]) + choices.Swap(index, index - 1) + show() + return + + if(href_list["downvote"]) + var/index = text2num(href_list["downvote"]) + choices.Swap(index, index + 1) + show() + return + + if(href_list["cut"] && href_list["insert"]) + var/cut = text2num(href_list["cut"]) + var/insert = text2num(href_list["insert"]) + var/choice = choices[cut] + choices.Cut(cut, cut + 1) + choices.Insert(insert, choice) + 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/helper_datums/map_template.dm b/code/datums/helper_datums/map_template.dm index 0352c932a5a..92f6e7f360a 100644 --- a/code/datums/helper_datums/map_template.dm +++ b/code/datums/helper_datums/map_template.dm @@ -123,7 +123,7 @@ banned = generateMapList("config/spaceRuinBlacklist.txt") else banned = generateMapList("config/example/spaceRuinBlacklist.txt") - //banned += generateMapList("config/lavaRuinBlacklist.txt") + banned += generateMapList("config/lavaRuinBlacklist.txt") for(var/item in subtypesof(/datum/map_template/ruin)) var/datum/map_template/ruin/ruin_type = item @@ -138,10 +138,8 @@ map_templates[R.name] = R ruins_templates[R.name] = R - /* if(istype(R, /datum/map_template/ruin/lavaland)) lava_ruins_templates[R.name] = R - */ if(istype(R, /datum/map_template/ruin/space)) space_ruins_templates[R.name] = R diff --git a/code/datums/hud.dm b/code/datums/hud.dm index ac3249f9c5f..365a4309413 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -10,7 +10,6 @@ var/datum/atom_hud/huds = list( \ DATA_HUD_DIAGNOSTIC = new/datum/atom_hud/data/diagnostic(), \ DATA_HUD_DIAGNOSTIC_ADVANCED = new/datum/atom_hud/data/diagnostic/advanced(), \ DATA_HUD_HYDROPONIC = new/datum/atom_hud/data/hydroponic(), \ - GAME_HUD_NATIONS = new/datum/atom_hud/antag(), \ ANTAG_HUD_CULT = new/datum/atom_hud/antag(), \ ANTAG_HUD_REV = new/datum/atom_hud/antag(), \ ANTAG_HUD_OPS = new/datum/atom_hud/antag(), \ @@ -23,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 @@ -94,8 +94,8 @@ var/datum/atom_hud/huds = list( \ // gang_huds += G.ganghud var/serv_huds = list()//mindslaves and/or vampire thralls - if(ticker.mode) - for(var/datum/mindslaves/serv in (ticker.mode.vampires | ticker.mode.traitors)) + if(SSticker.mode) + for(var/datum/mindslaves/serv in (SSticker.mode.vampires | SSticker.mode.traitors)) serv_huds += serv.thrallhud diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0658c81d90f..0ab0453cb95 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -29,6 +29,7 @@ var/memory var/assigned_role //assigned role is what job you're assigned to when you join the station. + var/playtime_role //if set, overrides your assigned_role for the purpose of playtime awards. Set by IDcomputer when your ID is changed. var/special_role //special roles are typically reserved for antags or roles like ERT. If you want to avoid a character being automatically announced by the AI, on arrival (becuase they're an off station character or something); ensure that special_role and assigned_role are equal. var/offstation_role = FALSE //set to true for ERT, deathsquad, abductors, etc, that can go from and to z2 at will and shouldn't be antag targets var/list/restricted_roles = list() @@ -41,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 @@ -51,7 +53,6 @@ var/datum/changeling/changeling //changeling holder var/linglink var/datum/vampire/vampire //vampire holder - var/datum/nations/nation //nation holder var/datum/abductor/abductor //abductor holder var/datum/devilinfo/devilinfo //devil holder @@ -84,7 +85,7 @@ soulOwner = src /datum/mind/Destroy() - ticker.minds -= src + SSticker.minds -= src if(islist(antag_datums)) for(var/i in antag_datums) var/datum/antagonist/antag_datum = i @@ -163,7 +164,7 @@ /datum/mind/proc/_memory_edit_header(gamemode, list/alt) . = gamemode - if(ticker.mode.config_tag == gamemode || (LAZYLEN(alt) && (ticker.mode.config_tag in alt))) + if(SSticker.mode.config_tag == gamemode || (LAZYLEN(alt) && (SSticker.mode.config_tag in alt))) . = uppertext(.) . = "[.]: " @@ -183,7 +184,7 @@ . = _memory_edit_header("revolution") if(ismindshielded(H)) . += "NO|headrev|rev" - else if(src in ticker.mode.head_revolutionaries) + else if(src in SSticker.mode.head_revolutionaries) . += "no|HEADREV|rev" . += "
Flash: give" @@ -200,7 +201,7 @@ . += " Reequip (gives traitor uplink)." if(objectives.len==0) . += "
Objectives are empty! Set to kill all heads." - else if(src in ticker.mode.revolutionaries) + else if(src in SSticker.mode.revolutionaries) . += "no|headrev|REV" else . += "NO|headrev|rev" @@ -211,7 +212,7 @@ . = _memory_edit_header("cult") if(ismindshielded(H)) . += "NO|cultist" - else if(src in ticker.mode.cult) + else if(src in SSticker.mode.cult) . += "no|CULTIST" . += "
Give tome|equip." else @@ -221,7 +222,7 @@ /datum/mind/proc/memory_edit_wizard(mob/living/carbon/human/H) . = _memory_edit_header("wizard") - if(src in ticker.mode.wizards) + if(src in SSticker.mode.wizards) . += "WIZARD|no" . += "
To lair, undress, dress up, let choose name." if(objectives.len==0) @@ -233,7 +234,7 @@ /datum/mind/proc/memory_edit_changeling(mob/living/carbon/human/H) . = _memory_edit_header("changeling", list("traitorchan")) - if(src in ticker.mode.changelings) + if(src in SSticker.mode.changelings) . += "CHANGELING|no" if(objectives.len==0) . += "
Objectives are empty! Randomize!" @@ -246,7 +247,7 @@ /datum/mind/proc/memory_edit_vampire(mob/living/carbon/human/H) . = _memory_edit_header("vampire", list("traitorvamp")) - if(src in ticker.mode.vampires) + if(src in SSticker.mode.vampires) . += "VAMPIRE|no" if(objectives.len==0) . += "
Objectives are empty! Randomize!" @@ -256,14 +257,14 @@ . += _memory_edit_role_enabled(ROLE_VAMPIRE) /** Enthralled ***/ . += "
enthralled: " - if(src in ticker.mode.vampire_enthralled) + if(src in SSticker.mode.vampire_enthralled) . += "THRALL|no" else . += "thrall|NO" /datum/mind/proc/memory_edit_nuclear(mob/living/carbon/human/H) . = _memory_edit_header("nuclear") - if(src in ticker.mode.syndicates) + if(src in SSticker.mode.syndicates) . += "OPERATIVE|no" . += "
To shuttle, undress, dress up." var/code @@ -280,9 +281,9 @@ /datum/mind/proc/memory_edit_shadowling(mob/living/carbon/human/H) . = _memory_edit_header("shadowling") - if(src in ticker.mode.shadows) + if(src in SSticker.mode.shadows) . += "SHADOWLING|thrall|no" - else if(src in ticker.mode.shadowling_thralls) + else if(src in SSticker.mode.shadowling_thralls) . += "Shadowling|THRALL|no" else . += "shadowling|thrall|NO" @@ -291,7 +292,7 @@ /datum/mind/proc/memory_edit_abductor(mob/living/carbon/human/H) . = _memory_edit_header("abductor") - if(src in ticker.mode.abductors) + if(src in SSticker.mode.abductors) . += "ABDUCTOR|no" . += "|undress|equip" else @@ -301,14 +302,14 @@ /datum/mind/proc/memory_edit_devil(mob/living/H) . = _memory_edit_header("devil", list("devilagents")) - if(src in ticker.mode.devils) + if(src in SSticker.mode.devils) if(!devilinfo) . += "No devilinfo found! Yell at a coder!" else if(!devilinfo.ascendable) . += "DEVIL|Ascendable Devil|sintouched|no" else . += "DEVIL|ASCENDABLE DEVIL|sintouched|no" - else if(src in ticker.mode.sintouched) + else if(src in SSticker.mode.sintouched) . += "devil|Ascendable Devil|SINTOUCHED|no" else . += "devil|Ascendable Devil|sintouched|NO" @@ -317,14 +318,14 @@ /datum/mind/proc/memory_edit_eventmisc(mob/living/H) . = _memory_edit_header("event", list()) - if(src in ticker.mode.eventmiscs) + if(src in SSticker.mode.eventmiscs) . += "YES|no" else . += "Event Role|NO" /datum/mind/proc/memory_edit_traitor() . = _memory_edit_header("traitor", list("traitorchan", "traitorvamp")) - if(src in ticker.mode.traitors) + if(src in SSticker.mode.traitors) . += "TRAITOR|no" if(objectives.len==0) . += "
Objectives are empty! Randomize!" @@ -348,9 +349,9 @@ /datum/mind/proc/memory_edit_uplink() . = "" - if(ishuman(current) && ((src in ticker.mode.head_revolutionaries) || \ - (src in ticker.mode.traitors) || \ - (src in ticker.mode.syndicates))) + if(ishuman(current) && ((src in SSticker.mode.head_revolutionaries) || \ + (src in SSticker.mode.traitors) || \ + (src in SSticker.mode.syndicates))) . = "Uplink: give" var/obj/item/uplink/hidden/suplink = find_syndicate_uplink() var/crystals @@ -366,7 +367,7 @@ // ^ whoever left this comment is literally a grammar nazi. stalin better. in russia grammar correct you. /datum/mind/proc/edit_memory() - if(!ticker || !ticker.mode) + if(!SSticker || !SSticker.mode) alert("Not before round-start!", "Alert") return @@ -419,7 +420,7 @@ This prioritizes antags relevant to the current round to make them appear at the top of the panel. Traitorchan and traitorvamp are snowflaked in because they have multiple sections. */ - if(ticker.mode.config_tag == "traitorchan") + if(SSticker.mode.config_tag == "traitorchan") if(sections["traitor"]) out += sections["traitor"] + "
" if(sections["changeling"]) @@ -427,7 +428,7 @@ sections -= "traitor" sections -= "changeling" // Elif technically unnecessary but it makes the following else look better - else if(ticker.mode.config_tag == "traitorvamp") + else if(SSticker.mode.config_tag == "traitorvamp") if(sections["traitor"]) out += sections["traitor"] + "
" if(sections["vampire"]) @@ -435,9 +436,9 @@ sections -= "traitor" sections -= "vampire" else - if(sections[ticker.mode.config_tag]) - out += sections[ticker.mode.config_tag] + "
" - sections -= ticker.mode.config_tag + if(sections[SSticker.mode.config_tag]) + out += sections[SSticker.mode.config_tag] + "
" + sections -= SSticker.mode.config_tag for(var/i in sections) if(sections[i]) @@ -512,7 +513,7 @@ var/objective_type = "[objective_type_capital][objective_type_text]"//Add them together into a text string. var/list/possible_targets = list() - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human)) possible_targets += possible_target.current @@ -612,7 +613,7 @@ if("identity theft") var/list/possible_targets = list() - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if((possible_target != src) && ishuman(possible_target.current)) possible_targets += possible_target possible_targets = sortAtom(possible_targets) @@ -687,19 +688,19 @@ message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a mindshield implant") to_chat(H, "You somehow have become the recepient of a mindshield transplant, and it just activated!") - if(src in ticker.mode.revolutionaries) + if(src in SSticker.mode.revolutionaries) special_role = null - ticker.mode.revolutionaries -= src + SSticker.mode.revolutionaries -= src to_chat(src, "The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work!") - if(src in ticker.mode.head_revolutionaries) + if(src in SSticker.mode.head_revolutionaries) special_role = null - ticker.mode.head_revolutionaries -=src + SSticker.mode.head_revolutionaries -=src to_chat(src, "The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work!") - if(src in ticker.mode.cult) - ticker.mode.cult -= src - ticker.mode.update_cult_icons_removed(src) + if(src in SSticker.mode.cult) + SSticker.mode.cult -= src + SSticker.mode.update_cult_icons_removed(src) special_role = null - var/datum/game_mode/cult/cult = ticker.mode + var/datum/game_mode/cult/cult = SSticker.mode if(istype(cult)) cult.memorize_cult_objectives(src) to_chat(current, "The nanobots in the mindshield implant remove all thoughts about being in a cult. Have a productive day!") @@ -709,46 +710,46 @@ switch(href_list["revolution"]) if("clear") - if(src in ticker.mode.revolutionaries) - ticker.mode.revolutionaries -= src + if(src in SSticker.mode.revolutionaries) + SSticker.mode.revolutionaries -= src to_chat(current, "You have been brainwashed! You are no longer a revolutionary!") - ticker.mode.update_rev_icons_removed(src) + SSticker.mode.update_rev_icons_removed(src) special_role = null - if(src in ticker.mode.head_revolutionaries) - ticker.mode.head_revolutionaries -= src + if(src in SSticker.mode.head_revolutionaries) + SSticker.mode.head_revolutionaries -= src to_chat(current, "You have been brainwashed! You are no longer a head revolutionary!") - ticker.mode.update_rev_icons_removed(src) + SSticker.mode.update_rev_icons_removed(src) special_role = null log_admin("[key_name(usr)] has de-rev'd [key_name(current)]") message_admins("[key_name_admin(usr)] has de-rev'd [key_name_admin(current)]") if("rev") - if(src in ticker.mode.head_revolutionaries) - ticker.mode.head_revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) + if(src in SSticker.mode.head_revolutionaries) + SSticker.mode.head_revolutionaries -= src + SSticker.mode.update_rev_icons_removed(src) to_chat(current, "Revolution has been disappointed of your leadership traits! You are a regular revolutionary now!") - else if(!(src in ticker.mode.revolutionaries)) + else if(!(src in SSticker.mode.revolutionaries)) to_chat(current, " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") else return - ticker.mode.revolutionaries += src - ticker.mode.update_rev_icons_added(src) + SSticker.mode.revolutionaries += src + SSticker.mode.update_rev_icons_added(src) special_role = SPECIAL_ROLE_REV log_admin("[key_name(usr)] has rev'd [key_name(current)]") message_admins("[key_name_admin(usr)] has rev'd [key_name_admin(current)]") if("headrev") - if(src in ticker.mode.revolutionaries) - ticker.mode.revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) + if(src in SSticker.mode.revolutionaries) + SSticker.mode.revolutionaries -= src + SSticker.mode.update_rev_icons_removed(src) to_chat(current, "You have proven your devotion to revolution! You are a head revolutionary now!") - else if(!(src in ticker.mode.head_revolutionaries)) + else if(!(src in SSticker.mode.head_revolutionaries)) to_chat(current, "You are a member of the revolutionaries' leadership now!") else return - if(ticker.mode.head_revolutionaries.len>0) + if(SSticker.mode.head_revolutionaries.len>0) // copy targets - var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries + var/datum/mind/valid_head = locate() in SSticker.mode.head_revolutionaries if(valid_head) for(var/datum/objective/mutiny/O in valid_head.objectives) var/datum/objective/mutiny/rev_obj = new @@ -756,21 +757,21 @@ rev_obj.target = O.target rev_obj.explanation_text = "Assassinate [O.target.name], the [O.target.assigned_role]." objectives += rev_obj - ticker.mode.greet_revolutionary(src,0) - ticker.mode.head_revolutionaries += src - ticker.mode.update_rev_icons_added(src) + SSticker.mode.greet_revolutionary(src,0) + SSticker.mode.head_revolutionaries += src + SSticker.mode.update_rev_icons_added(src) special_role = SPECIAL_ROLE_HEAD_REV log_admin("[key_name(usr)] has head-rev'd [key_name(current)]") message_admins("[key_name_admin(usr)] has head-rev'd [key_name_admin(current)]") if("autoobjectives") - ticker.mode.forge_revolutionary_objectives(src) - ticker.mode.greet_revolutionary(src,0) + SSticker.mode.forge_revolutionary_objectives(src) + SSticker.mode.greet_revolutionary(src,0) log_admin("[key_name(usr)] has automatically forged revolutionary objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged revolutionary objectives for [key_name_admin(current)]") if("flash") - if(!ticker.mode.equip_revolutionary(current)) + if(!SSticker.mode.equip_revolutionary(current)) to_chat(usr, "Spawning flash failed!") log_admin("[key_name(usr)] has given [key_name(current)] a flash") message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a flash") @@ -800,8 +801,8 @@ qdel(flash) take_uplink() var/fail = 0 - fail |= !ticker.mode.equip_traitor(current, 1) - fail |= !ticker.mode.equip_revolutionary(current) + fail |= !SSticker.mode.equip_traitor(current, 1) + fail |= !SSticker.mode.equip_revolutionary(current) if(fail) to_chat(usr, "Reequipping revolutionary goes wrong!") return @@ -811,19 +812,24 @@ else if(href_list["cult"]) switch(href_list["cult"]) if("clear") - if(src in ticker.mode.cult) - ticker.mode.remove_cultist(src) + if(src in SSticker.mode.cult) + SSticker.mode.remove_cultist(src) special_role = null log_admin("[key_name(usr)] has de-culted [key_name(current)]") message_admins("[key_name_admin(usr)] has de-culted [key_name_admin(current)]") if("cultist") - if(!(src in ticker.mode.cult)) - ticker.mode.add_cultist(src) + if(!(src in SSticker.mode.cult)) + SSticker.mode.add_cultist(src) special_role = SPECIAL_ROLE_CULTIST - to_chat(current, "You catch a glimpse of the Realm of [ticker.cultdat.entity_name], [ticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [ticker.cultdat.entity_name].") - to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve [ticker.cultdat.entity_title2] above all else. Bring It back.") + to_chat(current, "You catch a glimpse of the Realm of [SSticker.cultdat.entity_name], [SSticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [SSticker.cultdat.entity_name].") + to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve [SSticker.cultdat.entity_title2] above all else. Bring It back.") log_admin("[key_name(usr)] has culted [key_name(current)]") message_admins("[key_name_admin(usr)] has culted [key_name_admin(current)]") + if(!summon_spots.len) + while(summon_spots.len < SUMMON_POSSIBILITIES) + var/area/summon = pick(return_sorted_areas() - summon_spots) + if(summon && is_station_level(summon.z) && summon.valid_territory) + summon_spots += summon if("tome") var/mob/living/carbon/human/H = current if(istype(H)) @@ -846,7 +852,7 @@ message_admins("[key_name_admin(usr)] has spawned a tome for [key_name_admin(current)]") if("equip") - if(!ticker.mode.equip_cultist(current)) + if(!SSticker.mode.equip_cultist(current)) to_chat(usr, "Spawning equipment failed!") log_admin("[key_name(usr)] has equipped [key_name(current)] as a cultist") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a cultist") @@ -855,21 +861,22 @@ switch(href_list["wizard"]) if("clear") - if(src in ticker.mode.wizards) - ticker.mode.wizards -= src + if(src in SSticker.mode.wizards) + SSticker.mode.wizards -= src special_role = null current.spellremove(current) current.faction = list("Station") - ticker.mode.update_wiz_icons_removed(src) + SSticker.mode.update_wiz_icons_removed(src) to_chat(current, "You have been brainwashed! You are no longer a wizard!") log_admin("[key_name(usr)] has de-wizarded [key_name(current)]") message_admins("[key_name_admin(usr)] has de-wizarded [key_name_admin(current)]") if("wizard") - if(!(src in ticker.mode.wizards)) - ticker.mode.wizards += src + if(!(src in SSticker.mode.wizards)) + SSticker.mode.wizards += src special_role = SPECIAL_ROLE_WIZARD //ticker.mode.learn_basic_spells(current) - ticker.mode.update_wiz_icons_added(src) + SSticker.mode.update_wiz_icons_added(src) + SEND_SOUND(current, 'sound/ambience/antag/ragesmages.ogg') to_chat(current, "You are a Space Wizard!") current.faction = list("wizard") log_admin("[key_name(usr)] has wizarded [key_name(current)]") @@ -879,15 +886,15 @@ log_admin("[key_name(usr)] has moved [key_name(current)] to the wizard's lair") message_admins("[key_name_admin(usr)] has moved [key_name_admin(current)] to the wizard's lair") if("dressup") - ticker.mode.equip_wizard(current) + SSticker.mode.equip_wizard(current) log_admin("[key_name(usr)] has equipped [key_name(current)] as a wizard") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a wizard") if("name") - ticker.mode.name_wizard(current) + SSticker.mode.name_wizard(current) log_admin("[key_name(usr)] has allowed wizard [key_name(current)] to name themselves") message_admins("[key_name_admin(usr)] has allowed wizard [key_name_admin(current)] to name themselves") if("autoobjectives") - ticker.mode.forge_wizard_objectives(src) + SSticker.mode.forge_wizard_objectives(src) to_chat(usr, "The objectives for wizard [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged wizard objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged wizard objectives for [key_name_admin(current)]") @@ -896,27 +903,30 @@ else if(href_list["changeling"]) switch(href_list["changeling"]) if("clear") - if(src in ticker.mode.changelings) - ticker.mode.changelings -= src + if(src in SSticker.mode.changelings) + SSticker.mode.changelings -= src special_role = null - current.remove_changeling_powers() - ticker.mode.update_change_icons_removed(src) - if(changeling) qdel(changeling) + if(changeling) + current.remove_changeling_powers() + qdel(changeling) + changeling = null + SSticker.mode.update_change_icons_removed(src) to_chat(current, "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!") log_admin("[key_name(usr)] has de-changelinged [key_name(current)]") message_admins("[key_name_admin(usr)] has de-changelinged [key_name_admin(current)]") if("changeling") - if(!(src in ticker.mode.changelings)) - ticker.mode.changelings += src - ticker.mode.grant_changeling_powers(current) - ticker.mode.update_change_icons_added(src) + if(!(src in SSticker.mode.changelings)) + SSticker.mode.changelings += src + SSticker.mode.grant_changeling_powers(current) + SSticker.mode.update_change_icons_added(src) special_role = SPECIAL_ROLE_CHANGELING + SEND_SOUND(current, 'sound/ambience/antag/ling_aler.ogg') to_chat(current, "Your powers have awoken. A flash of memory returns to us... we are a changeling!") log_admin("[key_name(usr)] has changelinged [key_name(current)]") message_admins("[key_name_admin(usr)] has changelinged [key_name_admin(current)]") if("autoobjectives") - ticker.mode.forge_changeling_objectives(src) + SSticker.mode.forge_changeling_objectives(src) to_chat(usr, "The objectives for changeling [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -935,32 +945,33 @@ else if(href_list["vampire"]) switch(href_list["vampire"]) if("clear") - if(src in ticker.mode.vampires) - ticker.mode.vampires -= src + if(src in SSticker.mode.vampires) + SSticker.mode.vampires -= src special_role = null if(vampire) vampire.remove_vampire_powers() qdel(vampire) vampire = null - ticker.mode.update_vampire_icons_removed(src) + SSticker.mode.update_vampire_icons_removed(src) to_chat(current, "You grow weak and lose your powers! You are no longer a vampire and are stuck in your current form!") log_admin("[key_name(usr)] has de-vampired [key_name(current)]") message_admins("[key_name_admin(usr)] has de-vampired [key_name_admin(current)]") if("vampire") - if(!(src in ticker.mode.vampires)) - ticker.mode.vampires += src - ticker.mode.grant_vampire_powers(current) - ticker.mode.update_vampire_icons_added(src) + if(!(src in SSticker.mode.vampires)) + SSticker.mode.vampires += src + SSticker.mode.grant_vampire_powers(current) + SSticker.mode.update_vampire_icons_added(src) var/datum/mindslaves/slaved = new() slaved.masters += src som = slaved //we MIGT want to mindslave someone special_role = SPECIAL_ROLE_VAMPIRE + SEND_SOUND(current, 'sound/ambience/antag/vampalert.ogg') to_chat(current, "Your powers have awoken. Your lust for blood grows... You are a Vampire!") log_admin("[key_name(usr)] has vampired [key_name(current)]") message_admins("[key_name_admin(usr)] has vampired [key_name_admin(current)]") if("autoobjectives") - ticker.mode.forge_vampire_objectives(src) + SSticker.mode.forge_vampire_objectives(src) to_chat(usr, "The objectives for vampire [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -968,8 +979,8 @@ else if(href_list["vampthrall"]) switch(href_list["vampthrall"]) if("clear") - if(src in ticker.mode.vampire_enthralled) - ticker.mode.remove_vampire_mind(src) + if(src in SSticker.mode.vampire_enthralled) + SSticker.mode.remove_vampire_mind(src) log_admin("[key_name(usr)] has de-vampthralled [key_name(current)]") message_admins("[key_name_admin(usr)] has de-vampthralled [key_name_admin(current)]") @@ -978,9 +989,9 @@ switch(href_list["nuclear"]) if("clear") - if(src in ticker.mode.syndicates) - ticker.mode.syndicates -= src - ticker.mode.update_synd_icons_removed(src) + if(src in SSticker.mode.syndicates) + SSticker.mode.syndicates -= src + SSticker.mode.update_synd_icons_removed(src) special_role = null for(var/datum/objective/nuclear/O in objectives) objectives-=O @@ -989,17 +1000,17 @@ log_admin("[key_name(usr)] has de-nuke op'd [key_name(current)]") message_admins("[key_name_admin(usr)] has de-nuke op'd [key_name_admin(current)]") if("nuclear") - if(!(src in ticker.mode.syndicates)) - ticker.mode.syndicates += src - ticker.mode.update_synd_icons_added(src) - if(ticker.mode.syndicates.len==1) - ticker.mode.prepare_syndicate_leader(src) + if(!(src in SSticker.mode.syndicates)) + SSticker.mode.syndicates += src + SSticker.mode.update_synd_icons_added(src) + if(SSticker.mode.syndicates.len==1) + SSticker.mode.prepare_syndicate_leader(src) else - current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]" special_role = SPECIAL_ROLE_NUKEOPS to_chat(current, "You are a [syndicate_name()] agent!") - ticker.mode.forge_syndicate_objectives(src) - ticker.mode.greet_syndicate(src) + SSticker.mode.forge_syndicate_objectives(src) + SSticker.mode.greet_syndicate(src) log_admin("[key_name(usr)] has nuke op'd [key_name(current)]") message_admins("[key_name_admin(usr)] has nuke op'd [key_name_admin(current)]") if("lair") @@ -1019,9 +1030,10 @@ qdel(H.wear_suit) qdel(H.w_uniform) - if(!ticker.mode.equip_syndicate(current)) + if(!SSticker.mode.equip_syndicate(current)) to_chat(usr, "Equipping a syndicate failed!") return + SSticker.mode.update_syndicate_id(current.mind, SSticker.mode.syndicates.len == 1) log_admin("[key_name(usr)] has equipped [key_name(current)] as a nuclear operative") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a nuclear operative") @@ -1042,27 +1054,27 @@ else if(href_list["eventmisc"]) switch(href_list["eventmisc"]) if("clear") - if(src in ticker.mode.eventmiscs) - ticker.mode.eventmiscs -= src - ticker.mode.update_eventmisc_icons_removed(src) + if(src in SSticker.mode.eventmiscs) + SSticker.mode.eventmiscs -= src + SSticker.mode.update_eventmisc_icons_removed(src) special_role = null message_admins("[key_name_admin(usr)] has de-eventantag'ed [current].") log_admin("[key_name(usr)] has de-eventantag'ed [current].") if("eventmisc") - ticker.mode.eventmiscs += src + SSticker.mode.eventmiscs += src special_role = SPECIAL_ROLE_EVENTMISC - ticker.mode.update_eventmisc_icons_added(src) + SSticker.mode.update_eventmisc_icons_added(src) message_admins("[key_name_admin(usr)] has eventantag'ed [current].") log_admin("[key_name(usr)] has eventantag'ed [current].") else if(href_list["devil"]) switch(href_list["devil"]) if("clear") - if(src in ticker.mode.devils) + if(src in SSticker.mode.devils) if(istype(current,/mob/living/carbon/true_devil/)) to_chat(usr,"This cannot be used on true or arch-devils.") else - ticker.mode.devils -= src - ticker.mode.update_devil_icons_removed(src) + SSticker.mode.devils -= src + SSticker.mode.update_devil_icons_removed(src) special_role = null to_chat(current,"Your infernal link has been severed! You are no longer a devil!") RemoveSpell(/obj/effect/proc_holder/spell/targeted/infernal_jaunt) @@ -1081,8 +1093,8 @@ S.laws.clear_sixsixsix_laws() devilinfo = null log_admin("[key_name(usr)] has de-devil'ed [current].") - else if(src in ticker.mode.sintouched) - ticker.mode.sintouched -= src + else if(src in SSticker.mode.sintouched) + SSticker.mode.sintouched -= src message_admins("[key_name_admin(usr)] has de-sintouch'ed [current].") log_admin("[key_name(usr)] has de-sintouch'ed [current].") if("devil") @@ -1094,12 +1106,12 @@ if(!ishuman(current) && !isrobot(current)) to_chat(usr, "This only works on humans and cyborgs!") return - ticker.mode.devils += src + SSticker.mode.devils += src special_role = "devil" - ticker.mode.update_devil_icons_added(src) - ticker.mode.finalize_devil(src, FALSE) - ticker.mode.forge_devil_objectives(src, 2) - ticker.mode.greet_devil(src) + SSticker.mode.update_devil_icons_added(src) + SSticker.mode.finalize_devil(src, FALSE) + SSticker.mode.forge_devil_objectives(src, 2) + SSticker.mode.greet_devil(src) message_admins("[key_name_admin(usr)] has devil'ed [current].") log_admin("[key_name(usr)] has devil'ed [current].") if("ascendable_devil") @@ -1111,12 +1123,12 @@ if(!ishuman(current) && !isrobot(current)) to_chat(usr, "This only works on humans and cyborgs!") return - ticker.mode.devils += src + SSticker.mode.devils += src special_role = "devil" - ticker.mode.update_devil_icons_added(src) - ticker.mode.finalize_devil(src, TRUE) - ticker.mode.forge_devil_objectives(src, 2) - ticker.mode.greet_devil(src) + SSticker.mode.update_devil_icons_added(src) + SSticker.mode.finalize_devil(src, TRUE) + SSticker.mode.forge_devil_objectives(src, 2) + SSticker.mode.greet_devil(src) message_admins("[key_name_admin(usr)] has devil'ed [current]. The devil has been marked as ascendable.") log_admin("[key_name(usr)] has devil'ed [current]. The devil has been marked as ascendable.") if("sintouched") @@ -1128,8 +1140,8 @@ else if(href_list["traitor"]) switch(href_list["traitor"]) if("clear") - if(src in ticker.mode.traitors) - ticker.mode.traitors -= src + if(src in SSticker.mode.traitors) + SSticker.mode.traitors -= src special_role = null to_chat(current, "You have been brainwashed! You are no longer a traitor!") log_admin("[key_name(usr)] has de-traitored [key_name(current)]") @@ -1141,12 +1153,12 @@ A.verbs -= /mob/living/silicon/ai/proc/choose_modules A.malf_picker.remove_verbs(A) qdel(A.malf_picker) - ticker.mode.update_traitor_icons_removed(src) + SSticker.mode.update_traitor_icons_removed(src) if("traitor") - if(!(src in ticker.mode.traitors)) - ticker.mode.traitors += src + if(!(src in SSticker.mode.traitors)) + SSticker.mode.traitors += src var/datum/mindslaves/slaved = new() slaved.masters += src som = slaved //we MIGT want to mindslave someone @@ -1156,11 +1168,14 @@ message_admins("[key_name_admin(usr)] has traitored [key_name_admin(current)]") if(isAI(current)) var/mob/living/silicon/ai/A = current - ticker.mode.add_law_zero(A) - ticker.mode.update_traitor_icons_added(src) + SSticker.mode.add_law_zero(A) + SEND_SOUND(current, 'sound/ambience/antag/malf.ogg') + else + SEND_SOUND(current, 'sound/ambience/antag/tatoralert.ogg') + SSticker.mode.update_traitor_icons_added(src) if("autoobjectives") - ticker.mode.forge_traitor_objectives(src) + SSticker.mode.forge_traitor_objectives(src) to_chat(usr, "The objectives for traitor [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -1168,17 +1183,17 @@ else if(href_list["shadowling"]) switch(href_list["shadowling"]) if("clear") - ticker.mode.update_shadow_icons_removed(src) - if(src in ticker.mode.shadows) - ticker.mode.shadows -= src + SSticker.mode.update_shadow_icons_removed(src) + if(src in SSticker.mode.shadows) + SSticker.mode.shadows -= src special_role = null to_chat(current, "Your powers have been quenched! You are no longer a shadowling!") message_admins("[key_name_admin(usr)] has de-shadowlinged [current].") log_admin("[key_name(usr)] has de-shadowlinged [current].") current.spellremove(current) current.remove_language("Shadowling Hivemind") - else if(src in ticker.mode.shadowling_thralls) - ticker.mode.remove_thrall(src,0) + else if(src in SSticker.mode.shadowling_thralls) + SSticker.mode.remove_thrall(src,0) message_admins("[key_name_admin(usr)] has de-thrall'ed [current].") log_admin("[key_name(usr)] has de-thralled [key_name(current)]") message_admins("[key_name_admin(usr)] has de-thralled [key_name_admin(current)]") @@ -1186,20 +1201,20 @@ if(!ishuman(current)) to_chat(usr, "This only works on humans!") return - ticker.mode.shadows += src + SSticker.mode.shadows += src special_role = SPECIAL_ROLE_SHADOWLING to_chat(current, "Something stirs deep in your mind. A red light floods your vision, and slowly you remember. Though your human disguise has served you well, the \ time is nigh to cast it off and enter your true form. You have disguised yourself amongst the humans, but you are not one of them. You are a shadowling, and you are to ascend at all costs.\ ") - ticker.mode.finalize_shadowling(src) - ticker.mode.update_shadow_icons_added(src) + SSticker.mode.finalize_shadowling(src) + SSticker.mode.update_shadow_icons_added(src) log_admin("[key_name(usr)] has shadowlinged [key_name(current)]") message_admins("[key_name_admin(usr)] has shadowlinged [key_name_admin(current)]") if("thrall") if(!ishuman(current)) to_chat(usr, "This only works on humans!") return - ticker.mode.add_thrall(src) + SSticker.mode.add_thrall(src) message_admins("[key_name_admin(usr)] has thralled [current].") log_admin("[key_name(usr)] has thralled [current].") @@ -1214,7 +1229,7 @@ return make_Abductor() log_admin("[key_name(usr)] turned [current] into abductor.") - ticker.mode.update_abductor_icons_added(src) + SSticker.mode.update_abductor_icons_added(src) if("equip") if(!ishuman(current)) to_chat(usr, "This only works on humans!") @@ -1299,7 +1314,7 @@ log_admin("[key_name(usr)] has set [key_name(current)]'s telecrystals to [crystals]") message_admins("[key_name_admin(usr)] has set [key_name_admin(current)]'s telecrystals to [crystals]") if("uplink") - if(!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors))) + if(!SSticker.mode.equip_traitor(current, !(src in SSticker.mode.traitors))) to_chat(usr, "Equipping a syndicate failed!") return log_admin("[key_name(usr)] has given [key_name(current)] an uplink") @@ -1385,27 +1400,27 @@ qdel(H) /datum/mind/proc/make_Traitor() - if(!(src in ticker.mode.traitors)) - ticker.mode.traitors += src + if(!(src in SSticker.mode.traitors)) + SSticker.mode.traitors += src special_role = SPECIAL_ROLE_TRAITOR - ticker.mode.forge_traitor_objectives(src) - ticker.mode.finalize_traitor(src) - ticker.mode.greet_traitor(src) - ticker.mode.update_traitor_icons_added(src) + SSticker.mode.forge_traitor_objectives(src) + SSticker.mode.finalize_traitor(src) + SSticker.mode.greet_traitor(src) + SSticker.mode.update_traitor_icons_added(src) /datum/mind/proc/make_Nuke() - if(!(src in ticker.mode.syndicates)) - ticker.mode.syndicates += src - ticker.mode.update_synd_icons_added(src) - if(ticker.mode.syndicates.len==1) - ticker.mode.prepare_syndicate_leader(src) + if(!(src in SSticker.mode.syndicates)) + SSticker.mode.syndicates += src + SSticker.mode.update_synd_icons_added(src) + if(SSticker.mode.syndicates.len==1) + SSticker.mode.prepare_syndicate_leader(src) else - current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]" special_role = SPECIAL_ROLE_NUKEOPS assigned_role = SPECIAL_ROLE_NUKEOPS to_chat(current, "You are a [syndicate_name()] agent!") - ticker.mode.forge_syndicate_objectives(src) - ticker.mode.greet_syndicate(src) + SSticker.mode.forge_syndicate_objectives(src) + SSticker.mode.greet_syndicate(src) current.loc = get_turf(locate("landmark*Syndicate-Spawn")) @@ -1422,29 +1437,34 @@ qdel(H.wear_suit) qdel(H.w_uniform) - ticker.mode.equip_syndicate(current) + SSticker.mode.equip_syndicate(current) /datum/mind/proc/make_Vampire() - if(!(src in ticker.mode.vampires)) - ticker.mode.vampires += src - ticker.mode.grant_vampire_powers(current) + if(!(src in SSticker.mode.vampires)) + SSticker.mode.vampires += src + SSticker.mode.grant_vampire_powers(current) special_role = SPECIAL_ROLE_VAMPIRE - ticker.mode.forge_vampire_objectives(src) - ticker.mode.greet_vampire(src) - ticker.mode.update_vampire_icons_added(src) + SSticker.mode.forge_vampire_objectives(src) + SSticker.mode.greet_vampire(src) + SSticker.mode.update_vampire_icons_added(src) /datum/mind/proc/make_Changeling() - if(!(src in ticker.mode.changelings)) - ticker.mode.changelings += src - ticker.mode.grant_changeling_powers(current) + if(!(src in SSticker.mode.changelings)) + SSticker.mode.changelings += src + SSticker.mode.grant_changeling_powers(current) special_role = SPECIAL_ROLE_CHANGELING - ticker.mode.forge_changeling_objectives(src) - ticker.mode.greet_changeling(src) - ticker.mode.update_change_icons_added(src) + SSticker.mode.forge_changeling_objectives(src) + SSticker.mode.greet_changeling(src) + SSticker.mode.update_change_icons_added(src) + +/datum/mind/proc/make_Overmind() + if(!(src in SSticker.mode.blob_overminds)) + SSticker.mode.blob_overminds += src + special_role = SPECIAL_ROLE_BLOB_OVERMIND /datum/mind/proc/make_Wizard() - if(!(src in ticker.mode.wizards)) - ticker.mode.wizards += src + if(!(src in SSticker.mode.wizards)) + SSticker.mode.wizards += src special_role = SPECIAL_ROLE_WIZARD assigned_role = SPECIAL_ROLE_WIZARD //ticker.mode.learn_basic_spells(current) @@ -1454,18 +1474,18 @@ else current.loc = pick(wizardstart) - ticker.mode.equip_wizard(current) + SSticker.mode.equip_wizard(current) for(var/obj/item/spellbook/S in current.contents) S.op = 0 - ticker.mode.name_wizard(current) - ticker.mode.forge_wizard_objectives(src) - ticker.mode.greet_wizard(src) - ticker.mode.update_wiz_icons_added(src) + SSticker.mode.name_wizard(current) + SSticker.mode.forge_wizard_objectives(src) + SSticker.mode.greet_wizard(src) + SSticker.mode.update_wiz_icons_added(src) /datum/mind/proc/make_Rev() - if(ticker.mode.head_revolutionaries.len>0) + if(SSticker.mode.head_revolutionaries.len>0) // copy targets - var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries + var/datum/mind/valid_head = locate() in SSticker.mode.head_revolutionaries if(valid_head) for(var/datum/objective/mutiny/O in valid_head.objectives) var/datum/objective/mutiny/rev_obj = new @@ -1473,13 +1493,13 @@ rev_obj.target = O.target rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]." objectives += rev_obj - ticker.mode.greet_revolutionary(src,0) - ticker.mode.head_revolutionaries += src - ticker.mode.update_rev_icons_added(src) + SSticker.mode.greet_revolutionary(src,0) + SSticker.mode.head_revolutionaries += src + SSticker.mode.update_rev_icons_added(src) special_role = SPECIAL_ROLE_HEAD_REV - ticker.mode.forge_revolutionary_objectives(src) - ticker.mode.greet_revolutionary(src,0) + SSticker.mode.forge_revolutionary_objectives(src) + SSticker.mode.greet_revolutionary(src,0) var/list/L = current.get_contents() var/obj/item/flash/flash = locate() in L @@ -1487,7 +1507,7 @@ take_uplink() var/fail = 0 // fail |= !ticker.mode.equip_traitor(current, 1) - fail |= !ticker.mode.equip_revolutionary(current) + fail |= !SSticker.mode.equip_revolutionary(current) /datum/mind/proc/make_Abductor() var/role = alert("Abductor Role ?","Role","Agent","Scientist") @@ -1500,7 +1520,7 @@ if(!ishuman(current)) return - ticker.mode.abductors |= src + SSticker.mode.abductors |= src var/datum/objective/experiment/O = new O.owner = src @@ -1609,15 +1629,15 @@ var/list/implanters var/ref = "\ref[missionary.mind]" - if(!(missionary.mind in ticker.mode.implanter)) - ticker.mode.implanter[ref] = list() - implanters = ticker.mode.implanter[ref] + if(!(missionary.mind in SSticker.mode.implanter)) + SSticker.mode.implanter[ref] = list() + implanters = SSticker.mode.implanter[ref] implanters.Add(src) - ticker.mode.implanted.Add(src) - ticker.mode.implanted[src] = missionary.mind + SSticker.mode.implanted.Add(src) + SSticker.mode.implanted[src] = missionary.mind //ticker.mode.implanter[missionary.mind] += src - ticker.mode.implanter[ref] = implanters - ticker.mode.traitors += src + SSticker.mode.implanter[ref] = implanters + SSticker.mode.traitors += src special_role = "traitor" to_chat(current, "You're now a loyal zealot of [missionary.name]! You now must lay down your life to protect [missionary.p_them()] and assist in [missionary.p_their()] goals at any cost.") var/datum/objective/protect/mindslave/MS = new @@ -1628,8 +1648,8 @@ for(var/datum/objective/objective in objectives) to_chat(current, "Objective #1: [objective.explanation_text]") - ticker.mode.update_traitor_icons_added(missionary.mind) - ticker.mode.update_traitor_icons_added(src)//handles datahuds/observerhuds + SSticker.mode.update_traitor_icons_added(missionary.mind) + SSticker.mode.update_traitor_icons_added(src)//handles datahuds/observerhuds if(missionary.mind.som)//do not add if not a traitor..and you just picked up a robe and staff in the hall... var/datum/mindslaves/slaved = missionary.mind.som @@ -1653,7 +1673,7 @@ /datum/mind/proc/remove_zealot(obj/item/clothing/under/jumpsuit = null) if(!zealot_master) //if they aren't a zealot, we can't remove their zealot status, obviously. don't bother with the rest so we don't confuse them with the messages return - ticker.mode.remove_traitor_mind(src) + SSticker.mode.remove_traitor_mind(src) add_attack_logs(zealot_master, current, "Lost control of zealot") zealot_master = null @@ -1684,8 +1704,8 @@ mind.key = key else mind = new /datum/mind(key) - if(ticker) - ticker.minds += mind + if(SSticker) + SSticker.minds += mind else error("mind_initialize(): No ticker ready yet! Please inform Carn") if(!mind.name) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index d8b893caaf9..31c20315508 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -4,15 +4,21 @@ // Mutable appearances are children of images, just so you know. +/mutable_appearance/New() + ..() + plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE + // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var + // Helper similar to image() -/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER) +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE) var/mutable_appearance/MA = new() MA.icon = icon MA.icon_state = icon_state MA.layer = layer + MA.plane = plane return MA -/mutable_appearance/clean + /mutable_appearance/clean/New() . = ..() alpha = 255 diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 8c172f3592f..184f1155da2 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -25,6 +25,7 @@ var/list/implants = null var/list/cybernetic_implants = null + var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns /datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) //to be overriden for customization depending on client prefs,species etc @@ -151,4 +152,10 @@ H.r_store.add_fingerprint(H, 1) if(H.wear_pda) H.wear_pda.add_fingerprint(H, 1) - return 1 \ No newline at end of file + return 1 + +/datum/outfit/proc/get_chameleon_disguise_info() + var/list/types = list(uniform, suit, back, belt, gloves, shoes, head, mask, l_ear, r_ear, glasses, id, l_pocket, r_pocket, suit_store, r_hand, l_hand, pda) + types += chameleon_extras + listclearnulls(types) + return types diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 867ef7cac4d..40205ca715b 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -123,7 +123,7 @@ /datum/outfit/admin/syndicate/spy name = "Syndicate Spy" uniform = /obj/item/clothing/under/suit_jacket/really_black - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip uplink_uses = 40 id_access = "Syndicate Agent" @@ -228,7 +228,7 @@ back = /obj/item/storage/backpack belt = /obj/item/storage/belt/utility/full/multitool gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/centcom id = /obj/item/card/id pda = /obj/item/pda @@ -990,7 +990,7 @@ suit = /obj/item/clothing/suit/hooded/chaplain_hoodie back = /obj/item/storage/backpack gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/syndicate id = /obj/item/card/id/syndicate l_hand = /obj/item/twohanded/dualsaber/red @@ -1021,7 +1021,7 @@ suit = /obj/item/clothing/suit/draculacoat back = /obj/item/storage/backpack gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/syndicate id = /obj/item/card/id backpack_contents = list( diff --git a/code/datums/periodic_news.dm b/code/datums/periodic_news.dm index cdf2d5b9ad8..9a09ec4a7ec 100644 --- a/code/datums/periodic_news.dm +++ b/code/datums/periodic_news.dm @@ -118,7 +118,7 @@ var/global/list/newscaster_standard_feeds = list(/datum/news_announcement/bluespace_research, /datum/news_announcement/lotus_tree, /datum/news_announcement/random_junk, /datum/news_announcement/food_riots) proc/process_newscaster() - check_for_newscaster_updates(ticker.mode.newscaster_announcements) + check_for_newscaster_updates(SSticker.mode.newscaster_announcements) var/global/tmp/announced_news_types = list() proc/check_for_newscaster_updates(type) diff --git a/code/datums/radio.dm b/code/datums/radio.dm new file mode 100644 index 00000000000..7670bc76e32 --- /dev/null +++ b/code/datums/radio.dm @@ -0,0 +1,114 @@ + +/datum/radio_frequency + var/frequency as num + var/list/list/obj/devices = list() + +/datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, var/filter = null as text|null, var/range = null as num|null) + var/turf/start_point + if(range) + start_point = get_turf(source) + if(!start_point) + qdel(signal) + return 0 + if(filter) + send_to_filter(source, signal, filter, start_point, range) + send_to_filter(source, signal, RADIO_DEFAULT, start_point, range) + else + //Broadcast the signal to everyone! + for(var/next_filter in devices) + send_to_filter(source, signal, next_filter, start_point, range) + +//Sends a signal to all machines belonging to a given filter. Should be called by post_signal() +/datum/radio_frequency/proc/send_to_filter(obj/source, datum/signal/signal, var/filter, var/turf/start_point = null, var/range = null) + if(range && !start_point) + return + + for(var/obj/device in devices[filter]) + if(device == source) + continue + if(range) + var/turf/end_point = get_turf(device) + if(!end_point) + continue + if(start_point.z!=end_point.z || get_dist(start_point, end_point) > range) + continue + + device.receive_signal(signal, TRANSMISSION_RADIO, frequency) + +/datum/radio_frequency/proc/add_listener(obj/device as obj, var/filter as text|null) + if(!filter) + filter = RADIO_DEFAULT + //log_admin("add_listener(device=[device],filter=[filter]) frequency=[frequency]") + var/list/obj/devices_line = devices[filter] + if(!devices_line) + devices_line = new + devices[filter] = devices_line + devices_line+=device +// var/list/obj/devices_line___ = devices[filter_str] +// var/l = devices_line___.len + //log_admin("DEBUG: devices_line.len=[devices_line.len]") + //log_admin("DEBUG: devices(filter_str).len=[l]") + +/datum/radio_frequency/proc/remove_listener(obj/device) + for(var/devices_filter in devices) + var/list/devices_line = devices[devices_filter] + devices_line-=device + while(null in devices_line) + devices_line -= null + if(devices_line.len==0) + devices -= devices_filter + qdel(devices_line) + +/datum/signal + var/obj/source + + var/transmission_method = 0 //unused at the moment + //0 = wire + //1 = radio transmission + //2 = subspace transmission + + var/list/data = list() + var/encryption + + var/frequency = 0 + +/datum/signal/proc/copy_from(datum/signal/model) + source = model.source + transmission_method = model.transmission_method + data = model.data + encryption = model.encryption + frequency = model.frequency + +/datum/signal/proc/debug_print() + if(source) + . = "signal = {source = '[source]' ([source:x],[source:y],[source:z])\n" + else + . = "signal = {source = '[source]' ()\n" + for(var/i in data) + . += "data\[\"[i]\"\] = \"[data[i]]\"\n" + if(islist(data[i])) + var/list/L = data[i] + for(var/t in L) + . += "data\[\"[i]\"\] list has: [t]" + +/datum/signal/proc/get_race(mob/M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + . = H.dna.species.name + else if(isbrain(M)) + var/mob/living/carbon/brain/B = M + . = B.get_race() + else if(issilicon(M)) + . = "Artificial Life" + else if(isslime(M)) + . = "Slime" + else if(isbot(M)) + . = "Bot" + else if(isanimal(M)) + . = "Domestic Animal" + else + . = "Unidentifiable" + +//callback used by objects to react to incoming radio signals +/obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param) + return null diff --git a/code/datums/ruins.dm b/code/datums/ruins.dm index eaedf6dd49b..7cfc24fdd16 100644 --- a/code/datums/ruins.dm +++ b/code/datums/ruins.dm @@ -7,8 +7,12 @@ wooden container filled with 18th century coinage in the middle of a \ lavawracked hellscape? It is clearly a mystery." - var/cost = null - var/allow_duplicates = FALSE //A bit boring, don't you think? You can always explicitly allow it on a ruin definition + var/unpickable = FALSE //If TRUE these won't be placed automatically (can still be forced or loaded with another ruin) + var/always_place = FALSE //Will skip the whole weighting process and just plop this down, ideally you want the ruins of this kind to have no cost. + var/placement_weight = 1 //How often should this ruin appear + var/cost = 0 //Cost in ruin budget placement system + var/allow_duplicates = TRUE + var/list/never_spawn_with = null //If this ruin is spawned these will not eg list(/datum/map_template/ruin/base_alternate) var/prefix = null var/suffix = null diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm new file mode 100644 index 00000000000..67e5438656e --- /dev/null +++ b/code/datums/ruins/lavaland.dm @@ -0,0 +1,207 @@ +/datum/map_template/ruin/lavaland + prefix = "_maps/map_files/RandomRuins/LavaRuins/" + +/datum/map_template/ruin/lavaland/biodome + cost = 5 + allow_duplicates = FALSE + +/datum/map_template/ruin/lavaland/biodome/beach + name = "Biodome Beach" + id = "biodome-beach" + description = "Seemingly plucked from a tropical destination, this beach is calm and cool, with the salty waves roaring softly in the background. \ + 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" + description = "The creators of these vaults were a highly advanced and benevolent race, and launched many into the stars, hoping to aid fledgling civilizations. \ + However, all the inhabitants seem to do is grow drugs and guns." + suffix = "lavaland_surface_seed_vault.dmm" + cost = 10 + allow_duplicates = FALSE + +datum/map_template/ruin/lavaland/ash_walker + name = "Ash Walker Nest" + id = "ash-walker" + description = "A race of unbreathing lizards live here, that run faster than a human can, worship a broken dead city, and are capable of reproducing by something involving tentacles? \ + Probably best to stay clear." + suffix = "lavaland_surface_ash_walker1.dmm" + cost = 20 + allow_duplicates = FALSE + +/datum/map_template/ruin/lavaland/syndicate_base + name = "Syndicate Lava Base" + id = "lava-base" + description = "A secret base researching illegal bioweapons, it is closely guarded by an elite team of syndicate agents." + suffix = "lavaland_surface_syndicate_base1.dmm" + cost = 20 + allow_duplicates = FALSE + +/datum/map_template/ruin/lavaland/free_golem + name = "Free Golem Ship" + id = "golem-ship" + description = "Lumbering humanoids, made out of precious metals, move inside this ship. They frequently leave to mine more minerals, which they somehow turn into more of them. \ + Seem very intent on research and individual liberty, and also geology based naming?" + cost = 20 + suffix = "lavaland_surface_golem_ship.dmm" + allow_duplicates = FALSE + +/datum/map_template/ruin/lavaland/animal_hospital + name = "Animal Hospital" + id = "animal-hospital" + description = "Rats with cancer do not live very long. And the ones that wake up from cryostasis seem to commit suicide out of boredom." + cost = 5 + 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" + description = "A strange, square chunk of metal of massive size. Inside awaits only death and many, many squares." + suffix = "lavaland_surface_hierophant.dmm" + allow_duplicates = FALSE + always_place = TRUE + +/datum/map_template/ruin/lavaland/blood_drunk_miner + name = "Blood-Drunk Miner" + id = "blooddrunk" + description = "A strange arrangement of stone tiles and an insane, beastly miner contemplating them." + suffix = "lavaland_surface_blooddrunk1.dmm" + cost = 0 + allow_duplicates = FALSE //will only spawn one variant of the ruin + +/datum/map_template/ruin/lavaland/blood_drunk_miner/guidance + name = "Blood-Drunk Miner (Guidance)" + suffix = "lavaland_surface_blooddrunk2.dmm" + +/datum/map_template/ruin/lavaland/blood_drunk_miner/hunter + 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" + description = "A place of shelter for a lone hermit, scraping by to live another day." + suffix = "lavaland_surface_hermit.dmm" + allow_duplicates = FALSE + cost = 10 + +/datum/map_template/ruin/lavaland/swarmer_boss + name = "Crashed Shuttle" + id = "swarmerboss" + description = "A Syndicate shuttle had an unfortunate stowaway..." + suffix = "lavaland_surface_swarmer_crash.dmm" + allow_duplicates = FALSE + 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/shuttles.dm b/code/datums/shuttles.dm index d20255bc57c..53517d5dbc9 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -25,6 +25,11 @@ port_id = "ferry" name = "Base Shuttle Template (Ferry)" +/datum/map_template/shuttle/admin + port_id = "admin" + name = "Base Shuttle Template (Admin)" + + // Shuttles start here: @@ -117,3 +122,13 @@ definitely no zombifyin' reagents!" admin_notes = "Meat currently contains no zombifying reagents, people on \ meatspike must be spawned in." + +/datum/map_template/shuttle/admin/hospital + suffix = "hospital" + name = "NHV Asclepius" + description = "Nanostrasen Hospital ship, for medical assistance during disasters." + +/datum/map_template/shuttle/admin/admin + suffix = "admin" + name = "NTV Argos" + description = "Default Admin ship. An older ship used for special operations." diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 813604a1431..d8c7b26554c 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -62,6 +62,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/charge_type = "recharge" //can be recharge or charges, see charge_max and charge_counter descriptions; can also be based on the holder's vars now, use "holder_var" for that var/charge_max = 100 //recharge time in deciseconds if charge_type = "recharge" or starting charges if charge_type = "charges" + var/starts_charged = TRUE //Does this spell start ready to go? var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = "recharge" or -- each cast if charge_type = "charges" var/still_recharging_msg = "The spell is still recharging." @@ -167,6 +168,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if("holdervar") adjust_var(user, holder_var_type, holder_var_amount) + if(action) + action.UpdateButtonIcon() return 1 /obj/effect/proc_holder/spell/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount @@ -193,9 +196,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin /obj/effect/proc_holder/spell/New() ..() action = new(src) - still_recharging_msg = "[name] is still recharging." - charge_counter = charge_max + if(starts_charged) + charge_counter = charge_max + else + start_recharge() /obj/effect/proc_holder/spell/Destroy() QDEL_NULL(action) @@ -212,9 +217,14 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin /obj/effect/proc_holder/spell/proc/start_recharge() if(action) action.UpdateButtonIcon() - while(charge_counter < charge_max) - sleep(1) - charge_counter++ + START_PROCESSING(SSfastprocess, src) + +/obj/effect/proc_holder/spell/process() + charge_counter += 2 + if(charge_counter < charge_max) + return + STOP_PROCESSING(SSfastprocess, src) + charge_counter = charge_max if(action) action.UpdateButtonIcon() @@ -235,6 +245,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin else cast(targets, user = user) after_cast(targets) + if(action) + action.UpdateButtonIcon() /obj/effect/proc_holder/spell/proc/before_cast(list/targets) if(overlay) @@ -291,8 +303,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin charge_counter++ if("holdervar") adjust_var(user, holder_var_type, -holder_var_amount) - - return + if(action) + action.UpdateButtonIcon() /obj/effect/proc_holder/spell/proc/updateButtonIcon() if(action) diff --git a/code/datums/spells/chaplain.dm b/code/datums/spells/chaplain.dm index f9c2641c50e..bdb7bb3f551 100644 --- a/code/datums/spells/chaplain.dm +++ b/code/datums/spells/chaplain.dm @@ -64,9 +64,9 @@ spawn(0) // allows cast to complete even if recipient ignores the prompt if(alert(target, "[user] wants to bless you, in the name of [user.p_their()] religion. Accept?", "Accept Blessing?", "Yes", "No") == "Yes") // prevents forced conversions - user.visible_message("[user] starts blessing [target] in the name of [ticker.Bible_deity_name].", "You start blessing [target] in the name of [ticker.Bible_deity_name].") + user.visible_message("[user] starts blessing [target] in the name of [SSticker.Bible_deity_name].", "You start blessing [target] in the name of [SSticker.Bible_deity_name].") if(do_after(user, 150, target = target)) - user.visible_message("[user] has blessed [target] in the name of [ticker.Bible_deity_name].", "You have blessed [target] in the name of [ticker.Bible_deity_name].") + user.visible_message("[user] has blessed [target] in the name of [SSticker.Bible_deity_name].", "You have blessed [target] in the name of [SSticker.Bible_deity_name].") if(!target.mind.isblessed) target.mind.isblessed = TRUE user.mind.num_blessed++ diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm index cfda930afd2..896e399187a 100644 --- a/code/datums/spells/inflict_handler.dm +++ b/code/datums/spells/inflict_handler.dm @@ -44,7 +44,7 @@ else if(amt_dam_fire <= 0) target.heal_overall_damage(amt_dam_brute,amt_dam_fire) target.adjustToxLoss(amt_dam_tox) - target.oxyloss += amt_dam_oxy + target.adjustOxyLoss(amt_dam_oxy) //disabling target.Weaken(amt_weakened) target.Paralyse(amt_paralysis) diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm index f1744e22550..f37d48c0a10 100644 --- a/code/datums/spells/lichdom.dm +++ b/code/datums/spells/lichdom.dm @@ -20,7 +20,7 @@ action_icon_state = "skeleton" /obj/effect/proc_holder/spell/targeted/lichdom/Destroy() - for(var/datum/mind/M in ticker.mode.wizards) //Make sure no other bones are about + for(var/datum/mind/M in SSticker.mode.wizards) //Make sure no other bones are about for(var/obj/effect/proc_holder/spell/S in M.spell_list) if(istype(S,/obj/effect/proc_holder/spell/targeted/lichdom) && S != src) return ..() diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm index ba00d0f226b..dcca0cfc919 100644 --- a/code/datums/spells/lightning.dm +++ b/code/datums/spells/lightning.dm @@ -88,7 +88,7 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr) var/mob/living/current = target if(bounces < 1) if(damaging) - current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1) + current.electrocute_act(bolt_energy, "Lightning Bolt", safety = TRUE) else current.AdjustJitter(1000) //High numbers for violent convulsions current.do_jitter_animation(current.jitteriness) @@ -99,7 +99,7 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr) playsound(get_turf(current), 'sound/magic/lightningshock.ogg', 50, 1, -1) else if(damaging) - current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1) + current.electrocute_act(bolt_energy, "Lightning Bolt", safety = TRUE) else current.AdjustJitter(1000) //High numbers for violent convulsions current.do_jitter_animation(current.jitteriness) 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/statclick.dm b/code/datums/statclick.dm index c7273e4744b..11a3ed41ce3 100644 --- a/code/datums/statclick.dm +++ b/code/datums/statclick.dm @@ -1,12 +1,13 @@ -// Not TECHNICALLY a datum, but this should never be instantiated -// outside of the stat panel // Clickable stat() button /obj/effect/statclick var/target -/obj/effect/statclick/New(ntarget, text) - target = ntarget +INITIALIZE_IMMEDIATE(/obj/effect/statclick) + +/obj/effect/statclick/Initialize(mapload, text, target) + . = ..() name = text + src.target = target /obj/effect/statclick/proc/update(text) name = text @@ -19,10 +20,6 @@ if(!is_admin(usr) || !target) return if(!class) - if(istype(target, /datum/controller/process)) - class = "process" - else if(istype(target, /datum/controller/processScheduler)) - class = "scheduler" if(istype(target, /datum/controller/subsystem)) class = "subsystem" else if(istype(target, /datum/controller)) diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 26d8ec67ef0..387cc70f992 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -38,4 +38,18 @@ /datum/status_effect/void_price/tick() playsound(owner, 'sound/weapons/bite.ogg', 50, 1) - owner.adjustBruteLoss(3) \ No newline at end of file + owner.adjustBruteLoss(3) + +/datum/status_effect/exercised + id = "Exercised" + duration = 1200 + alert_type = null + +/datum/status_effect/exercised/on_creation(mob/living/new_owner, ...) + . = ..() + STOP_PROCESSING(SSfastprocess, src) + START_PROCESSING(SSprocessing, src) //this lasts 20 minutes, so SSfastprocess isn't needed. + +/datum/status_effect/exercised/Destroy() + . = ..() + STOP_PROCESSING(SSprocessing, src) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index cfafa912b64..6e809b32606 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -7,4 +7,76 @@ /datum/status_effect/cultghost/tick() if(owner.reagents) - owner.reagents.del_reagent("holywater") //can't be deconverted \ No newline at end of file + owner.reagents.del_reagent("holywater") //can't be deconverted + +/datum/status_effect/saw_bleed + id = "saw_bleed" + duration = -1 //removed under specific conditions + tick_interval = 6 + alert_type = null + var/mutable_appearance/bleed_overlay + var/mutable_appearance/bleed_underlay + var/bleed_amount = 3 + var/bleed_buildup = 3 + var/delay_before_decay = 5 + var/bleed_damage = 200 + var/needs_to_bleed = FALSE + +/datum/status_effect/saw_bleed/Destroy() + if(owner) + owner.cut_overlay(bleed_overlay) + owner.underlays -= bleed_underlay + QDEL_NULL(bleed_overlay) + return ..() + +/datum/status_effect/saw_bleed/on_apply() + if(owner.stat == DEAD) + return FALSE + bleed_overlay = mutable_appearance('icons/effects/bleed.dmi', "bleed[bleed_amount]") + bleed_underlay = mutable_appearance('icons/effects/bleed.dmi', "bleed[bleed_amount]") + var/icon/I = icon(owner.icon, owner.icon_state, owner.dir) + var/icon_height = I.Height() + bleed_overlay.pixel_x = -owner.pixel_x + bleed_overlay.pixel_y = FLOOR(icon_height * 0.25, 1) + bleed_overlay.transform = matrix() * (icon_height/world.icon_size) //scale the bleed overlay's size based on the target's icon size + bleed_underlay.pixel_x = -owner.pixel_x + bleed_underlay.transform = matrix() * (icon_height/world.icon_size) * 3 + bleed_underlay.alpha = 40 + owner.add_overlay(bleed_overlay) + owner.underlays += bleed_underlay + return ..() + +/datum/status_effect/saw_bleed/tick() + if(owner.stat == DEAD) + qdel(src) + else + add_bleed(-1) + +/datum/status_effect/saw_bleed/proc/add_bleed(amount) + owner.cut_overlay(bleed_overlay) + owner.underlays -= bleed_underlay + bleed_amount += amount + if(bleed_amount) + if(bleed_amount >= 10) + needs_to_bleed = TRUE + qdel(src) + else + if(amount > 0) + tick_interval += delay_before_decay + bleed_overlay.icon_state = "bleed[bleed_amount]" + bleed_underlay.icon_state = "bleed[bleed_amount]" + owner.add_overlay(bleed_overlay) + owner.underlays += bleed_underlay + else + qdel(src) + +/datum/status_effect/saw_bleed/on_remove() + if(needs_to_bleed) + var/turf/T = get_turf(owner) + new /obj/effect/temp_visual/bleed/explode(T) + for(var/d in alldirs) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(T, d) + playsound(T, "desceration", 200, 1, -1) + owner.adjustBruteLoss(bleed_damage) + else + new /obj/effect/temp_visual/bleed(get_turf(owner)) \ No newline at end of file diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index d312ff9d11d..dd478a8f64c 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -32,11 +32,11 @@ var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type) A.attached_effect = src //so the alert can reference us, if it needs to linked_alert = A //so we can reference the alert, if we need to - GLOB.fast_processing.Add(src) + START_PROCESSING(SSfastprocess, src) return TRUE /datum/status_effect/Destroy() - GLOB.fast_processing.Remove(src) + STOP_PROCESSING(SSfastprocess, src) if(owner) owner.clear_alert(id) LAZYREMOVE(owner.status_effects, src) @@ -44,7 +44,7 @@ owner = null return ..() -/datum/status_effect/proc/process() +/datum/status_effect/process() if(!owner) qdel(src) return diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 5330be00665..7a63fa1571f 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1060,8 +1060,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/organic/bar name = "Bar Starter Kit" contains = list(/obj/item/storage/box/drinkingglasses, - /obj/item/circuitboard/soda, - /obj/item/circuitboard/beer) + /obj/item/circuitboard/chem_dispenser/soda, + /obj/item/circuitboard/chem_dispenser/beer) cost = 20 containername = "beer starter kit" announce_beacons = list("Bar" = list("Bar")) @@ -1073,6 +1073,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containertype = /obj/structure/closet/critter/cow containername = "cow crate" +/datum/supply_packs/organic/pig + name = "Pig Crate" + cost = 25 + containertype = /obj/structure/closet/critter/pig + containername = "pig crate" + /datum/supply_packs/organic/goat name = "Goat Crate" cost = 25 @@ -1102,7 +1108,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine name = "Cat Crate" cost = 50 //Cats are worth as much as corgis. containertype = /obj/structure/closet/critter/cat - contains = list(/obj/item/clothing/accessory/petcollar) + contains = list(/obj/item/clothing/accessory/petcollar, + /obj/item/toy/cattoy) containername = "cat crate" /datum/supply_packs/organic/pug @@ -1199,13 +1206,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/organic/hydroponics/beekeeping_fullkit name = "Beekeeping Starter Kit" - contains = list(/obj/structure/beebox, + contains = list(/obj/structure/beebox/unwrenched, /obj/item/honey_frame, /obj/item/honey_frame, /obj/item/honey_frame, /obj/item/queen_bee/bought, /obj/item/clothing/head/beekeeper_head, - /obj/item/clothing/suit/beekeeper_suit) + /obj/item/clothing/suit/beekeeper_suit, + /obj/item/melee/flyswatter) cost = 15 containername = "beekeeping starter kit" @@ -1354,6 +1362,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 40 containername = "religious supplies crate" +/datum/supply_packs/misc/minerkit + name = "Shaft Miner Starter Kit" + cost = 30 + access = access_qm + contains = list(/obj/item/storage/backpack/duffel/mining_conscript/noid) + containertype = /obj/structure/closet/crate/secure + containername = "shaft miner starter kit" + ///////////// Paper Work diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 392908127d0..4c1fb437046 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -12,9 +12,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) var/datum/uplink_item/I = new path if(!I.item) continue - if(I.gamemodes.len && ticker && !(ticker.mode.type in I.gamemodes)) + if(I.gamemodes.len && SSticker && !(SSticker.mode.type in I.gamemodes)) continue - if(I.excludefrom.len && ticker && (ticker.mode.type in I.excludefrom)) + if(I.excludefrom.len && SSticker && (SSticker.mode.type in I.excludefrom)) continue if(I.last) last += I @@ -88,9 +88,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/uplink/U) - if(hijack_only) + if(hijack_only && !(usr.mind.special_role == SPECIAL_ROLE_NUKEOPS))//nukies get items that regular traitors only get with hijack. If a hijack-only item is not for nukies, then exclude it via the gamemode list. if(!(locate(/datum/objective/hijack) in usr.mind.objectives)) - to_chat(usr, "The Syndicate lacks resources to provide you with this item.") + to_chat(usr, "The Syndicate will only issue this extremely dangerous item to agents assigned the Hijack objective.") return if(item) @@ -182,6 +182,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 3 job = list("Clown") +/datum/uplink_item/jobspecific/trick_revolver + name = "Trick Revolver" + desc = "A revolver that will fire backwards and kill whoever attempts to use it. Perfect for those pesky vigilante or just a good laugh." + reference = "CTR" + item = /obj/item/storage/box/syndie_kit/fake_revolver + cost = 1 + job = list("Clown") + //mime /datum/uplink_item/jobspecific/caneshotgun name = "Cane Shotgun and Assassination Shells" @@ -433,7 +441,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/dangerous category = "Highly Visible and Dangerous Weapons" - /datum/uplink_item/dangerous/pistol name = "FK-69 Pistol" reference = "SPI" @@ -551,37 +558,66 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/batterer cost = 5 -/datum/uplink_item/dangerous/gygax +// SUPPORT AND MECHAS + +/datum/uplink_item/support + category = "Support and Mechanized Exosuits" + surplus = 0 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/support/gygax name = "Gygax Exosuit" desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent for hit-and-run style attacks. \ This model lacks a method of space propulsion, and therefore it is advised to repair the mothership's teleporter if you wish to make use of it." reference = "GE" item = /obj/mecha/combat/gygax/dark/loaded cost = 90 - gamemodes = list(/datum/game_mode/nuclear) - surplus = 0 -/datum/uplink_item/dangerous/mauler +/datum/uplink_item/support/mauler name = "Mauler Exosuit" desc = "A massive and incredibly deadly Syndicate exosuit. Features long-range targeting, thrust vectoring, and deployable smoke." reference = "ME" item = /obj/mecha/combat/marauder/mauler/loaded cost = 140 - gamemodes = list(/datum/game_mode/nuclear) - surplus = 0 -/datum/uplink_item/dangerous/syndieborg - name = "Syndicate Cyborg" - desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. Comes in Assault, Medical, or Saboteur variants." - reference = "SC" - item = /obj/item/antag_spawner/borg_tele - refund_path = /obj/item/antag_spawner/borg_tele - cost = 50 - gamemodes = list(/datum/game_mode/nuclear) - surplus = 0 +/datum/uplink_item/support/reinforcement + name = "Reinforcement" + desc = "Call in an additional team member. They won't come with any gear, so you'll have to save some telecrystals \ + to arm them as well." + reference = "REINF" + item = /obj/item/antag_spawner/nuke_ops + refund_path = /obj/item/antag_spawner/nuke_ops + cost = 25 refundable = TRUE cant_discount = TRUE +/datum/uplink_item/support/reinforcement/assault_borg + name = "Syndicate Assault Cyborg" + desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. \ + Comes equipped with a self-resupplying LMG, a grenade launcher, energy sword, emag, pinpointer, flash and crowbar." + reference = "SAC" + item = /obj/item/antag_spawner/nuke_ops/borg_tele/assault + refund_path = /obj/item/antag_spawner/nuke_ops/borg_tele/assault + cost = 65 + +/datum/uplink_item/support/reinforcement/medical_borg + name = "Syndicate Medical Cyborg" + desc = "A combat medical cyborg. Has limited offensive potential, but makes more than up for it with its support capabilities. \ + It comes equipped with a nanite hypospray, a medical beamgun, combat defibrillator, full surgical kit including an energy saw, an emag, pinpointer and flash. \ + Thanks to its organ storage bag, it can perform surgery as well as any humanoid." + reference = "SMC" + item = /obj/item/antag_spawner/nuke_ops/borg_tele/medical + refund_path = /obj/item/antag_spawner/nuke_ops/borg_tele/medical + cost = 35 + +/datum/uplink_item/support/reinforcement/saboteur_borg + name = "Syndicate Saboteur Cyborg" + desc = "A streamlined engineering cyborg, equipped with covert modules and engineering equipment. Also incapable of leaving the welder in the shuttle. \ + Its chameleon projector lets it disguise itself as a Nanotrasen cyborg, on top it has thermal vision and a pinpointer." + reference = "SSC" + item = /obj/item/antag_spawner/nuke_ops/borg_tele/saboteur + refund_path = /obj/item/antag_spawner/nuke_ops/borg_tele/saboteur + /datum/uplink_item/dangerous/foamsmg name = "Toy Submachine Gun" desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade rounds with a 20-round magazine." @@ -645,15 +681,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/ammo_box/magazine/m10mm/hp cost = 3 -/datum/uplink_item/ammo/ammobag - name = "Bulldog - Shotgun Ammo Grab Bag" - desc = "A duffelbag filled with Bulldog ammo to kit out an entire team, at a discounted price." - reference = "SAGL" - item = /obj/item/storage/backpack/duffel/syndie/ammo/loaded - cost = 10 //bulk buyer's discount. Very useful if you're buying a mech and dont have TC left to buy people non-shotgun guns - gamemodes = list(/datum/game_mode/nuclear) - cant_discount = TRUE - /datum/uplink_item/ammo/bullslug name = "Bulldog - 12g Slug Magazine" desc = "An additional 8-round slug magazine for use in the Bulldog shotgun. Now 8 times less likely to shoot your pals." @@ -686,6 +713,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 2 gamemodes = list(/datum/game_mode/nuclear) +/datum/uplink_item/ammo/bulldog_ammobag + name = "Bulldog - 12g Ammo Duffel Bag" + desc = "A duffel bag filled with enough 12g ammo to supply an entire team, at a discounted price." + reference = "12ADB" + item = /obj/item/storage/backpack/duffel/syndie/ammo/shotgun + cost = 12 // normally 18 + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/ammo/smg name = "C-20r - .45 Magazine" desc = "An additional 20-round .45 magazine for use in the C-20r submachine gun. These bullets pack a lot of punch that can knock most targets down, but do limited overall damage." @@ -694,6 +729,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 2 gamemodes = list(/datum/game_mode/nuclear) +/datum/uplink_item/ammo/smg_ammobag + name = "C-20r - .45 Ammo Duffel Bag" + desc = "A duffel bag filled with enough .45 ammo to supply an entire team, at a discounted price." + reference = "45ADB" + item = /obj/item/storage/backpack/duffel/syndie/ammo/smg + cost = 14 // normally 20 + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/ammo/carbine name = "Carbine - 5.56 Toploader Magazine" desc = "An additional 30-round 5.56 magazine for use in the M-90gl carbine. These bullets don't have the punch to knock most targets down, but dish out higher overall damage." @@ -805,7 +848,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) desc = "A manual that teaches a single user tactical Close-Quarters Combat before self-destructing. Does not restrict weapon usage, but cannot be used alongside Gloves of the North Star." reference = "CQC" item = /obj/item/CQC_manual - cost = 9 + gamemodes = list(/datum/game_mode/nuclear) + cost = 13 + surplus = 0 /datum/uplink_item/stealthy_weapons/cameraflash name = "Camera Flash" @@ -885,7 +930,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) desc = "Just add water to make your very own hostile to everything space carp. It looks just like a plushie. The first person to squeeze it will be registered as its owner, who it will not attack. If no owner is registered, it'll just attack everyone." reference = "DSC" item = /obj/item/toy/carpplushie/dehy_carp - cost = 3 + cost = 2 // GRENADES AND EXPLOSIVES @@ -906,6 +951,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/box/syndie_kit/c4 cost = 4 +/datum/uplink_item/explosives/c4bag + name = "Bag of C-4 explosives" + desc = "Because sometimes quantity is quality. Contains 10 C-4 plastic explosives." + reference = "C4B" + item = /obj/item/storage/backpack/duffel/syndie/c4 + cost = 8 //20% discount! + cant_discount = TRUE + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/explosives/breaching_charge name = "Composition X-4" desc = "X-4 is a shaped charge designed to be safe to the user while causing maximum damage to the occupants of the room beach breached. It has a modifiable timer with a minimum setting of 10 seconds." @@ -914,6 +968,17 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 2 gamemodes = list(/datum/game_mode/nuclear) +/datum/uplink_item/explosives/x4bag + name = "Bag of X-4 explosives" + desc = "Contains 3 X-4 shaped plastic explosives. Similar to C4, but with a stronger blast that is directional instead of circular. \ + X-4 can be placed on a solid surface, such as a wall or window, and it will blast through the wall, injuring anything on the opposite side, while being safer to the user. \ + For when you want a controlled explosion that leaves a wider, deeper, hole." + reference = "X4B" + item = /obj/item/storage/backpack/duffel/syndie/x4 + cost = 4 + cant_discount = TRUE + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/explosives/syndicate_bomb name = "Syndicate Bomb" desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 60 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \ @@ -921,6 +986,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) reference = "SB" item = /obj/item/radio/beacon/syndicate/bomb cost = 11 + surplus = 0 + cant_discount = TRUE /datum/uplink_item/explosives/syndicate_minibomb name = "Syndicate Minibomb" @@ -970,13 +1037,22 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) gamemodes = list(/datum/game_mode/nuclear) surplus = 0 -/datum/uplink_item/explosives/atmosgrenades - name = "Atmos Grenades" - desc = "A box of two (2) grenades that wreak havoc with the atmosphere of the target area. Capable of engulfing a large area in lit plasma, or N2O. Deploy with extreme caution!" - reference = "AGG" - item = /obj/item/storage/box/syndie_kit/atmosgasgrenades - cost = 11 +/datum/uplink_item/explosives/atmosn2ogrenades + name = "Knockout Gas Grenades" + desc = "A box of two (2) grenades that spread knockout gas over a large area. Equip internals before using one of these." + reference = "ANG" + item = /obj/item/storage/box/syndie_kit/atmosn2ogrenades + cost = 8 + +/datum/uplink_item/explosives/atmosfiregrenades + name = "Plasma Fire Grenades" + desc = "A box of two (2) grenades that cause large plasma fires. Can be used to deny access to a large area. Most useful if you have an atmospherics hardsuit." + reference = "APG" + item = /obj/item/storage/box/syndie_kit/atmosfiregrenades + hijack_only = TRUE + cost = 12 surplus = 0 + cant_discount = TRUE /datum/uplink_item/explosives/emp name = "EMP Grenades and Implanter Kit" @@ -991,13 +1067,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_tools category = "Stealth and Camouflage Items" -/datum/uplink_item/stealthy_tools/chameleon_jumpsuit - name = "Chameleon Jumpsuit" - desc = "A jumpsuit used to imitate the uniforms of Nanotrasen crewmembers." - reference = "CJ" - item = /obj/item/clothing/under/chameleon - cost = 2 - /datum/uplink_item/stealthy_tools/chameleon_stamp name = "Chameleon Stamp" desc = "A stamp that can be activated to imitate an official Nanotrasen Stamp. The disguised stamp will work exactly like the real stamp and will allow you to forge false documents to gain access or equipment; \ @@ -1016,20 +1085,19 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 35 /datum/uplink_item/stealthy_tools/syndigaloshes - name = "No-Slip Syndicate Shoes" - desc = "These allow you to run on wet floors. They do not work on lubricated surfaces." + name = "No-Slip Chameleon Shoes" + desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \ + They do not work on heavily lubricated surfaces." reference = "NSSS" - item = /obj/item/clothing/shoes/syndigaloshes + item = /obj/item/clothing/shoes/chameleon/noslip cost = 2 excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/syndigaloshes/nuke - name = "Tactical No-Slip Brown Shoes" - desc = "These allow you to run on wet floors. They do not work on lubricated surfaces, and the maker swears they're better than normal ones, somehow." - reference = "NNSSS" + reference = "TNSSS" cost = 4 //but they aren't - gamemodes = list(/datum/game_mode/nuclear) excludefrom = list() + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/chamsechud name = "Chameleon Security HUD" @@ -1039,10 +1107,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 2 /datum/uplink_item/stealthy_tools/thermal - name = "Thermal Imaging Glasses" - desc = "These glasses are thermals disguised as engineers' optical meson scanners. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks." + name = "Thermal Chameleon Glasses" + desc = "These glasses are thermals with Syndicate chameleon technology built into them. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks." reference = "THIG" - item = /obj/item/clothing/glasses/thermal/syndi + item = /obj/item/clothing/glasses/chameleon/thermal cost = 6 /datum/uplink_item/stealthy_tools/traitor_belt @@ -1070,12 +1138,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/card/id/syndicate cost = 2 -/datum/uplink_item/stealthy_tools/voice_changer - name = "Voice Changer" - desc = "A conspicuous gas mask that mimics the voice named on your identification card. When no identification is worn, the mask will render your voice unrecognisable." - reference = "VC" - item = /obj/item/clothing/mask/gas/voice - cost = 3 +/datum/uplink_item/stealthy_tools/chameleon + name = "Chameleon Kit" + desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \ + Due to budget cuts, the shoes don't provide protection against slipping. The set comes with a complementary chameleon stamp." + reference = "CHAM" + item = /obj/item/storage/box/syndie_kit/chameleon + cost = 2 /datum/uplink_item/stealthy_tools/chameleon_proj name = "Chameleon-Projector" @@ -1134,7 +1203,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_tools/clownkit name = "Honk Brand Infiltration Kit" - desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer clown mask, magnetic clown shoes, and standard clown outfit, tools, and backpack." + desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer mask, magnetic clown shoes, and standard clown outfit, tools, and backpack." reference = "HBIK" item = /obj/item/storage/backpack/clown/syndie cost = 6 @@ -1311,13 +1380,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 0 hijack_only = TRUE //This is an item only useful for a hijack traitor, as such, it should only be available in those scenarios. cant_discount = TRUE - excludefrom = list(/datum/game_mode/nuclear) - -/datum/uplink_item/device_tools/singularity_beacon/nuke - reference = "SNGBN" - hijack_only = FALSE // This inherited version exists so nukies can use it while keeping the original hijack only - excludefrom = list() - gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/device_tools/syndicate_detonator name = "Syndicate Detonator" @@ -1342,37 +1404,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/multitool/ai_detect cost = 1 -/datum/uplink_item/device_tools/telecrystal - name = "Raw Telecrystal" - desc = "Telecrystal in its rawest and purest form; can be utilized on active uplinks to increase their telecrystal count." - reference = "RTC" - item = /obj/item/stack/telecrystal - cost = 1 - surplus = 0 - cant_discount = TRUE - -/datum/uplink_item/device_tools/telecrystal/five - name = "5 Raw Telecrystals" - desc = "Five telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count." - reference = "RTCF" - item = /obj/item/stack/telecrystal/five - cost = 5 - -/datum/uplink_item/device_tools/telecrystal/twenty - name = "20 Raw Telecrystals" - desc = "Twenty telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count." - reference = "RTCT" - item = /obj/item/stack/telecrystal/twenty - cost = 20 - -/datum/uplink_item/device_tools/telecrystal/fifty - name = "50 Raw Telecrystals" - desc = "Fifty telecrystals in their rawest and purest form. You know you want that Mauler." - reference = "RTCB" - item = /obj/item/stack/telecrystal/fifty - cost = 50 - gamemodes = list(/datum/game_mode/nuclear) - /datum/uplink_item/device_tools/jammer name = "Radio Jammer" desc = "This device will disrupt any nearby outgoing radio communication when activated." @@ -1409,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 @@ -1472,11 +1503,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) category = "Cybernetic Implants" surplus = 0 gamemodes = list(/datum/game_mode/nuclear) - var/cyber_bundle = FALSE /datum/uplink_item/cyber_implants/spawn_item(turf/loc, obj/item/uplink/U) if(item) - if(findtext(item, /obj/item/organ/internal/cyberimp) && !cyber_bundle) + if(findtext(item, /obj/item/organ/internal/cyberimp)) U.uses -= max(cost, 0) U.used_TC += cost feedback_add_details("traitor_uplink_items_bought", name) //this one and the line before copypasted because snowflaek code @@ -1507,22 +1537,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 12 /datum/uplink_item/cyber_implants/reviver - name = "Reviver Implant" - desc = "This implant will attempt to revive you if you lose consciousness. Comes with an automated implanting tool." + name = "Hardened Reviver Implant" + desc = "This implant will attempt to revive you if you lose consciousness. It is invulnerable to EMPs. Comes with an automated implanting tool." reference = "CIR" - item = /obj/item/organ/internal/cyberimp/chest/reviver + item = /obj/item/organ/internal/cyberimp/chest/reviver/hardened cost = 8 -/datum/uplink_item/cyber_implants/bundle - name = "Cybernetic Implants Bundle" - desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. \ - Comes with an automated implanting tool." - reference = "CIB" - item = /obj/item/storage/box/cyber_implants/bundle - cost = 40 - cyber_bundle = TRUE - cant_discount = TRUE - // POINTLESS BADASSERY /datum/uplink_item/badass @@ -1536,15 +1556,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate cost = 2 -/datum/uplink_item/badass/bundle - name = "Syndicate Bundle" - desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 20 telecrystals, but you do not know which specialisation you will receive." - reference = "SYB" - item = /obj/item/storage/box/syndicate - cost = 20 - excludefrom = list(/datum/game_mode/nuclear) - cant_discount = TRUE - /datum/uplink_item/badass/syndiecards name = "Syndicate Playing Cards" desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, making them lethal weapons both when wielded as a blade and when thrown. \ @@ -1587,50 +1598,81 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 20 gamemodes = list(/datum/game_mode/nuclear) -/*/datum/uplink_item/badass/random - name = "Random Item" - desc = "Picking this choice will send you a random item from the list. Useful for when you cannot think of a strategy to finish your objectives with." - reference = "RAIT" +/datum/uplink_item/bundles_TC + category = "Bundles and Telecrystals" + surplus = 0 + cant_discount = TRUE + +/datum/uplink_item/bundles_TC/bulldog + name = "Bulldog Bundle" + desc = "Lean and mean: Optimized for people that want to get up close and personal. Contains the popular \ + Bulldog shotgun, two 12g buckshot drums, and a pair of Thermal imaging goggles." + reference = "BULB" + item = /obj/item/storage/backpack/duffel/syndie/bulldogbundle + cost = 9 // normally 12 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/bundles_TC/c20r + name = "C-20r Bundle" + desc = "Old Faithful: The classic C-20r, bundled with two magazines and a (surplus) suppressor at discount price." + reference = "C20B" + item = /obj/item/storage/backpack/duffel/syndie/c20rbundle + cost = 14 // normally 17 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/bundles_TC/cyber_implants + name = "Cybernetic Implants Bundle" + desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. \ + Comes with an automated implanting tool." + 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, \ + a Donksoft LMG and a box of riot darts." + reference = "MEDB" + item = /obj/item/storage/backpack/duffel/syndie/med/medicalbundle + cost = 15 // normally 20 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/bundles_TC/sniper + name = "Sniper bundle" + desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, \ + two soporific knockout magazines, a free surplus suppressor, and a sharp-looking tactical turtleneck suit. \ + We'll throw in a free red tie if you order NOW." + reference = "SNPB" + item = /obj/item/storage/briefcase/sniperbundle + cost = 18 // normally 23 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/bundles_TC/badass + name = "Syndicate Bundle" + desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 20 telecrystals, but you do not know which specialisation you will receive." + reference = "SYB" item = /obj/item/storage/box/syndicate - cost = 0 + cost = 20 + excludefrom = list(/datum/game_mode/nuclear) -/datum/uplink_item/badass/random/spawn_item(var/turf/loc, var/obj/item/uplink/U) - - var/list/buyable_items = get_uplink_items() - var/list/possible_items = list() - - for(var/category in buyable_items) - for(var/datum/uplink_item/I in buyable_items[category]) - if(I == src) - continue - if(I.cost > U.uses) - continue - possible_items += I - - if(possible_items.len) - var/datum/uplink_item/I = pick(possible_items) - U.uses -= max(0, I.cost) - feedback_add_details("traitor_uplink_items_bought","RN") - return new I.item(loc) */ - -/datum/uplink_item/badass/surplus_crate +/datum/uplink_item/bundles_TC/surplus_crate name = "Syndicate Surplus Crate" desc = "A crate containing 50 telecrystals worth of random syndicate leftovers." reference = "SYSC" cost = 20 item = /obj/item/storage/box/syndicate excludefrom = list(/datum/game_mode/nuclear) - cant_discount = TRUE // You fucking wish var/crate_value = 50 -/datum/uplink_item/badass/surplus_crate/super +/datum/uplink_item/bundles_TC/surplus_crate/super name = "Syndicate Super Surplus Crate" desc = "A crate containing 125 telecrystals worth of random syndicate leftovers." reference = "SYSS" cost = 40 crate_value = 125 -/datum/uplink_item/badass/surplus_crate/spawn_item(turf/loc, obj/item/uplink/U) +/datum/uplink_item/bundles_TC/surplus_crate/spawn_item(turf/loc, obj/item/uplink/U) var/obj/structure/closet/crate/C = new(loc) var/list/temp_uplink_list = get_uplink_items() var/list/buyable_items = list() @@ -1660,3 +1702,32 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) new item(C) U.purchase_log += "[bicon(item)]" log_game("[key_name(usr)] purchased a surplus crate with [jointext(itemlog, ", ")]") + +/datum/uplink_item/bundles_TC/telecrystal + name = "Raw Telecrystal" + desc = "Telecrystal in its rawest and purest form; can be utilized on active uplinks to increase their telecrystal count." + reference = "RTC" + item = /obj/item/stack/telecrystal + cost = 1 + +/datum/uplink_item/bundles_TC/telecrystal/five + name = "5 Raw Telecrystals" + desc = "Five telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count." + reference = "RTCF" + item = /obj/item/stack/telecrystal/five + cost = 5 + +/datum/uplink_item/bundles_TC/telecrystal/twenty + name = "20 Raw Telecrystals" + desc = "Twenty telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count." + reference = "RTCT" + item = /obj/item/stack/telecrystal/twenty + cost = 20 + +/datum/uplink_item/bundles_TC/telecrystal/fifty + name = "50 Raw Telecrystals" + desc = "Fifty telecrystals in their rawest and purest form. You know you want that Mauler." + reference = "RTCB" + item = /obj/item/stack/telecrystal/fifty + cost = 50 + gamemodes = list(/datum/game_mode/nuclear) \ No newline at end of file diff --git a/code/datums/vision_override.dm b/code/datums/vision_override.dm index 140ceb8d5fa..86aab6d65ec 100644 --- a/code/datums/vision_override.dm +++ b/code/datums/vision_override.dm @@ -1,13 +1,15 @@ /datum/vision_override var/name = "vision override" - var/see_in_dark = 0 - var/see_invisible = 0 - var/light_sensitive = 0 + var/sight_flags = 0 + var/see_in_dark = 0 + var/lighting_alpha + + var/light_sensitive = 0 /datum/vision_override/nightvision see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE /datum/vision_override/nightvision/thermals sight_flags = SEE_MOBS diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 2f3a4c4bcba..6d36b81f7b4 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -28,6 +28,7 @@ var/impacted_z_levels // The list of z-levels that this weather is actively affecting var/overlay_layer = AREA_LAYER //Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that. + var/overlay_plane = BLACKNESS_PLANE var/aesthetic = FALSE //If the weather has no purpose other than looks var/immunity_type = "storm" //Used by mobs to prevent them from being affected by the weather @@ -106,6 +107,8 @@ /datum/weather/proc/can_weather_act(mob/living/L) //Can this weather impact a mob? var/turf/mob_turf = get_turf(L) + if(!istype(L)) + return if(mob_turf && !(mob_turf.z in impacted_z_levels)) return if(immunity_type in L.weather_immunities) @@ -121,6 +124,7 @@ for(var/V in impacted_areas) var/area/N = V N.layer = overlay_layer + N.plane = overlay_plane N.icon = 'icons/effects/weather_effects.dmi' N.invisibility = 0 N.color = weather_color @@ -135,6 +139,6 @@ N.color = null N.icon_state = "" N.icon = 'icons/turf/areas.dmi' - N.layer = AREA_LAYER //Just default back to normal area stuff since I assume setting a var is faster than initial - N.invisibility = INVISIBILITY_MAXIMUM + N.layer = initial(N.layer) + N.plane = initial(N.plane) N.set_opacity(FALSE) diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index 3f4c57c4196..dbc75cb9bf0 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -16,12 +16,12 @@ end_duration = 300 end_overlay = "light_ash" - area_type = /area/mine/dangerous // /area/lavaland/surface/outdoors + area_type = /area/lavaland/surface/outdoors target_trait = ORE_LEVEL immunity_type = "ash" -// probability = 90 + probability = 90 barometer_predictable = TRUE @@ -81,7 +81,7 @@ if(ishuman(L)) //Are you immune? var/mob/living/carbon/human/H = L var/thermal_protection = H.get_thermal_protection() - if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) + if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) return TRUE L = L.loc //Matryoshka check return FALSE //RIP you @@ -105,4 +105,4 @@ aesthetic = TRUE -// probability = 10 \ No newline at end of file + probability = 10 \ No newline at end of file diff --git a/code/datums/weather/weather_types/floor_is_lava.dm b/code/datums/weather/weather_types/floor_is_lava.dm index 6d06e3ca1ef..72f49ad5057 100644 --- a/code/datums/weather/weather_types/floor_is_lava.dm +++ b/code/datums/weather/weather_types/floor_is_lava.dm @@ -19,6 +19,7 @@ target_trait = STATION_LEVEL overlay_layer = ABOVE_OPEN_TURF_LAYER //Covers floors only + overlay_plane = FLOOR_PLANE immunity_type = "lava" 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/defines/procs/radio.dm b/code/defines/procs/radio.dm index f41bea79048..84d3ddaae78 100644 --- a/code/defines/procs/radio.dm +++ b/code/defines/procs/radio.dm @@ -13,8 +13,8 @@ if(SYNDTEAM_FREQ) freq_text = "#unid" else - for(var/channel in radiochannels) - if(radiochannels[channel] == display_freq) + for(var/channel in SSradio.radiochannels) + if(SSradio.radiochannels[channel] == display_freq) freq_text = channel break diff --git a/code/game/area/Dynamic areas.dm b/code/game/area/Dynamic areas.dm index 1cb24e23512..c6d1154847b 100644 --- a/code/game/area/Dynamic areas.dm +++ b/code/game/area/Dynamic areas.dm @@ -24,18 +24,21 @@ match_tag = "arrivals" match_width = 5 match_height = 4 - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/dynamic/source/lobby_russian name = "\improper Russian Lounge" match_tag = "arrivals" match_width = 5 match_height = 4 - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/dynamic/source/lobby_disco name = "\improper Disco Lounge" match_tag = "arrivals" match_width = 5 match_height = 4 - requires_power = 0 \ No newline at end of file + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED \ No newline at end of file diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 067223c0285..d5b4faef17c 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1,2730 +1,2350 @@ -/* - -### This file contains a list of all the areas in your station. Format is as follows: - -/area/CATEGORY/OR/DESCRIPTOR/NAME (you can make as many subdivisions as you want) - name = "NICE NAME" (not required but makes things really nice) - icon = "ICON FILENAME" (defaults to areas.dmi) - icon_state = "NAME OF ICON" (defaults to "unknown" (blank)) - requires_power = 0 (defaults to 1) - music = "music/music.ogg" (defaults to "music/music.ogg") - -NOTE: there are two lists of areas in the end of this file: centcom and station itself. Please maintain these lists valid. --rastaf0 - -*/ - - - -/area - var/fire = null - var/atmosalm = ATMOS_ALARM_NONE - var/poweralm = 1 - var/party = null - var/report_alerts = 1 // Should atmos alerts notify the AI/computers - level = null - name = "Space" - icon = 'icons/turf/areas.dmi' - icon_state = "unknown" - layer = AREA_LAYER - luminosity = 0 - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - invisibility = INVISIBILITY_LIGHTING - var/valid_territory = TRUE //used for cult summoning areas on station zlevel - var/map_name // Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints. - var/lightswitch = 1 - - var/eject = null - - var/debug = 0 - var/requires_power = 1 - var/always_unpowered = 0 //this gets overriden to 1 for space in area/New() - - var/power_equip = 1 - var/power_light = 1 - var/power_environ = 1 - var/music = null - var/used_equip = 0 - var/used_light = 0 - var/used_environ = 0 - var/static_equip - var/static_light = 0 - var/static_environ - - var/has_gravity = 1 - var/list/apc = list() - var/no_air = null -// var/list/lights // list of all lights on this area - var/air_doors_activated = 0 - - var/tele_proof = 0 - var/no_teleportlocs = 0 - - var/outdoors = 0 //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room) - var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default? - var/nad_allowed = FALSE //is the station NAD allowed on this area? - -/*Adding a wizard area teleport list because motherfucking lag -- Urist*/ -/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ -var/list/teleportlocs = list() -/hook/startup/proc/process_teleport_locs() - for(var/area/AR in world) - if(AR.no_teleportlocs) continue - if(teleportlocs.Find(AR.name)) continue - var/turf/picked = safepick(get_area_turfs(AR.type)) - if(picked && is_station_level(picked.z)) - teleportlocs += AR.name - teleportlocs[AR.name] = AR - - teleportlocs = sortAssoc(teleportlocs) - - return 1 - -var/list/ghostteleportlocs = list() -/hook/startup/proc/process_ghost_teleport_locs() - for(var/area/AR in world) - if(ghostteleportlocs.Find(AR.name)) continue - var/list/turfs = get_area_turfs(AR.type) - if(turfs.len) - ghostteleportlocs += AR.name - ghostteleportlocs[AR.name] = AR - - ghostteleportlocs = sortAssoc(ghostteleportlocs) - - return 1 - -/*-----------------------------------------------------------------------------*/ - -/area/engine/ - -/area/turret_protected/ - -/area/arrival - requires_power = 0 - -/area/arrival/start - name = "\improper Arrival Area" - icon_state = "start" - -/area/admin/ - name = "\improper Admin Room" - icon_state = "start" - requires_power = 0 - dynamic_lighting = 0 - - -/area/adminconstruction - name = "\improper Admin Testing Area" - icon_state = "start" - requires_power = 0 - dynamic_lighting = 0 - -/area/space - icon_state = "space" - requires_power = 1 - always_unpowered = 1 - power_light = 0 - power_equip = 0 - power_environ = 0 - valid_territory = FALSE - outdoors = 1 - ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg') - -/area/space/atmosalert() - return - -/area/space/fire_alert() - return - -/area/space/fire_reset() - return - -/area/space/readyalert() - return - -/area/space/partyalert() - return - -//These are shuttle areas, they must contain two areas in a subgroup if you want to move a shuttle from one -//place to another. Look at escape shuttle for example. -//All shuttles show now be under shuttle since we have smooth-wall code. - -/area/shuttle - no_teleportlocs = 1 - requires_power = 0 - valid_territory = FALSE - -/area/shuttle/arrival - name = "\improper Arrival Shuttle" - -/area/shuttle/arrival/pre_game - icon_state = "shuttle2" - -/area/shuttle/arrival/station - icon_state = "shuttle" - -/area/shuttle/auxillary_base - icon_state = "shuttle" - -/area/shuttle/escape - name = "\improper Emergency Shuttle" - music = "music/escape.ogg" - icon_state = "shuttle2" - nad_allowed = TRUE - -/area/shuttle/pod_1 - name = "\improper Escape Pod One" - music = "music/escape.ogg" - icon_state = "shuttle" - nad_allowed = TRUE - -/area/shuttle/pod_2 - name = "\improper Escape Pod Two" - music = "music/escape.ogg" - icon_state = "shuttle" - nad_allowed = TRUE - -/area/shuttle/pod_3 - name = "\improper Escape Pod Three" - music = "music/escape.ogg" - icon_state = "shuttle" - nad_allowed = TRUE - -/area/shuttle/pod_4 - name = "\improper Escape Pod Four" - music = "music/escape.ogg" - icon_state = "shuttle" - nad_allowed = TRUE - -/area/shuttle/escape_pod1 - name = "\improper Escape Pod One" - music = "music/escape.ogg" - nad_allowed = TRUE - -/area/shuttle/escape_pod1/station - icon_state = "shuttle2" - -/area/shuttle/escape_pod1/centcom - icon_state = "shuttle" - -/area/shuttle/escape_pod1/transit - icon_state = "shuttle" - -/area/shuttle/escape_pod2 - name = "\improper Escape Pod Two" - music = "music/escape.ogg" - nad_allowed = TRUE - -/area/shuttle/escape_pod2/station - icon_state = "shuttle2" - -/area/shuttle/escape_pod2/centcom - icon_state = "shuttle" - -/area/shuttle/escape_pod2/transit - icon_state = "shuttle" - -/area/shuttle/escape_pod3 - name = "\improper Escape Pod Three" - music = "music/escape.ogg" - nad_allowed = TRUE - -/area/shuttle/escape_pod3/station - icon_state = "shuttle2" - -/area/shuttle/escape_pod3/centcom - icon_state = "shuttle" - -/area/shuttle/escape_pod3/transit - icon_state = "shuttle" - -/area/shuttle/escape_pod5 //Pod 4 was lost to meteors - name = "\improper Escape Pod Five" - music = "music/escape.ogg" - nad_allowed = TRUE - -/area/shuttle/escape_pod5/station - icon_state = "shuttle2" - -/area/shuttle/escape_pod5/centcom - icon_state = "shuttle" - -/area/shuttle/escape_pod5/transit - icon_state = "shuttle" - -/area/shuttle/mining - name = "\improper Mining Shuttle" - music = "music/escape.ogg" - icon_state = "shuttle" - -/area/shuttle/transport - icon_state = "shuttle" - name = "\improper Transport Shuttle" - -/area/shuttle/transport1 - icon_state = "shuttle" - name = "\improper Transport Shuttle" - -/area/shuttle/alien/base - icon_state = "shuttle" - name = "\improper Alien Shuttle Base" - requires_power = 1 - -/area/shuttle/alien/mine - icon_state = "shuttle" - name = "\improper Alien Shuttle Mine" - requires_power = 1 - -/area/shuttle/gamma/space - icon_state = "shuttle" - name = "\improper Gamma Armory" - requires_power = 0 - -/area/shuttle/gamma/station - icon_state = "shuttle" - name = "\improper Gamma Armory Station" - requires_power = 0 - -/area/shuttle/prison/ - name = "\improper Prison Shuttle" - -/area/shuttle/prison/station - icon_state = "shuttle" - -/area/shuttle/prison/prison - icon_state = "shuttle2" - -/area/shuttle/siberia - name = "\improper Labor Camp Shuttle" - music = "music/escape.ogg" - icon_state = "shuttle" - -/area/shuttle/specops - name = "\improper Special Ops Shuttle" - icon_state = "shuttlered" - -/area/shuttle/specops/centcom - name = "\improper Special Ops Shuttle" - icon_state = "shuttlered" - -/area/shuttle/specops/station - name = "\improper Special Ops Shuttle" - icon_state = "shuttlered2" - -/area/shuttle/syndicate_elite - name = "\improper Syndicate Elite Shuttle" - icon_state = "shuttlered" - nad_allowed = TRUE - -/area/shuttle/syndicate_elite/mothership - name = "\improper Syndicate Elite Shuttle" - icon_state = "shuttlered" - -/area/shuttle/syndicate_elite/station - name = "\improper Syndicate Elite Shuttle" - icon_state = "shuttlered2" - -/area/shuttle/syndicate_sit - name = "\improper Syndicate SIT Shuttle" - icon_state = "shuttlered" - nad_allowed = TRUE - -/area/shuttle/assault_pod - name = "Steel Rain" - icon_state = "shuttle" - -/area/shuttle/administration - name = "\improper Administration Shuttle" - icon_state = "shuttlered" - -/area/shuttle/administration/centcom - name = "\improper Administration Shuttle Centcom" - icon_state = "shuttlered" - -/area/shuttle/administration/station - name = "\improper Administration Shuttle" - icon_state = "shuttlered2" - -/area/shuttle/thunderdome - name = "honk" - -/area/shuttle/thunderdome/grnshuttle - name = "\improper Thunderdome GRN Shuttle" - icon_state = "green" - -/area/shuttle/thunderdome/grnshuttle/dome - name = "\improper GRN Shuttle" - icon_state = "shuttlegrn" - -/area/shuttle/thunderdome/grnshuttle/station - name = "\improper GRN Station" - icon_state = "shuttlegrn2" - -/area/shuttle/thunderdome/redshuttle - name = "\improper Thunderdome RED Shuttle" - icon_state = "red" - -/area/shuttle/thunderdome/redshuttle/dome - name = "\improper RED Shuttle" - icon_state = "shuttlered" - -/area/shuttle/thunderdome/redshuttle/station - name = "\improper RED Station" - icon_state = "shuttlered2" -// === Trying to remove these areas: - -/area/shuttle/research - name = "\improper Research Shuttle" - music = "music/escape.ogg" - icon_state = "shuttle" - -/area/shuttle/research/station - icon_state = "shuttle2" - -/area/shuttle/research/outpost - icon_state = "shuttle" - -/area/shuttle/vox - name = "\improper Vox Skipjack" - icon_state = "shuttle" - requires_power = 0 - -/area/shuttle/vox/station - name = "\improper Vox Skipjack" - icon_state = "yellow" - requires_power = 0 - -/area/shuttle/salvage - name = "\improper Salvage Ship" - icon_state = "yellow" - requires_power = 0 - -/area/shuttle/salvage/start - name = "\improper Middle of Nowhere" - icon_state = "yellow" - -/area/shuttle/salvage/arrivals - name = "\improper Space Station Auxiliary Docking" - icon_state = "yellow" - -/area/shuttle/salvage/derelict - name = "\improper Derelict Station" - icon_state = "yellow" - -/area/shuttle/salvage/djstation - name = "\improper Ruskie DJ Station" - icon_state = "yellow" - -/area/shuttle/salvage/north - name = "\improper North of the Station" - icon_state = "yellow" - -/area/shuttle/salvage/east - name = "\improper East of the Station" - icon_state = "yellow" - -/area/shuttle/salvage/south - name = "\improper South of the Station" - icon_state = "yellow" - -/area/shuttle/salvage/commssat - name = "\improper The Communications Satellite" - icon_state = "yellow" - -/area/shuttle/salvage/mining - name = "\improper South-West of the Mining Asteroid" - icon_state = "yellow" - -/area/shuttle/salvage/abandoned_ship - name = "\improper Abandoned Ship" - icon_state = "yellow" - -/area/shuttle/salvage/clown_asteroid - name = "\improper Clown Asteroid" - icon_state = "yellow" - -/area/shuttle/salvage/trading_post - name = "\improper Trading Post" - icon_state = "yellow" - -/area/shuttle/salvage/transit - name = "\improper hyperspace" - icon_state = "shuttle" - -/area/shuttle/supply - name = "Supply Shuttle" - icon_state = "shuttle3" - requires_power = 0 - -/area/shuttle/abandoned - name = "Abandoned Ship" - icon_state = "shuttle" - -/area/shuttle/syndicate - name = "Syndicate Nuclear Team Shuttle" - icon_state = "shuttle" - nad_allowed = TRUE - -/area/shuttle/trade - name = "Trade Shuttle" - icon_state = "shuttle" - requires_power = 0 - -/area/shuttle/trade/sol - name = "Sol Freighter" - -/area/shuttle/freegolem - name = "Free Golem Ship" - icon_state = "purple" - xenobiology_compatible = TRUE - -/area/airtunnel1/ // referenced in airtunnel.dm:759 - -/area/dummy/ // Referenced in engine.dm:261 - -/area/start // will be unused once kurper gets his login interface patch done - name = "start area" - icon_state = "start" - requires_power = 0 - luminosity = 1 - dynamic_lighting = 0 - has_gravity = 1 - -// === end remove - -/area/alien - name = "\improper Alien base" - icon_state = "yellow" - requires_power = 0 - -// CENTCOM - -/area/centcom - name = "\improper Centcom" - icon_state = "centcom" - requires_power = 0 - dynamic_lighting = 0 - nad_allowed = TRUE - -/area/centcom/control - name = "\improper Centcom Control" - icon_state = "centcom_ctrl" - -/area/centcom/evac - name = "\improper Centcom Emergency Shuttle" - icon_state = "centcom_evac" - -/area/centcom/suppy - name = "\improper Centcom Supply Shuttle" - icon_state = "centcom_supply" - -/area/centcom/ferry - name = "\improper Centcom Transport Shuttle" - icon_state = "centcom_ferry" - -/area/centcom/shuttle - name = "\improper Centcom Administration Shuttle" - -/area/centcom/test - name = "\improper Centcom Testing Facility" - -/area/centcom/living - name = "\improper Centcom Living Quarters" - -/area/centcom/specops - name = "\improper Centcom Special Ops" - icon_state = "centcom_specops" - -/area/centcom/gamma - name = "\improper Centcom Gamma Armory" - icon_state = "centcom_gamma" - -/area/centcom/holding - name = "\improper Holding Facility" - -/area/centcom/bathroom - name = "\improper Centcom Emergency Shuttle Bathrooms" - -//SYNDICATES - -/area/syndicate_mothership - name = "\improper Syndicate Forward Base" - icon_state = "syndie-ship" - requires_power = 0 - nad_allowed = TRUE - -/area/syndicate_mothership/control - name = "\improper Syndicate Control Room" - icon_state = "syndie-control" - -/area/syndicate_mothership/elite_squad - name = "\improper Syndicate Elite Squad" - icon_state = "syndie-elite" - -/area/syndicate_mothership/infteam - name = "\improper Syndicate Infiltrators" - icon_state = "syndie-elite" - -//EXTRA - -/area/asteroid // -- TLE - name = "\improper Asteroid" - icon_state = "asteroid" - requires_power = 0 - valid_territory = FALSE - -/area/asteroid/cave // -- TLE - name = "\improper Asteroid - Underground" - icon_state = "cave" - requires_power = 0 - outdoors = 1 - -/area/asteroid/artifactroom - name = "\improper Asteroid - Artifact" - icon_state = "cave" - -/area/tdome - name = "\improper Thunderdome" - icon_state = "thunder" - requires_power = 0 - dynamic_lighting = 0 - - -/area/tdome/arena_source - name = "\improper Thunderdome Arena Template" - icon_state = "thunder" - -/area/tdome/arena - name = "\improper Thunderdome Arena" - icon_state = "thunder" - -/area/tdome/tdome1 - name = "\improper Thunderdome (Team 1)" - icon_state = "green" - -/area/tdome/tdome2 - name = "\improper Thunderdome (Team 2)" - icon_state = "yellow" - -/area/tdome/tdomeadmin - name = "\improper Thunderdome (Admin.)" - icon_state = "purple" - -/area/tdome/tdomeobserve - name = "\improper Thunderdome (Observer.)" - icon_state = "purple" - -/area/exploration/methlab - name = "\improper Abandoned Drug Lab" - icon_state = "green" - -//ENEMY - -//names are used -/area/syndicate_station - name = "\improper Syndicate Station" - icon_state = "yellow" - requires_power = 0 - -/area/syndicate_station/start - name = "\improper Syndicate Forward Operating Base" - icon_state = "yellow" - -/area/syndicate_station/southwest - name = "\improper South-West of SS13" - icon_state = "southwest" - -/area/syndicate_station/northwest - name = "\improper North-West of SS13" - icon_state = "northwest" - -/area/syndicate_station/northeast - name = "\improper North-East of SS13" - icon_state = "northeast" - -/area/syndicate_station/southeast - name = "\improper South-East of SS13" - icon_state = "southeast" - -/area/syndicate_station/north - name = "\improper North of SS13" - icon_state = "north" - -/area/syndicate_station/south - name = "\improper South of SS13" - icon_state = "south" - -/area/syndicate_station/commssat - name = "\improper South of the Communication Satellite" - icon_state = "south" - -/area/syndicate_station/mining - name = "\improper North-East of the Mining Asteroid" - icon_state = "north" - -/area/syndicate_station/transit - name = "\improper Hyperspace" - icon_state = "shuttle" - -//Abductors -/area/abductor_ship - name = "\improper Abductor Ship" - icon_state = "yellow" - requires_power = 0 - has_gravity = 1 - dynamic_lighting = 0 - -/area/wizard_station - name = "\improper Wizard's Den" - icon_state = "yellow" - requires_power = 0 - -/area/ninja - name = "\improper Ninja Area Parent" - icon_state = "ninjabase" - requires_power = 0 - no_teleportlocs = 1 - -/area/ninja/outpost - name = "\improper SpiderClan Outpost" - -/area/ninja/holding - name = "\improper SpiderClan Holding Facility" - -/area/vox_station - name = "\improper Vox Base" - icon_state = "yellow" - requires_power = 0 - dynamic_lighting = 0 - no_teleportlocs = 1 - -/area/vox_station/transit - name = "\improper Hyperspace" - icon_state = "shuttle" - requires_power = 0 - -/area/vox_station/southwest_solars - name = "\improper Aft Port Solars" - icon_state = "southwest" - requires_power = 0 - -/area/vox_station/northwest_solars - name = "\improper Fore Port Solars" - icon_state = "northwest" - requires_power = 0 - -/area/vox_station/northeast_solars - name = "\improper Fore Starboard Solars" - icon_state = "northeast" - requires_power = 0 - -/area/vox_station/southeast_solars - name = "\improper Aft Starboard Solars" - icon_state = "southeast" - requires_power = 0 - -/area/trader_station - name = "Trade Base" - icon_state = "yellow" - requires_power = 0 - -/area/trader_station/sol - name = "Jupiter Station 6" - -/area/vox_station/mining - name = "\improper Nearby Mining Asteroid" - icon_state = "north" - requires_power = 0 - -/area/xenos_station/start - name = "\improper Alien Shuttle" - icon_state = "north" - requires_power = 0 - -/area/xenos_station/transit - name = "\improper Hyperspace" - icon_state = "shuttle" - requires_power = 0 - -/area/xenos_station/southwest - name = "\improper Aft Port Solars Landing Area" - icon_state = "southwest" - requires_power = 0 - -/area/xenos_station/northwest - name = "\improper Fore Port Solars Landing Area" - icon_state = "northwest" - requires_power = 0 - -/area/xenos_station/northeast - name = "\improper Fore Starboard Solars Landing Area" - icon_state = "northeast" - requires_power = 0 - -/area/xenos_station/southeast - name = "\improper Aft Starboard Solars Landing Area" - icon_state = "southeast" - requires_power = 0 - -/area/xenos_station/east - name = "\improper East Landing Area" - icon_state = "east" - requires_power = 0 - -/area/xenos_station/west - name = "\improper West Landing Area" - icon_state = "west" - requires_power = 0 - -/area/xenos_station/researchoutpost - name = "\improper Research Outpost Landing Area" - icon_state = "north" - requires_power = 0 - -/area/xenos_station/miningoutpost - name = "\improper Mining Outpost Landing Area" - icon_state = "south" - requires_power = 0 - -//PRISON -/area/prison - name = "\improper Prison Station" - icon_state = "brig" - -/area/prison/arrival_airlock - name = "\improper Prison Station Airlock" - icon_state = "green" - requires_power = 0 - -/area/prison/control - name = "\improper Prison Security Checkpoint" - icon_state = "security" - -/area/prison/crew_quarters - name = "\improper Prison Security Quarters" - icon_state = "security" - -/area/prison/rec_room - name = "\improper Prison Rec Room" - icon_state = "green" - -/area/prison/closet - name = "\improper Prison Supply Closet" - icon_state = "dk_yellow" - -/area/prison/hallway/fore - name = "\improper Prison Fore Hallway" - icon_state = "yellow" - -/area/prison/hallway/aft - name = "\improper Prison Aft Hallway" - icon_state = "yellow" - -/area/prison/hallway/port - name = "\improper Prison Port Hallway" - icon_state = "yellow" - -/area/prison/hallway/starboard - name = "\improper Prison Starboard Hallway" - icon_state = "yellow" - -/area/prison/morgue - name = "\improper Prison Morgue" - icon_state = "morgue" - -/area/prison/medical_research - name = "\improper Prison Genetic Research" - icon_state = "medresearch" - -/area/prison/medical - name = "\improper Prison Medbay" - icon_state = "medbay" - -/area/prison/solar - name = "\improper Prison Solar Array" - icon_state = "storage" - requires_power = 0 - -/area/prison/podbay - name = "\improper Prison Podbay" - icon_state = "dk_yellow" - -/area/prison/solar_control - name = "\improper Prison Solar Array Control" - icon_state = "dk_yellow" - -/area/prison/solitary - name = "\improper Solitary Confinement" - icon_state = "brig" - -/area/prison/cell_block - name = "\improper Prison Cell Block" - icon_state = "brig" - -/area/prison/cell_block/A - name = "\improper Prison Cell Block A" - icon_state = "brig" - -/area/prison/cell_block/B - name = "\improper Prison Cell Block B" - icon_state = "brig" - -/area/prison/cell_block/C - name = "\improper Prison Cell Block C" - icon_state = "brig" - -//Labor camp -/area/mine/laborcamp - name = "Labor Camp" - icon_state = "brig" - -/area/mine/laborcamp/security - name = "Labor Camp Security" - icon_state = "security" - -//STATION13 - -/area/atmos - name = "Atmospherics" - icon_state = "atmos" - -/area/atmos/control - name = "Atmospherics Control Room" - icon_state = "atmos" - -/area/atmos/distribution - name = "Atmospherics Distribution Loop" - icon_state = "atmos" - -//Maintenance -/area/maintenance - ambientsounds = list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg', 'sound/ambience/ambimaint5.ogg') - valid_territory = FALSE - -/area/maintenance/atmos_control - name = "Atmospherics Maintenance" - icon_state = "fpmaint" - -/area/maintenance/fpmaint - name = "EVA Maintenance" - icon_state = "fpmaint" - -/area/maintenance/fpmaint2 - name = "Arrivals North Maintenance" - icon_state = "fpmaint" - -/area/maintenance/fsmaint - name = "Dormitory Maintenance" - icon_state = "fsmaint" - -/area/maintenance/fsmaint2 - name = "Bar Maintenance" - icon_state = "fsmaint" - -/area/maintenance/asmaint - name = "Medbay Maintenance" - icon_state = "asmaint" - -/area/maintenance/asmaint2 - name = "Science Maintenance" - icon_state = "asmaint" - -/area/maintenance/apmaint - name = "Cargo Maintenance" - icon_state = "apmaint" - -/area/maintenance/maintcentral - name = "Bridge Maintenance" - icon_state = "maintcentral" - -/area/maintenance/fore - name = "Fore Maintenance" - icon_state = "fmaint" - -/area/maintenance/starboard - name = "Starboard Maintenance" - icon_state = "smaint" - -/area/maintenance/port - name = "Locker Room Maintenance" - icon_state = "pmaint" - -/area/maintenance/aft - name = "Engineering Maintenance" - icon_state = "amaint" - -/area/maintenance/engi_shuttle - name = "Engineering Shuttle Access" - icon_state = "maint_e_shuttle" - -/area/maintenance/storage - name = "Atmospherics Maintenance" - icon_state = "green" - -/area/maintenance/incinerator - name = "\improper Incinerator" - icon_state = "disposal" - -/area/maintenance/turbine - name = "\improper Turbine" - icon_state = "disposal" - -/area/maintenance/disposal - name = "Waste Disposal" - icon_state = "disposal" - -/area/maintenance/genetics - name = "Genetics Maintenance" - icon_state = "asmaint" - - -/area/maintenance/electrical - name = "Electrical Maintenance" - icon_state = "yellow" - -/area/maintenance/abandonedbar - name = "Maintenance Bar" - icon_state = "yellow" - power_equip = 0 - power_light = 0 - power_environ = 0 - -/area/maintenance/electrical_shop - name ="Electronics Den" - icon_state = "yellow" - -/area/maintenance/gambling_den - name = "Gambling Den" - icon_state = "yellow" - -/area/maintenance/consarea - name = "Alternate Construction Area" - icon_state = "yellow" - - -//Hallway - -/area/hallway/primary/fore - name = "\improper Fore Primary Hallway" - icon_state = "hallF" - -/area/hallway/primary/starboard - name = "\improper Starboard Primary Hallway" - icon_state = "hallS" - -/area/hallway/primary/starboard/west -/area/hallway/primary/starboard/east - -/area/hallway/primary/aft - name = "\improper Aft Primary Hallway" - icon_state = "hallA" - - -/area/hallway/primary/port - name = "\improper Port Primary Hallway" - icon_state = "hallP" - -/area/hallway/primary/port/west - name = "\improper Port West Hallway" - -/area/hallway/primary/port/east - name = "\improper Port East Hallway" - -/area/hallway/primary/central - name = "\improper Central Primary Hallway" - icon_state = "hallC" - -/area/hallway/primary/central/north -/area/hallway/primary/central/south -/area/hallway/primary/central/west -/area/hallway/primary/central/east -/area/hallway/primary/central/nw -/area/hallway/primary/central/ne -/area/hallway/primary/central/sw -/area/hallway/primary/central/se - -/area/hallway/secondary/exit - name = "\improper Escape Shuttle Hallway" - icon_state = "escape" - -/area/hallway/secondary/construction - name = "\improper Construction Area" - icon_state = "construction" - -/area/hallway/secondary/entry - name = "\improper Arrival Shuttle Hallway" - icon_state = "entry" - -/area/hallway/secondary/entry/north - -/area/hallway/secondary/entry/south - -/area/hallway/secondary/entry/louge - name = "\improper Arrivals Lounge" - - -//Command - -/area/bridge - name = "\improper Bridge" - icon_state = "bridge" - music = "signal" - -/area/bridge/meeting_room - name = "\improper Heads of Staff Meeting Room" - icon_state = "meeting" - music = null - -/area/crew_quarters/captain - name = "\improper Captain's Office" - icon_state = "captain" - -/area/crew_quarters/captain/bedroom - name = "\improper Captain's Bedroom" - icon_state = "captain" - -/area/crew_quarters/recruit - name = "\improper Recruitment Office" - icon_state = "head_quarters" - -/area/crew_quarters/heads/hop - name = "\improper Head of Personnel's Quarters" - icon_state = "head_quarters" - -/area/crew_quarters/heads/hor - name = "\improper Research Director's Quarters" - icon_state = "head_quarters" - -/area/crew_quarters/heads/chief - name = "\improper Chief Engineer's Quarters" - icon_state = "head_quarters" - -/area/crew_quarters/heads/hos - name = "\improper Head of Security's Quarters" - icon_state = "head_quarters" - -/area/crew_quarters/heads/cmo - name = "\improper Chief Medical Officer's Quarters" - icon_state = "head_quarters" - -/area/crew_quarters/courtroom - name = "\improper Courtroom" - icon_state = "courtroom" - -/area/crew_quarters/heads - name = "\improper Head of Personnel's Office" - icon_state = "head_quarters" - -/area/crew_quarters/hor - name = "\improper Research Director's Office" - icon_state = "head_quarters" - -/area/crew_quarters/hos - name = "\improper Head of Security's Office" - icon_state = "head_quarters" - -/area/crew_quarters/chief - name = "\improper Chief Engineer's Office" - icon_state = "head_quarters" - -/area/mint - name = "\improper Mint" - icon_state = "green" - -/area/comms - name = "\improper Communications Relay" - icon_state = "tcomsatcham" - -/area/server - name = "\improper Messaging Server Room" - icon_state = "server" - -/area/ntrep - name = "\improper Nanotrasen Representative's Office" - icon_state = "bluenew" - -/area/blueshield - name = "\improper Blueshield's Office" - icon_state = "blueold" - -/area/centcomdocks - name = "\improper Central Command Docks" - icon_state = "centcom" - -//Crew - -/area/crew_quarters - name = "\improper Dormitories" - icon_state = "Sleep" - -/area/crew_quarters/toilet - name = "\improper Dormitory Toilets" - icon_state = "toilet" - -/area/crew_quarters/sleep - name = "\improper Dormitories" - icon_state = "Sleep" - valid_territory = FALSE - -/area/crew_quarters/sleep_male - name = "\improper Male Dorm" - icon_state = "Sleep" - -/area/crew_quarters/sleep_male/toilet_male - name = "\improper Male Toilets" - icon_state = "toilet" - -/area/crew_quarters/sleep_female - name = "\improper Female Dorm" - icon_state = "Sleep" - -/area/crew_quarters/sleep_female/toilet_female - name = "\improper Female Toilets" - icon_state = "toilet" - -/area/crew_quarters/locker - name = "\improper Locker Room" - icon_state = "locker" - -/area/crew_quarters/locker/locker_toilet - name = "\improper Locker Toilets" - icon_state = "toilet" - -/area/crew_quarters/fitness - name = "\improper Fitness Room" - icon_state = "fitness" - -/area/crew_quarters/dorms - name = "\improper Dorms" - icon_state = "dorms" - -/area/crew_quarters/arcade - name = "\improper Arcade" - icon_state = "arcade" - -/area/crew_quarters/cafeteria - name = "\improper Cafeteria" - icon_state = "cafeteria" - -/area/crew_quarters/kitchen - name = "\improper Kitchen" - icon_state = "kitchen" - -/area/crew_quarters/bar - name = "\improper Bar" - icon_state = "bar" - -/area/crew_quarters/bar/atrium - name = "Atrium" - icon_state = "bar" - -/area/crew_quarters/theatre - name = "\improper Theatre" - icon_state = "Theatre" - -/area/crew_quarters/mrchangs - name = "\improper Mr Chang's" - icon_state = "Theatre" - -/area/library - name = "\improper Library" - icon_state = "library" - -/area/library/abandoned - name = "\improper Abandoned Library" - icon_state = "library" - -/area/chapel/main - name = "\improper Chapel" - icon_state = "chapel" - ambientsounds = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/music/traitor.ogg') - -/area/chapel/office - name = "\improper Chapel Office" - icon_state = "chapeloffice" - -/area/escapepodbay - name = "\improper Escape Shuttle Hallway Podbay" - icon_state = "escape" - -/area/lawoffice - name = "\improper Law Office" - icon_state = "law" - -/area/magistrateoffice - name = "\improper Magistrate's Office" - icon_state = "magistrate" - -/area/clownoffice - name = "\improper Clown's Office" - icon_state = "clown_office" - -/area/mimeoffice - name = "\improper Mime's Office" - icon_state = "mime_office" - -/area/civilian/barber - name = "\improper Barber Shop" - icon_state = "barber" - -/area/civilian/clothing - name = "\improper Clothing Shop" - icon_state = "Theatre" - -/area/civilian/pet_store - name = "\improper Pet Store" - icon_state = "pet_store" - -/area/holodeck - name = "\improper Holodeck" - icon_state = "Holodeck" - dynamic_lighting = 0 - -/area/holodeck/alphadeck - name = "\improper Holodeck Alpha" - - -/area/holodeck/source_plating - name = "\improper Holodeck - Off" - icon_state = "Holodeck" - -/area/holodeck/source_emptycourt - name = "\improper Holodeck - Empty Court" - -/area/holodeck/source_boxingcourt - name = "\improper Holodeck - Boxing Court" - -/area/holodeck/source_basketball - name = "\improper Holodeck - Basketball Court" - -/area/holodeck/source_thunderdomecourt - name = "\improper Holodeck - Thunderdome Court" - -/area/holodeck/source_beach - name = "\improper Holodeck - Beach" - icon_state = "Holodeck" // Lazy. - -/area/holodeck/source_burntest - name = "\improper Holodeck - Atmospheric Burn Test" - -/area/holodeck/source_wildlife - name = "\improper Holodeck - Wildlife Simulation" - -/area/holodeck/source_meetinghall - name = "\improper Holodeck - Meeting Hall" - -/area/holodeck/source_theatre - name = "\improper Holodeck - Theatre" - -/area/holodeck/source_picnicarea - name = "\improper Holodeck - Picnic Area" - -/area/holodeck/source_snowfield - name = "\improper Holodeck - Snow Field" - -/area/holodeck/source_desert - name = "\improper Holodeck - Desert" - -/area/holodeck/source_space - name = "\improper Holodeck - Space" - -/area/holodeck/source_knightarena - name = "\improper Holodeck - Knight Arena" - - -//Embassies -/area/embassy/ - name = "\improper Embassy Hallway" - -/area/embassy/tajaran - name = "\improper Tajaran Embassy" - icon_state = "tajaran" - -/area/embassy/skrell - name = "\improper Skrell Embassy" - icon_state = "skrell" - -/area/embassy/unathi - name = "\improper Unathi Embassy" - icon_state = "unathi" - -/area/embassy/kidan - name = "\improper Kidan Embassy" - icon_state = "kidan" - -/area/embassy/diona - name = "\improper Diona Embassy" - icon_state = "diona" - -/area/embassy/slime - name = "\improper Slime Person Embassy" - icon_state = "slime" - -/area/embassy/grey - name = "\improper Grey Embassy" - icon_state = "grey" - -/area/embassy/vox - name = "\improper Vox Embassy" - icon_state = "vox" - - - -//Engineering -/area/engine - ambientsounds = list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg') - -/area/engine/engine_smes - name = "\improper Engineering SMES" - icon_state = "engine_smes" - requires_power = 0//This area only covers the batteries and they deal with their own power - -/area/engine/engineering - name = "Engineering" - icon_state = "engine_smes" - -/area/engine/break_room - name = "\improper Engineering Foyer" - icon_state = "engine" - -/area/engine/equipmentstorage - name = "\improper Engineering Equipment Storage" - icon_state = "storage" - -/area/engine/hardsuitstorage - name = "\improper Engineering Hardsuit Storage" - icon_state = "storage" - -/area/engine/controlroom - name = "\improper Engineering Control Room" - icon_state = "engine_control" - -/area/engine/gravitygenerator - name = "\improper Gravity Generator" - icon_state = "engine" - -/area/engine/chiefs_office - name = "\improper Chief Engineer's office" - icon_state = "engine_control" - -/area/engine/mechanic_workshop - name = "\improper Mechanic Workshop" - icon_state = "engine" - -/area/engine/mechanic_workshop/hanger - name = "\improper Hanger Bay" - icon_state = "engine" - -/area/engine/supermatter - name = "\improper Supermatter Engine" - icon_state = "engine" - -//Solars - -/area/solar - requires_power = 0 - dynamic_lighting = 0 - valid_territory = FALSE - -/area/solar/auxport - name = "\improper Fore Port Solar Array" - icon_state = "panelsA" - -/area/solar/auxstarboard - name = "\improper Fore Starboard Solar Array" - icon_state = "panelsA" - -/area/solar/fore - name = "\improper Fore Solar Array" - icon_state = "yellow" - -/area/solar/aft - name = "\improper Aft Solar Array" - icon_state = "aft" - -/area/solar/starboard - name = "\improper Aft Starboard Solar Array" - icon_state = "panelsS" - -/area/solar/port - name = "\improper Aft Port Solar Array" - icon_state = "panelsP" - -/area/maintenance/auxsolarport - name = "\improper Fore Port Solar Maintenance" - icon_state = "SolarcontrolA" - -/area/maintenance/starboardsolar - name = "\improper Aft Starboard Solar Maintenance" - icon_state = "SolarcontrolS" - -/area/maintenance/portsolar - name = "\improper Aft Port Solar Maintenance" - icon_state = "SolarcontrolP" - -/area/maintenance/auxsolarstarboard - name = "\improper Fore Starboard Solar Maintenance" - icon_state = "SolarcontrolA" - - -/area/assembly/chargebay - name = "\improper Mech Bay" - icon_state = "mechbay" - -/area/assembly/showroom - name = "\improper Robotics Showroom" - icon_state = "showroom" - -/area/assembly/robotics - name = "\improper Robotics Lab" - icon_state = "ass_line" - -/area/assembly/assembly_line //Derelict Assembly Line - name = "\improper Assembly Line" - icon_state = "ass_line" - power_equip = 0 - power_light = 0 - power_environ = 0 - -//Teleporter - -/area/teleporter - name = "\improper Teleporter" - icon_state = "teleporter" - music = "signal" - -/area/gateway - name = "\improper Gateway" - icon_state = "teleporter" - music = "signal" - -/area/AIsattele - name = "\improper Abandoned Teleporter" - icon_state = "teleporter" - music = "signal" - ambientsounds = list('sound/ambience/ambimalf.ogg') - -/area/toxins/explab - name = "\improper E.X.P.E.R.I-MENTOR Lab" - icon_state = "toxmisc" - -/area/toxins/explab_chamber - name = "\improper E.X.P.E.R.I-MENTOR Chamber" - icon_state = "toxmisc" - -//MedBay - -/area/medical/medbay - name = "\improper Medbay" - icon_state = "medbay" - music = 'sound/ambience/signal.ogg' - -//Medbay is a large area, these additional areas help level out APC load. -/area/medical/medbay2 - name = "\improper Medbay" - icon_state = "medbay2" - music = 'sound/ambience/signal.ogg' - -/area/medical/medbay3 - name = "\improper Medbay" - icon_state = "medbay3" - music = 'sound/ambience/signal.ogg' - - -/area/medical/biostorage - name = "\improper Medical Storage" - icon_state = "medbaysecstorage" - music = 'sound/ambience/signal.ogg' - -/area/medical/reception - name = "\improper Medbay Reception" - icon_state = "medbay" - music = 'sound/ambience/signal.ogg' - -/area/medical/psych - name = "\improper Psych Room" - icon_state = "medbaypsych" - music = 'sound/ambience/signal.ogg' - -/area/medical/medbreak - name = "\improper Break Room" - icon_state = "medbaybreak" - music = 'sound/ambience/signal.ogg' - -/area/medical/patients_rooms - name = "\improper Patient's Rooms" - icon_state = "patients" - -/area/medical/ward - name = "\improper Medbay Patient Ward" - icon_state = "patientsward" - -/area/medical/patient_a - name = "\improper Isolation A" - icon_state = "medbayisoa" - -/area/medical/patient_b - name = "\improper Isolation B" - icon_state = "medbayisob" - -/area/medical/patient_c - name = "\improper Isolation C" - icon_state = "medbayisoc" - -/area/medical/iso_access - name = "\improper Isolation Access" - icon_state = "medbayisoaccess" - -/area/medical/cmo - name = "\improper Chief Medical Officer's office" - icon_state = "CMO" - -/area/medical/cmostore - name = "\improper Medical Secondary Storage" - icon_state = "medbaysecstorage" - -/area/medical/robotics - name = "\improper Robotics" - icon_state = "medresearch" - -/area/medical/research - name = "\improper Medical Research" - icon_state = "medresearch" - -/area/medical/research_shuttle_dock - name = "\improper Research Shuttle Dock" - icon_state = "medresearch" - -/area/medical/virology - name = "\improper Virology" - icon_state = "virology" - -/area/medical/virology/lab - name = "\improper Virology Laboratory" - icon_state = "virology" - -/area/medical/morgue - name = "\improper Morgue" - icon_state = "morgue" - ambientsounds = list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg') - -/area/medical/chemistry - name = "\improper Chemistry" - icon_state = "chem" - -/area/medical/surgery - name = "\improper Surgery" - icon_state = "surgery" - -/area/medical/surgery1 - name = "\improper Surgery 1" - icon_state = "surgery1" - -/area/medical/surgery2 - name = "\improper Surgery 2" - icon_state = "surgery2" - -/area/medical/surgeryobs - name = "\improper Surgery Observation" - icon_state = "surgery" - -/area/medical/cryo - name = "\improper Cryogenics" - icon_state = "cryo" - -/area/medical/exam_room - name = "\improper Exam Room" - icon_state = "exam_room" - -/area/medical/genetics - name = "\improper Genetics Lab" - icon_state = "genetics" - -/area/medical/genetics_cloning - name = "\improper Cloning Lab" - icon_state = "cloning" - -/area/medical/sleeper - name = "\improper Medical Treatment Center" - icon_state = "exam_room" - -/area/medical/paramedic - name = "\improper Paramedic" - icon_state = "medbay" - -//Security - -/area/security/main - name = "\improper Security Office" - icon_state = "securityoffice" - -/area/security/lobby - name = "\improper Security Lobby" - icon_state = "securitylobby" - -/area/security/brig - name = "\improper Brig" - icon_state = "brig" - -/area/security/brig/prison_break() - for(var/obj/structure/closet/secure_closet/brig/temp_closet in src) - temp_closet.locked = 0 - temp_closet.icon_state = temp_closet.icon_closed - for(var/obj/machinery/door_timer/temp_timer in src) - temp_timer.releasetime = 1 - ..() - -/area/security/permabrig - name = "\improper Prison Wing" - icon_state = "sec_prison_perma" - -/area/security/prison - name = "\improper Prison Wing" - icon_state = "sec_prison" - -/area/security/prison/prison_break() - for(var/obj/structure/closet/secure_closet/brig/temp_closet in src) - temp_closet.locked = 0 - temp_closet.icon_state = temp_closet.icon_closed - for(var/obj/machinery/door_timer/temp_timer in src) - temp_timer.releasetime = 1 - ..() - -/area/security/prison/cell_block - name = "\improper Prison Cell Block" - icon_state = "brig" - -/area/security/prison/cell_block/A - name = "\improper Prison Cell Block A" - icon_state = "brigcella" - -/area/security/prison/cell_block/B - name = "\improper Prison Cell Block B" - icon_state = "brigcellb" - -/area/security/prison/cell_block/C - name = "\improper Prison Cell Block C" - icon_state = "brig" - -/area/security/execution - name = "\improper Execution" - icon_state = "execution" - -/area/security/processing - name = "\improper Prisoner Processing" - icon_state = "prisonerprocessing" - -/area/security/interrogation - name = "\improper Interrogation" - icon_state = "interrogation" - -/area/security/seceqstorage - name = "\improper Security Equipment Storage" - icon_state = "securityequipmentstorage" - -/area/security/interrogationhallway - name = "\improper Interrogation Hallway" - icon_state = "interrogationhall" - -/area/security/courtroomdandp - name = "\improper Courtroom Defense and Prosecution" - icon_state = "seccourt" - -/area/security/interrogationobs - name = "\improper Interrogation Observation" - icon_state = "security" - -/area/security/evidence - name = "\improper Evidence Room" - icon_state = "evidence" - -/area/security/prisonlockers - name = "\improper Prisoner Lockers" - icon_state = "sec_prison_lockers" - -/area/security/medbay - name = "\improper Security Medbay" - icon_state = "security_medbay" - -/area/security/prisonershuttle - name = "\improper Security Prisoner Shuttle" - icon_state = "security" - -/area/security/warden - name = "\improper Warden's Office" - icon_state = "Warden" - -/area/security/armoury - name = "\improper Armory" - icon_state = "armory" - -/area/security/securearmoury - name = "\improper Secure Armory" - icon_state = "secarmory" - -/area/security/armoury/gamma - name = "\improper Gamma Armory" - icon_state = "Warden" - requires_power = 0 - -/area/security/securehallway - name = "\improper Security Secure Hallway" - icon_state = "securehall" - -/area/security/hos - name = "\improper Head of Security's Office" - icon_state = "sec_hos" - -/area/security/podbay - name = "\improper Security Podbay" - icon_state = "securitypodbay" - -/area/security/detectives_office - name = "\improper Detective's Office" - icon_state = "detective" - -/area/security/range - name = "\improper Firing Range" - icon_state = "firingrange" - -/area/security/nuke_storage - name = "\improper Vault" - icon_state = "nuke_storage" - -/area/security/customs - name = "\improper Customs" - icon_state = "checkpoint1" - -/area/security/customs2 - name = "\improper Customs" - icon_state = "security" - -/area/security/checkpoint - name = "\improper Security Checkpoint" - icon_state = "checkpoint1" - -/area/security/checkpoint2 - name = "\improper Security Checkpoint" - icon_state = "security" - -/area/security/checkpoint/supply - name = "Security Post - Cargo Bay" - icon_state = "checkpoint1" - -/area/security/checkpoint/engineering - name = "Security Post - Engineering" - icon_state = "checkpoint1" - -/area/security/checkpoint/medical - name = "Security Post - Medbay" - icon_state = "checkpoint1" - -/area/security/checkpoint/science - name = "Security Post - Science" - icon_state = "checkpoint1" - -/area/security/vacantoffice - name = "\improper Vacant Office" - icon_state = "security" - -/area/security/vacantoffice2 - name = "\improper Vacant Office" - icon_state = "security" - -/area/quartermaster - name = "\improper Quartermasters" - icon_state = "quart" - -///////////WORK IN PROGRESS////////// - -/area/quartermaster/sorting - name = "\improper Delivery Office" - icon_state = "quartstorage" - -////////////WORK IN PROGRESS////////// - -/area/quartermaster/office - name = "\improper Cargo Office" - icon_state = "quartoffice" - -/area/quartermaster/storage - name = "\improper Cargo Bay" - icon_state = "quartstorage" - -/area/quartermaster/qm - name = "\improper Quartermaster's Office" - icon_state = "quart" - -/area/quartermaster/miningdock - name = "\improper Mining Dock" - icon_state = "mining" - -/area/quartermaster/miningstorage - name = "\improper Mining Storage" - icon_state = "green" - -/area/quartermaster/mechbay - name = "\improper Mech Bay" - icon_state = "yellow" - -/area/janitor - name = "\improper Custodial Closet" - icon_state = "janitor" - -/area/hydroponics - name = "\improper Hydroponics" - icon_state = "hydro" - -/area/hydroponics/abandoned_garden - name = "\improper Abandoned Garden" - icon_state = "hydro" - -//Toxins - -/area/toxins/lab - name = "\improper Research and Development" - icon_state = "toxlab" - -/area/toxins/hallway - name = "\improper Research Lab" - icon_state = "toxlab" - -/area/toxins/rdoffice - name = "\improper Research Director's Office" - icon_state = "head_quarters" - -/area/toxins/supermatter - name = "\improper Supermatter Lab" - icon_state = "toxlab" - -/area/toxins/xenobiology - name = "\improper Xenobiology Lab" - icon_state = "toxmix" - xenobiology_compatible = TRUE - -/area/toxins/xenobiology/xenoflora_storage - name = "\improper Xenoflora Storage" - icon_state = "toxlab" - -/area/toxins/xenobiology/xenoflora - name = "\improper Xenoflora Lab" - icon_state = "toxlab" - -/area/toxins/storage - name = "\improper Toxins Storage" - icon_state = "toxstorage" - -/area/toxins/test_area - name = "\improper Toxins Test Area" - icon_state = "toxtest" - valid_territory = FALSE - -/area/toxins/mixing - name = "\improper Toxins Mixing Room" - icon_state = "toxmix" - -/area/toxins/launch - name = "Toxins Launch Room" - icon_state = "toxlaunch" - -/area/toxins/misc_lab - name = "\improper Research Testing Lab" - icon_state = "toxmisc" - -/area/toxins/test_chamber - name = "\improper Research Testing Chamber" - icon_state = "toxtest" - -/area/toxins/server - name = "\improper Server Room" - icon_state = "server" - -/area/toxins/server_coldroom - name = "\improper Server Coldroom" - icon_state = "servercold" - -/area/toxins/explab - name = "\improper Experimentation Lab" - icon_state = "toxmisc" - -//Storage - -/area/storage/tools - name = "Auxiliary Tool Storage" - icon_state = "storage" - -/area/storage/primary - name = "Primary Tool Storage" - icon_state = "primarystorage" - -/area/storage/autolathe - name = "Autolathe Storage" - icon_state = "storage" - -/area/storage/art - name = "Art Supply Storage" - icon_state = "storage" - -/area/storage/auxillary - name = "Auxillary Storage" - icon_state = "auxstorage" - -/area/storage/eva - name = "EVA Storage" - icon_state = "eva" - -/area/storage/secure - name = "Secure Storage" - icon_state = "storage" - -/area/storage/emergency - name = "Starboard Emergency Storage" - icon_state = "emergencystorage" - -/area/storage/emergency2 - name = "Port Emergency Storage" - icon_state = "emergencystorage" - -/area/storage/tech - name = "Technical Storage" - icon_state = "auxstorage" - -/area/storage/testroom - requires_power = 0 - name = "\improper Test Room" - icon_state = "storage" - -/area/storage/office - name = "\improper Office Supplies" - icon_state = "office_supplies" - -// ENGIE OUTPOST - -/area/engiestation - name = "\improper Engineering Outpost" - icon_state = "construction" - -/area/engiestation/solars - name = "\improper Engineering Outpost Solars" - icon_state = "panelsP" - -//DJSTATION - -/area/djstation - name = "\improper Ruskie DJ Station" - icon_state = "DJ" - -/area/djstation/solars - name = "\improper Ruskie DJ Station Solars" - icon_state = "DJ" - -//DERELICT - -/area/derelict - name = "\improper Derelict Station" - icon_state = "storage" - -/area/derelict/hallway/primary - name = "\improper Derelict Primary Hallway" - icon_state = "hallP" - -/area/derelict/hallway/secondary - name = "\improper Derelict Secondary Hallway" - icon_state = "hallS" - -/area/derelict/arrival - name = "\improper Derelict Arrival Centre" - icon_state = "yellow" - -/area/derelict/storage/equipment - name = "Derelict Equipment Storage" - -/area/derelict/storage/storage_access - name = "Derelict Storage Access" - -/area/derelict/storage/engine_storage - name = "Derelict Engine Storage" - icon_state = "green" - -/area/derelict/bridge - name = "\improper Derelict Control Room" - icon_state = "bridge" - -/area/derelict/secret - name = "\improper Derelict Secret Room" - icon_state = "library" - -/area/derelict/bridge/access - name = "Derelict Control Room Access" - icon_state = "auxstorage" - -/area/derelict/bridge/ai_upload - name = "\improper Derelict Computer Core" - icon_state = "ai" - -/area/derelict/solar_control - name = "\improper Derelict Solar Control" - icon_state = "engine" - -/area/derelict/se_solar - name = "South East Solars" - icon_state = "engine" - -/area/derelict/crew_quarters - name = "\improper Derelict Crew Quarters" - icon_state = "fitness" - -/area/derelict/medical - name = "Derelict Medbay" - icon_state = "medbay" - -/area/derelict/medical/morgue - name = "\improper Derelict Morgue" - icon_state = "morgue" - -/area/derelict/medical/chapel - name = "\improper Derelict Chapel" - icon_state = "chapel" - -/area/derelict/teleporter - name = "\improper Derelict Teleporter" - icon_state = "teleporter" - -/area/derelict/eva - name = "Derelict EVA Storage" - icon_state = "eva" - -/area/shuttle/derelict/ship/start - name = "\improper Abandoned Ship" - icon_state = "yellow" - -/area/shuttle/derelict/ship/transit - name = "\improper Abandoned Ship" - icon_state = "yellow" - -/area/shuttle/derelict/ship/engipost - name = "\improper Engineering Outpost" - icon_state = "yellow" - -/area/shuttle/derelict/ship/station - name = "\improper North of SS13" - icon_state = "yellow" - -/area/solar/derelict_starboard - name = "\improper Derelict Starboard Solar Array" - icon_state = "panelsS" - -/area/solar/derelict_aft - name = "\improper Derelict Aft Solar Array" - icon_state = "aft" - -/area/derelict/singularity_engine - name = "\improper Derelict Singularity Engine" - icon_state = "engine" - -/area/derelict/gravity_generator - name = "\improper Derelict Gravity Generator Room" - icon_state = "red" - -/area/derelict/atmospherics - name = "Derelict Atmospherics" - icon_state = "red" - -//HALF-BUILT STATION (REPLACES DERELICT IN BAYCODE, ABOVE IS LEFT FOR DOWNSTREAM) - -/area/shuttle/constructionsite - name = "\improper Construction Site Shuttle" - icon_state = "yellow" - -/area/shuttle/constructionsite/station - name = "\improper Construction Site Shuttle" - -/area/shuttle/constructionsite/site - name = "\improper Construction Site Shuttle" - -/area/constructionsite - name = "\improper Construction Site" - icon_state = "storage" - -/area/constructionsite/storage - name = "\improper Construction Site Storage Area" - -/area/constructionsite/science - name = "\improper Construction Site Research" - icon_state = "medresearch" - -/area/constructionsite/bridge - name = "\improper Construction Site Bridge" - icon_state = "bridge" - -/area/constructionsite/hallway/center - name = "\improper Construction Site Central Hallway" - icon_state = "hallC" - -/area/constructionsite/hallway/engcore - name = "\improper Construction Site Eng Core" - icon_state = "green" - -/area/constructionsite/hallway/fore - name = "\improper Construction Site Fore" - icon_state = "green" - -/area/constructionsite/hallway/port - name = "\improper Construction Site Port" - icon_state = "hallP" - -/area/constructionsite/hallway/aft - name = "\improper Construction Site Aft" - icon_state = "hallA" - -/area/constructionsite/hallway/starboard - name = "\improper Construction Site Starboard" - icon_state = "hallS" - -/area/constructionsite/atmospherics - name = "\improper Construction Site Atmospherics" - icon_state = "atmos" - -/area/constructionsite/medical - name = "\improper Construction Site Medbay" - icon_state = "medbay" - -/area/constructionsite/ai - name = "\improper Construction Computer Core" - icon_state = "ai" - -/area/constructionsite/engineering - name = "\improper Construction Site Engine Bay" - icon_state = "engine" - -/area/solar/constructionsite - name = "\improper Construction Site Solars" - icon_state = "panelsA" - - -//Construction - -/area/construction - name = "\improper Construction Area" - icon_state = "yellow" - -/area/mining_construction - name = "Auxillary Base Construction" - icon_state = "yellow" - -/area/construction/supplyshuttle - name = "\improper Supply Shuttle" - icon_state = "yellow" - -/area/construction/quarters - name = "\improper Engineer's Quarters" - icon_state = "yellow" - -/area/construction/qmaint - name = "Maintenance" - icon_state = "yellow" - -/area/construction/hallway - name = "\improper Hallway" - icon_state = "yellow" - -/area/construction/solars - name = "\improper Solar Panels" - icon_state = "yellow" - -/area/construction/solarscontrol - name = "\improper Solar Panel Control" - icon_state = "yellow" - -/area/construction/Storage - name = "Construction Site Storage" - icon_state = "yellow" - - -//GAYBAR -/area/secret/gaybar - name = "\improper Dance Bar" - icon_state = "dancebar" - - -//Traitor Station -/area/traitor - name = "\improper Syndicate Base" - icon_state = "syndie_hall" - report_alerts = 0 - -/area/traitor/rnd - name = "\improper Syndicate Research and Development" - icon_state = "syndie_rnd" - -/area/traitor/chem - name = "\improper Syndicate Chemistry" - icon_state = "syndie_chem" - -/area/traitor/tox - name = "\improper Syndicate Toxins" - icon_state = "syndie_tox" - -/area/traitor/atmos - name = "\improper Syndicate Atmos" - icon_state = "syndie_atmo" - -/area/traitor/inter - name = "\improper Syndicate Interrogation" - icon_state = "syndie_inter" - -/area/traitor/radio - name = "\improper Syndicate Eavesdropping Booth" - icon_state = "syndie_radio" - -/area/traitor/surgery - name = "\improper Syndicate Surgery Theatre" - icon_state = "syndie_surgery" - -/area/traitor/hall - name = "\improper Syndicate Station" - icon_state = "syndie_hall" - -/area/traitor/kitchen - name = "\improper Syndicate Kitchen" - icon_state = "syndie_kitchen" - -/area/traitor/empty - name = "\improper Syndicate Project Room" - icon_state = "syndie_empty" - - -//AI - -/area/ai_monitored/storage/eva - name = "EVA Storage" - icon_state = "eva" - -/area/ai_monitored/storage/secure - name = "Secure Storage" - icon_state = "storage" - -/area/ai_monitored/storage/emergency - name = "Emergency Storage" - icon_state = "storage" - -/area/turret_protected/ - ambientsounds = list('sound/ambience/ambimalf.ogg') - -/area/turret_protected/ai_upload - name = "\improper AI Upload Chamber" - icon_state = "ai_upload" - -/area/turret_protected/ai_upload_foyer - name = "AI Upload Access" - icon_state = "ai_foyer" - -/area/turret_protected/ai - name = "\improper AI Chamber" - icon_state = "ai_chamber" - -/area/turret_protected/aisat - name = "\improper AI Satellite" - icon_state = "ai" - -/area/aisat - name = "\improper AI Satellite Exterior" - icon_state = "yellow" - -/area/aisat/entrance - name = "\improper AI Satellite Entrance" - icon_state = "ai_foyer" - -/area/aisat/maintenance - name = "\improper AI Satellite Maintenance" - icon_state = "storage" - -/area/turret_protected/aisat_interior - name = "\improper AI Satellite Antechamber" - icon_state = "ai" - -/area/turret_protected/AIsatextFP - name = "\improper AI Sat Ext" - icon_state = "storage" - luminosity = 1 - dynamic_lighting = 0 - -/area/turret_protected/AIsatextFS - name = "\improper AI Sat Ext" - icon_state = "storage" - luminosity = 1 - dynamic_lighting = 0 - -/area/turret_protected/AIsatextAS - name = "\improper AI Sat Ext" - icon_state = "storage" - luminosity = 1 - dynamic_lighting = 0 - -/area/turret_protected/AIsatextAP - name = "\improper AI Sat Ext" - icon_state = "storage" - luminosity = 1 - dynamic_lighting = 0 - -/area/turret_protected/NewAIMain - name = "\improper AI Main New" - icon_state = "storage" - - - -//Misc - -/area/wreck/ai - name = "\improper AI Chamber" - icon_state = "ai" - -/area/wreck/main - name = "\improper Wreck" - icon_state = "storage" - -/area/wreck/engineering - name = "\improper Power Room" - icon_state = "engine" - -/area/wreck/bridge - name = "\improper Bridge" - icon_state = "bridge" - -/area/generic - name = "Unknown" - icon_state = "storage" - - - -// Telecommunications Satellite - -/area/tcommsat - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') - -/area/tcommsat/entrance - name = "\improper Telecoms Teleporter" - icon_state = "tcomsatentrance" - -/area/tcommsat/chamber - name = "\improper Telecoms Central Compartment" - icon_state = "tcomsatcham" - -/area/turret_protected/tcomsat - name = "\improper Telecoms Satellite" - icon_state = "tcomsatlob" - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') - -/area/turret_protected/tcomfoyer - name = "\improper Telecoms Foyer" - icon_state = "tcomsatentrance" - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') - -/area/turret_protected/tcomwest - name = "\improper Telecoms West Wing" - icon_state = "tcomsatwest" - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') - -/area/turret_protected/tcomeast - name = "\improper Telecoms East Wing" - icon_state = "tcomsateast" - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') - -/area/tcommsat/computer - name = "\improper Telecoms Control Room" - icon_state = "tcomsatcomp" - -/area/tcommsat/server - name = "\improper Telecoms Server Room" - icon_state = "tcomsatcham" - -/area/tcommsat/lounge - name = "\improper Telecoms Lounge" - icon_state = "tcomsatlounge" - -/area/tcommsat/powercontrol - name = "\improper Telecoms Power Control" - icon_state = "tcomsatwest" - -// Away Missions -/area/awaymission - name = "\improper Strange Location" - icon_state = "away" - report_alerts = 0 - -/area/awaymission/example - name = "\improper Strange Station" - icon_state = "away" - -/area/awaymission/wwmines - name = "\improper Wild West Mines" - icon_state = "away1" - luminosity = 1 - requires_power = 0 - -/area/awaymission/wwgov - name = "\improper Wild West Mansion" - icon_state = "away2" - luminosity = 1 - requires_power = 0 - -/area/awaymission/wwrefine - name = "\improper Wild West Refinery" - icon_state = "away3" - luminosity = 1 - requires_power = 0 - -/area/awaymission/wwvault - name = "\improper Wild West Vault" - icon_state = "away3" - luminosity = 0 - -/area/awaymission/wwvaultdoors - name = "\improper Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power - icon_state = "away2" - requires_power = 0 - luminosity = 0 - -/area/awaymission/desert - name = "Mars" - icon_state = "away" - -/area/awaymission/BMPship1 - name = "\improper Aft Block" - icon_state = "away1" - -/area/awaymission/BMPship2 - name = "\improper Midship Block" - icon_state = "away2" - -/area/awaymission/BMPship3 - name = "\improper Fore Block" - icon_state = "away3" - -/area/awaymission/spacebattle - name = "\improper Space Battle" - icon_state = "away" - requires_power = 0 - -/area/awaymission/spacebattle/cruiser - name = "\improper Nanotrasen Cruiser" - -/area/awaymission/spacebattle/syndicate1 - name = "\improper Syndicate Assault Ship 1" - -/area/awaymission/spacebattle/syndicate2 - name = "\improper Syndicate Assault Ship 2" - -/area/awaymission/spacebattle/syndicate3 - name = "\improper Syndicate Assault Ship 3" - -/area/awaymission/spacebattle/syndicate4 - name = "\improper Syndicate War Sphere 1" - -/area/awaymission/spacebattle/syndicate5 - name = "\improper Syndicate War Sphere 2" - -/area/awaymission/spacebattle/syndicate6 - name = "\improper Syndicate War Sphere 3" - -/area/awaymission/spacebattle/syndicate7 - name = "\improper Syndicate Fighter" - -/area/awaymission/spacebattle/secret - name = "\improper Hidden Chamber" - -/area/awaymission/beach - name = "Beach" - icon_state = "beach" - luminosity = 1 - dynamic_lighting = 0 - requires_power = 0 - ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg') - -/area/awaymission/undersea - name = "Undersea" - icon_state = "undersea" - - -////////////////////////AWAY AREAS/////////////////////////////////// - -/area/awaycontent - name = "space" - report_alerts = 0 - -/area/awaycontent/a1 - icon_state = "awaycontent1" - -/area/awaycontent/a2 - icon_state = "awaycontent2" - -/area/awaycontent/a3 - icon_state = "awaycontent3" - -/area/awaycontent/a4 - icon_state = "awaycontent4" - -/area/awaycontent/a5 - icon_state = "awaycontent5" - -/area/awaycontent/a6 - icon_state = "awaycontent6" - -/area/awaycontent/a7 - icon_state = "awaycontent7" - -/area/awaycontent/a8 - icon_state = "awaycontent8" - -/area/awaycontent/a9 - icon_state = "awaycontent9" - -/area/awaycontent/a10 - icon_state = "awaycontent10" - -/area/awaycontent/a11 - icon_state = "awaycontent11" - -/area/awaycontent/a11 - icon_state = "awaycontent12" - -/area/awaycontent/a12 - icon_state = "awaycontent13" - -/area/awaycontent/a13 - icon_state = "awaycontent14" - -/area/awaycontent/a14 - icon_state = "awaycontent14" - -/area/awaycontent/a15 - icon_state = "awaycontent15" - -/area/awaycontent/a16 - icon_state = "awaycontent16" - -/area/awaycontent/a17 - icon_state = "awaycontent17" - -/area/awaycontent/a18 - icon_state = "awaycontent18" - -/area/awaycontent/a19 - icon_state = "awaycontent19" - -/area/awaycontent/a20 - icon_state = "awaycontent20" - -/area/awaycontent/a21 - icon_state = "awaycontent21" - -/area/awaycontent/a22 - icon_state = "awaycontent22" - -/area/awaycontent/a23 - icon_state = "awaycontent23" - -/area/awaycontent/a24 - icon_state = "awaycontent24" - -/area/awaycontent/a25 - icon_state = "awaycontent25" - -/area/awaycontent/a26 - icon_state = "awaycontent26" - -/area/awaycontent/a27 - icon_state = "awaycontent27" - -/area/awaycontent/a28 - icon_state = "awaycontent28" - -/area/awaycontent/a29 - icon_state = "awaycontent29" - -/area/awaycontent/a30 - icon_state = "awaycontent30" - -////////////////////////VR AREAS/////////////////////////////////// - -/area/vr - name = "VR" - requires_power = 0 - dynamic_lighting = 0 - no_teleportlocs = 1 - - -/area/vr/lobby - name = "VR Lobby" - -/area/vr/roman - name = "Roman Arena" - - -///////////////////////////////////////////////////////////////////// -/* - Lists of areas to be used with is_type_in_list. - Used in gamemodes code at the moment. --rastaf0 -*/ - -// CENTCOM -var/list/centcom_areas = list ( - /area/centcom, - /area/shuttle/escape_pod1/centcom, - /area/shuttle/escape_pod2/centcom, - /area/shuttle/escape_pod3/centcom, - /area/shuttle/escape_pod5/centcom, - /area/shuttle/transport1, - /area/shuttle/administration/centcom, - /area/shuttle/specops/centcom, -) - -//SPACE STATION 13 -var/list/the_station_areas = list ( - /area/shuttle/arrival, - /area/shuttle/escape, - /area/shuttle/escape_pod1/station, - /area/shuttle/escape_pod2/station, - /area/shuttle/escape_pod3/station, - /area/shuttle/escape_pod5/station, - /area/shuttle/prison/station, - /area/shuttle/administration/station, - /area/shuttle/specops/station, - /area/atmos, - /area/maintenance, - /area/hallway, - /area/hallway/primary/fore, - /area/hallway/primary/starboard, - /area/hallway/primary/aft, - /area/hallway/primary/port, - /area/hallway/primary/central, - /area/bridge, - /area/crew_quarters, - /area/civilian, - /area/holodeck, - /area/library, - /area/chapel, - /area/escapepodbay, - /area/lawoffice, - /area/magistrateoffice, - /area/clownoffice, - /area/mimeoffice, - /area/engine, - /area/solar, - /area/assembly, - /area/teleporter, - /area/medical, - /area/security, - /area/prison, - /area/quartermaster, - /area/janitor, - /area/hydroponics, - /area/toxins, - /area/storage, - /area/construction, - /area/ai_monitored/storage/eva, //do not try to simplify to "/area/ai_monitored" --rastaf0 - /area/ai_monitored/storage/secure, - /area/ai_monitored/storage/emergency, - /area/turret_protected/ai_upload, //do not try to simplify to "/area/turret_protected" --rastaf0 - /area/turret_protected/ai_upload_foyer, - /area/turret_protected/ai, -) +/* + +### This file contains a list of all the areas in your station. Format is as follows: + +/area/CATEGORY/OR/DESCRIPTOR/NAME (you can make as many subdivisions as you want) + name = "NICE NAME" (not required but makes things really nice) + icon = "ICON FILENAME" (defaults to areas.dmi) + icon_state = "NAME OF ICON" (defaults to "unknown" (blank)) + requires_power = FALSE (defaults to TRUE) + music = "music/music.ogg" (defaults to "music/music.ogg") + +NOTE: there are two lists of areas in the end of this file: centcom and station itself. Please maintain these lists valid. --rastaf0 + +*/ + +/*Adding a wizard area teleport list because motherfucking lag -- Urist*/ +/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ +var/list/teleportlocs = list() +/hook/startup/proc/process_teleport_locs() + for(var/area/AR in world) + if(AR.no_teleportlocs) continue + if(teleportlocs.Find(AR.name)) continue + var/turf/picked = safepick(get_area_turfs(AR.type)) + if(picked && is_station_level(picked.z)) + teleportlocs += AR.name + teleportlocs[AR.name] = AR + + teleportlocs = sortAssoc(teleportlocs) + + return 1 + +var/list/ghostteleportlocs = list() +/hook/startup/proc/process_ghost_teleport_locs() + for(var/area/AR in world) + if(ghostteleportlocs.Find(AR.name)) continue + var/list/turfs = get_area_turfs(AR.type) + if(turfs.len) + ghostteleportlocs += AR.name + ghostteleportlocs[AR.name] = AR + + ghostteleportlocs = sortAssoc(ghostteleportlocs) + + return 1 + +/*-----------------------------------------------------------------------------*/ + + +/area/admin + name = "\improper Admin Room" + icon_state = "start" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + hide_attacklogs = TRUE + + +/area/adminconstruction + name = "\improper Admin Testing Area" + icon_state = "start" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + hide_attacklogs = TRUE + +/area/space + icon_state = "space" + requires_power = TRUE + always_unpowered = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + power_light = FALSE + power_equip = FALSE + power_environ = FALSE + valid_territory = FALSE + outdoors = TRUE + ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg') + +/area/space/nearstation + icon_state = "space_near" + dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT + +/area/space/atmosalert() + return + +/area/space/fire_alert() + return + +/area/space/fire_reset() + return + +/area/space/readyalert() + return + +/area/space/partyalert() + return + +//These are shuttle areas, they must contain two areas in a subgroup if you want to move a shuttle from one +//place to another. Look at escape shuttle for example. +//All shuttles show now be under shuttle since we have smooth-wall code. + +/area/shuttle + no_teleportlocs = TRUE + requires_power = FALSE + valid_territory = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/shuttle/arrival + name = "\improper Arrival Shuttle" + +/area/shuttle/arrival/pre_game + icon_state = "shuttle2" + +/area/shuttle/arrival/station + icon_state = "shuttle" + +/area/shuttle/auxillary_base + icon_state = "shuttle" + +/area/shuttle/escape + name = "\improper Emergency Shuttle" + music = "music/escape.ogg" + icon_state = "shuttle2" + nad_allowed = TRUE + +/area/shuttle/pod_1 + name = "\improper Escape Pod One" + music = "music/escape.ogg" + icon_state = "shuttle" + nad_allowed = TRUE + +/area/shuttle/pod_2 + name = "\improper Escape Pod Two" + music = "music/escape.ogg" + icon_state = "shuttle" + nad_allowed = TRUE + +/area/shuttle/pod_3 + name = "\improper Escape Pod Three" + music = "music/escape.ogg" + icon_state = "shuttle" + nad_allowed = TRUE + +/area/shuttle/pod_4 + name = "\improper Escape Pod Four" + music = "music/escape.ogg" + icon_state = "shuttle" + nad_allowed = TRUE + +/area/shuttle/escape_pod1 + name = "\improper Escape Pod One" + music = "music/escape.ogg" + nad_allowed = TRUE + +/area/shuttle/escape_pod1/station + icon_state = "shuttle2" + +/area/shuttle/escape_pod1/centcom + icon_state = "shuttle" + +/area/shuttle/escape_pod1/transit + icon_state = "shuttle" + +/area/shuttle/escape_pod2 + name = "\improper Escape Pod Two" + music = "music/escape.ogg" + nad_allowed = TRUE + +/area/shuttle/escape_pod2/station + icon_state = "shuttle2" + +/area/shuttle/escape_pod2/centcom + icon_state = "shuttle" + +/area/shuttle/escape_pod2/transit + icon_state = "shuttle" + +/area/shuttle/escape_pod3 + name = "\improper Escape Pod Three" + music = "music/escape.ogg" + nad_allowed = TRUE + +/area/shuttle/escape_pod3/station + icon_state = "shuttle2" + +/area/shuttle/escape_pod3/centcom + icon_state = "shuttle" + +/area/shuttle/escape_pod3/transit + icon_state = "shuttle" + +/area/shuttle/escape_pod5 //Pod 4 was lost to meteors + name = "\improper Escape Pod Five" + music = "music/escape.ogg" + nad_allowed = TRUE + +/area/shuttle/escape_pod5/station + icon_state = "shuttle2" + +/area/shuttle/escape_pod5/centcom + icon_state = "shuttle" + +/area/shuttle/escape_pod5/transit + icon_state = "shuttle" + +/area/shuttle/mining + name = "\improper Mining Shuttle" + music = "music/escape.ogg" + icon_state = "shuttle" + +/area/shuttle/transport + icon_state = "shuttle" + name = "\improper Transport Shuttle" + +/area/shuttle/transport1 + icon_state = "shuttle" + name = "\improper Transport Shuttle" + +/area/shuttle/alien/base + icon_state = "shuttle" + name = "\improper Alien Shuttle Base" + requires_power = 1 + +/area/shuttle/alien/mine + icon_state = "shuttle" + name = "\improper Alien Shuttle Mine" + requires_power = 1 + +/area/shuttle/gamma/space + icon_state = "shuttle" + name = "\improper Gamma Armory" + +/area/shuttle/gamma/station + icon_state = "shuttle" + name = "\improper Gamma Armory Station" + +/area/shuttle/prison/ + name = "\improper Prison Shuttle" + +/area/shuttle/prison/station + icon_state = "shuttle" + +/area/shuttle/prison/prison + icon_state = "shuttle2" + +/area/shuttle/siberia + name = "\improper Labor Camp Shuttle" + music = "music/escape.ogg" + icon_state = "shuttle" + +/area/shuttle/specops + name = "\improper Special Ops Shuttle" + icon_state = "shuttlered" + +/area/shuttle/specops/centcom + name = "\improper Special Ops Shuttle" + icon_state = "shuttlered" + +/area/shuttle/specops/station + name = "\improper Special Ops Shuttle" + icon_state = "shuttlered2" + +/area/shuttle/syndicate_elite + name = "\improper Syndicate Elite Shuttle" + icon_state = "shuttlered" + nad_allowed = TRUE + +/area/shuttle/syndicate_elite/mothership + name = "\improper Syndicate Elite Shuttle" + icon_state = "shuttlered" + +/area/shuttle/syndicate_elite/station + name = "\improper Syndicate Elite Shuttle" + icon_state = "shuttlered2" + +/area/shuttle/syndicate_sit + name = "\improper Syndicate SIT Shuttle" + icon_state = "shuttlered" + nad_allowed = TRUE + +/area/shuttle/assault_pod + name = "Steel Rain" + icon_state = "shuttle" + +/area/shuttle/administration + name = "\improper Nanotrasen Vessel" + icon_state = "shuttlered" + +/area/shuttle/administration/centcom + name = "\improper Nanotrasen Vessel Centcom" + icon_state = "shuttlered" + +/area/shuttle/administration/station + name = "\improper Nanotrasen Vessel" + icon_state = "shuttlered2" + +/area/shuttle/thunderdome + name = "honk" + +/area/shuttle/thunderdome/grnshuttle + name = "\improper Thunderdome GRN Shuttle" + icon_state = "green" + +/area/shuttle/thunderdome/grnshuttle/dome + name = "\improper GRN Shuttle" + icon_state = "shuttlegrn" + +/area/shuttle/thunderdome/grnshuttle/station + name = "\improper GRN Station" + icon_state = "shuttlegrn2" + +/area/shuttle/thunderdome/redshuttle + name = "\improper Thunderdome RED Shuttle" + icon_state = "red" + +/area/shuttle/thunderdome/redshuttle/dome + name = "\improper RED Shuttle" + icon_state = "shuttlered" + +/area/shuttle/thunderdome/redshuttle/station + name = "\improper RED Station" + icon_state = "shuttlered2" +// === Trying to remove these areas: + +/area/shuttle/research + name = "\improper Research Shuttle" + music = "music/escape.ogg" + icon_state = "shuttle" + +/area/shuttle/research/station + icon_state = "shuttle2" + +/area/shuttle/research/outpost + icon_state = "shuttle" + +/area/shuttle/vox + name = "\improper Vox Skipjack" + icon_state = "shuttle" + +/area/shuttle/vox/station + name = "\improper Vox Skipjack" + icon_state = "yellow" + +/area/shuttle/salvage + name = "\improper Salvage Ship" + icon_state = "yellow" + +/area/shuttle/salvage/start + name = "\improper Middle of Nowhere" + icon_state = "yellow" + +/area/shuttle/salvage/arrivals + name = "\improper Space Station Auxiliary Docking" + icon_state = "yellow" + +/area/shuttle/salvage/derelict + name = "\improper Derelict Station" + icon_state = "yellow" + +/area/shuttle/salvage/djstation + name = "\improper Ruskie DJ Station" + icon_state = "yellow" + +/area/shuttle/salvage/north + name = "\improper North of the Station" + icon_state = "yellow" + +/area/shuttle/salvage/east + name = "\improper East of the Station" + icon_state = "yellow" + +/area/shuttle/salvage/south + name = "\improper South of the Station" + icon_state = "yellow" + +/area/shuttle/salvage/commssat + name = "\improper The Communications Satellite" + icon_state = "yellow" + +/area/shuttle/salvage/mining + name = "\improper South-West of the Mining Asteroid" + icon_state = "yellow" + +/area/shuttle/salvage/abandoned_ship + name = "\improper Abandoned Ship" + icon_state = "yellow" + +/area/shuttle/salvage/clown_asteroid + name = "\improper Clown Asteroid" + icon_state = "yellow" + +/area/shuttle/salvage/trading_post + name = "\improper Trading Post" + icon_state = "yellow" + +/area/shuttle/salvage/transit + name = "\improper hyperspace" + icon_state = "shuttle" + +/area/shuttle/supply + name = "Supply Shuttle" + icon_state = "shuttle3" + +/area/shuttle/abandoned + name = "Abandoned Ship" + icon_state = "shuttle" + +/area/shuttle/syndicate + name = "Syndicate Nuclear Team Shuttle" + icon_state = "shuttle" + nad_allowed = TRUE + +/area/shuttle/trade + name = "Trade Shuttle" + icon_state = "shuttle" + +/area/shuttle/trade/sol + name = "Sol Freighter" + +/area/shuttle/freegolem + name = "Free Golem Ship" + icon_state = "purple" + xenobiology_compatible = TRUE + +/area/airtunnel1/ // referenced in airtunnel.dm:759 + +/area/dummy/ // Referenced in engine.dm:261 + +/area/start // will be unused once kurper gets his login interface patch done + name = "start area" + icon_state = "start" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + has_gravity = TRUE + +// === end remove + +// CENTCOM + +/area/centcom + name = "\improper Centcom" + icon_state = "centcom" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + nad_allowed = TRUE + +/area/centcom/control + name = "\improper Centcom Control" + icon_state = "centcom_ctrl" + +/area/centcom/evac + name = "\improper Centcom Emergency Shuttle" + icon_state = "centcom_evac" + +/area/centcom/suppy + name = "\improper Centcom Supply Shuttle" + icon_state = "centcom_supply" + +/area/centcom/ferry + name = "\improper Centcom Transport Shuttle" + icon_state = "centcom_ferry" + +/area/centcom/shuttle + name = "\improper Centcom Administration Shuttle" + +/area/centcom/test + name = "\improper Centcom Testing Facility" + +/area/centcom/living + name = "\improper Centcom Living Quarters" + +/area/centcom/specops + name = "\improper Centcom Special Ops" + icon_state = "centcom_specops" + +/area/centcom/gamma + name = "\improper Centcom Gamma Armory" + icon_state = "centcom_gamma" + +/area/centcom/holding + name = "\improper Holding Facility" + +/area/centcom/bathroom + name = "\improper Centcom Emergency Shuttle Bathrooms" + +//SYNDICATES + +/area/syndicate_mothership + name = "\improper Syndicate Forward Base" + icon_state = "syndie-ship" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + nad_allowed = TRUE + +/area/syndicate_mothership/control + name = "\improper Syndicate Control Room" + icon_state = "syndie-control" + +/area/syndicate_mothership/elite_squad + name = "\improper Syndicate Elite Squad" + icon_state = "syndie-elite" + +/area/syndicate_mothership/infteam + name = "\improper Syndicate Infiltrators" + icon_state = "syndie-elite" + +//EXTRA + +/area/asteroid // -- TLE + name = "\improper Asteroid" + icon_state = "asteroid" + requires_power = FALSE + valid_territory = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/asteroid/cave // -- TLE + name = "\improper Asteroid - Underground" + icon_state = "cave" + requires_power = FALSE + outdoors = TRUE + +/area/asteroid/artifactroom + name = "\improper Asteroid - Artifact" + icon_state = "cave" + +/area/tdome + name = "\improper Thunderdome" + icon_state = "thunder" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + hide_attacklogs = TRUE + + +/area/tdome/arena_source + name = "\improper Thunderdome Arena Template" + icon_state = "thunder" + +/area/tdome/arena + name = "\improper Thunderdome Arena" + icon_state = "thunder" + +/area/tdome/tdome1 + name = "\improper Thunderdome (Team 1)" + icon_state = "green" + +/area/tdome/tdome2 + name = "\improper Thunderdome (Team 2)" + icon_state = "yellow" + +/area/tdome/tdomeadmin + name = "\improper Thunderdome (Admin.)" + icon_state = "purple" + +/area/tdome/tdomeobserve + name = "\improper Thunderdome (Observer.)" + icon_state = "purple" + +/area/exploration/methlab + name = "\improper Abandoned Drug Lab" + icon_state = "green" + +//Abductors +/area/abductor_ship + name = "\improper Abductor Ship" + icon_state = "yellow" + requires_power = FALSE + has_gravity = TRUE + +/area/wizard_station + name = "\improper Wizard's Den" + icon_state = "yellow" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/ninja + name = "\improper Ninja Area Parent" + icon_state = "ninjabase" + requires_power = FALSE + no_teleportlocs = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/ninja/outpost + name = "\improper SpiderClan Outpost" + +/area/ninja/holding + name = "\improper SpiderClan Holding Facility" + +/area/vox_station + name = "\improper Vox Base" + icon_state = "yellow" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + no_teleportlocs = TRUE + +/area/trader_station + name = "Trade Base" + icon_state = "yellow" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/trader_station/sol + name = "Jupiter Station 6" + +//Labor camp +/area/mine/laborcamp + name = "Labor Camp" + icon_state = "brig" + +/area/mine/laborcamp/security + name = "Labor Camp Security" + icon_state = "security" + +//STATION13 + +/area/atmos + name = "Atmospherics" + icon_state = "atmos" + +/area/atmos/control + name = "Atmospherics Control Room" + icon_state = "atmos" + +/area/atmos/distribution + name = "Atmospherics Distribution Loop" + icon_state = "atmos" + +//Maintenance +/area/maintenance + ambientsounds = list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg', 'sound/ambience/ambimaint5.ogg') + valid_territory = FALSE + +/area/maintenance/atmos_control + name = "Atmospherics Maintenance" + icon_state = "fpmaint" + +/area/maintenance/fpmaint + name = "EVA Maintenance" + icon_state = "fpmaint" + +/area/maintenance/fpmaint2 + name = "Arrivals North Maintenance" + icon_state = "fpmaint" + +/area/maintenance/fsmaint + name = "Dormitory Maintenance" + icon_state = "fsmaint" + +/area/maintenance/fsmaint2 + name = "Bar Maintenance" + icon_state = "fsmaint" + +/area/maintenance/asmaint + name = "Medbay Maintenance" + icon_state = "asmaint" + +/area/maintenance/asmaint2 + name = "Science Maintenance" + icon_state = "asmaint" + +/area/maintenance/apmaint + name = "Cargo Maintenance" + icon_state = "apmaint" + +/area/maintenance/maintcentral + name = "Bridge Maintenance" + icon_state = "maintcentral" + +/area/maintenance/fore + name = "Fore Maintenance" + icon_state = "fmaint" + +/area/maintenance/starboard + name = "Starboard Maintenance" + icon_state = "smaint" + +/area/maintenance/port + name = "Locker Room Maintenance" + icon_state = "pmaint" + +/area/maintenance/aft + name = "Engineering Maintenance" + icon_state = "amaint" + +/area/maintenance/engi_shuttle + name = "Engineering Shuttle Access" + icon_state = "maint_e_shuttle" + +/area/maintenance/storage + name = "Atmospherics Maintenance" + icon_state = "green" + +/area/maintenance/incinerator + name = "\improper Incinerator" + icon_state = "disposal" + +/area/maintenance/turbine + name = "\improper Turbine" + icon_state = "disposal" + +/area/maintenance/disposal + name = "Waste Disposal" + icon_state = "disposal" + +/area/maintenance/genetics + name = "Genetics Maintenance" + icon_state = "asmaint" + + +/area/maintenance/electrical + name = "Electrical Maintenance" + icon_state = "yellow" + +/area/maintenance/abandonedbar + name = "Maintenance Bar" + icon_state = "yellow" + power_equip = 0 + power_light = 0 + power_environ = 0 + +/area/maintenance/electrical_shop + name ="Electronics Den" + icon_state = "yellow" + +/area/maintenance/gambling_den + name = "Gambling Den" + icon_state = "yellow" + +/area/maintenance/consarea + name = "Alternate Construction Area" + icon_state = "yellow" + + +//Hallway + +/area/hallway/primary/fore + name = "\improper Fore Primary Hallway" + icon_state = "hallF" + +/area/hallway/primary/starboard + name = "\improper Starboard Primary Hallway" + icon_state = "hallS" + +/area/hallway/primary/starboard/west +/area/hallway/primary/starboard/east + +/area/hallway/primary/aft + name = "\improper Aft Primary Hallway" + icon_state = "hallA" + + +/area/hallway/primary/port + name = "\improper Port Primary Hallway" + icon_state = "hallP" + +/area/hallway/primary/port/west + name = "\improper Port West Hallway" + +/area/hallway/primary/port/east + name = "\improper Port East Hallway" + +/area/hallway/primary/central + name = "\improper Central Primary Hallway" + icon_state = "hallC" + +/area/hallway/primary/central/north +/area/hallway/primary/central/south +/area/hallway/primary/central/west +/area/hallway/primary/central/east +/area/hallway/primary/central/nw +/area/hallway/primary/central/ne +/area/hallway/primary/central/sw +/area/hallway/primary/central/se + +/area/hallway/secondary/exit + name = "\improper Escape Shuttle Hallway" + icon_state = "escape" + +/area/hallway/secondary/construction + name = "\improper Construction Area" + icon_state = "construction" + +/area/hallway/secondary/entry + name = "\improper Arrival Shuttle Hallway" + icon_state = "entry" + +/area/hallway/secondary/entry/north + +/area/hallway/secondary/entry/south + +/area/hallway/secondary/entry/louge + name = "\improper Arrivals Lounge" + + +//Command + +/area/bridge + name = "\improper Bridge" + icon_state = "bridge" + music = "signal" + +/area/bridge/meeting_room + name = "\improper Heads of Staff Meeting Room" + icon_state = "meeting" + music = null + +/area/crew_quarters/captain + name = "\improper Captain's Office" + icon_state = "captain" + +/area/crew_quarters/captain/bedroom + name = "\improper Captain's Bedroom" + icon_state = "captain" + +/area/crew_quarters/recruit + name = "\improper Recruitment Office" + icon_state = "head_quarters" + +/area/crew_quarters/heads/hop + name = "\improper Head of Personnel's Quarters" + icon_state = "head_quarters" + +/area/crew_quarters/heads/hor + name = "\improper Research Director's Quarters" + icon_state = "head_quarters" + +/area/crew_quarters/heads/chief + name = "\improper Chief Engineer's Quarters" + icon_state = "head_quarters" + +/area/crew_quarters/heads/hos + name = "\improper Head of Security's Quarters" + icon_state = "head_quarters" + +/area/crew_quarters/heads/cmo + name = "\improper Chief Medical Officer's Quarters" + icon_state = "head_quarters" + +/area/crew_quarters/courtroom + name = "\improper Courtroom" + icon_state = "courtroom" + +/area/crew_quarters/heads + name = "\improper Head of Personnel's Office" + icon_state = "head_quarters" + +/area/crew_quarters/hor + name = "\improper Research Director's Office" + icon_state = "head_quarters" + +/area/crew_quarters/hos + name = "\improper Head of Security's Office" + icon_state = "head_quarters" + +/area/crew_quarters/chief + name = "\improper Chief Engineer's Office" + icon_state = "head_quarters" + +/area/mint + name = "\improper Mint" + icon_state = "green" + +/area/comms + name = "\improper Communications Relay" + icon_state = "tcomsatcham" + +/area/server + name = "\improper Messaging Server Room" + icon_state = "server" + +/area/ntrep + name = "\improper Nanotrasen Representative's Office" + icon_state = "bluenew" + +/area/blueshield + name = "\improper Blueshield's Office" + icon_state = "blueold" + +/area/centcomdocks + name = "\improper Central Command Docks" + icon_state = "centcom" + +//Crew + +/area/crew_quarters + name = "\improper Dormitories" + icon_state = "Sleep" + +/area/crew_quarters/toilet + name = "\improper Dormitory Toilets" + icon_state = "toilet" + +/area/crew_quarters/sleep + name = "\improper Dormitories" + icon_state = "Sleep" + valid_territory = FALSE + +/area/crew_quarters/sleep_male + name = "\improper Male Dorm" + icon_state = "Sleep" + +/area/crew_quarters/sleep_male/toilet_male + name = "\improper Male Toilets" + icon_state = "toilet" + +/area/crew_quarters/sleep_female + name = "\improper Female Dorm" + icon_state = "Sleep" + +/area/crew_quarters/sleep_female/toilet_female + name = "\improper Female Toilets" + icon_state = "toilet" + +/area/crew_quarters/locker + name = "\improper Locker Room" + icon_state = "locker" + +/area/crew_quarters/locker/locker_toilet + name = "\improper Locker Toilets" + icon_state = "toilet" + +/area/crew_quarters/fitness + name = "\improper Fitness Room" + icon_state = "fitness" + +/area/crew_quarters/dorms + name = "\improper Dorms" + icon_state = "dorms" + +/area/crew_quarters/arcade + name = "\improper Arcade" + icon_state = "arcade" + +/area/crew_quarters/cafeteria + name = "\improper Cafeteria" + icon_state = "cafeteria" + +/area/crew_quarters/kitchen + name = "\improper Kitchen" + icon_state = "kitchen" + +/area/crew_quarters/bar + name = "\improper Bar" + icon_state = "bar" + +/area/crew_quarters/bar/atrium + name = "Atrium" + icon_state = "bar" + +/area/crew_quarters/theatre + name = "\improper Theatre" + icon_state = "Theatre" + +/area/crew_quarters/mrchangs + name = "\improper Mr Chang's" + icon_state = "Theatre" + +/area/library + name = "\improper Library" + icon_state = "library" + +/area/library/abandoned + name = "\improper Abandoned Library" + icon_state = "library" + +/area/chapel/main + name = "\improper Chapel" + icon_state = "chapel" + ambientsounds = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/music/traitor.ogg') + +/area/chapel/office + name = "\improper Chapel Office" + icon_state = "chapeloffice" + +/area/escapepodbay + name = "\improper Escape Shuttle Hallway Podbay" + icon_state = "escape" + +/area/lawoffice + name = "\improper Law Office" + icon_state = "law" + +/area/magistrateoffice + name = "\improper Magistrate's Office" + icon_state = "magistrate" + +/area/clownoffice + name = "\improper Clown's Office" + icon_state = "clown_office" + +/area/mimeoffice + name = "\improper Mime's Office" + icon_state = "mime_office" + +/area/civilian/barber + name = "\improper Barber Shop" + icon_state = "barber" + +/area/civilian/clothing + name = "\improper Clothing Shop" + icon_state = "Theatre" + +/area/civilian/pet_store + name = "\improper Pet Store" + icon_state = "pet_store" + +/area/holodeck + name = "\improper Holodeck" + icon_state = "Holodeck" + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + +/area/holodeck/alphadeck + name = "\improper Holodeck Alpha" + + +/area/holodeck/source_plating + name = "\improper Holodeck - Off" + icon_state = "Holodeck" + +/area/holodeck/source_emptycourt + name = "\improper Holodeck - Empty Court" + +/area/holodeck/source_boxingcourt + name = "\improper Holodeck - Boxing Court" + +/area/holodeck/source_basketball + name = "\improper Holodeck - Basketball Court" + +/area/holodeck/source_thunderdomecourt + name = "\improper Holodeck - Thunderdome Court" + +/area/holodeck/source_beach + name = "\improper Holodeck - Beach" + icon_state = "Holodeck" // Lazy. + +/area/holodeck/source_burntest + name = "\improper Holodeck - Atmospheric Burn Test" + +/area/holodeck/source_wildlife + name = "\improper Holodeck - Wildlife Simulation" + +/area/holodeck/source_meetinghall + name = "\improper Holodeck - Meeting Hall" + +/area/holodeck/source_theatre + name = "\improper Holodeck - Theatre" + +/area/holodeck/source_picnicarea + name = "\improper Holodeck - Picnic Area" + +/area/holodeck/source_snowfield + name = "\improper Holodeck - Snow Field" + +/area/holodeck/source_desert + name = "\improper Holodeck - Desert" + +/area/holodeck/source_space + name = "\improper Holodeck - Space" + +/area/holodeck/source_knightarena + name = "\improper Holodeck - Knight Arena" + + +//Embassies +/area/embassy/ + name = "\improper Embassy Hallway" + +/area/embassy/tajaran + name = "\improper Tajaran Embassy" + icon_state = "tajaran" + +/area/embassy/skrell + name = "\improper Skrell Embassy" + icon_state = "skrell" + +/area/embassy/unathi + name = "\improper Unathi Embassy" + icon_state = "unathi" + +/area/embassy/kidan + name = "\improper Kidan Embassy" + icon_state = "kidan" + +/area/embassy/diona + name = "\improper Diona Embassy" + icon_state = "diona" + +/area/embassy/slime + name = "\improper Slime Person Embassy" + icon_state = "slime" + +/area/embassy/grey + name = "\improper Grey Embassy" + icon_state = "grey" + +/area/embassy/vox + name = "\improper Vox Embassy" + icon_state = "vox" + + + +//Engineering +/area/engine + ambientsounds = list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg') + +/area/engine/engine_smes + name = "\improper Engineering SMES" + icon_state = "engine_smes" + requires_power = FALSE //This area only covers the batteries and they deal with their own power + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/engine/engineering + name = "Engineering" + icon_state = "engine_smes" + +/area/engine/break_room + name = "\improper Engineering Foyer" + icon_state = "engine" + +/area/engine/equipmentstorage + name = "\improper Engineering Equipment Storage" + icon_state = "storage" + +/area/engine/hardsuitstorage + name = "\improper Engineering Hardsuit Storage" + icon_state = "storage" + +/area/engine/controlroom + name = "\improper Engineering Control Room" + icon_state = "engine_control" + +/area/engine/gravitygenerator + name = "\improper Gravity Generator" + icon_state = "engine" + +/area/engine/chiefs_office + name = "\improper Chief Engineer's office" + icon_state = "engine_control" + +/area/engine/mechanic_workshop + name = "\improper Mechanic Workshop" + icon_state = "engine" + +/area/engine/mechanic_workshop/hanger + name = "\improper Hanger Bay" + icon_state = "engine" + +/area/engine/supermatter + name = "\improper Supermatter Engine" + icon_state = "engine" + +//Solars + +/area/solar + requires_power = FALSE + valid_territory = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT + +/area/solar/auxport + name = "\improper Fore Port Solar Array" + icon_state = "panelsA" + +/area/solar/auxstarboard + name = "\improper Fore Starboard Solar Array" + icon_state = "panelsA" + +/area/solar/fore + name = "\improper Fore Solar Array" + icon_state = "yellow" + +/area/solar/aft + name = "\improper Aft Solar Array" + icon_state = "aft" + +/area/solar/starboard + name = "\improper Aft Starboard Solar Array" + icon_state = "panelsS" + +/area/solar/port + name = "\improper Aft Port Solar Array" + icon_state = "panelsP" + +/area/maintenance/auxsolarport + name = "\improper Fore Port Solar Maintenance" + icon_state = "SolarcontrolA" + +/area/maintenance/starboardsolar + name = "\improper Aft Starboard Solar Maintenance" + icon_state = "SolarcontrolS" + +/area/maintenance/portsolar + name = "\improper Aft Port Solar Maintenance" + icon_state = "SolarcontrolP" + +/area/maintenance/auxsolarstarboard + name = "\improper Fore Starboard Solar Maintenance" + icon_state = "SolarcontrolA" + + +/area/assembly/chargebay + name = "\improper Mech Bay" + icon_state = "mechbay" + +/area/assembly/showroom + name = "\improper Robotics Showroom" + icon_state = "showroom" + +/area/assembly/robotics + name = "\improper Robotics Lab" + icon_state = "ass_line" + +/area/assembly/assembly_line //Derelict Assembly Line + name = "\improper Assembly Line" + icon_state = "ass_line" + power_equip = 0 + power_light = 0 + power_environ = 0 + +//Teleporter + +/area/teleporter + name = "\improper Teleporter" + icon_state = "teleporter" + music = "signal" + +/area/gateway + name = "\improper Gateway" + icon_state = "teleporter" + music = "signal" + +/area/AIsattele + name = "\improper Abandoned Teleporter" + icon_state = "teleporter" + music = "signal" + ambientsounds = list('sound/ambience/ambimalf.ogg') + +/area/toxins/explab + name = "\improper E.X.P.E.R.I-MENTOR Lab" + icon_state = "toxmisc" + +/area/toxins/explab_chamber + name = "\improper E.X.P.E.R.I-MENTOR Chamber" + icon_state = "toxmisc" + +//MedBay + +/area/medical/medbay + name = "\improper Medbay" + icon_state = "medbay" + music = 'sound/ambience/signal.ogg' + +//Medbay is a large area, these additional areas help level out APC load. +/area/medical/medbay2 + name = "\improper Medbay" + icon_state = "medbay2" + music = 'sound/ambience/signal.ogg' + +/area/medical/medbay3 + name = "\improper Medbay" + icon_state = "medbay3" + music = 'sound/ambience/signal.ogg' + + +/area/medical/biostorage + name = "\improper Medical Storage" + icon_state = "medbaysecstorage" + music = 'sound/ambience/signal.ogg' + +/area/medical/reception + name = "\improper Medbay Reception" + icon_state = "medbay" + music = 'sound/ambience/signal.ogg' + +/area/medical/psych + name = "\improper Psych Room" + icon_state = "medbaypsych" + music = 'sound/ambience/signal.ogg' + +/area/medical/medbreak + name = "\improper Break Room" + icon_state = "medbaybreak" + music = 'sound/ambience/signal.ogg' + +/area/medical/patients_rooms + name = "\improper Patient's Rooms" + icon_state = "patients" + +/area/medical/ward + name = "\improper Medbay Patient Ward" + icon_state = "patientsward" + +/area/medical/patient_a + name = "\improper Isolation A" + icon_state = "medbayisoa" + +/area/medical/patient_b + name = "\improper Isolation B" + icon_state = "medbayisob" + +/area/medical/patient_c + name = "\improper Isolation C" + icon_state = "medbayisoc" + +/area/medical/iso_access + name = "\improper Isolation Access" + icon_state = "medbayisoaccess" + +/area/medical/cmo + name = "\improper Chief Medical Officer's office" + icon_state = "CMO" + +/area/medical/cmostore + name = "\improper Medical Secondary Storage" + icon_state = "medbaysecstorage" + +/area/medical/robotics + name = "\improper Robotics" + icon_state = "medresearch" + +/area/medical/research + name = "\improper Medical Research" + icon_state = "medresearch" + +/area/medical/research_shuttle_dock + name = "\improper Research Shuttle Dock" + icon_state = "medresearch" + +/area/medical/virology + name = "\improper Virology" + icon_state = "virology" + +/area/medical/virology/lab + name = "\improper Virology Laboratory" + icon_state = "virology" + +/area/medical/morgue + name = "\improper Morgue" + icon_state = "morgue" + ambientsounds = list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg') + +/area/medical/chemistry + name = "\improper Chemistry" + icon_state = "chem" + +/area/medical/surgery + name = "\improper Surgery" + icon_state = "surgery" + +/area/medical/surgery1 + name = "\improper Surgery 1" + icon_state = "surgery1" + +/area/medical/surgery2 + name = "\improper Surgery 2" + icon_state = "surgery2" + +/area/medical/surgeryobs + name = "\improper Surgery Observation" + icon_state = "surgery" + +/area/medical/cryo + name = "\improper Cryogenics" + icon_state = "cryo" + +/area/medical/exam_room + name = "\improper Exam Room" + icon_state = "exam_room" + +/area/medical/genetics + name = "\improper Genetics Lab" + icon_state = "genetics" + +/area/medical/genetics_cloning + name = "\improper Cloning Lab" + icon_state = "cloning" + +/area/medical/sleeper + name = "\improper Medical Treatment Center" + icon_state = "exam_room" + +/area/medical/paramedic + name = "\improper Paramedic" + icon_state = "medbay" + +//Security + +/area/security/main + name = "\improper Security Office" + icon_state = "securityoffice" + +/area/security/lobby + name = "\improper Security Lobby" + icon_state = "securitylobby" + +/area/security/brig + name = "\improper Brig" + icon_state = "brig" + +/area/security/brig/prison_break() + for(var/obj/structure/closet/secure_closet/brig/temp_closet in src) + temp_closet.locked = 0 + temp_closet.icon_state = temp_closet.icon_closed + for(var/obj/machinery/door_timer/temp_timer in src) + temp_timer.releasetime = 1 + ..() + +/area/security/permabrig + 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) + temp_closet.locked = 0 + temp_closet.icon_state = temp_closet.icon_closed + for(var/obj/machinery/door_timer/temp_timer in src) + temp_timer.releasetime = 1 + ..() + +/area/security/prison/cell_block + name = "\improper Prison Cell Block" + icon_state = "brig" + +/area/security/prison/cell_block/A + name = "\improper Prison Cell Block A" + icon_state = "brigcella" + +/area/security/prison/cell_block/B + name = "\improper Prison Cell Block B" + icon_state = "brigcellb" + +/area/security/prison/cell_block/C + name = "\improper Prison Cell Block C" + icon_state = "brig" + +/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" + icon_state = "securityequipmentstorage" + +/area/security/interrogationhallway + name = "\improper Interrogation Hallway" + icon_state = "interrogationhall" + +/area/security/courtroomdandp + name = "\improper Courtroom Defense and Prosecution" + icon_state = "seccourt" + +/area/security/interrogationobs + name = "\improper Interrogation Observation" + icon_state = "security" + can_get_auto_cryod = FALSE + +/area/security/evidence + name = "\improper Evidence Room" + icon_state = "evidence" + +/area/security/prisonlockers + name = "\improper Prisoner Lockers" + icon_state = "sec_prison_lockers" + can_get_auto_cryod = FALSE + +/area/security/medbay + name = "\improper Security Medbay" + icon_state = "security_medbay" + +/area/security/prisonershuttle + name = "\improper Security Prisoner Shuttle" + icon_state = "security" + can_get_auto_cryod = FALSE + +/area/security/warden + name = "\improper Warden's Office" + icon_state = "Warden" + +/area/security/armoury + name = "\improper Armory" + icon_state = "armory" + +/area/security/securearmoury + name = "\improper Secure Armory" + icon_state = "secarmory" + +/area/security/securehallway + name = "\improper Security Secure Hallway" + icon_state = "securehall" + +/area/security/hos + name = "\improper Head of Security's Office" + icon_state = "sec_hos" + +/area/security/podbay + name = "\improper Security Podbay" + icon_state = "securitypodbay" + +/area/security/detectives_office + name = "\improper Detective's Office" + icon_state = "detective" + +/area/security/range + name = "\improper Firing Range" + icon_state = "firingrange" + +/area/security/nuke_storage + name = "\improper Vault" + icon_state = "nuke_storage" + +/area/security/customs + name = "\improper Customs" + icon_state = "checkpoint1" + +/area/security/customs2 + name = "\improper Customs" + icon_state = "security" + +/area/security/checkpoint + name = "\improper Security Checkpoint" + icon_state = "checkpoint1" + +/area/security/checkpoint2 + name = "\improper Security Checkpoint" + icon_state = "security" + +/area/security/checkpoint/supply + name = "Security Post - Cargo Bay" + icon_state = "checkpoint1" + +/area/security/checkpoint/engineering + name = "Security Post - Engineering" + icon_state = "checkpoint1" + +/area/security/checkpoint/medical + name = "Security Post - Medbay" + icon_state = "checkpoint1" + +/area/security/checkpoint/science + name = "Security Post - Science" + icon_state = "checkpoint1" + +/area/security/vacantoffice + name = "\improper Vacant Office" + icon_state = "security" + +/area/security/vacantoffice2 + name = "\improper Vacant Office" + icon_state = "security" + +/area/quartermaster + name = "\improper Quartermasters" + icon_state = "quart" + +///////////WORK IN PROGRESS////////// + +/area/quartermaster/sorting + name = "\improper Delivery Office" + icon_state = "quartstorage" + +////////////WORK IN PROGRESS////////// + +/area/quartermaster/office + name = "\improper Cargo Office" + icon_state = "quartoffice" + +/area/quartermaster/storage + name = "\improper Cargo Bay" + icon_state = "quartstorage" + +/area/quartermaster/qm + name = "\improper Quartermaster's Office" + icon_state = "quart" + +/area/quartermaster/miningdock + name = "\improper Mining Dock" + icon_state = "mining" + +/area/quartermaster/miningstorage + name = "\improper Mining Storage" + icon_state = "green" + +/area/quartermaster/mechbay + name = "\improper Mech Bay" + icon_state = "yellow" + +/area/janitor + name = "\improper Custodial Closet" + icon_state = "janitor" + +/area/hydroponics + name = "\improper Hydroponics" + icon_state = "hydro" + +/area/hydroponics/abandoned_garden + name = "\improper Abandoned Garden" + icon_state = "hydro" + +//Toxins + +/area/toxins/lab + name = "\improper Research and Development" + icon_state = "toxlab" + +/area/toxins/hallway + name = "\improper Research Lab" + icon_state = "toxlab" + +/area/toxins/rdoffice + name = "\improper Research Director's Office" + icon_state = "head_quarters" + +/area/toxins/supermatter + name = "\improper Supermatter Lab" + icon_state = "toxlab" + +/area/toxins/xenobiology + name = "\improper Xenobiology Lab" + icon_state = "toxmix" + xenobiology_compatible = TRUE + +/area/toxins/xenobiology/xenoflora_storage + name = "\improper Xenoflora Storage" + icon_state = "toxlab" + +/area/toxins/xenobiology/xenoflora + name = "\improper Xenoflora Lab" + icon_state = "toxlab" + +/area/toxins/storage + name = "\improper Toxins Storage" + icon_state = "toxstorage" + +/area/toxins/test_area + name = "\improper Toxins Test Area" + icon_state = "toxtest" + valid_territory = FALSE + +/area/toxins/mixing + name = "\improper Toxins Mixing Room" + icon_state = "toxmix" + +/area/toxins/launch + name = "Toxins Launch Room" + icon_state = "toxlaunch" + +/area/toxins/misc_lab + name = "\improper Research Testing Lab" + icon_state = "toxmisc" + +/area/toxins/test_chamber + name = "\improper Research Testing Chamber" + icon_state = "toxtest" + +/area/toxins/server + name = "\improper Server Room" + icon_state = "server" + +/area/toxins/server_coldroom + name = "\improper Server Coldroom" + icon_state = "servercold" + +/area/toxins/explab + name = "\improper Experimentation Lab" + icon_state = "toxmisc" + +//Storage + +/area/storage/tools + name = "Auxiliary Tool Storage" + icon_state = "storage" + +/area/storage/primary + name = "Primary Tool Storage" + icon_state = "primarystorage" + +/area/storage/autolathe + name = "Autolathe Storage" + icon_state = "storage" + +/area/storage/art + name = "Art Supply Storage" + icon_state = "storage" + +/area/storage/auxillary + name = "Auxillary Storage" + icon_state = "auxstorage" + +/area/storage/eva + name = "EVA Storage" + icon_state = "eva" + +/area/storage/secure + name = "Secure Storage" + icon_state = "storage" + +/area/storage/emergency + name = "Starboard Emergency Storage" + icon_state = "emergencystorage" + +/area/storage/emergency2 + name = "Port Emergency Storage" + icon_state = "emergencystorage" + +/area/storage/tech + name = "Technical Storage" + icon_state = "auxstorage" + +/area/storage/office + name = "\improper Office Supplies" + icon_state = "office_supplies" + +// ENGIE OUTPOST + +/area/engiestation + name = "\improper Engineering Outpost" + icon_state = "construction" + +/area/engiestation/solars + name = "\improper Engineering Outpost Solars" + icon_state = "panelsP" + +//DJSTATION + +/area/djstation + name = "\improper Ruskie DJ Station" + icon_state = "DJ" + +/area/djstation/solars + name = "\improper Ruskie DJ Station Solars" + icon_state = "DJ" + +//DERELICT + +/area/derelict + name = "\improper Derelict Station" + icon_state = "storage" + +/area/derelict/hallway/primary + name = "\improper Derelict Primary Hallway" + icon_state = "hallP" + +/area/derelict/hallway/secondary + name = "\improper Derelict Secondary Hallway" + icon_state = "hallS" + +/area/derelict/arrival + name = "\improper Derelict Arrival Centre" + icon_state = "yellow" + +/area/derelict/storage/equipment + name = "Derelict Equipment Storage" + +/area/derelict/storage/storage_access + name = "Derelict Storage Access" + +/area/derelict/storage/engine_storage + name = "Derelict Engine Storage" + icon_state = "green" + +/area/derelict/bridge + name = "\improper Derelict Control Room" + icon_state = "bridge" + +/area/derelict/secret + name = "\improper Derelict Secret Room" + icon_state = "library" + +/area/derelict/bridge/access + name = "Derelict Control Room Access" + icon_state = "auxstorage" + +/area/derelict/bridge/ai_upload + name = "\improper Derelict Computer Core" + icon_state = "ai" + +/area/derelict/solar_control + name = "\improper Derelict Solar Control" + icon_state = "engine" + +/area/derelict/se_solar + name = "South East Solars" + icon_state = "engine" + +/area/derelict/crew_quarters + name = "\improper Derelict Crew Quarters" + icon_state = "fitness" + +/area/derelict/medical + name = "Derelict Medbay" + icon_state = "medbay" + +/area/derelict/medical/morgue + name = "\improper Derelict Morgue" + icon_state = "morgue" + +/area/derelict/medical/chapel + name = "\improper Derelict Chapel" + icon_state = "chapel" + +/area/derelict/teleporter + name = "\improper Derelict Teleporter" + icon_state = "teleporter" + +/area/derelict/eva + name = "Derelict EVA Storage" + icon_state = "eva" + +/area/shuttle/derelict/ship/start + name = "\improper Abandoned Ship" + icon_state = "yellow" + +/area/shuttle/derelict/ship/transit + name = "\improper Abandoned Ship" + icon_state = "yellow" + +/area/shuttle/derelict/ship/engipost + name = "\improper Engineering Outpost" + icon_state = "yellow" + +/area/shuttle/derelict/ship/station + name = "\improper North of SS13" + icon_state = "yellow" + +/area/solar/derelict_starboard + name = "\improper Derelict Starboard Solar Array" + icon_state = "panelsS" + +/area/solar/derelict_aft + name = "\improper Derelict Aft Solar Array" + icon_state = "aft" + +/area/derelict/singularity_engine + name = "\improper Derelict Singularity Engine" + icon_state = "engine" + +/area/derelict/gravity_generator + name = "\improper Derelict Gravity Generator Room" + icon_state = "red" + +/area/derelict/atmospherics + name = "Derelict Atmospherics" + icon_state = "red" + +//HALF-BUILT STATION (REPLACES DERELICT IN BAYCODE, ABOVE IS LEFT FOR DOWNSTREAM) + +/area/shuttle/constructionsite + name = "\improper Construction Site Shuttle" + icon_state = "yellow" + +/area/shuttle/constructionsite/station + name = "\improper Construction Site Shuttle" + +/area/shuttle/constructionsite/site + name = "\improper Construction Site Shuttle" + +/area/constructionsite + name = "\improper Construction Site" + icon_state = "storage" + +/area/constructionsite/storage + name = "\improper Construction Site Storage Area" + +/area/constructionsite/science + name = "\improper Construction Site Research" + icon_state = "medresearch" + +/area/constructionsite/bridge + name = "\improper Construction Site Bridge" + icon_state = "bridge" + +/area/constructionsite/hallway/center + name = "\improper Construction Site Central Hallway" + icon_state = "hallC" + +/area/constructionsite/hallway/engcore + name = "\improper Construction Site Eng Core" + icon_state = "green" + +/area/constructionsite/hallway/fore + name = "\improper Construction Site Fore" + icon_state = "green" + +/area/constructionsite/hallway/port + name = "\improper Construction Site Port" + icon_state = "hallP" + +/area/constructionsite/hallway/aft + name = "\improper Construction Site Aft" + icon_state = "hallA" + +/area/constructionsite/hallway/starboard + name = "\improper Construction Site Starboard" + icon_state = "hallS" + +/area/constructionsite/atmospherics + name = "\improper Construction Site Atmospherics" + icon_state = "atmos" + +/area/constructionsite/medical + name = "\improper Construction Site Medbay" + icon_state = "medbay" + +/area/constructionsite/ai + name = "\improper Construction Computer Core" + icon_state = "ai" + +/area/constructionsite/engineering + name = "\improper Construction Site Engine Bay" + icon_state = "engine" + +/area/solar/constructionsite + name = "\improper Construction Site Solars" + icon_state = "panelsA" + + +//Construction + +/area/construction + name = "\improper Construction Area" + icon_state = "yellow" + +/area/mining_construction + name = "Auxillary Base Construction" + icon_state = "yellow" + +/area/construction/supplyshuttle + name = "\improper Supply Shuttle" + icon_state = "yellow" + +/area/construction/quarters + name = "\improper Engineer's Quarters" + icon_state = "yellow" + +/area/construction/qmaint + name = "Maintenance" + icon_state = "yellow" + +/area/construction/hallway + name = "\improper Hallway" + icon_state = "yellow" + +/area/construction/solars + name = "\improper Solar Panels" + icon_state = "yellow" + +/area/construction/solarscontrol + name = "\improper Solar Panel Control" + icon_state = "yellow" + +/area/construction/Storage + name = "Construction Site Storage" + icon_state = "yellow" + + +//GAYBAR +/area/secret/gaybar + name = "\improper Dance Bar" + icon_state = "dancebar" + + +//Traitor Station +/area/traitor + name = "\improper Syndicate Base" + icon_state = "syndie_hall" + report_alerts = FALSE + +/area/traitor/rnd + name = "\improper Syndicate Research and Development" + icon_state = "syndie_rnd" + +/area/traitor/chem + name = "\improper Syndicate Chemistry" + icon_state = "syndie_chem" + +/area/traitor/tox + name = "\improper Syndicate Toxins" + icon_state = "syndie_tox" + +/area/traitor/atmos + name = "\improper Syndicate Atmos" + icon_state = "syndie_atmo" + +/area/traitor/inter + name = "\improper Syndicate Interrogation" + icon_state = "syndie_inter" + +/area/traitor/radio + name = "\improper Syndicate Eavesdropping Booth" + icon_state = "syndie_radio" + +/area/traitor/surgery + name = "\improper Syndicate Surgery Theatre" + icon_state = "syndie_surgery" + +/area/traitor/hall + name = "\improper Syndicate Station" + icon_state = "syndie_hall" + +/area/traitor/kitchen + name = "\improper Syndicate Kitchen" + icon_state = "syndie_kitchen" + +/area/traitor/empty + name = "\improper Syndicate Project Room" + icon_state = "syndie_empty" + + +//AI + +/area/ai_monitored/storage/eva + name = "EVA Storage" + icon_state = "eva" + +/area/ai_monitored/storage/secure + name = "Secure Storage" + icon_state = "storage" + +/area/ai_monitored/storage/emergency + name = "Emergency Storage" + icon_state = "storage" + +/area/turret_protected/ + ambientsounds = list('sound/ambience/ambimalf.ogg') + +/area/turret_protected/ai_upload + name = "\improper AI Upload Chamber" + icon_state = "ai_upload" + +/area/turret_protected/ai_upload_foyer + name = "AI Upload Access" + icon_state = "ai_foyer" + +/area/turret_protected/ai + name = "\improper AI Chamber" + icon_state = "ai_chamber" + +/area/turret_protected/aisat + name = "\improper AI Satellite" + icon_state = "ai" + +/area/aisat + name = "\improper AI Satellite Exterior" + icon_state = "yellow" + +/area/aisat/entrance + name = "\improper AI Satellite Entrance" + icon_state = "ai_foyer" + +/area/aisat/maintenance + name = "\improper AI Satellite Maintenance" + icon_state = "storage" + +/area/turret_protected/aisat_interior + name = "\improper AI Satellite Antechamber" + icon_state = "ai" + + +//Misc + +/area/wreck/ai + name = "\improper AI Chamber" + icon_state = "ai" + +/area/wreck/main + name = "\improper Wreck" + icon_state = "storage" + +/area/wreck/engineering + name = "\improper Power Room" + icon_state = "engine" + +/area/wreck/bridge + name = "\improper Bridge" + icon_state = "bridge" + +/area/generic + name = "Unknown" + icon_state = "storage" + + + +// Telecommunications Satellite + +/area/tcommsat + ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') + +/area/tcommsat/entrance + name = "\improper Telecoms Teleporter" + icon_state = "tcomsatentrance" + +/area/tcommsat/chamber + name = "\improper Telecoms Central Compartment" + icon_state = "tcomsatcham" + +/area/turret_protected/tcomsat + name = "\improper Telecoms Satellite" + icon_state = "tcomsatlob" + ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') + +/area/turret_protected/tcomfoyer + name = "\improper Telecoms Foyer" + icon_state = "tcomsatentrance" + ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') + +/area/turret_protected/tcomwest + name = "\improper Telecoms West Wing" + icon_state = "tcomsatwest" + ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') + +/area/turret_protected/tcomeast + name = "\improper Telecoms East Wing" + icon_state = "tcomsateast" + ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') + +/area/tcommsat/computer + name = "\improper Telecoms Control Room" + icon_state = "tcomsatcomp" + +/area/tcommsat/server + name = "\improper Telecoms Server Room" + icon_state = "tcomsatcham" + +/area/tcommsat/lounge + name = "\improper Telecoms Lounge" + icon_state = "tcomsatlounge" + +/area/tcommsat/powercontrol + name = "\improper Telecoms Power Control" + icon_state = "tcomsatwest" + +// Away Missions +/area/awaymission + name = "\improper Strange Location" + icon_state = "away" + report_alerts = FALSE + +/area/awaymission/example + name = "\improper Strange Station" + icon_state = "away" + +/area/awaymission/desert + name = "Mars" + icon_state = "away" + +/area/awaymission/beach + name = "Beach" + icon_state = "beach" + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + requires_power = FALSE + ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg') + +/area/awaymission/undersea + name = "Undersea" + icon_state = "undersea" + + +////////////////////////AWAY AREAS/////////////////////////////////// + +/area/awaycontent + name = "space" + report_alerts = FALSE + +/area/awaycontent/a1 + icon_state = "awaycontent1" + +/area/awaycontent/a2 + icon_state = "awaycontent2" + +/area/awaycontent/a3 + icon_state = "awaycontent3" + +/area/awaycontent/a4 + icon_state = "awaycontent4" + +/area/awaycontent/a5 + icon_state = "awaycontent5" + +/area/awaycontent/a6 + icon_state = "awaycontent6" + +/area/awaycontent/a7 + icon_state = "awaycontent7" + +/area/awaycontent/a8 + icon_state = "awaycontent8" + +/area/awaycontent/a9 + icon_state = "awaycontent9" + +/area/awaycontent/a10 + icon_state = "awaycontent10" + +/area/awaycontent/a11 + icon_state = "awaycontent11" + +/area/awaycontent/a11 + icon_state = "awaycontent12" + +/area/awaycontent/a12 + icon_state = "awaycontent13" + +/area/awaycontent/a13 + icon_state = "awaycontent14" + +/area/awaycontent/a14 + icon_state = "awaycontent14" + +/area/awaycontent/a15 + icon_state = "awaycontent15" + +/area/awaycontent/a16 + icon_state = "awaycontent16" + +/area/awaycontent/a17 + icon_state = "awaycontent17" + +/area/awaycontent/a18 + icon_state = "awaycontent18" + +/area/awaycontent/a19 + icon_state = "awaycontent19" + +/area/awaycontent/a20 + icon_state = "awaycontent20" + +/area/awaycontent/a21 + icon_state = "awaycontent21" + +/area/awaycontent/a22 + icon_state = "awaycontent22" + +/area/awaycontent/a23 + icon_state = "awaycontent23" + +/area/awaycontent/a24 + icon_state = "awaycontent24" + +/area/awaycontent/a25 + icon_state = "awaycontent25" + +/area/awaycontent/a26 + icon_state = "awaycontent26" + +/area/awaycontent/a27 + icon_state = "awaycontent27" + +/area/awaycontent/a28 + icon_state = "awaycontent28" + +/area/awaycontent/a29 + icon_state = "awaycontent29" + +/area/awaycontent/a30 + icon_state = "awaycontent30" + +////////////////////////VR AREAS/////////////////////////////////// + +/area/vr + name = "VR" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + no_teleportlocs = TRUE + +/area/vr/lobby + name = "VR Lobby" + +/area/vr/roman + name = "Roman Arena" + + +///////////////////////////////////////////////////////////////////// +/* + Lists of areas to be used with is_type_in_list. + Used in gamemodes code at the moment. --rastaf0 +*/ + +// CENTCOM +var/list/centcom_areas = list ( + /area/centcom, + /area/shuttle/escape_pod1/centcom, + /area/shuttle/escape_pod2/centcom, + /area/shuttle/escape_pod3/centcom, + /area/shuttle/escape_pod5/centcom, + /area/shuttle/transport1, + /area/shuttle/administration/centcom, + /area/shuttle/specops/centcom, +) + +//SPACE STATION 13 +var/list/the_station_areas = list ( + /area/shuttle/arrival, + /area/shuttle/escape, + /area/shuttle/escape_pod1/station, + /area/shuttle/escape_pod2/station, + /area/shuttle/escape_pod3/station, + /area/shuttle/escape_pod5/station, + /area/shuttle/prison/station, + /area/shuttle/administration/station, + /area/shuttle/specops/station, + /area/atmos, + /area/maintenance, + /area/hallway, + /area/hallway/primary/fore, + /area/hallway/primary/starboard, + /area/hallway/primary/aft, + /area/hallway/primary/port, + /area/hallway/primary/central, + /area/bridge, + /area/crew_quarters, + /area/civilian, + /area/holodeck, + /area/library, + /area/chapel, + /area/escapepodbay, + /area/lawoffice, + /area/magistrateoffice, + /area/clownoffice, + /area/mimeoffice, + /area/engine, + /area/solar, + /area/assembly, + /area/teleporter, + /area/medical, + /area/security, + /area/quartermaster, + /area/janitor, + /area/hydroponics, + /area/toxins, + /area/storage, + /area/construction, + /area/ai_monitored/storage/eva, //do not try to simplify to "/area/ai_monitored" --rastaf0 + /area/ai_monitored/storage/secure, + /area/ai_monitored/storage/emergency, + /area/turret_protected/ai_upload, //do not try to simplify to "/area/turret_protected" --rastaf0 + /area/turret_protected/ai_upload_foyer, + /area/turret_protected/ai, +) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index a74314a9919..2e7448ec5c8 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -1,9 +1,61 @@ -// Areas.dm - -// === /area + var/fire = null + var/atmosalm = ATMOS_ALARM_NONE + var/poweralm = TRUE + var/party = null + var/report_alerts = TRUE // Should atmos alerts notify the AI/computers + level = null + name = "Space" + icon = 'icons/turf/areas.dmi' + icon_state = "unknown" + layer = AREA_LAYER + plane = BLACKNESS_PLANE //Keeping this on the default plane, GAME_PLANE, will make area overlays fail to render on FLOOR_PLANE. + luminosity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + invisibility = INVISIBILITY_LIGHTING + var/valid_territory = TRUE //used for cult summoning areas on station zlevel + var/map_name // Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints. + var/lightswitch = TRUE + + var/eject = null + + var/debug = FALSE + var/requires_power = TRUE + var/always_unpowered = FALSE //this gets overriden to 1 for space in area/New() + + var/power_equip = TRUE + var/power_light = TRUE + var/power_environ = TRUE + var/music = null + var/used_equip = FALSE + var/used_light = FALSE + var/used_environ = FALSE + var/static_equip + var/static_light = FALSE + var/static_environ + + var/has_gravity = TRUE + var/list/apc = list() + var/no_air = null + + var/air_doors_activated = FALSE + + var/tele_proof = FALSE + var/no_teleportlocs = FALSE + + var/outdoors = FALSE //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room) + var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default? + var/nad_allowed = FALSE //is the station NAD allowed on this area? + + // This var is used with the maploader (modules/awaymissions/maploader/reader.dm) + // if this is 1, when used in a map snippet, this will instantiate a unique + // area from any other instances already present (meaning you can have + // separate APCs, and so on) + var/there_can_be_many = FALSE + var/global/global_uid = 0 var/uid + var/list/ambientsounds = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg',\ 'sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg',\ 'sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg',\ @@ -11,42 +63,49 @@ 'sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg',\ 'sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg') - // This var is used with the maploader (modules/awaymissions/maploader/reader.dm) - // if this is 1, when used in a map snippet, this will instantiate a unique - // area from any other instances already present (meaning you can have - // separate APCs, and so on) - var/there_can_be_many = 0 + 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/New() - - ..() +/area/Initialize(mapload) + GLOB.all_areas += src icon_state = "" layer = AREA_LAYER uid = ++global_uid - GLOB.all_areas += src + map_name = name // Save the initial (the name set in the map) name of the area. - if(type == /area) // override defaults for space. TODO: make space areas of type /area/space rather than /area - requires_power = 1 - always_unpowered = 1 - dynamic_lighting = 1 - power_light = 0 - power_equip = 0 - power_environ = 0 -// lighting_state = 4 - //has_gravity = 0 // Space has gravity. Because.. because. + if(requires_power) + luminosity = 0 + else + power_light = TRUE + power_equip = TRUE + power_environ = TRUE - if(requires_power != 0) - power_light = 0 //rastaf0 - power_equip = 0 //rastaf0 - power_environ = 0 //rastaf0 + if(dynamic_lighting == DYNAMIC_LIGHTING_FORCED) + dynamic_lighting = DYNAMIC_LIGHTING_ENABLED + luminosity = 0 + else if(dynamic_lighting != DYNAMIC_LIGHTING_IFSTARLIGHT) + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + if(dynamic_lighting == DYNAMIC_LIGHTING_IFSTARLIGHT) + dynamic_lighting = config.starlight ? DYNAMIC_LIGHTING_ENABLED : DYNAMIC_LIGHTING_DISABLED + + . = ..() blend_mode = BLEND_MULTIPLY // Putting this in the constructor so that it stops the icons being screwed up in the map editor. -/area/Initialize() - . = ..() + if(!IS_DYNAMIC_LIGHTING(src)) + add_overlay(/obj/effect/fullbright) + reg_in_areas_in_z() + + return INITIALIZE_HINT_LATELOAD + +/area/LateInitialize() + . = ..() + power_change() // all machines set to current power level, also updates lighting icon + +/area/proc/reg_in_areas_in_z() if(contents.len) var/list/areas_in_z = space_manager.areas_in_z var/z @@ -63,12 +122,6 @@ areas_in_z["[z]"] = list() areas_in_z["[z]"] += src - return INITIALIZE_HINT_LATELOAD - -/area/LateInitialize() - . = ..() - power_change() // all machines set to current power level, also updates lighting icon - /area/proc/get_cameras() var/list/cameras = list() for(var/obj/machinery/camera/C in src) @@ -77,10 +130,11 @@ /area/proc/atmosalert(danger_level, var/alarm_source, var/force = FALSE) - if(danger_level == ATMOS_ALARM_NONE) - atmosphere_alarm.clearAlarm(src, alarm_source) - else - atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level) + if(report_alerts) + if(danger_level == ATMOS_ALARM_NONE) + SSalarms.atmosphere_alarm.clearAlarm(src, alarm_source) + else + SSalarms.atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level) //Check all the alarms before lowering atmosalm. Raising is perfectly fine. If force = 1 we don't care. for(var/obj/machinery/alarm/AA in src) @@ -158,9 +212,9 @@ if(A.density) A.lock() - burglar_alarm.triggerAlarm(src, trigger) + SSalarms.burglar_alarm.triggerAlarm(src, trigger) spawn(600) - burglar_alarm.clearAlarm(src, trigger) + SSalarms.burglar_alarm.clearAlarm(src, trigger) /area/proc/set_fire_alarm_effect() fire = 1 @@ -199,7 +253,6 @@ icon_state = "party" else icon_state = "blue-red" - invisibility = INVISIBILITY_LIGHTING else var/weather_icon for(var/V in SSweather.processing) @@ -209,12 +262,9 @@ weather_icon = TRUE if(!weather_icon) icon_state = null - invisibility = INVISIBILITY_MAXIMUM /area/space/updateicon() icon_state = null - invisibility = INVISIBILITY_MAXIMUM - /* #define EQUIP 1 @@ -317,9 +367,6 @@ M.lastarea = src - // /vg/ - EVENTS! - callHook("mob_area_change", list("mob" = M, "newarea" = newarea, "oldarea" = oldarea)) - if(!istype(A,/mob/living)) return var/mob/living/L = A @@ -341,7 +388,7 @@ L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE) L.client.played = 1 spawn(600) //ewww - this is very very bad - if(L.&& L.client) + if(L && L.client) L.client.played = 0 /area/proc/gravitychange(var/gravitystate = 0, var/area/A) @@ -362,7 +409,7 @@ if(istype(get_turf(M), /turf/space)) // Can't fall onto nothing. return - if((istype(M,/mob/living/carbon/human/)) && (M.m_intent == MOVE_INTENT_RUN)). + if((istype(M,/mob/living/carbon/human/)) && (M.m_intent == MOVE_INTENT_RUN)) M.Stun(5) M.Weaken(5) diff --git a/code/game/area/depot-areas.dm b/code/game/area/areas/depot-areas.dm similarity index 100% rename from code/game/area/depot-areas.dm rename to code/game/area/areas/depot-areas.dm diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm new file mode 100644 index 00000000000..4a2317889fa --- /dev/null +++ b/code/game/area/areas/mining.dm @@ -0,0 +1,130 @@ +/**********************Mine areas**************************/ + +/area/mine + icon_state = "mining" + has_gravity = TRUE + +/area/mine/explored + name = "Mine" + icon_state = "explored" + music = null + always_unpowered = TRUE + requires_power = TRUE + poweralm = FALSE + power_environ = FALSE + power_equip = FALSE + power_light = FALSE + outdoors = TRUE + ambientsounds = list('sound/ambience/ambimine.ogg') + flags = NONE + +/area/mine/dangerous/explored/golem + name = "Small Asteroid" + +/area/mine/unexplored + name = "Mine" + icon_state = "unexplored" + music = null + always_unpowered = TRUE + requires_power = TRUE + poweralm = FALSE + power_environ = FALSE + power_equip = FALSE + power_light = FALSE + outdoors = TRUE + ambientsounds = list('sound/ambience/ambimine.ogg') + flags = NONE + +/area/mine/lobby + name = "Mining Station" + +/area/mine/storage + name = "Mining Station Storage" + +/area/mine/production + name = "Mining Station Starboard Wing" + icon_state = "mining_production" + +/area/mine/abandoned + name = "Abandoned Mining Station" + +/area/mine/living_quarters + name = "Mining Station Port Wing" + icon_state = "mining_living" + +/area/mine/eva + name = "Mining Station EVA" + icon_state = "mining_eva" + +/area/mine/maintenance + name = "Mining Station Communications" + +/area/mine/cafeteria + name = "Mining station Cafeteria" + +/area/mine/hydroponics + name = "Mining station Hydroponics" + +/area/mine/sleeper + name = "Mining station Emergency Sleeper" + +/area/mine/north_outpost + name = "North Mining Outpost" + +/area/mine/west_outpost + name = "West Mining Outpost" + +/area/mine/laborcamp + name = "Labor Camp" + +/area/mine/laborcamp/security + name = "Labor Camp Security" + icon_state = "security" + +/area/mine/podbay + name = "Mining Podbay" + + + +/**********************Lavaland Areas**************************/ + +/area/lavaland + icon_state = "mining" + has_gravity = TRUE + +/area/lavaland/surface + name = "Lavaland" + icon_state = "explored" + music = null + always_unpowered = TRUE + poweralm = FALSE + power_environ = FALSE + power_equip = FALSE + power_light = FALSE + requires_power = TRUE + ambientsounds = list('sound/ambience/ambilava.ogg') + +/area/lavaland/underground + name = "Lavaland Caves" + icon_state = "unexplored" + music = null + always_unpowered = TRUE + requires_power = TRUE + poweralm = FALSE + power_environ = FALSE + power_equip = FALSE + power_light = FALSE + ambientsounds = list('sound/ambience/ambilava.ogg') + +/area/lavaland/surface/outdoors + name = "Lavaland Wastes" + outdoors = TRUE + +/area/lavaland/surface/outdoors/unexplored //monsters and ruins spawn here + icon_state = "unexplored" + +/area/lavaland/surface/outdoors/unexplored/danger //megafauna will also spawn here + icon_state = "danger" + +/area/lavaland/surface/outdoors/explored + name = "Lavaland Labor Camp" \ No newline at end of file diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm new file mode 100644 index 00000000000..d72c6cc0406 --- /dev/null +++ b/code/game/area/areas/ruins/lavaland.dm @@ -0,0 +1,87 @@ +//Lavaland Ruins + +/area/ruin/powered/beach + icon_state = "dk_yellow" + +/area/ruin/powered/clownplanet + icon_state = "dk_yellow" + +/area/ruin/powered/animal_hospital + icon_state = "dk_yellow" + +/area/ruin/powered/snow_biodome + icon_state = "dk_yellow" + +/area/ruin/powered/gluttony + icon_state = "dk_yellow" + +/area/ruin/powered/golem_ship + name = "Free Golem Landing" + icon_state = "dk_yellow" + +/area/ruin/powered/greed + icon_state = "dk_yellow" + +/area/ruin/unpowered/hierophant + name = "Hierophant's Arena" + icon_state = "dk_yellow" + +/area/ruin/powered/pride + icon_state = "dk_yellow" + +/area/ruin/powered/seedvault + icon_state = "dk_yellow" + +/area/ruin/unpowered/syndicate_lava_base + name = "Secret Base" + icon_state = "dk_yellow" + ambientsounds = list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg') + report_alerts = FALSE + hide_attacklogs = TRUE + +/area/ruin/unpowered/syndicate_lava_base/engineering + name = "Syndicate Lavaland Engineering" + +/area/ruin/unpowered/syndicate_lava_base/medbay + name = "Syndicate Lavaland Medbay" + +/area/ruin/unpowered/syndicate_lava_base/arrivals + name = "Syndicate Lavaland Arrivals" + +/area/ruin/unpowered/syndicate_lava_base/bar + name = "Syndicate Lavaland Bar" + +/area/ruin/unpowered/syndicate_lava_base/main + name = "Syndicate Lavaland Primary Hallway" + +/area/ruin/unpowered/syndicate_lava_base/cargo + name = "Syndicate Lavaland Cargo Bay" + +/area/ruin/unpowered/syndicate_lava_base/chemistry + name = "Syndicate Lavaland Chemistry" + +/area/ruin/unpowered/syndicate_lava_base/virology + name = "Syndicate Lavaland Virology" + +/area/ruin/unpowered/syndicate_lava_base/testlab + name = "Syndicate Lavaland Experimentation Lab" + +/area/ruin/unpowered/syndicate_lava_base/dormitories + name = "Syndicate Lavaland Dormitories" + +/area/ruin/unpowered/syndicate_lava_base/telecomms + name = "Syndicate Lavaland Telecommunications" + +//Xeno Nest + +/area/ruin/unpowered/xenonest + name = "The Hive" + always_unpowered = TRUE + power_environ = FALSE + power_equip = FALSE + power_light = FALSE + poweralm = FALSE + +//ash walker nest +/area/ruin/unpowered/ash_walkers + icon_state = "red" \ No newline at end of file diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm index c6edd09575e..e35a7b5bd51 100644 --- a/code/game/asteroid.dm +++ b/code/game/asteroid.dm @@ -30,7 +30,9 @@ var/global/max_secret_rooms = 6 T.ChangeTurf(floor) room_turfs["floors"] += T + var/old_area = T.loc A.contents += T + T.change_area(old_area, A) return room_turfs @@ -87,7 +89,7 @@ var/global/max_secret_rooms = 6 if("cavein") theme = "cavein" walltypes = list(/turf/simulated/mineral/random/high_chance=1) - floortypes = list(/turf/simulated/floor/plating/airless/asteroid, /turf/simulated/floor/beach/sand) + floortypes = list(/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/floor/beach/sand) treasureitems = list(/obj/mecha/working/ripley/mining=1, /obj/item/pickaxe/drill/diamonddrill=2, /obj/item/resonator/upgraded=1, /obj/item/pickaxe/drill/jackhammer=5) fluffitems = list(/obj/effect/decal/cleanable/blood=3,/obj/effect/decal/remains/human=1,/obj/item/clothing/under/overalls=1, @@ -96,7 +98,7 @@ var/global/max_secret_rooms = 6 if("xenoden") theme = "xenoden" walltypes = list(/turf/simulated/mineral/random/high_chance=1) - floortypes = list(/turf/simulated/floor/plating/airless/asteroid, /turf/simulated/floor/beach/sand) + floortypes = list(/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/floor/beach/sand) treasureitems = list(/obj/item/clothing/mask/facehugger=1,/obj/item/stack/sheet/animalhide/xeno=2,/obj/item/clothing/suit/xenos=2,/obj/item/clothing/head/xenos=2,/obj/item/guardiancreator/biological/choose=1) fluffitems = list(/obj/effect/decal/remains/human=1,/obj/effect/decal/cleanable/blood/xeno=5) @@ -104,7 +106,7 @@ var/global/max_secret_rooms = 6 theme = "hitech" walltypes = list(/turf/simulated/wall/r_wall=5,/turf/simulated/mineral/random=1) floortypes = list(/turf/simulated/floor/greengrid,/turf/simulated/floor/bluegrid) - treasureitems = list(/obj/item/stock_parts/cell/hyper=1, /obj/machinery/chem_dispenser/constructable=1,/obj/machinery/computer/telescience=1, /obj/machinery/r_n_d/protolathe=1, + treasureitems = list(/obj/item/stock_parts/cell/hyper=1, /obj/item/circuitboard/chem_dispenser=1,/obj/machinery/computer/telescience=1, /obj/machinery/r_n_d/protolathe=1, /obj/machinery/biogenerator=1) fluffitems = list(/obj/structure/table/reinforced=2,/obj/item/stock_parts/scanning_module/phasic=3, /obj/item/stock_parts/matter_bin/super=3,/obj/item/stock_parts/manipulator/pico=3, @@ -139,7 +141,7 @@ var/global/max_secret_rooms = 6 possiblethemes -= theme //once a theme is selected, it's out of the running! var/floor = pick(floortypes) - turfs = get_area_turfs(/area/mine/dangerous/unexplored) + turfs = get_area_turfs(/area/mine/unexplored) if(!turfs.len) return 0 @@ -177,7 +179,7 @@ var/global/max_secret_rooms = 6 valid = 0 continue - if(locate(/turf/simulated/floor/plating/airless/asteroid) in range(5,T))//A little less strict than the other checks due to tunnels + if(locate(/turf/simulated/floor/plating/asteroid/airless) in range(5,T))//A little less strict than the other checks due to tunnels valid = 0 continue @@ -188,10 +190,6 @@ var/global/max_secret_rooms = 6 if(room)//time to fill it with stuff var/list/emptyturfs = room["floors"] - for(var/turf/simulated/floor/A in emptyturfs) //remove pls doesn't fix problem - if(istype(A)) - spawn(2) - A.fullUpdateMineralOverlays() T = pick(emptyturfs) if(T) new /obj/structure/glowshroom/single(T) //Just to make it a little more visible diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 91132a5f9bd..757f036c691 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1,5 +1,6 @@ /atom - layer = 2 + layer = TURF_LAYER + plane = GAME_PLANE var/level = 2 var/flags = NONE var/flags_2 = NONE @@ -11,7 +12,7 @@ var/last_bumped = 0 var/pass_flags = 0 var/germ_level = GERM_LEVEL_AMBIENT // The higher the germ level, the more germ on the atom. - var/simulated = 1 //filter for actions - used by lighting overlays + var/simulated = TRUE //filter for actions - used by lighting overlays var/atom_say_verb = "says" var/dont_save = 0 // For atoms that are temporary by necessity - like lighting overlays @@ -47,6 +48,9 @@ var/list/remove_overlays // a very temporary list of overlays to remove var/list/add_overlays // a very temporary list of overlays to add + var/list/atom_colours //used to store the different colors on an atom + //its inherent color, the colored paint applied on it, special color effect etc... + /atom/New(loc, ...) if(use_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New() _preloader.load(src) @@ -80,6 +84,9 @@ stack_trace("Warning: [src]([type]) initialized multiple times!") initialized = TRUE + if(color) + add_atom_colour(color, FIXED_COLOUR_PRIORITY) + if(light_power && light_range) update_light() @@ -144,9 +151,12 @@ alternate_appearances = null QDEL_NULL(reagents) - invisibility = 101 + invisibility = INVISIBILITY_MAXIMUM LAZYCLEARLIST(overlays) LAZYCLEARLIST(priority_overlays) + + QDEL_NULL(light) + return ..() //Hook for running code when a dir change occurs @@ -333,6 +343,9 @@ if(AM && isturf(AM.loc)) step(AM, turn(AM.dir, 180)) +/atom/proc/get_spooked() + return + /atom/proc/add_hiddenprint(mob/living/M as mob) if(isnull(M)) return if(isnull(M.key)) return @@ -348,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) @@ -642,15 +655,22 @@ var/list/blood_splatter_icons = list() update_icons() //apply the now updated overlays to the mob -/atom/proc/add_vomit_floor(mob/living/carbon/M as mob, var/toxvomit = 0) - if( istype(src, /turf/simulated) ) - var/obj/effect/decal/cleanable/vomit/this = new /obj/effect/decal/cleanable/vomit(src) +/atom/proc/add_vomit_floor(toxvomit = 0, green = FALSE) + playsound(src, 'sound/effects/splat.ogg', 50, 1) + if(!isspaceturf(src)) + var/type = green ? /obj/effect/decal/cleanable/vomit/green : /obj/effect/decal/cleanable/vomit + var/vomit_reagent = green ? "green_vomit" : "vomit" + for(var/obj/effect/decal/cleanable/vomit/V in get_turf(src)) + if(V.type == type) + V.reagents.add_reagent(vomit_reagent, 5) + return + + var/obj/effect/decal/cleanable/vomit/this = new type(src) // Make toxins vomit look different if(toxvomit) this.icon_state = "vomittox_[pick(1,4)]" - /atom/proc/get_global_map_pos() if(!islist(global_map) || isemptylist(global_map)) return var/cur_x = null @@ -674,16 +694,17 @@ var/list/blood_splatter_icons = list() //the sight changes to give to the mob whose perspective is set to that atom (e.g. A mob with nightvision loses its nightvision while looking through a normal camera) /atom/proc/update_remote_sight(mob/living/user) + user.sync_lighting_plane_alpha() return /atom/proc/checkpass(passflag) return pass_flags&passflag /atom/proc/isinspace() - if(istype(get_turf(src), /turf/space)) - return 1 + if(isspaceturf(get_turf(src))) + return TRUE else - return 0 + return FALSE /atom/proc/handle_fall() return @@ -722,6 +743,8 @@ var/list/blood_splatter_icons = list() switch(var_name) if("light_power", "light_range", "light_color") update_light() + if("color") + add_atom_colour(color, ADMIN_COLOUR_PRIORITY) /atom/vv_get_dropdown() @@ -752,3 +775,52 @@ var/list/blood_splatter_icons = list() /atom/Exited(atom/movable/AM, atom/newLoc) SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, newLoc) + +/* + Adds an instance of colour_type to the atom's atom_colours list +*/ +/atom/proc/add_atom_colour(coloration, colour_priority) + if(!atom_colours || !atom_colours.len) + atom_colours = list() + atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. + if(!coloration) + return + if(colour_priority > atom_colours.len) + return + atom_colours[colour_priority] = coloration + update_atom_colour() + + +/* + Removes an instance of colour_type from the atom's atom_colours list +*/ +/atom/proc/remove_atom_colour(colour_priority, coloration) + if(!atom_colours) + atom_colours = list() + atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. + if(colour_priority > atom_colours.len) + return + if(coloration && atom_colours[colour_priority] != coloration) + return //if we don't have the expected color (for a specific priority) to remove, do nothing + atom_colours[colour_priority] = null + update_atom_colour() + + +/* + Resets the atom's color to null, and then sets it to the highest priority + colour available +*/ +/atom/proc/update_atom_colour() + if(!atom_colours) + atom_colours = list() + atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. + color = null + for(var/C in atom_colours) + if(islist(C)) + var/list/L = C + if(L.len) + color = L + return + else if(C) + color = C + return \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2d3f01a139d..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 @@ -185,15 +210,16 @@ . = 0 // Called after a successful Move(). By this point, we've already moved -/atom/movable/proc/Moved(atom/OldLoc, Dir) +/atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE) + SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced) if(!inertia_moving) inertia_next_move = world.time + inertia_move_delay newtonian_move(Dir) - return 1 + 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(). @@ -209,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) @@ -218,8 +245,15 @@ 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) + var/dest_z = (destturf ? destturf.z : null) + if(old_z != dest_z) + onTransitZ(old_z, dest_z) if(isturf(destination) && opacity) var/turf/new_loc = destination new_loc.reconsider_lights() @@ -232,6 +266,11 @@ 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. + var/atom/movable/AM = item + AM.onTransitZ(old_z,new_z) + /mob/living/forceMove(atom/destination) if(buckled) addtimer(CALLBACK(src, .proc/check_buckled), 1, TIMER_UNIQUE) @@ -364,30 +403,28 @@ SSthrowing.processing[src] = TT TT.tick() + return TRUE //Overlays /atom/movable/overlay var/atom/master = null - anchored = 1 + anchored = TRUE + simulated = FALSE /atom/movable/overlay/New() verbs.Cut() return /atom/movable/overlay/attackby(a, b, c) - if(src.master) - return src.master.attackby(a, b, c) - return - + if(master) + return master.attackby(a, b, c) /atom/movable/overlay/attack_hand(a, b, c) - if(src.master) - return src.master.attack_hand(a, b, c) - return + if(master) + return master.attack_hand(a, b, c) - -/atom/movable/proc/water_act(var/volume, var/temperature, var/source) //amount of water acting : temperature of water in kelvin : object that called it (for shennagins) - return 1 +/atom/movable/proc/water_act(volume, temperature, source, method = TOUCH) //amount of water acting : temperature of water in kelvin : object that called it (for shennagins) + return TRUE /atom/movable/proc/handle_buckled_mob_movement(newloc,direct) if(!buckled_mob.Move(newloc, direct)) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 178605853e8..1370b64ecc7 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -78,10 +78,11 @@ return 1 return 0 -//helper for getting the appropriate health status UPDATED BY PUCKABOO2 TO INCLUDE NEGATIVES. +//helper for getting the appropriate health status /proc/RoundHealth(mob/living/M) if(M.stat == DEAD || (M.status_flags & FAKEDEATH)) - return "health-100" //what's our health? it doesn't matter, we're dead, or faking + return "health-100-dead" //what's our health? it doesn't matter, we're dead, or faking + var/maxi_health = M.maxHealth if(iscarbon(M) && M.health < 0) maxi_health = 100 //so crit shows up right for aliens and other high-health carbon mobs; noncarbons don't have crit. @@ -91,7 +92,7 @@ if(100 to INFINITY) return "health100" if(95 to 100) - return "health95" //For telling patients to eat a warm donk pocket and go on with their shift. + return "health95" if(90 to 95) return "health90" if(80 to 90) @@ -127,13 +128,13 @@ if(-70 to -60) return "health-60" if(-80 to -70) - return "health-70" //Doc? + return "health-70" if(-90 to -80) - return "health-80" //Hey, doc? + return "health-80" if(-100 to -90) - return "health-90" //HURRY UP, DOC! + return "health-90" else - return "health-100" //doc u had 1 job + return "health-100" //past this point, you're just in trouble return "0" @@ -217,7 +218,7 @@ /mob/living/carbon/human/proc/sec_hud_set_security_status() var/image/holder = hud_list[WANTED_HUD] var/perpname = get_visible_name(TRUE) //gets the name of the perp, works if they have an id or if their face is uncovered - if(!ticker) return //wait till the game starts or the monkeys runtime.... + if(!SSticker) return //wait till the game starts or the monkeys runtime.... if(perpname) var/datum/data/record/R = find_record("name", perpname, data_core.security) if(R) @@ -438,4 +439,4 @@ if(weedlevel < 1) // You don't want to see these icons if the value is small holder.icon_state = "" return - holder.icon_state = "hudweed[RoundPlantBar(weedlevel/10)]" + holder.icon_state = "hudweed[RoundPlantBar(weedlevel/10)]" \ No newline at end of file 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/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 708d8467fb0..e4b1f1e8a49 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -537,7 +537,7 @@ occupantData["isViableSubject"] = 0 occupantData["health"] = connected.occupant.health occupantData["maxHealth"] = connected.occupant.maxHealth - occupantData["minHealth"] = config.health_threshold_dead + occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD occupantData["uniqueEnzymes"] = connected.occupant.dna.unique_enzymes occupantData["uniqueIdentity"] = connected.occupant.dna.uni_identity occupantData["structuralEnzymes"] = connected.occupant.dna.struc_enzymes diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 9ab851e86bf..506ef5714f8 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -188,9 +188,19 @@ ..() block=REMOTETALKBLOCK +/datum/dna/gene/basic/grant_spell/remotetalk/activate(mob/user) + ..() + user.AddSpell(new /obj/effect/proc_holder/spell/targeted/mindscan(null)) + +/datum/dna/gene/basic/grant_spell/remotetalk/deactivate(mob/user) + ..() + for(var/obj/effect/proc_holder/spell/S in user.mob_spell_list) + if(istype(S, /obj/effect/proc_holder/spell/targeted/mindscan)) + user.RemoveSpell(S) + /obj/effect/proc_holder/spell/targeted/remotetalk name = "Project Mind" - desc = "Make people understand your thoughts at any range!" + desc = "Make people understand your thoughts!" charge_max = 0 clothes_req = 0 @@ -242,6 +252,89 @@ for(var/mob/dead/observer/G in GLOB.player_list) G.show_message("Telepathic message from [user] ([ghost_follow_link(user, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]") +/obj/effect/proc_holder/spell/targeted/mindscan + name = "Scan Mind" + desc = "Offer people a chance to share their thoughts!" + charge_max = 0 + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + range = -2 + selection_type = "range" + action_icon_state = "genetic_mindscan" + var/list/available_targets = list() + +/obj/effect/proc_holder/spell/targeted/mindscan/choose_targets(mob/user = usr) + var/list/targets = new /list() + var/list/validtargets = new /list() + var/turf/T = get_turf(user) + for(var/mob/living/M in range(14, T)) + if(M && M.mind) + if(M == user) + continue + validtargets += M + + if(!validtargets.len) + to_chat(user, "There are no valid targets!") + start_recharge() + return + + targets += input("Choose the target to listen to.", "Targeting") as null|mob in validtargets + + if(!targets.len || !targets[1]) //doesn't waste the spell + revert_cast(user) + return + + perform(targets, user = user) + +/obj/effect/proc_holder/spell/targeted/mindscan/cast(list/targets, mob/user = usr) + if(!ishuman(user)) + return + for(var/mob/living/target in targets) + var/message = "You feel your mind expand briefly... (Click to send a message.)" + if(REMOTE_TALK in target.mutations) + message = "You feel [user.real_name] request a response from you... (Click here to project mind.)" + user.show_message("You offer your mind to [target.name].") + target.show_message("[message]") + available_targets += target + addtimer(CALLBACK(src, .proc/removeAvailability, target), 100) + +/obj/effect/proc_holder/spell/targeted/mindscan/proc/removeAvailability(mob/living/target) + if(target in available_targets) + available_targets -= target + if(!(target in available_targets)) + target.show_message("You feel the sensation fade...") + +/obj/effect/proc_holder/spell/targeted/mindscan/Topic(href, href_list) + var/mob/living/user + if(href_list["user"]) + user = locateUID(href_list["user"]) + if(href_list["target"]) + if(!user) + return + var/mob/living/target = locateUID(href_list["target"]) + if(!(target in available_targets)) + return + available_targets -= target + var/say = input("What do you wish to say") as text|null + if(!say) + return + say = strip_html(say) + say = pencode_to_html(say, target, format = 0, fields = 0) + + log_say("(TPATH to [key_name(target)]) [say]", user) + if(REMOTE_TALK in target.mutations) + target.show_message("You project your mind into [user.name]: [say]") + else + target.show_message("You fill the space in your thoughts: [say]") + user.show_message("You hear [target.name]'s voice: [say]") + for(var/mob/dead/observer/G in GLOB.player_list) + G.show_message("Telepathic response from [target] ([ghost_follow_link(target, ghost=G)]) to [user] ([ghost_follow_link(user, ghost=G)]): [say]") + +/obj/effect/proc_holder/spell/targeted/mindscan/Destroy() + available_targets.Cut() + return ..() + /datum/dna/gene/basic/grant_spell/remoteview name="Remote Viewing" activation_messages=list("Your mind can see things from afar.") diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index bf9fbb5a9e5..2137888d0b8 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -96,7 +96,8 @@ for(var/obj/item/implant/mindshield/I in H.contents) if(I && I.implanted) possible_traitors -= player - + if(!H.job || H.mind.offstation_role) //Golems, special events stuff, etc. + possible_traitors -= player //message_admins("Live Players: [playercount]") //message_admins("Live Traitors: [traitorcount]") // message_admins("Potential Traitors:") @@ -130,8 +131,10 @@ forge_traitor_objectives(newtraitor.mind) if(istype(newtraitor, /mob/living/silicon)) + SEND_SOUND(newtraitor, 'sound/ambience/antag/malf.ogg') add_law_zero(newtraitor) else + SEND_SOUND(newtraitor, 'sound/ambience/antag/tatoralert.ogg') equip_traitor(newtraitor) traitors += newtraitor.mind diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 41068876a54..df61106c4ab 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -3,6 +3,8 @@ var/list/blobs = list() var/list/blob_cores = list() var/list/blob_nodes = list() +/datum/game_mode + var/list/blob_overminds = list() /datum/game_mode/blob name = "blob" @@ -12,7 +14,6 @@ var/list/blob_nodes = list() required_enemies = 1 recommended_enemies = 1 restricted_jobs = list("Cyborg", "AI") - free_golems_disabled = TRUE var/declared = 0 var/burst = 0 @@ -41,9 +42,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 @@ -65,8 +68,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!") @@ -184,16 +190,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/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 3d65a41eeb8..53a98de7028 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -64,13 +64,15 @@ src.floor += 1 if(istype(T, /turf/simulated/wall)) - if(T:intact) + var/turf/simulated/wall/W = T + if(W.intact) src.wall += 2 else src.wall += 1 if(istype(T, /turf/simulated/wall/r_wall)) - if(T:intact) + var/turf/simulated/wall/r_wall/R = T + if(R.intact) src.r_wall += 2 else src.r_wall += 1 diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index a96b3e18620..bf2143b9784 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -12,6 +12,8 @@ minbodytemp = 0 maxbodytemp = 360 universal_speak = 1 //So mobs can understand them when a blob uses Blob Broadcast + sentience_type = SENTIENCE_OTHER + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID var/mob/camera/blob/overmind = null /mob/living/simple_animal/hostile/blob/proc/adjustcolors(var/a_color) @@ -21,6 +23,7 @@ /mob/living/simple_animal/hostile/blob/blob_act() return + //////////////// // BLOB SPORE // //////////////// @@ -42,7 +45,6 @@ var/obj/structure/blob/factory/factory = null var/list/human_overlays = list() var/is_zombie = 0 - gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE pressure_resistance = 100 //100 kPa difference required to push throw_pressure_limit = 120 //120 kPa difference required to throw @@ -65,15 +67,17 @@ /mob/living/simple_animal/hostile/blob/blobspore/Life(seconds, times_fired) if(!is_zombie && isturf(src.loc)) - for(var/mob/living/carbon/human/H in oview(src,1)) //Only for corpse right next to/on same tile - if(H.stat == DEAD) + for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile + if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD)) Zombify(H) break ..() -/mob/living/simple_animal/hostile/blob/blobspore/proc/Zombify(var/mob/living/carbon/human/H) +/mob/living/simple_animal/hostile/blob/blobspore/proc/Zombify(mob/living/carbon/human/H) + if(!H.check_death_method()) + H.death() var/obj/item/organ/external/head/head_organ = H.get_organ("head") - is_zombie = 1 + is_zombie = TRUE if(H.wear_suit) var/obj/item/clothing/suit/armor/A = H.wear_suit if(A.armor && A.armor["melee"]) @@ -87,14 +91,15 @@ icon = H.icon speak_emote = list("groans") icon_state = "zombie2_s" - head_organ.h_style = null + if(head_organ) + head_organ.h_style = null H.update_hair() human_overlays = H.overlays update_icons() - H.loc = src + H.forceMove(src) pressure_resistance = 20 //5 kPa difference required to push lowered throw_pressure_limit = 30 //15 kPa difference required to throw lowered - loc.visible_message("The corpse of [H.name] suddenly rises!") + visible_message("The corpse of [H.name] suddenly rises!") /mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) // Only execute the below if we successfuly died @@ -132,9 +137,9 @@ ..() if(overmind && overmind.blob_reagent_datum) - adjustcolors(overmind.blob_reagent_datum.color) + adjustcolors(overmind.blob_reagent_datum.complementary_color) else - adjustcolors(color) //to ensure zombie/other overlays update + adjustcolors(overmind.blob_reagent_datum.complementary_color) //to ensure zombie/other overlays update /mob/living/simple_animal/hostile/blob/blobspore/adjustcolors(var/a_color) @@ -144,8 +149,8 @@ overlays.Cut() overlays = human_overlays var/image/I = image('icons/mob/blob.dmi', icon_state = "blob_head") - I.color = color - color = initial(color)//looks better. + I.color = overmind.blob_reagent_datum.complementary_color + color = initial(overmind.blob_reagent_datum.complementary_color)//looks better. overlays += I ///////////////// @@ -171,10 +176,10 @@ force_threshold = 10 mob_size = MOB_SIZE_LARGE environment_smash = ENVIRONMENT_SMASH_RWALLS - gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE pressure_resistance = 100 //100 kPa difference required to push throw_pressure_limit = 120 //120 kPa difference required to throw - + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE /mob/living/simple_animal/hostile/blob/blobbernaut/blob_act() return diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 4bdc2cafddd..91c6df639e5 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -4,6 +4,7 @@ icon_state = "blank_blob" health = 200 fire_resist = 2 + point_return = -1 var/mob/camera/blob/overmind = null // the blob core's overmind var/overmind_get_delay = 0 // we don't want to constantly try to find an overmind, do it every 5 minutes var/resource_delay = 0 @@ -13,7 +14,7 @@ /obj/structure/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2, offspring) blob_cores += src - processing_objects.Add(src) + START_PROCESSING(SSobj, src) GLOB.poi_list |= src adjustcolors(color) //so it atleast appears if(!overmind) @@ -41,7 +42,7 @@ if(overmind) overmind.blob_core = null overmind = null - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) GLOB.poi_list.Remove(src) return ..() @@ -81,7 +82,7 @@ continue var/obj/structure/blob/normal/B = locate() in get_step(src, b_dir) if(B) - B.change_to(/obj/structure/blob/shield) + B.change_to(/obj/structure/blob/shield/core) if(B && overmind) B.color = overmind.blob_reagent_datum.color else @@ -104,7 +105,11 @@ spawn() if(!new_overmind) - candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1) + if(is_offspring) + candidates = pollCandidates("Do you want to play as a blob offspring?", ROLE_BLOB, 1) + else + candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1) + if(candidates.len) C = pick(candidates) else @@ -117,10 +122,10 @@ src.overmind = B color = overmind.blob_reagent_datum.color if(B.mind && !B.mind.special_role) - B.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND + B.mind.make_Overmind() spawn(0) if(is_offspring) - B.verbs -= /mob/camera/blob/verb/split_consciousness + B.is_offspring = TRUE /obj/structure/blob/core/proc/lateblobtimer() addtimer(CALLBACK(src, .proc/lateblobcheck), 50) @@ -129,8 +134,13 @@ if(overmind) overmind.add_points(60) if(overmind.mind) - overmind.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND + overmind.mind.make_Overmind() else log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks a overmind.mind.") else - log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks an overmind.") \ No newline at end of file + log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks an overmind.") + +/obj/structure/blob/core/onTransitZ(old_z, new_z) + if(overmind && is_station_level(new_z)) + overmind.forceMove(get_turf(src)) + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index 81d3ab47493..fd6aa8c9f4a 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -4,6 +4,7 @@ icon_state = "blob_factory" health = 100 fire_resist = 2 + point_return = 18 var/list/spores = list() var/max_spores = 3 var/spore_delay = 0 @@ -22,13 +23,12 @@ /obj/structure/blob/factory/run_action() if(spores.len >= max_spores) - return 0 + return if(spore_delay > world.time) - return 0 + return + flick("blob_factory_glow", src) spore_delay = world.time + 100 // 10 seconds var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore(src.loc, src) - BS.color = color + BS.color = overmind.blob_reagent_datum.complementary_color BS.overmind = overmind overmind.blob_mobs.Add(BS) - return 0 - diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index 32b6ce1f408..4a2699802c1 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -4,11 +4,12 @@ icon_state = "blank_blob" health = 100 fire_resist = 2 + point_return = 18 var/mob/camera/blob/overmind /obj/structure/blob/node/New(loc, var/h = 100) blob_nodes += src - processing_objects.Add(src) + START_PROCESSING(SSobj, src) ..(loc, h) /obj/structure/blob/node/adjustcolors(var/a_color) @@ -25,7 +26,7 @@ /obj/structure/blob/node/Destroy() blob_nodes -= src - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/structure/blob/node/Life(seconds, times_fired) diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm index f5d838fd0a2..14c240f681b 100644 --- a/code/game/gamemodes/blob/blobs/resource.dm +++ b/code/game/gamemodes/blob/blobs/resource.dm @@ -4,6 +4,7 @@ icon_state = "blob_resource" health = 30 fire_resist = 2 + point_return = 12 var/mob/camera/blob/overmind = null var/resource_delay = 0 @@ -12,13 +13,9 @@ qdel(src) /obj/structure/blob/resource/run_action() - if(resource_delay > world.time) - return 0 - + return + flick("blob_resource_glow", src) resource_delay = world.time + 40 // 4 seconds - if(overmind) overmind.add_points(1) - return 0 - diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index 696a33d94b9..0e74e601957 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -5,8 +5,12 @@ desc = "Some blob creature thingy" health = 75 fire_resist = 2 + point_return = 4 var/maxHealth = 75 +/obj/structure/blob/shield/core + point_return = 0 + /obj/structure/blob/shield/update_icon() if(health <= 0) qdel(src) @@ -27,11 +31,12 @@ brute_resist = 0 health = 50 maxHealth = 50 + point_return = 9 flags_2 = CHECK_RICOCHET_1 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) @@ -43,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/blobs/storage.dm b/code/game/gamemodes/blob/blobs/storage.dm index 8c9da104edf..00f6d7b4e0c 100644 --- a/code/game/gamemodes/blob/blobs/storage.dm +++ b/code/game/gamemodes/blob/blobs/storage.dm @@ -4,6 +4,7 @@ icon_state = "blob_resource" health = 30 fire_resist = 2 + point_return = 12 var/mob/camera/blob/overmind = null /obj/structure/blob/storage/update_icon() diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index c0f2e4a4a9e..4489aaf707b 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -5,8 +5,8 @@ icon_state = "marker" see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM invisibility = INVISIBILITY_OBSERVER + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE pass_flags = PASSBLOB faction = list("blob") @@ -15,9 +15,11 @@ var/blob_points = 0 var/max_blob_points = 100 var/last_attack = 0 + var/nodes_required = TRUE //if the blob needs nodes to place resource and factory blobs + var/split_used = FALSE + var/is_offspring = FALSE var/datum/reagent/blob/blob_reagent_datum = new/datum/reagent/blob() var/list/blob_mobs = list() - var/ghostimage = null /mob/camera/blob/New() var/new_name = "[initial(name)] ([rand(1, 999)])" @@ -31,9 +33,7 @@ if(blob_core) blob_core.adjustcolors(blob_reagent_datum.color) - ghostimage = image(src.icon,src,src.icon_state) - ghost_darkness_images |= ghostimage //so ghosts can see the blob cursor when they disable darkness - updateallghostimages() + color = blob_reagent_datum.complementary_color ..() /mob/camera/blob/Life(seconds, times_fired) @@ -41,26 +41,10 @@ qdel(src) ..() -/mob/camera/blob/Destroy() - if(ghostimage) - ghost_darkness_images -= ghostimage - QDEL_NULL(ghostimage) - updateallghostimages() - return ..() - /mob/camera/blob/Login() ..() sync_mind() - to_chat(src, "You are the overmind!") - to_chat(src, "Your randomly chosen reagent is: [blob_reagent_datum.name]!") - to_chat(src, "You are the overmind and can control the blob! You can expand, which will attack people, and place new blob pieces such as...") - to_chat(src, "Normal Blob will expand your reach and allow you to upgrade into special blobs that perform certain functions.") - to_chat(src, "Shield Blob is a strong and expensive blob which can take more damage. It is fireproof and can block air, use this to protect yourself from station fires.") - to_chat(src, "Reflective Blobis an upgraded Shield Blob which has a high chance of deflecting energy projectiles, but is vulnerable to ballistics and brute damage.") - to_chat(src, "Resource Blob is a blob which will collect more resources for you, try to build these earlier to get a strong income. It will benefit from being near your core or multiple nodes, by having an increased resource rate; put it alone and it won't create resources at all.") - to_chat(src, "Node Blob is a blob which will grow, like the core. Unlike the core it won't give you a small income but it can power resource and factory blobs to increase their rate.") - to_chat(src, "Factory Blob is a blob which will spawn blob spores which will attack nearby food. Putting this nearby nodes and your core will increase the spawn rate; put it alone and it will not spawn any spores.") - to_chat(src, "Shortcuts: CTRL Click = Expand Blob / Middle Mouse Click = Rally Spores / Alt Click = Create Shield") + blob_help() update_health() /mob/camera/blob/proc/update_health() @@ -103,7 +87,7 @@ if(isovermind(M) || isobserver(M)) M.show_message(rendered, 2) -/mob/camera/blob/emote(var/act,var/m_type=1,var/message = null) +/mob/camera/blob/emote(act, m_type = 1, message = null, force) return /mob/camera/blob/blob_act() diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 4491b80d2e4..d6d4a91cf19 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -25,12 +25,23 @@ if(blob_nodes.len) var/list/nodes = list() for(var/i = 1; i <= blob_nodes.len; i++) - nodes["Blob Node #[i]"] = blob_nodes[i] + var/obj/structure/blob/node/B = blob_nodes[i] + nodes["Blob Node #[i] ([get_location_name(B)])"] = B var/node_name = input(src, "Choose a node to jump to.", "Node Jump") in nodes var/obj/structure/blob/node/chosen_node = nodes[node_name] if(chosen_node) src.loc = chosen_node.loc +/mob/camera/blob/verb/toggle_node_req() + set category = "Blob" + set name = "Toggle Node Requirement" + set desc = "Toggle requiring nodes to place resource and factory blobs." + nodes_required = !nodes_required + if(nodes_required) + to_chat(src, "You now require a nearby node or core to place factory and resource blobs.") + else + to_chat(src, "You no longer require a nearby node or core to place factory and resource blobs.") + /mob/camera/blob/verb/create_shield_power() set category = "Blob" set name = "Create/Upgrade Shield Blob (15)" @@ -43,7 +54,7 @@ var/obj/structure/blob/B = locate(/obj/structure/blob) in T var/obj/structure/blob/shield/S = locate(/obj/structure/blob/shield) in T - + if(!S) if(!B)//We are on a blob to_chat(src, "There is no blob here!") @@ -59,7 +70,7 @@ B.color = blob_reagent_datum.color B.change_to(/obj/structure/blob/shield) else - + if(istype(S, /obj/structure/blob/shield/reflective)) to_chat(src, "There's already a reflector blob here!") return @@ -68,12 +79,12 @@ else if(S.health < S.maxHealth * 0.5) to_chat(src, "This shield blob is too damaged to be modified properly!") return - + else if (!can_buy(15)) return - + to_chat(src, "You secrete a reflective ooze over the shield blob, allowing it to reflect energy projectiles at the cost of reduced intregrity.") - + S.change_to(/obj/structure/blob/shield/reflective) S.color = blob_reagent_datum.color return @@ -103,6 +114,11 @@ to_chat(src, "There is a resource blob nearby, move more than 4 tiles away from it!") return + if(nodes_required) + if(!(locate(/obj/structure/blob/node) in orange(3, T)) && !(locate(/obj/structure/blob/core) in orange(4, T))) + to_chat(src, "You need to place this blob closer to a node or core!") + return //handholdotron 2000 + if(!can_buy(40)) return @@ -174,6 +190,11 @@ to_chat(src, "There is a factory blob nearby, move more than 7 tiles away from it!") return + if(nodes_required) + if(!(locate(/obj/structure/blob/node) in orange(3, T)) && !(locate(/obj/structure/blob/core) in orange(4, T))) + to_chat(src, "You need to place this blob closer to a node or core!") + return //handholdotron 2000 + if(!can_buy(60)) return @@ -210,7 +231,7 @@ var/mob/living/simple_animal/hostile/blob/blobbernaut/blobber = new /mob/living/simple_animal/hostile/blob/blobbernaut (get_turf(B)) if(blobber) qdel(B) - blobber.color = blob_reagent_datum.color + blobber.color = blob_reagent_datum.complementary_color blobber.overmind = src blob_mobs.Add(blobber) return @@ -245,21 +266,28 @@ /mob/camera/blob/verb/revert() set category = "Blob" set name = "Remove Blob" - set desc = "Removes a blob." + set desc = "Removes a blob. You will receive 30% cost refund for special Blob structures." var/turf/T = get_turf(src) - if(!T) - return + remove_blob(T) + +/mob/camera/blob/proc/remove_blob(var/turf/T) var/obj/structure/blob/B = locate(/obj/structure/blob) in T + if(!T) + return if(!B) - to_chat(src, "You must be on a blob!") + to_chat(src, "There is no blob there!") return - - if(istype(B, /obj/structure/blob/core)) - to_chat(src, "Unable to remove this blob.") + if(B.point_return < 0) + to_chat(src, "Unable to remove this blob.") return - + if(max_blob_points < B.point_return + blob_points) + to_chat(src, "You have too many resources to remove this blob!") + return + if(B.point_return) + add_points(B.point_return) + to_chat(src, "Gained [B.point_return] resources from removing \the [B].") qdel(B) return @@ -304,17 +332,13 @@ /mob/camera/blob/verb/rally_spores_power() set category = "Blob" - set name = "Rally Spores (5)" + set name = "Rally Spores" set desc = "Rally the spores to move to your location." var/turf/T = get_turf(src) rally_spores(T) /mob/camera/blob/proc/rally_spores(var/turf/T) - - if(!can_buy(5)) - return - to_chat(src, "You rally your spores.") var/list/surrounding_turfs = block(locate(T.x - 1, T.y - 1, T.z), locate(T.x + 1, T.y + 1, T.z)) @@ -327,45 +351,53 @@ BS.Goto(pick(surrounding_turfs), BS.move_to_delay) return - /mob/camera/blob/verb/split_consciousness() set category = "Blob" set name = "Split consciousness (100) (One use)" - set desc = "Expend resources to attempt to produce another sentient overmind" + set desc = "Expend resources to attempt to produce another sentient overmind." - if(!blob_nodes || !blob_nodes.len) - to_chat(src, "A node is required to birth your offspring...") + var/turf/T = get_turf(src) + if(!T) return - var/obj/structure/blob/node/N = locate(/obj/structure/blob) in blob_nodes + if(split_used) + to_chat(src, "You have already produced an offspring.") + return + if(is_offspring) + to_chat(src, "You cannot split as an offspring of another Blob.") + return + + var/obj/structure/blob/N = (locate(/obj/structure/blob) in T) if(!N) - to_chat(src, "A node is required to birth your offspring...") + to_chat(src, "A node is required to birth your offspring.") + return + if(!istype(N, /obj/structure/blob/node)) + to_chat(src, "A node is required to birth your offspring.") return - if(!can_buy(100)) return - verbs -= /mob/camera/blob/verb/split_consciousness //we've used our split_consciousness + split_used = TRUE new /obj/structure/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring") qdel(N) - if(ticker && ticker.mode.name == "blob") - var/datum/game_mode/blob/BL = ticker.mode + if(SSticker && SSticker.mode.name == "blob") + var/datum/game_mode/blob/BL = SSticker.mode BL.blobwincount += initial(BL.blobwincount) - /mob/camera/blob/verb/blob_broadcast() set category = "Blob" set name = "Blob Broadcast" set desc = "Speak with your blob spores and blobbernauts as your mouthpieces. This action is free." - var/speak_text = input(usr, "What would you like to say with your minions?", "Blob Broadcast", null) as text + var/speak_text = clean_input("What would you like to say with your minions?", "Blob Broadcast", null) if(!speak_text) return else to_chat(usr, "You broadcast with your minions, [speak_text]") for(var/mob/living/simple_animal/hostile/blob_minion in blob_mobs) - blob_minion.say(speak_text) + if(blob_minion.stat == CONSCIOUS) + blob_minion.say(speak_text) return /mob/camera/blob/verb/create_storage() @@ -409,7 +441,7 @@ /mob/camera/blob/verb/chemical_reroll() set category = "Blob" set name = "Reactive Chemical Adaptation (50)" - set desc = "Replaces your chemical with a different one" + set desc = "Replaces your chemical with a random, different one." if(!can_buy(50)) return @@ -417,10 +449,31 @@ var/datum/reagent/blob/B = pick((subtypesof(/datum/reagent/blob) - blob_reagent_datum.type)) blob_reagent_datum = new B + color = blob_reagent_datum.complementary_color + for(var/obj/structure/blob/BL in blobs) BL.adjustcolors(blob_reagent_datum.color) for(var/mob/living/simple_animal/hostile/blob/BLO) - BLO.adjustcolors(blob_reagent_datum.color) + BLO.adjustcolors(blob_reagent_datum.complementary_color) - to_chat(src, "Your reagent is now: [blob_reagent_datum.name]!") + to_chat(src, "Your reagent is now: [blob_reagent_datum.name] - [blob_reagent_datum.description]") + +/mob/camera/blob/verb/blob_help() + set category = "Blob" + set name = "*Blob Help*" + set desc = "Help on how to blob." + to_chat(src, "As the overmind, you can control the blob!") + to_chat(src, "Your blob reagent is: [blob_reagent_datum.name] - [blob_reagent_datum.description]") + to_chat(src, "You can expand, which will attack people, damage objects, or place a Normal Blob if the tile is clear.") + to_chat(src, "Normal Blobs will expand your reach and can be upgraded into special blobs that perform certain functions.") + to_chat(src, "You can upgrade normal blobs into the following types of blob:") + to_chat(src, "Shield Blobs are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires. Upgrading them again will result in a Reflective blob, capable of reflecting laser projectiles at the cost of the strong blob's extra health.") + to_chat(src, "Resource Blobs are blobs which produce more resources for you, build as many of these as possible to consume the station. This type of blob must be placed near node blobs or your core to work.") + to_chat(src, "Factory Blobs are blobs that spawn blob spores which will attack nearby enemies. This type of blob must be placed near node blobs or your core to work.") + to_chat(src, "Blobbernauts can be produced from factories for a cost, and are hard to kill, powerful, but ultimately dumb. The factory used to create one will be destroyed in the process.") + to_chat(src, "Storage Blobs are storage towers which will store extra resources for you. This increases your max resource cap by 50.") + to_chat(src, "Node Blobs are blobs which grow, like the core. Like the core it can activate resource and factory blobs.") + to_chat(src, "In addition to the buttons on your HUD, there are a few click shortcuts to speed up expansion and defense.") + to_chat(src, "Shortcuts: Click = Expand Blob | CTRL Click = Create Shield Blob | Middle Mouse Click = Rally Spores | Alt Click = Remove Blob") + to_chat(src, "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them.") diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index ba3ad1dada8..ed06ec4086d 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -7,6 +7,7 @@ density = 0 opacity = 0 anchored = 1 + var/point_return = 0 //How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed. var/health = 30 var/health_timestamp = 0 var/brute_resist = 4 @@ -31,8 +32,10 @@ /obj/structure/blob/CanPass(atom/movable/mover, turf/target, height=0) - if(height==0) return 1 - if(istype(mover) && mover.checkpass(PASSBLOB)) return 1 + if(height==0) + return 1 + if(istype(mover) && mover.checkpass(PASSBLOB)) + return 1 return 0 /obj/structure/blob/CanAStarPass(ID, dir, caller) @@ -139,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/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index d0ac848d905..038f331f924 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -240,10 +240,10 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/geneticpoints = 10 var/purchasedpowers = list() var/mimicing = "" - var/canrespec = 0 + var/canrespec = FALSE //set to TRUE in absorb.dm var/changeling_speak = 0 var/datum/dna/chosen_dna - var/obj/effect/proc_holder/changeling/sting/chosen_sting + var/datum/action/changeling/sting/chosen_sting var/regenerating = FALSE /datum/changeling/New(gender=FEMALE) @@ -329,4 +329,4 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" return 1 /proc/can_absorb_species(datum/species/S) - return !(NO_DNA in S.species_traits) \ No newline at end of file + return !(NO_DNA in S.species_traits) diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index 387e7ce9d61..69142049280 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -3,10 +3,10 @@ * TODO: combine atleast some of the functionality with /proc_holder/spell */ -/obj/effect/proc_holder/changeling - panel = "Changeling" +/datum/action/changeling name = "Prototype Sting" desc = "" // Fluff + background_icon_state = "bg_changeling" var/helptext = "" // Details var/chemical_cost = 0 // negative chemical cost is for passive abilities (chemical glands) var/dna_cost = -1 //cost of the sting in dna points. 0 = auto-purchase, -1 = cannot be purchased @@ -16,20 +16,26 @@ var/genetic_damage = 0 // genetic damage caused by using the sting. Nothing to do with cloneloss. var/max_genetic_damage = 100 // hard counter for spamming abilities. Not used/balanced much yet. var/always_keep = 0 // important for abilities like regenerate that screw you if you lose them. + var/needs_button = TRUE // for passive abilities like hivemind that dont need a button + var/active = FALSE // used by a few powers that toggle -/obj/effect/proc_holder/changeling/proc/on_purchase(var/mob/user) - return +/* +changeling code now relies on on_purchase to grant powers. +if you override it, MAKE SURE you call parent or it will not be usable +the same goes for Remove(). if you override Remove(), call parent or else your power wont be removed on respec +*/ -/obj/effect/proc_holder/changeling/proc/on_refund(mob/user) - return +/datum/action/changeling/proc/on_purchase(var/mob/user) + if(needs_button) + Grant(user) -/obj/effect/proc_holder/changeling/Click() - var/mob/user = usr +/datum/action/changeling/Trigger() + var/mob/user = owner if(!user || !user.mind || !user.mind.changeling) return try_to_sting(user) -/obj/effect/proc_holder/changeling/proc/try_to_sting(var/mob/user, var/mob/target) +/datum/action/changeling/proc/try_to_sting(var/mob/user, var/mob/target) if(!user.mind || !user.mind.changeling) return if(!can_sting(user, target)) @@ -39,18 +45,18 @@ sting_feedback(user, target) take_chemical_cost(c) -/obj/effect/proc_holder/changeling/proc/sting_action(var/mob/user, var/mob/target) +/datum/action/changeling/proc/sting_action(var/mob/user, var/mob/target) return 0 -/obj/effect/proc_holder/changeling/proc/sting_feedback(var/mob/user, var/mob/target) +/datum/action/changeling/proc/sting_feedback(var/mob/user, var/mob/target) return 0 -/obj/effect/proc_holder/changeling/proc/take_chemical_cost(var/datum/changeling/changeling) +/datum/action/changeling/proc/take_chemical_cost(var/datum/changeling/changeling) changeling.chem_charges -= chemical_cost changeling.geneticdamage += genetic_damage //Fairly important to remember to return 1 on success >.< -/obj/effect/proc_holder/changeling/proc/can_sting(var/mob/user, var/mob/target) +/datum/action/changeling/proc/can_sting(var/mob/user, var/mob/target) if(!ishuman(user)) //typecast everything from mob to carbon from this point onwards return 0 if(req_human && (!ishuman(user) || issmall(user))) @@ -75,7 +81,7 @@ return 1 //used in /mob/Stat() -/obj/effect/proc_holder/changeling/proc/can_be_used_by(var/mob/user) +/datum/action/changeling/proc/can_be_used_by(var/mob/user) if(!ishuman(user)) return 0 if(req_human && !ishuman(user)) @@ -83,10 +89,10 @@ return 1 // Transform the target to the chosen dna. Used in transform.dm and tiny_prick.dm (handy for changes since it's the same thing done twice) -/obj/effect/proc_holder/changeling/proc/transform_dna(var/mob/living/carbon/human/H, var/datum/dna/D) +/datum/action/changeling/proc/transform_dna(var/mob/living/carbon/human/H, var/datum/dna/D) if(!D) return - + H.set_species(D.species.type, retain_damage = TRUE) H.dna = D.Clone() H.real_name = D.real_name diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index befdf899253..b6a0213f82f 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -1,24 +1,24 @@ var/list/sting_paths // totally stolen from the new player panel. YAYY -/obj/effect/proc_holder/changeling/evolution_menu +/datum/action/changeling/evolution_menu name = "-Evolution Menu-" //Dashes are so it's listed before all the other abilities. desc = "Choose our method of subjugation." + button_icon_state = "changelingsting" dna_cost = 0 -/obj/effect/proc_holder/changeling/evolution_menu/Click() +/datum/action/changeling/evolution_menu/Trigger() if(!usr || !usr.mind || !usr.mind.changeling) return var/datum/changeling/changeling = usr.mind.changeling if(!sting_paths) - sting_paths = init_subtypes(/obj/effect/proc_holder/changeling) + sting_paths = init_subtypes(/datum/action/changeling) var/dat = create_menu(changeling) usr << browse(dat, "window=powers;size=600x700")//900x480 - -/obj/effect/proc_holder/changeling/evolution_menu/proc/create_menu(var/datum/changeling/changeling) +/datum/action/changeling/evolution_menu/proc/create_menu(var/datum/changeling/changeling) var/dat dat +="Changeling Evolution Menu" @@ -230,7 +230,7 @@ var/list/sting_paths "} var/i = 1 - for(var/obj/effect/proc_holder/changeling/cling_power in sting_paths) + for(var/datum/action/changeling/cling_power in sting_paths) if(cling_power.dna_cost <= 0) //Let's skip the crap we start with. Keeps the evolution menu uncluttered. continue @@ -283,7 +283,7 @@ var/list/sting_paths return dat -/obj/effect/proc_holder/changeling/evolution_menu/Topic(href, href_list) +/datum/action/changeling/evolution_menu/Topic(href, href_list) ..() if(!(iscarbon(usr) && usr.mind && usr.mind.changeling)) return @@ -297,12 +297,10 @@ var/list/sting_paths ///// /datum/changeling/proc/purchasePower(var/mob/living/carbon/user, var/sting_name) + var/datum/action/changeling/thepower = null + var/list/all_powers = init_subtypes(/datum/action/changeling) - var/obj/effect/proc_holder/changeling/thepower = null - - if(!sting_paths) - sting_paths = init_subtypes(/obj/effect/proc_holder/changeling) - for(var/obj/effect/proc_holder/changeling/cling_sting in sting_paths) + for(var/datum/action/changeling/cling_sting in all_powers) if(cling_sting.name == sting_name) thepower = cling_sting @@ -343,21 +341,19 @@ var/list/sting_paths to_chat(user, "We have removed our evolutions from this form, and are now ready to readapt.") user.remove_changeling_powers(1) canrespec = 0 - user.make_changeling() + user.make_changeling(FALSE) return 1 else to_chat(user, "You lack the power to readapt your evolutions!") return 0 -/mob/proc/make_changeling() +/mob/proc/make_changeling(var/get_free_powers = TRUE) if(!mind) return if(!ishuman(src)) return if(!mind.changeling) mind.changeling = new /datum/changeling(gender) - if(!sting_paths) - sting_paths = init_subtypes(/obj/effect/proc_holder/changeling) if(mind.changeling.purchasedpowers) remove_changeling_powers(1) @@ -366,13 +362,23 @@ var/list/sting_paths for(var/language in languages) mind.changeling.absorbed_languages |= language - // purchase free powers. - for(var/obj/effect/proc_holder/changeling/path in sting_paths) - //var/obj/effect/proc_holder/changeling/S = new path() - if(!path.dna_cost) - if(!mind.changeling.has_sting(path)) - mind.changeling.purchasedpowers += path - path.on_purchase(src) + if(get_free_powers) + var/list/all_powers = init_subtypes(/datum/action/changeling) + for(var/datum/action/changeling/path in all_powers) // purchase free powers. + if(!path.dna_cost) + if(!mind.changeling.has_sting(path)) + mind.changeling.purchasedpowers += path + path.on_purchase(src) + else //for respec + var/datum/action/changeling/hivemind_upload/S1 = new + if(!mind.changeling.has_sting(S1)) + mind.changeling.purchasedpowers+=S1 + S1.Grant(src) + + var/datum/action/changeling/hivemind_download/S2 = new + if(!mind.changeling.has_sting(S2)) + mind.changeling.purchasedpowers+=S2 + S2.Grant(src) var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste mind.changeling.absorbed_dna |= C.dna.Clone() @@ -406,18 +412,18 @@ var/list/sting_paths digitalcamo = 0 mind.changeling.changeling_speak = 0 mind.changeling.reset() - for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers) + for(var/datum/action/changeling/p in mind.changeling.purchasedpowers) if((p.dna_cost == 0 && keep_free_powers) || p.always_keep) continue mind.changeling.purchasedpowers -= p - p.on_refund(src) + p.Remove(src) remove_language("Changeling") if(hud_used) hud_used.lingstingdisplay.icon_state = null hud_used.lingstingdisplay.invisibility = 101 -/datum/changeling/proc/has_sting(obj/effect/proc_holder/changeling/power) - for(var/obj/effect/proc_holder/changeling/P in purchasedpowers) +/datum/changeling/proc/has_sting(datum/action/power) + for(var/datum/action/P in purchasedpowers) if(power.name == P.name) return 1 return 0 diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index b60cfee4718..b5ad5ab9f8a 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -1,12 +1,13 @@ -/obj/effect/proc_holder/changeling/absorbDNA +/datum/action/changeling/absorbDNA name = "Absorb DNA" - desc = "Absorb the DNA of our victim." + desc = "Absorb the DNA of our victim. Requires us to strangle them." + button_icon_state = "absorb_dna" chemical_cost = 0 dna_cost = 0 req_human = 1 max_genetic_damage = 100 -/obj/effect/proc_holder/changeling/absorbDNA/can_sting(var/mob/living/carbon/user) +/datum/action/changeling/absorbDNA/can_sting(mob/living/carbon/user) if(!..()) return @@ -26,7 +27,7 @@ var/mob/living/carbon/target = G.affecting return changeling.can_absorb_dna(user,target) -/obj/effect/proc_holder/changeling/absorbDNA/sting_action(var/mob/user) +/datum/action/changeling/absorbDNA/sting_action(var/mob/user) var/datum/changeling/changeling = user.mind.changeling var/obj/item/grab/G = user.get_active_hand() var/mob/living/carbon/human/target = G.affecting diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index bf16d90d55e..b0b77a456d5 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -1,36 +1,40 @@ //Augmented Eyesight: Gives you thermal and night vision - bye bye, flashlights. Also, high DNA cost because of how powerful it is. //Possible todo: make a custom message for directing a penlight/flashlight at the eyes - not sure what would display though. -/obj/effect/proc_holder/changeling/augmented_eyesight +/datum/action/changeling/augmented_eyesight name = "Augmented Eyesight" desc = "Creates heat receptors in our eyes and dramatically increases light sensing ability." - helptext = "Grants us thermal vision or flash protection. We will become a lot more vulnerable to flash-based devices while thermal vision is active." + helptext = "Grants us thermal vision or flash protection. We will become a lot more vulnerable to flash based devices while thermal vision is active." + button_icon_state = "augmented_eyesight" chemical_cost = 0 dna_cost = 2 //Would be 1 without thermal vision + active = FALSE -/obj/effect/proc_holder/changeling/augmented_eyesight/sting_action(mob/living/carbon/human/user) +/datum/action/changeling/augmented_eyesight/on_purchase(mob/user) //The ability starts inactive, so we should be protected from flashes. + ..() + var/obj/item/organ/internal/cyberimp/eyes/O = new /obj/item/organ/internal/cyberimp/eyes/shield/ling() + O.insert(user) + active = FALSE + +/datum/action/changeling/augmented_eyesight/sting_action(mob/living/carbon/user) if(!istype(user)) return - if(user.get_int_organ(/obj/item/organ/internal/cyberimp/eyes/thermals/ling)) - var/obj/item/organ/internal/cyberimp/eyes/O = new /obj/item/organ/internal/cyberimp/eyes/shield/ling() - O.insert(user) - - else + if(!active) var/obj/item/organ/internal/cyberimp/eyes/O = new /obj/item/organ/internal/cyberimp/eyes/thermals/ling() O.insert(user) - + active = TRUE + else + var/obj/item/organ/internal/cyberimp/eyes/O = new /obj/item/organ/internal/cyberimp/eyes/shield/ling() + O.insert(user) + active = FALSE return 1 - -/obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) +/datum/action/changeling/augmented_eyesight/Remove(mob/user) var/obj/item/organ/internal/cyberimp/eyes/O = user.get_organ_slot("eye_ling") if(O) O.remove(user) qdel(O) - - - - + ..() /obj/item/organ/internal/cyberimp/eyes/shield/ling name = "protective membranes" @@ -53,7 +57,6 @@ S.reagents.add_reagent("oculine", 15) return S - /obj/item/organ/internal/cyberimp/eyes/thermals/ling name = "heat receptors" desc = "These heat receptors dramatically increases eyes light sensing ability." diff --git a/code/game/gamemodes/changeling/powers/biodegrade.dm b/code/game/gamemodes/changeling/powers/biodegrade.dm index 5142734183b..c8a7721a5f5 100644 --- a/code/game/gamemodes/changeling/powers/biodegrade.dm +++ b/code/game/gamemodes/changeling/powers/biodegrade.dm @@ -1,12 +1,13 @@ -/obj/effect/proc_holder/changeling/biodegrade +/datum/action/changeling/biodegrade name = "Biodegrade" - desc = "Dissolves restraints or other objects preventing free movement." + desc = "Dissolves restraints or other objects preventing free movement. Costs 30 chemicals." helptext = "This is obvious to nearby people, and can destroy standard restraints and closets." + button_icon_state = "biodegrade" chemical_cost = 30 //High cost to prevent spam dna_cost = 2 req_human = 1 -/obj/effect/proc_holder/changeling/biodegrade/sting_action(mob/living/carbon/human/user) +/datum/action/changeling/biodegrade/sting_action(mob/living/carbon/human/user) var/used = FALSE // only one form of shackles removed per use if(!user.restrained() && !istype(user.loc, /obj/structure/closet) && !istype(user.loc, /obj/structure/spider/cocoon)) to_chat(user, "We are already free!") @@ -30,7 +31,6 @@ addtimer(CALLBACK(src, .proc/dissolve_straightjacket, user, S), 30) used = TRUE - if(istype(user.loc, /obj/structure/closet) && !used) var/obj/structure/closet/C = user.loc if(!istype(C)) @@ -53,21 +53,21 @@ feedback_add_details("changeling_powers","BD") return TRUE -/obj/effect/proc_holder/changeling/biodegrade/proc/dissolve_handcuffs(mob/living/carbon/human/user, obj/O) +/datum/action/changeling/biodegrade/proc/dissolve_handcuffs(mob/living/carbon/human/user, obj/O) if(O && user.handcuffed == O) user.unEquip(O) O.visible_message("[O] dissolves into a puddle of sizzling goop.") O.forceMove(get_turf(user)) qdel(O) -/obj/effect/proc_holder/changeling/biodegrade/proc/dissolve_straightjacket(mob/living/carbon/human/user, obj/S) +/datum/action/changeling/biodegrade/proc/dissolve_straightjacket(mob/living/carbon/human/user, obj/S) if(S && user.wear_suit == S) user.unEquip(S) S.visible_message("[S] dissolves into a puddle of sizzling goop.") S.forceMove(get_turf(user)) qdel(S) -/obj/effect/proc_holder/changeling/biodegrade/proc/open_closet(mob/living/carbon/human/user, obj/structure/closet/C) +/datum/action/changeling/biodegrade/proc/open_closet(mob/living/carbon/human/user, obj/structure/closet/C) if(C && user.loc == C) C.visible_message("[C]'s door breaks and opens!") C.welded = FALSE @@ -76,7 +76,7 @@ C.open() to_chat(user, "We open the container restraining us!") -/obj/effect/proc_holder/changeling/biodegrade/proc/dissolve_cocoon(mob/living/carbon/human/user, obj/structure/spider/cocoon/C) +/datum/action/changeling/biodegrade/proc/dissolve_cocoon(mob/living/carbon/human/user, obj/structure/spider/cocoon/C) if(C && user.loc == C) qdel(C) //The cocoon's destroy will move the changeling outside of it without interference to_chat(user, "We dissolve the cocoon!") diff --git a/code/game/gamemodes/changeling/powers/chameleon_skin.dm b/code/game/gamemodes/changeling/powers/chameleon_skin.dm index 07340cf3e84..7de16801153 100644 --- a/code/game/gamemodes/changeling/powers/chameleon_skin.dm +++ b/code/game/gamemodes/changeling/powers/chameleon_skin.dm @@ -1,12 +1,13 @@ -/obj/effect/proc_holder/changeling/chameleon_skin +/datum/action/changeling/chameleon_skin name = "Chameleon Skin" - desc = "Our skin pigmentation rapidly changes to suit our current environment." + desc = "Our skin pigmentation rapidly changes to suit our current environment. Costs 25 chemicals." helptext = "Allows us to become invisible after a few seconds of standing still. Can be toggled on and off." + button_icon_state = "chameleon_skin" dna_cost = 2 chemical_cost = 25 req_human = 1 -/obj/effect/proc_holder/changeling/chameleon_skin/sting_action(mob/user) +/datum/action/changeling/chameleon_skin/sting_action(mob/user) var/mob/living/carbon/human/H = user //SHOULD always be human, because req_human = 1 if(!istype(H)) // req_human could be done in can_sting stuff. return @@ -20,8 +21,9 @@ feedback_add_details("changeling_powers","CS") return TRUE -/obj/effect/proc_holder/changeling/chameleon_skin/on_refund(mob/user) +/datum/action/changeling/chameleon_skin/Remove(mob/user) var/mob/living/carbon/C = user if(C.dna.GetSEState(CHAMELEONBLOCK)) C.dna.SetSEState(CHAMELEONBLOCK, 0) genemutcheck(C, CHAMELEONBLOCK, null, MUTCHK_FORCED) + ..() diff --git a/code/game/gamemodes/changeling/powers/digitalcamo.dm b/code/game/gamemodes/changeling/powers/digitalcamo.dm index bc5879f67be..dd309b55060 100644 --- a/code/game/gamemodes/changeling/powers/digitalcamo.dm +++ b/code/game/gamemodes/changeling/powers/digitalcamo.dm @@ -1,11 +1,12 @@ -/obj/effect/proc_holder/changeling/digitalcamo +/datum/action/changeling/digitalcamo name = "Digital Camouflage" desc = "By evolving the ability to distort our form and proprotions, we defeat common altgorithms used to detect lifeforms on cameras." helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us... uncanny." + button_icon_state = "digital_camo" dna_cost = 1 //Prevents AIs tracking you but makes you easily detectable to the human-eye. -/obj/effect/proc_holder/changeling/digitalcamo/sting_action(var/mob/user) +/datum/action/changeling/digitalcamo/sting_action(var/mob/user) if(user.digitalcamo) to_chat(user, "We return to normal.") diff --git a/code/game/gamemodes/changeling/powers/epinephrine.dm b/code/game/gamemodes/changeling/powers/epinephrine.dm index 4e783f111cc..786ad0660ee 100644 --- a/code/game/gamemodes/changeling/powers/epinephrine.dm +++ b/code/game/gamemodes/changeling/powers/epinephrine.dm @@ -1,19 +1,21 @@ -/obj/effect/proc_holder/changeling/epinephrine +/datum/action/changeling/epinephrine name = "Epinephrine Overdose" - desc = "We evolve additional sacs of adrenaline throughout our body." - helptext = "Removes all stuns instantly and adds a short-term reduction in further stuns. Can be used while unconscious. Continued use poisons the body." + desc = "We evolve additional sacs of adrenaline throughout our body. Costs 30 chemicals." + helptext = "Removes all stuns instantly and adds a short term reduction in further stuns. Can be used while unconscious. Continued use poisons the body." + button_icon_state = "adrenaline" chemical_cost = 30 dna_cost = 2 req_human = 1 req_stat = UNCONSCIOUS //Recover from stuns. -/obj/effect/proc_holder/changeling/epinephrine/sting_action(var/mob/living/user) +/datum/action/changeling/epinephrine/sting_action(var/mob/living/user) if(user.lying) to_chat(user, "We arise.") else to_chat(user, "Adrenaline rushes through us.") + user.SetSleeping(0) user.stat = 0 user.SetParalysis(0) user.SetStunned(0) diff --git a/code/game/gamemodes/changeling/powers/fakedeath.dm b/code/game/gamemodes/changeling/powers/fakedeath.dm index 19cbbbdc3bd..d403059b0c7 100644 --- a/code/game/gamemodes/changeling/powers/fakedeath.dm +++ b/code/game/gamemodes/changeling/powers/fakedeath.dm @@ -1,6 +1,7 @@ -/obj/effect/proc_holder/changeling/fakedeath +/datum/action/changeling/fakedeath name = "Regenerative Stasis" - desc = "We fall into a stasis, allowing us to regenerate." + desc = "We fall into a stasis, allowing us to regenerate and trick our enemies. Costs 15 chemicals." + button_icon_state = "fake_death" chemical_cost = 15 dna_cost = 0 req_dna = 1 @@ -8,7 +9,7 @@ max_genetic_damage = 100 //Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay. -/obj/effect/proc_holder/changeling/fakedeath/sting_action(var/mob/living/user) +/datum/action/changeling/fakedeath/sting_action(var/mob/living/user) to_chat(user, "We begin our stasis, preparing energy to arise once more.") if(user.stat != DEAD) @@ -26,12 +27,13 @@ feedback_add_details("changeling_powers","FD") return 1 -/obj/effect/proc_holder/changeling/fakedeath/proc/ready_to_regenerate(mob/user) +/datum/action/changeling/fakedeath/proc/ready_to_regenerate(mob/user) if(user && user.mind && user.mind.changeling && user.mind.changeling.purchasedpowers) to_chat(user, "We are ready to regenerate.") - user.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/revive(null) + var/datum/action/changeling/revive/R = new + R.Grant(user) -/obj/effect/proc_holder/changeling/fakedeath/can_sting(var/mob/user) +/datum/action/changeling/fakedeath/can_sting(var/mob/user) if(user.status_flags & FAKEDEATH) to_chat(user, "We are already regenerating.") return diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index 6dbd4badc30..f7475090660 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -1,7 +1,8 @@ -/obj/effect/proc_holder/changeling/fleshmend +/datum/action/changeling/fleshmend name = "Fleshmend" - desc = "Our flesh rapidly regenerates, healing our wounds." - helptext = "Heals a moderate amount of damage over a short period of time. Can be used while unconscious." + desc = "Our flesh rapidly regenerates, healing our burns, bruises, and shortness of breath. Costs 20 chemicals." + helptext = "If we are on fire, the healing effect will not function. Does not regrow limbs or restore lost blood. Functions while unconscious." + button_icon_state = "fleshmend" chemical_cost = 20 dna_cost = 2 req_stat = UNCONSCIOUS @@ -11,20 +12,20 @@ // divided by healing_ticks to get heal/tick var/total_healing = 100 -/obj/effect/proc_holder/changeling/fleshmend/New() +/datum/action/changeling/fleshmend/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) -/obj/effect/proc_holder/changeling/fleshmend/Destroy() - processing_objects.Remove(src) +/datum/action/changeling/fleshmend/Destroy() + STOP_PROCESSING(SSobj, src) return ..() -/obj/effect/proc_holder/changeling/fleshmend/process() +/datum/action/changeling/fleshmend/process() if(recent_uses > 1) recent_uses = max(1, recent_uses - (1 / healing_ticks)) //Starts healing you every second for 10 seconds. Can be used whilst unconscious. -/obj/effect/proc_holder/changeling/fleshmend/sting_action(var/mob/living/user) +/datum/action/changeling/fleshmend/sting_action(var/mob/living/user) to_chat(user, "We begin to heal rapidly.") if(recent_uses > 1) to_chat(user, "Our healing's effectiveness is reduced \ @@ -35,14 +36,11 @@ feedback_add_details("changeling_powers","RR") return TRUE -/obj/effect/proc_holder/changeling/fleshmend/proc/fleshmend(mob/living/user) +/datum/action/changeling/fleshmend/proc/fleshmend(mob/living/user) // The healing itself - doesn't heal toxin damage // (that's anatomic panacea) and the effectiveness decreases with // each use in a short timespan - if(ishuman(user)) - var/mob/living/carbon/human/H = user - H.shock_stage = 0 for(var/i in 1 to healing_ticks) if(user) var/healpertick = -(total_healing / healing_ticks) diff --git a/code/game/gamemodes/changeling/powers/headcrab.dm b/code/game/gamemodes/changeling/powers/headcrab.dm index a950ec7a9c9..b39a2bba0d5 100644 --- a/code/game/gamemodes/changeling/powers/headcrab.dm +++ b/code/game/gamemodes/changeling/powers/headcrab.dm @@ -1,17 +1,18 @@ -/obj/effect/proc_holder/changeling/headcrab +/datum/action/changeling/headcrab name = "Last Resort" - desc = "We sacrifice our current body in a moment of need, placing us in control of a vessel." + desc = "We sacrifice our current body in a moment of need, placing us in control of a vessel that can plant our likeness in a new host. Costs 20 chemicals." helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us." + button_icon_state = "last_resort" chemical_cost = 20 dna_cost = 1 req_human = 1 -/obj/effect/proc_holder/changeling/headcrab/try_to_sting(mob/user, mob/target) +/datum/action/changeling/headcrab/try_to_sting(mob/user, mob/target) if(alert("Are you sure you wish to do this? This action cannot be undone.",,"Yes","No")=="No") return ..() -/obj/effect/proc_holder/changeling/headcrab/sting_action(mob/user) +/datum/action/changeling/headcrab/sting_action(mob/user) var/datum/mind/M = user.mind var/list/organs = user.get_organs_zone("head", 1) @@ -42,4 +43,4 @@ to_chat(crab, "You burst out of the remains of your former body in a shower of gore!") user.gib() feedback_add_details("changeling_powers","LR") - return 1 \ No newline at end of file + return 1 diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm index 0976f0da36d..af375cad368 100644 --- a/code/game/gamemodes/changeling/powers/hivemind.dm +++ b/code/game/gamemodes/changeling/powers/hivemind.dm @@ -1,34 +1,38 @@ //HIVEMIND COMMUNICATION (:g) -/obj/effect/proc_holder/changeling/hivemind_comms +/datum/action/changeling/hivemind_comms name = "Hivemind Communication" desc = "We tune our senses to the airwaves to allow us to discreetly communicate and exchange DNA with other changelings." helptext = "We will be able to talk with other changelings with :g. Exchanged DNA do not count towards absorb objectives." dna_cost = 0 chemical_cost = -1 + needs_button = FALSE -/obj/effect/proc_holder/changeling/hivemind_comms/on_purchase(var/mob/user) +/datum/action/changeling/hivemind_comms/on_purchase(var/mob/user) ..() var/datum/changeling/changeling=user.mind.changeling changeling.changeling_speak = 1 to_chat(user, "Use say \":g message\" to communicate with the other changelings.") - var/obj/effect/proc_holder/changeling/hivemind_upload/S1 = new + var/datum/action/changeling/hivemind_upload/S1 = new if(!changeling.has_sting(S1)) changeling.purchasedpowers+=S1 - var/obj/effect/proc_holder/changeling/hivemind_download/S2 = new + S1.Grant(user) + var/datum/action/changeling/hivemind_download/S2 = new if(!changeling.has_sting(S2)) + S2.Grant(user) changeling.purchasedpowers+=S2 return // HIVE MIND UPLOAD/DOWNLOAD DNA var/list/datum/dna/hivemind_bank = list() -/obj/effect/proc_holder/changeling/hivemind_upload +/datum/action/changeling/hivemind_upload name = "Hive Channel DNA" - desc = "Allows us to channel DNA in the airwaves to allow other changelings to absorb it." + desc = "Allows us to channel DNA in the airwaves to allow other changelings to absorb it. Costs 10 chemicals." + button_icon_state = "hivemind_channel" chemical_cost = 10 dna_cost = -1 -/obj/effect/proc_holder/changeling/hivemind_upload/sting_action(var/mob/user) +/datum/action/changeling/hivemind_upload/sting_action(var/mob/user) var/datum/changeling/changeling = user.mind.changeling var/list/names = list() for(var/datum/dna/DNA in (changeling.absorbed_dna+changeling.protected_dna)) @@ -52,13 +56,14 @@ var/list/datum/dna/hivemind_bank = list() feedback_add_details("changeling_powers","HU") return 1 -/obj/effect/proc_holder/changeling/hivemind_download +/datum/action/changeling/hivemind_download name = "Hive Absorb DNA" - desc = "Allows us to absorb DNA that has been channeled to the airwaves. Does not count towards absorb objectives." + desc = "Allows us to absorb DNA that has been channeled to the airwaves. Does not count towards absorb objectives. Costs 10 chemicals." + button_icon_state = "hive_absorb" chemical_cost = 10 dna_cost = -1 -/obj/effect/proc_holder/changeling/hivemind_download/can_sting(var/mob/living/carbon/user) +/datum/action/changeling/hivemind_download/can_sting(var/mob/living/carbon/user) if(!..()) return var/datum/changeling/changeling = user.mind.changeling @@ -67,7 +72,7 @@ var/list/datum/dna/hivemind_bank = list() return return 1 -/obj/effect/proc_holder/changeling/hivemind_download/sting_action(var/mob/user) +/datum/action/changeling/hivemind_download/sting_action(var/mob/user) var/datum/changeling/changeling = user.mind.changeling var/list/names = list() for(var/datum/dna/DNA in hivemind_bank) @@ -87,4 +92,4 @@ var/list/datum/dna/hivemind_bank = list() changeling.store_dna(chosen_dna, user) to_chat(user, "We absorb the DNA of [S] from the air.") feedback_add_details("changeling_powers","HD") - return 1 \ No newline at end of file + return 1 diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm index 72b0e821e66..f9b214c513c 100644 --- a/code/game/gamemodes/changeling/powers/humanform.dm +++ b/code/game/gamemodes/changeling/powers/humanform.dm @@ -1,14 +1,14 @@ -/obj/effect/proc_holder/changeling/humanform +/datum/action/changeling/humanform name = "Human form" - desc = "We change into a human." + desc = "We change into a human. Costs 5 chemicals." + button_icon_state = "human_form" chemical_cost = 5 genetic_damage = 3 req_dna = 1 max_genetic_damage = 3 - //Transform into a human. -/obj/effect/proc_holder/changeling/humanform/sting_action(var/mob/living/carbon/human/user) +/datum/action/changeling/humanform/sting_action(var/mob/living/carbon/human/user) var/datum/changeling/changeling = user.mind.changeling var/list/names = list() for(var/datum/dna/DNA in (changeling.absorbed_dna+changeling.protected_dna)) @@ -38,7 +38,7 @@ user.UpdateAppearance() changeling.purchasedpowers -= src - //O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/lesserform(null) + //O.mind.changeling.purchasedpowers += new /datum/action/changeling/lesserform(null) + src.Remove(user) feedback_add_details("changeling_powers","LFT") return 1 - diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm index 2197163cbd5..0dd112b66dd 100644 --- a/code/game/gamemodes/changeling/powers/lesserform.dm +++ b/code/game/gamemodes/changeling/powers/lesserform.dm @@ -1,13 +1,15 @@ -/obj/effect/proc_holder/changeling/lesserform +/datum/action/changeling/lesserform name = "Lesser form" - desc = "We debase ourselves and become lesser. We become a monkey." + desc = "We debase ourselves and become lesser. We become a monkey. Costs 5 chemicals." + helptext = "The transformation greatly reduces our size, allowing us to slip out of cuffs and climb through vents." + button_icon_state = "lesser_form" chemical_cost = 5 dna_cost = 1 genetic_damage = 3 req_human = 1 //Transform into a monkey. -/obj/effect/proc_holder/changeling/lesserform/sting_action(var/mob/living/carbon/human/user) +/datum/action/changeling/lesserform/sting_action(var/mob/living/carbon/human/user) var/datum/changeling/changeling = user.mind.changeling if(!user) return 0 @@ -25,6 +27,10 @@ changeling.geneticdamage = 30 to_chat(H, "Our genes cry out!") H.monkeyize() - changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) + + var/datum/action/changeling/humanform/HF = new + changeling.purchasedpowers += HF + HF.Grant(user) + feedback_add_details("changeling_powers","LF") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm index b9f984b57c0..ba203a3e71f 100644 --- a/code/game/gamemodes/changeling/powers/linglink.dm +++ b/code/game/gamemodes/changeling/powers/linglink.dm @@ -1,12 +1,14 @@ -/obj/effect/proc_holder/changeling/linglink +/datum/action/changeling/linglink name = "Hivemind Link" - desc = "Link your victim's mind into the hivemind for personal interrogation" + desc = "We link our victim's mind into the hivemind for personal interrogation." + helptext = "If we find a human mad enough to support our cause, this can be a helpful tool to stay in touch." + button_icon_state = "hivemind_link" chemical_cost = 0 dna_cost = 0 req_human = 1 max_genetic_damage = 100 -/obj/effect/proc_holder/changeling/linglink/can_sting(mob/living/carbon/user) +/datum/action/changeling/linglink/can_sting(mob/living/carbon/user) if(!..()) return var/datum/changeling/changeling = user.mind.changeling @@ -34,7 +36,7 @@ return return changeling.can_absorb_dna(user,target) -/obj/effect/proc_holder/changeling/linglink/sting_action(mob/user) +/datum/action/changeling/linglink/sting_action(mob/user) var/datum/changeling/changeling = user.mind.changeling var/obj/item/grab/G = user.get_active_hand() var/mob/living/carbon/target = G.affecting diff --git a/code/game/gamemodes/changeling/powers/mimic_voice.dm b/code/game/gamemodes/changeling/powers/mimic_voice.dm index 21693a84c3a..27211bd8a79 100644 --- a/code/game/gamemodes/changeling/powers/mimic_voice.dm +++ b/code/game/gamemodes/changeling/powers/mimic_voice.dm @@ -1,14 +1,15 @@ -/obj/effect/proc_holder/changeling/mimicvoice +/datum/action/changeling/mimicvoice name = "Mimic Voice" - desc = "We shape our vocal glands to sound like a desired voice." + desc = "We shape our vocal glands to sound like a desired voice. Maintaining this power slows chemical production." helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this." + button_icon_state = "mimic_voice" chemical_cost = 0 //constant chemical drain hardcoded dna_cost = 1 req_human = 1 // Fake Voice -/obj/effect/proc_holder/changeling/mimicvoice/sting_action(var/mob/user) +/datum/action/changeling/mimicvoice/sting_action(var/mob/user) var/datum/changeling/changeling=user.mind.changeling if(changeling.mimicing) changeling.mimicing = "" diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 0c8d22b5a8b..59e93e2d513 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -9,7 +9,7 @@ //Parent to shields and blades because muh copypasted code. -/obj/effect/proc_holder/changeling/weapon +/datum/action/changeling/weapon name = "Organic Weapon" desc = "Go tell a coder if you see this" helptext = "Yell at coderbus" @@ -21,7 +21,7 @@ var/weapon_type var/weapon_name_simple -/obj/effect/proc_holder/changeling/weapon/try_to_sting(var/mob/user, var/mob/target) +/datum/action/changeling/weapon/try_to_sting(var/mob/user, var/mob/target) if(istype(user.l_hand, weapon_type)) //Not the nicest way to do it, but eh qdel(user.l_hand) if(!silent) @@ -36,7 +36,7 @@ return ..(user, target) -/obj/effect/proc_holder/changeling/weapon/sting_action(var/mob/user) +/datum/action/changeling/weapon/sting_action(var/mob/user) if(!user.drop_item()) to_chat(user, "The [user.get_active_hand()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!") return @@ -45,7 +45,7 @@ return W //Parent to space suits and armor. -/obj/effect/proc_holder/changeling/suit +/datum/action/changeling/suit name = "Organic Suit" desc = "Go tell a coder if you see this" helptext = "Yell at coderbus" @@ -60,7 +60,7 @@ var/recharge_slowdown = 0 var/blood_on_castoff = 0 -/obj/effect/proc_holder/changeling/suit/try_to_sting(var/mob/user, var/mob/target) +/datum/action/changeling/suit/try_to_sting(var/mob/user, var/mob/target) var/datum/changeling/changeling = user.mind.changeling if(!ishuman(user) || !changeling) return @@ -84,7 +84,7 @@ return ..(H, target) -/obj/effect/proc_holder/changeling/suit/sting_action(var/mob/living/carbon/human/user) +/datum/action/changeling/suit/sting_action(var/mob/living/carbon/human/user) if(!user.unEquip(user.wear_suit)) to_chat(user, "\the [user.wear_suit] is stuck to your body, you cannot grow a [suit_name_simple] over it!") return @@ -107,10 +107,11 @@ /***************************************\ |***************ARM BLADE***************| \***************************************/ -/obj/effect/proc_holder/changeling/weapon/arm_blade +/datum/action/changeling/weapon/arm_blade name = "Arm Blade" - desc = "We reform one of our arms into a deadly blade." - helptext = "Cannot be used while in lesser form." + desc = "We reform one of our arms into a deadly blade. Costs 25 chemicals." + helptext = "We may retract our armblade in the same manner as we form it. Cannot be used while in lesser form." + button_icon_state = "armblade" chemical_cost = 25 dna_cost = 2 genetic_damage = 10 @@ -132,15 +133,6 @@ throw_range = 0 throw_speed = 0 -/obj/item/melee/arm_blade/New() - ..() - if(ismob(loc)) - loc.visible_message("A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!") - -/obj/item/melee/arm_blade/dropped(mob/user) - user.visible_message("With a sickening crunch, [user] reforms [user.p_their()] blade into an arm!", "We assimilate the blade back into our body.", "You hear organic matter ripping and tearing!") - . = ..() - /obj/item/melee/arm_blade/afterattack(atom/target, mob/user, proximity) if(!proximity) return @@ -177,12 +169,13 @@ |***********COMBAT TENTACLES*************| \***************************************/ -/obj/effect/proc_holder/changeling/weapon/tentacle +/datum/action/changeling/weapon/tentacle name = "Tentacle" - desc = "We ready a tentacle to grab items or victims with." + desc = "We ready a tentacle to grab items or victims with. Costs 10 chemicals." helptext = "We can use it once to retrieve a distant item. If used on living creatures, the effect depends on the intent: \ Help will simply drag them closer, Disarm will grab whatever they are holding instead of them, Grab will put the victim in our hold after catching it, \ and Harm will stun it, and stab it if we are also holding a sharp weapon. Cannot be used while in lesser form." + button_icon_state = "tentacle" chemical_cost = 10 dna_cost = 2 genetic_damage = 5 @@ -220,7 +213,7 @@ /obj/item/gun/magic/tentacle/suicide_act(mob/user) user.visible_message("[user] coils [src] tightly around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide.") - return (OXYLOSS) + return OXYLOSS /obj/item/ammo_casing/magic/tentacle name = "tentacle" @@ -350,10 +343,11 @@ /***************************************\ |****************SHIELD*****************| \***************************************/ -/obj/effect/proc_holder/changeling/weapon/shield +/datum/action/changeling/weapon/shield name = "Organic Shield" - desc = "We reform one of our arms into a hard shield." - helptext = "Organic tissue cannot resist damage forever, the shield will break after it is hit too much. The more genomes we absorb, the stronger it is. Cannot be used while in lesser form." + desc = "We reform one of our arms into a hard shield. Costs 20 chemicals." + helptext = "Organic tissue cannot resist damage forever. The shield will break after it is hit too much. The more genomes we absorb, the stronger it is. Cannot be used while in lesser form." + button_icon_state = "organic_shield" chemical_cost = 20 dna_cost = 1 genetic_damage = 12 @@ -363,7 +357,7 @@ weapon_type = /obj/item/shield/changeling weapon_name_simple = "shield" -/obj/effect/proc_holder/changeling/weapon/shield/sting_action(var/mob/user) +/datum/action/changeling/weapon/shield/sting_action(var/mob/user) var/datum/changeling/changeling = user.mind.changeling //So we can read the absorbedcount. if(!changeling) return @@ -404,10 +398,11 @@ /***************************************\ |*********SPACE SUIT + HELMET***********| \***************************************/ -/obj/effect/proc_holder/changeling/suit/organic_space_suit +/datum/action/changeling/suit/organic_space_suit name = "Organic Space Suit" - desc = "We grow an organic suit to protect ourselves from space exposure." - helptext = "We must constantly repair our form to make it space-proof, reducing chemical production while we are protected. Retreating the suit damages our genomes. Cannot be used in lesser form." + desc = "We grow an organic suit to protect ourselves from space exposure. Costs 20 chemicals." + helptext = "We must constantly repair our form to make it space proof, reducing chemical production while we are protected. Cannot be used in lesser form." + button_icon_state = "organic_suit" chemical_cost = 20 dna_cost = 2 genetic_damage = 8 @@ -433,7 +428,7 @@ ..() if(ismob(loc)) loc.visible_message("[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!") - processing_objects += src + START_PROCESSING(SSobj, src) /obj/item/clothing/suit/space/changeling/process() if(ishuman(loc)) @@ -451,10 +446,11 @@ /***************************************\ |*****************ARMOR*****************| \***************************************/ -/obj/effect/proc_holder/changeling/suit/armor +/datum/action/changeling/suit/armor name = "Chitinous Armor" - desc = "We turn our skin into tough chitin to protect us from damage." - helptext = "Upkeep of the armor requires a low expenditure of chemicals. The armor is strong against brute force, but does not provide much protection from lasers. Retreating the armor damages our genomes. Cannot be used in lesser form." + desc = "We turn our skin into tough chitin to protect us from damage. Costs 25 chemicals." + helptext = "Upkeep of the armor requires a low expenditure of chemicals. The armor is strong against brute force, but does not provide much protection from lasers. Cannot be used in lesser form." + button_icon_state = "chitinous_armor" chemical_cost = 25 dna_cost = 2 genetic_damage = 11 @@ -477,7 +473,6 @@ flags_inv = HIDEJUMPSUIT cold_protection = 0 heat_protection = 0 - species_fit = null sprite_sheets = null /obj/item/clothing/suit/armor/changeling/New() diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index 8f4fe0ac394..6e6d69cc1dd 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -1,13 +1,14 @@ -/obj/effect/proc_holder/changeling/panacea +/datum/action/changeling/panacea name = "Anatomic Panacea" - desc = "Expels impurifications from our form; curing diseases, removing parasites, sobering us, purging toxins and radiation, and resetting our genetic code completely." + desc = "Expels impurifications from our form, curing diseases, removing parasites, sobering us, purging toxins and radiation, and resetting our genetic code completely. Costs 20 chemicals." helptext = "Can be used while unconscious." + button_icon_state = "panacea" chemical_cost = 20 dna_cost = 1 req_stat = UNCONSCIOUS //Heals the things that the other regenerative abilities don't. -/obj/effect/proc_holder/changeling/panacea/sting_action(var/mob/user) +/datum/action/changeling/panacea/sting_action(var/mob/user) to_chat(user, "We cleanse impurities from our form.") diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 83f221a95d3..740d9fb25dc 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -1,11 +1,12 @@ -/obj/effect/proc_holder/changeling/revive +/datum/action/changeling/revive name = "Regenerate" desc = "We regenerate, healing all damage from our form." + button_icon_state = "revive" req_stat = DEAD always_keep = 1 //Revive from regenerative stasis -/obj/effect/proc_holder/changeling/revive/sting_action(var/mob/living/carbon/user) +/datum/action/changeling/revive/sting_action(var/mob/living/carbon/user) user.setToxLoss(0, FALSE) user.setOxyLoss(0, FALSE) user.setCloneLoss(0, FALSE) @@ -27,8 +28,6 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user H.restore_blood() - H.traumatic_shock = 0 - H.shock_stage = 0 H.next_pain_time = 0 H.dna.species.create_organs(H) // Now that recreating all organs is necessary, the rest of this organ stuff probably @@ -51,6 +50,8 @@ IO.rejuvenate() IO.trace_chemicals.Cut() H.remove_all_embedded_objects() + for(var/datum/disease/critical/C in user.viruses) + C.cure() user.status_flags &= ~(FAKEDEATH) user.updatehealth("revive sting") user.update_blind_effects() @@ -62,7 +63,7 @@ user.regenerate_icons() user.update_revive() //Handle waking up the changeling after the regenerative stasis has completed. - user.mind.changeling.purchasedpowers -= src + src.Remove(user) user.med_hud_set_status() user.med_hud_set_health() feedback_add_details("changeling_powers","CR") diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 1c60013fbb8..068092dde0d 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -1,13 +1,14 @@ -/obj/effect/proc_holder/changeling/resonant_shriek +/datum/action/changeling/resonant_shriek name = "Resonant Shriek" - desc = "Our lungs and vocal chords shift, allowing us to briefly emit a noise that deafens and confuses the weak-minded." - helptext = "Emits a high-frequency sound that confuses and deafens humans, blows out nearby lights and overloads cyborg sensors." + desc = "Our lungs and vocal cords shift, allowing us to briefly emit a noise that deafens and confuses the weak minded. Costs 30 chemicals." + helptext = "Emits a high frequency sound that confuses and deafens humans, blows out nearby lights and overloads cyborg sensors." + button_icon_state = "resonant_shriek" chemical_cost = 30 dna_cost = 1 req_human = 1 -//A flashy ability, good for crowd control and sewing chaos. -/obj/effect/proc_holder/changeling/resonant_shriek/sting_action(var/mob/user) +//A flashy ability, good for crowd control and sowing chaos. +/datum/action/changeling/resonant_shriek/sting_action(var/mob/user) for(var/mob/living/M in get_mobs_in_view(4, user)) if(iscarbon(M)) if(!M.mind || !M.mind.changeling) @@ -28,14 +29,15 @@ feedback_add_details("changeling_powers","RS") return 1 -/obj/effect/proc_holder/changeling/dissonant_shriek +/datum/action/changeling/dissonant_shriek name = "Dissonant Shriek" - desc = "We shift our vocal cords to release a high-frequency sound that overloads nearby electronics." + desc = "We shift our vocal cords to release a high frequency sound that overloads nearby electronics. Costs 30 chemicals." + button_icon_state = "dissonant_shriek" chemical_cost = 30 dna_cost = 1 //A flashy ability, good for crowd control and sewing chaos. -/obj/effect/proc_holder/changeling/dissonant_shriek/sting_action(var/mob/user) +/datum/action/changeling/dissonant_shriek/sting_action(var/mob/user) for(var/obj/machinery/light/L in range(5, usr)) L.on = 1 L.broken() diff --git a/code/game/gamemodes/changeling/powers/spiders.dm b/code/game/gamemodes/changeling/powers/spiders.dm index 348924c7d7b..82b2db6ac7b 100644 --- a/code/game/gamemodes/changeling/powers/spiders.dm +++ b/code/game/gamemodes/changeling/powers/spiders.dm @@ -1,13 +1,14 @@ -/obj/effect/proc_holder/changeling/spiders +/datum/action/changeling/spiders name = "Spread Infestation" desc = "Our form divides, creating arachnids which will grow into deadly beasts." helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 5 DNA absorptions." + button_icon_state = "spread_infestation" chemical_cost = 45 dna_cost = 1 req_dna = 5 //Makes some spiderlings. Good for setting traps and causing general trouble. -/obj/effect/proc_holder/changeling/spiders/sting_action(var/mob/user) +/datum/action/changeling/spiders/sting_action(var/mob/user) for(var/i=0, i<2, i++) var/obj/structure/spider/spiderling/S = new(user.loc) S.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/hunter diff --git a/code/game/gamemodes/changeling/powers/strained_muscles.dm b/code/game/gamemodes/changeling/powers/strained_muscles.dm index 28884c2653a..10f8a5a5d77 100644 --- a/code/game/gamemodes/changeling/powers/strained_muscles.dm +++ b/code/game/gamemodes/changeling/powers/strained_muscles.dm @@ -1,17 +1,18 @@ //Strained Muscles: Temporary speed boost at the cost of rapid damage //Limited because of hardsuits and such; ideally, used for a quick getaway -/obj/effect/proc_holder/changeling/strained_muscles +/datum/action/changeling/strained_muscles name = "Strained Muscles" desc = "We evolve the ability to reduce the acid buildup in our muscles, allowing us to move much faster." helptext = "The strain will make us tired, and we will rapidly become fatigued. Standard weight restrictions, like hardsuits, still apply. Cannot be used in lesser form." + button_icon_state = "strained_muscles" chemical_cost = 0 dna_cost = 1 req_human = 1 var/stacks = 0 //Increments every 5 seconds; damage increases over time var/enabled = 0 //Whether or not you are a hedgehog -/obj/effect/proc_holder/changeling/strained_muscles/sting_action(var/mob/living/carbon/user) +/datum/action/changeling/strained_muscles/sting_action(var/mob/living/carbon/user) enabled = !enabled if(enabled) to_chat(user, "Our muscles tense and strengthen.") diff --git a/code/game/gamemodes/changeling/powers/swap_form.dm b/code/game/gamemodes/changeling/powers/swap_form.dm index 7f0164535c2..e0fc1107729 100644 --- a/code/game/gamemodes/changeling/powers/swap_form.dm +++ b/code/game/gamemodes/changeling/powers/swap_form.dm @@ -1,12 +1,13 @@ -/obj/effect/proc_holder/changeling/swap_form +/datum/action/changeling/swap_form name = "Swap Forms" - desc = "We force ourselves into the body of another form, pushing their consciousness into the form we left behind." + desc = "We force ourselves into the body of another form, pushing their consciousness into the form we left behind. Costs 40 chemicals." helptext = "We will bring all our abilities with us, but we will lose our old form DNA in exchange for the new one. The process will seem suspicious to any observers." + button_icon_state = "mindswap" chemical_cost = 40 dna_cost = 1 req_human = 1 //Monkeys can't grab -/obj/effect/proc_holder/changeling/swap_form/can_sting(var/mob/living/carbon/user) +/datum/action/changeling/swap_form/can_sting(var/mob/living/carbon/user) if(!..()) return var/obj/item/grab/G = user.get_active_hand() @@ -20,10 +21,12 @@ if(!istype(target) || issmall(target) || NO_DNA in target.dna.species.species_traits) to_chat(user, "[target] is not compatible with this ability.") return + if(target.mind.changeling) + to_chat(user, "We are unable to swap forms with another changeling!") + return return 1 - -/obj/effect/proc_holder/changeling/swap_form/sting_action(var/mob/living/carbon/user) +/datum/action/changeling/swap_form/sting_action(var/mob/living/carbon/user) var/obj/item/grab/G = user.get_active_hand() var/mob/living/carbon/human/target = G.affecting var/datum/changeling/changeling = user.mind.changeling @@ -38,6 +41,10 @@ to_chat(target, "[user] tightens [user.p_their()] grip as a painful sensation invades your body.") + var/lingpowers = list() + for(var/power in changeling.purchasedpowers) + lingpowers += power + changeling.absorbed_dna -= changeling.find_dna(user.dna) changeling.protected_dna -= changeling.find_dna(user.dna) changeling.absorbedcount -= 1 @@ -55,6 +62,13 @@ user.Paralyse(2) target.add_language("Changeling") user.remove_language("Changeling") + user.regenerate_icons() + + for(var/power in lingpowers) + var/datum/action/changeling/S = power + target.mind.changeling.purchasedpowers += S + if(istype(S) && S.needs_button) + S.Grant(target) to_chat(target, "Our genes cry out as we swap our [user] form for [target].") return 1 diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 58afbb73dfe..94bde26674b 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -1,10 +1,10 @@ -/obj/effect/proc_holder/changeling/sting +/datum/action/changeling/sting name = "Tiny Prick" desc = "Stabby stabby" var/sting_icon = null -/obj/effect/proc_holder/changeling/sting/Click() - var/mob/user = usr +/datum/action/changeling/sting/Trigger() + var/mob/user = owner if(!user || !user.mind || !user.mind.changeling) return if(!(user.mind.changeling.chosen_sting)) @@ -13,13 +13,13 @@ unset_sting(user) return -/obj/effect/proc_holder/changeling/sting/proc/set_sting(var/mob/user) +/datum/action/changeling/sting/proc/set_sting(var/mob/user) to_chat(user, "We prepare our sting, use alt+click or middle mouse button on target to sting them.") user.mind.changeling.chosen_sting = src user.hud_used.lingstingdisplay.icon_state = sting_icon user.hud_used.lingstingdisplay.invisibility = 0 -/obj/effect/proc_holder/changeling/sting/proc/unset_sting(var/mob/user) +/datum/action/changeling/sting/proc/unset_sting(var/mob/user) to_chat(user, "We retract our sting, we can't sting anyone for now.") user.mind.changeling.chosen_sting = null user.hud_used.lingstingdisplay.icon_state = null @@ -29,7 +29,7 @@ if(mind && mind.changeling && mind.changeling.chosen_sting) mind.changeling.chosen_sting.unset_sting(src) -/obj/effect/proc_holder/changeling/sting/can_sting(var/mob/user, var/mob/target) +/datum/action/changeling/sting/can_sting(var/mob/user, var/mob/target) if(!..()) return if(!user.mind.changeling.chosen_sting) @@ -51,7 +51,7 @@ return return 1 -/obj/effect/proc_holder/changeling/sting/sting_feedback(var/mob/user, var/mob/target) +/datum/action/changeling/sting/sting_feedback(var/mob/user, var/mob/target) if(!target) return to_chat(user, "We stealthily sting [target.name].") @@ -60,18 +60,18 @@ add_attack_logs(user, target, "Unsuccessful sting (changeling)") return 1 - -/obj/effect/proc_holder/changeling/sting/transformation +/datum/action/changeling/sting/transformation name = "Transformation Sting" - desc = "We silently sting a human, injecting a retrovirus that forces them to transform." + desc = "We silently sting a human, injecting a retrovirus that forces them to transform. Costs 50 chemicals." helptext = "The victim will transform much like a changeling would. The effects will be obvious to the victim, and the process will damage our genomes." + button_icon_state = "sting_transform" sting_icon = "sting_transform" chemical_cost = 50 dna_cost = 3 genetic_damage = 100 var/datum/dna/selected_dna = null -/obj/effect/proc_holder/changeling/sting/transformation/Click() +/datum/action/changeling/sting/transformation/Trigger() var/mob/user = usr var/datum/changeling/changeling = user.mind.changeling if(changeling.chosen_sting) @@ -85,7 +85,7 @@ return ..() -/obj/effect/proc_holder/changeling/sting/transformation/can_sting(var/mob/user, var/mob/target) +/datum/action/changeling/sting/transformation/can_sting(var/mob/user, var/mob/target) if(!..()) return if((HUSK in target.mutations) || (!ishuman(target))) @@ -98,7 +98,7 @@ return FALSE return TRUE -/obj/effect/proc_holder/changeling/sting/transformation/sting_action(var/mob/user, var/mob/target) +/datum/action/changeling/sting/transformation/sting_action(var/mob/user, var/mob/target) add_attack_logs(user, target, "Transformation sting (changeling) (new identity is [selected_dna.real_name])") if(issmall(target)) to_chat(user, "Our genes cry out as we sting [target.name]!") @@ -114,48 +114,51 @@ feedback_add_details("changeling_powers","TS") return TRUE -obj/effect/proc_holder/changeling/sting/extract_dna +datum/action/changeling/sting/extract_dna name = "Extract DNA Sting" - desc = "We stealthily sting a target and extract their DNA." + desc = "We stealthily sting a target and extract their DNA. Costs 25 chemicals." helptext = "Will give you the DNA of your target, allowing you to transform into them." + button_icon_state = "sting_extract" sting_icon = "sting_extract" chemical_cost = 25 dna_cost = 0 -/obj/effect/proc_holder/changeling/sting/extract_dna/can_sting(var/mob/user, var/mob/target) +/datum/action/changeling/sting/extract_dna/can_sting(var/mob/user, var/mob/target) if(..()) return user.mind.changeling.can_absorb_dna(user, target) -/obj/effect/proc_holder/changeling/sting/extract_dna/sting_action(var/mob/user, var/mob/living/carbon/human/target) +/datum/action/changeling/sting/extract_dna/sting_action(var/mob/user, var/mob/living/carbon/human/target) add_attack_logs(user, target, "Extraction sting (changeling)") if(!(user.mind.changeling.has_dna(target.dna))) user.mind.changeling.absorb_dna(target, user) feedback_add_details("changeling_powers","ED") return 1 -obj/effect/proc_holder/changeling/sting/mute +datum/action/changeling/sting/mute name = "Mute Sting" - desc = "We silently sting a human, completely silencing them for a short time." + desc = "We silently sting a human, completely silencing them for a short time. Costs 20 chemicals." helptext = "Does not provide a warning to the victim that they have been stung, until they try to speak and cannot." + button_icon_state = "sting_mute" sting_icon = "sting_mute" chemical_cost = 20 dna_cost = 2 -/obj/effect/proc_holder/changeling/sting/mute/sting_action(var/mob/user, var/mob/living/carbon/target) +/datum/action/changeling/sting/mute/sting_action(var/mob/user, var/mob/living/carbon/target) add_attack_logs(user, target, "Mute sting (changeling)") target.AdjustSilence(30) feedback_add_details("changeling_powers","MS") return 1 -obj/effect/proc_holder/changeling/sting/blind +datum/action/changeling/sting/blind name = "Blind Sting" - desc = "Temporarily blinds the target." - helptext = "This sting completely blinds a target for a short time." + desc = "We temporarily blind our victim. Costs 25 chemicals." + helptext = "This sting completely blinds a target for a short time, and leaves them with blurred vision for a long time." + button_icon_state = "sting_blind" sting_icon = "sting_blind" chemical_cost = 25 dna_cost = 1 -/obj/effect/proc_holder/changeling/sting/blind/sting_action(var/mob/living/user, var/mob/living/target) +/datum/action/changeling/sting/blind/sting_action(var/mob/living/user, var/mob/living/target) add_attack_logs(user, target, "Blind sting (changeling)") to_chat(target, "Your eyes burn horrifically!") target.BecomeNearsighted() @@ -164,15 +167,16 @@ obj/effect/proc_holder/changeling/sting/blind feedback_add_details("changeling_powers","BS") return 1 -obj/effect/proc_holder/changeling/sting/LSD +datum/action/changeling/sting/LSD name = "Hallucination Sting" - desc = "Causes terror in the target." + desc = "We cause mass terror to our victim. Costs 10 chemicals." helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung, and the effect occurs after 30 to 60 seconds." + button_icon_state = "sting_lsd" sting_icon = "sting_lsd" chemical_cost = 10 dna_cost = 1 -/obj/effect/proc_holder/changeling/sting/LSD/sting_action(var/mob/user, var/mob/living/carbon/target) +/datum/action/changeling/sting/LSD/sting_action(var/mob/user, var/mob/living/carbon/target) add_attack_logs(user, target, "LSD sting (changeling)") spawn(rand(300,600)) if(target) @@ -180,15 +184,16 @@ obj/effect/proc_holder/changeling/sting/LSD feedback_add_details("changeling_powers","HS") return 1 -obj/effect/proc_holder/changeling/sting/cryo //Enable when mob cooling is fixed so that frostoil actually makes you cold, instead of mostly just hungry. +datum/action/changeling/sting/cryo //Enable when mob cooling is fixed so that frostoil actually makes you cold, instead of mostly just hungry. name = "Cryogenic Sting" - desc = "We silently sting a human with a cocktail of chemicals that freeze them." + desc = "We silently sting our victim with a cocktail of chemicals that freezes them from the inside. Costs 15 chemicals." helptext = "Does not provide a warning to the victim, though they will likely realize they are suddenly freezing." + button_icon_state = "sting_cryo" sting_icon = "sting_cryo" chemical_cost = 15 dna_cost = 2 -/obj/effect/proc_holder/changeling/sting/cryo/sting_action(var/mob/user, var/mob/target) +/datum/action/changeling/sting/cryo/sting_action(var/mob/user, var/mob/target) add_attack_logs(user, target, "Cryo sting (changeling)") if(target.reagents) target.reagents.add_reagent("frostoil", 30) diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm index eb50ae0b750..417fbaa052d 100644 --- a/code/game/gamemodes/changeling/powers/transform.dm +++ b/code/game/gamemodes/changeling/powers/transform.dm @@ -1,6 +1,7 @@ -/obj/effect/proc_holder/changeling/transform +/datum/action/changeling/transform name = "Transform" - desc = "We take on the appearance and voice of one we have absorbed." + desc = "We take on the appearance and voice of one we have absorbed. Costs 5 chemicals." + button_icon_state = "transform" chemical_cost = 5 dna_cost = 0 req_dna = 1 @@ -8,7 +9,7 @@ max_genetic_damage = 3 //Change our DNA to that of somebody we've absorbed. -/obj/effect/proc_holder/changeling/transform/sting_action(var/mob/living/carbon/human/user) +/datum/action/changeling/transform/sting_action(var/mob/living/carbon/human/user) var/datum/changeling/changeling = user.mind.changeling var/datum/dna/chosen_dna = changeling.select_dna("Select the target DNA: ", "Target DNA") diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 865d8e603d2..9442c319dcb 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -1,11 +1,10 @@ -#define SUMMON_POSSIBILITIES 3 var/global/list/all_cults = list() /datum/game_mode var/list/datum/mind/cult = list() /proc/iscultist(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.cult) /proc/is_convertable_to_cult(datum/mind/mind) @@ -30,8 +29,8 @@ var/global/list/all_cults = list() return 1 /proc/is_sacrifice_target(datum/mind/mind) - if(istype(ticker.mode.name, "cult")) - var/datum/game_mode/cult/cult_mode = ticker.mode + if(SSticker.mode.name == "cult") + var/datum/game_mode/cult/cult_mode = SSticker.mode if(mind == cult_mode.sacrifice_target) return 1 return 0 @@ -44,7 +43,6 @@ var/global/list/all_cults = list() required_players = 30 required_enemies = 3 recommended_enemies = 4 - free_golems_disabled = TRUE var/datum/mind/sacrifice_target = null var/finished = 0 @@ -121,7 +119,7 @@ var/global/list/all_cults = list() var/datum/action/innate/cultcomm/C = new() C.Grant(cult_mind.current) update_cult_icons_added(cult_mind) - to_chat(cult_mind.current, "You catch a glimpse of the Realm of [ticker.cultdat.entity_name], [ticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [ticker.cultdat.entity_name].") + to_chat(cult_mind.current, "You catch a glimpse of the Realm of [SSticker.cultdat.entity_name], [SSticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [SSticker.cultdat.entity_name].") first_phase() @@ -135,16 +133,16 @@ var/global/list/all_cults = list() if("survive") explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station." if("convert") - explanation = "We must increase our influence before we can summon [ticker.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." + explanation = "We must increase our influence before we can summon [SSticker.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." if("bloodspill") - explanation = "We must prepare this place for [ticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." + explanation = "We must prepare this place for [SSticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." if("sacrifice") if(sacrifice_target) explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.assigned_role]. You will need the sacrifice rune and three acolytes to do so." else explanation = "Free objective." if("eldergod") - explanation = "Summon [ticker.cultdat.entity_name] by invoking the 'Tear Reality' rune.The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." + explanation = "Summon [SSticker.cultdat.entity_name] by invoking the 'Tear Reality' rune.The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." to_chat(cult_mind.current, "Objective #[obj_count]: [explanation]") cult_mind.memory += "Objective #[obj_count]: [explanation]
" @@ -179,12 +177,13 @@ var/global/list/all_cults = list() /datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE if(!istype(cult_mind)) return 0 - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind)) cult += cult_mind cult_mind.current.faction |= "cult" var/datum/action/innate/cultcomm/C = new() C.Grant(cult_mind.current) + SEND_SOUND(cult_mind.current, 'sound/ambience/antag/bloodcult.ogg') cult_mind.current.create_attack_log("Has been converted to the cult!") if(jobban_isbanned(cult_mind.current, ROLE_CULTIST) || jobban_isbanned(cult_mind.current, ROLE_SYNDICATE)) replace_jobbanned_player(cult_mind.current, ROLE_CULTIST) @@ -313,10 +312,10 @@ var/global/list/all_cults = list() feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED") if("eldergod") if(!eldergod) - explanation = "Summon [ticker.cultdat.entity_name]. Success!" + explanation = "Summon [SSticker.cultdat.entity_name]. Success!" feedback_add_details("cult_objective","cult_narsie|SUCCESS") else - explanation = "Summon [ticker.cultdat.entity_name]. Fail." + explanation = "Summon [SSticker.cultdat.entity_name]. Fail." feedback_add_details("cult_objective","cult_narsie|FAIL") if("slaughter") if(demons_summoned) @@ -344,10 +343,10 @@ var/global/list/all_cults = list() if("harvest") if(harvested > harvest_target) - explanation = "Offer [harvest_target] humans for [ticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Success!" + explanation = "Offer [harvest_target] humans for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Success!" feedback_add_details("cult_objective","cult_harvest|SUCCESS") else - explanation = "Offer [harvest_target] humans for [ticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Fail!" + explanation = "Offer [harvest_target] humans for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Fail!" feedback_add_details("cult_objective","cult_harvest|FAIL") if("hijack") @@ -374,7 +373,7 @@ var/global/list/all_cults = list() /datum/game_mode/proc/auto_declare_completion_cult() - if(cult.len || (ticker && GAMEMODE_IS_CULT)) + if(cult.len || (SSticker && GAMEMODE_IS_CULT)) var/text = "The cultists were:" for(var/datum/mind/cultist in cult) diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index 2fbbcdc413d..2586c63bc91 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -39,10 +39,10 @@ my_message = "Harbringer of the Slaughter: [message]" else my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]" - for(var/mob/M in GLOB.mob_list) + 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_items.dm b/code/game/gamemodes/cult/cult_items.dm index 8b09d4d1577..7e849b54bbe 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -200,7 +200,7 @@ increment = 5 max = 40 prefix = "darkened" - claw_damage_increase = 2 + claw_damage_increase = 4 /obj/item/whetstone/cult/update_icon() icon_state = "cult_sharpener[used ? "_used" : ""]" @@ -217,7 +217,7 @@ name = "zealot's blindfold" icon_state = "blindfold" item_state = "blindfold" - darkness_view = 8 + see_in_dark = 8 flash_protect = 1 /obj/item/clothing/glasses/night/cultblind/equipped(mob/user, slot) @@ -366,9 +366,19 @@ /obj/item/clothing/head/culthood/alt/ghost flags = NODROP | DROPDEL -/obj/item/clothing/suit/cultrobes/alt/ghost +/obj/item/clothing/suit/cultrobesghost + name = "ghostly cult robes" + desc = "A set of ethreal armored robes worn by the undead followers of a cult." + icon_state = "cultrobesalt" + item_state = "cultrobesalt" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + allowed = list(/obj/item/tome,/obj/item/melee/cultblade) + armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0) + flags_inv = HIDEJUMPSUIT + flags = NODROP | DROPDEL + /obj/item/clothing/shoes/cult/ghost flags = NODROP | DROPDEL @@ -376,7 +386,7 @@ name = "Cultist Ghost" uniform = /obj/item/clothing/under/color/black - suit = /obj/item/clothing/suit/cultrobes/alt/ghost + suit = /obj/item/clothing/suit/cultrobesghost shoes = /obj/item/clothing/shoes/cult/ghost head = /obj/item/clothing/head/culthood/alt/ghost r_hand = /obj/item/melee/cultblade/ghost \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm index beef75e103b..c31ebaf9b84 100644 --- a/code/game/gamemodes/cult/cult_objectives.dm +++ b/code/game/gamemodes/cult/cult_objectives.dm @@ -19,10 +19,10 @@ switch(new_objective) if("convert") - explanation = "We must increase our influence before we can summon [ticker.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." + explanation = "We must increase our influence before we can summon [SSticker.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." if("bloodspill") spilltarget = 100 + rand(0,GLOB.player_list.len * 3) - explanation = "We must prepare this place for [ticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." + explanation = "We must prepare this place for [SSticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." if("sacrifice") explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for [sacrifice_target.p_their()] blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual." @@ -59,8 +59,8 @@ message_admins("The Cult has already completed [prenarsie_objectives] objectives! Nar-Sie objective unlocked.") log_admin("The Cult has already completed [prenarsie_objectives] objectives! Nar-Sie objective unlocked.") else - message_admins("There are less than 4 cultists! [ticker.cultdat.entity_name] objective unlocked.") - log_admin("There are less than 4 cultists! [ticker.cultdat.entity_name] objective unlocked.") + message_admins("There are less than 4 cultists! [SSticker.cultdat.entity_name] objective unlocked.") + log_admin("There are less than 4 cultists! [SSticker.cultdat.entity_name] objective unlocked.") gtfo_phase() if(!sacrificed.len && (new_objective != "sacrifice")) @@ -76,10 +76,10 @@ switch(new_objective) if("convert") - explanation = "We must increase our influence before we can summon [ticker.cultdat.entity_name]. Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." + explanation = "We must increase our influence before we can summon [SSticker.cultdat.entity_name]. Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." if("bloodspill") spilltarget = 100 + rand(0,GLOB.player_list.len * 3) - explanation = "We must prepare this place for [ticker.cultdat.entity_title1]'s coming. Spread blood and gibs over [spilltarget] of the Station's floor tiles." + explanation = "We must prepare this place for [SSticker.cultdat.entity_title1]'s coming. Spread blood and gibs over [spilltarget] of the Station's floor tiles." if("sacrifice") explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for [sacrifice_target.p_their()] blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual." @@ -111,7 +111,7 @@ if(prob(40))//split the chance of this objectives += "eldergod" - explanation = "Summon [ticker.cultdat.entity_name] on the Station via the use of the Tear Reality rune. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin." + explanation = "Summon [SSticker.cultdat.entity_name] on the Station via the use of the Tear Reality rune. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin." else objectives += "slaughter" explanation = "Bring the Slaughter via the rune 'Bring forth the slaughter'. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin." @@ -135,11 +135,11 @@ switch(last_objective) if("harvest") - explanation = "[ticker.cultdat.entity_title1] hungers for their first meal of this never-ending day. Offer them [harvest_target] humans in sacrifice." + explanation = "[SSticker.cultdat.entity_title1] hungers for their first meal of this never-ending day. Offer them [harvest_target] humans in sacrifice." if("hijack") - explanation = "[ticker.cultdat.entity_name] wishes for their troops to start the assault on Centcom immediately. Hijack the escape shuttle and don't let a single non-cultist board it." + explanation = "[SSticker.cultdat.entity_name] wishes for their troops to start the assault on Centcom immediately. Hijack the escape shuttle and don't let a single non-cultist board it." if("massacre") - explanation = "[ticker.cultdat.entity_name] wants to watch you as you massacre the remaining humans on the station (until less than [massacre_target] humans are left alive)." + explanation = "[SSticker.cultdat.entity_name] wants to watch you as you massacre the remaining humans on the station (until less than [massacre_target] humans are left alive)." for(var/datum/mind/cult_mind in cult) if(cult_mind) @@ -163,6 +163,16 @@ possible_sac_targets += player.mind return possible_sac_targets +// Handles the updating of sacrifice objectives after the sacrifice target goes to cryo and ghosts +/datum/game_mode/cult/proc/update_sac_objective(previous_target, previous_role) + for(var/datum/mind/cult_mind in cult) + if(cult_mind) + var/updated_memory = cult_mind.memory + updated_memory = replacetext("[cult_mind.memory]", "[previous_target]", "[sacrifice_target]") + updated_memory = replacetext("[updated_memory]", "[previous_role]", "[sacrifice_target.assigned_role]") + cult_mind.memory = updated_memory + + /datum/game_mode/cult/proc/pick_objective() var/list/possible_objectives = list() diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 63e0626f481..c6a6a3b7490 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -169,8 +169,8 @@ var/list/blacklisted_pylon_turfs = typecacheof(list( /turf/simulated/floor/engine/cult, /turf/space, - /turf/unsimulated/floor/lava, - /turf/unsimulated/floor/chasm, + /turf/simulated/floor/plating/lava, + /turf/simulated/floor/chasm, /turf/simulated/wall, )) @@ -193,11 +193,11 @@ var/list/blacklisted_pylon_turfs = typecacheof(list( return /obj/structure/cult/functional/pylon/New() - processing_objects |= src + START_PROCESSING(SSobj, src) ..() /obj/structure/cult/functional/pylon/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/structure/cult/functional/pylon/process() @@ -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/ritual.dm b/code/game/gamemodes/cult/ritual.dm index a16cf76d9f1..fb6bb95a4a8 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -11,7 +11,7 @@ return /obj/effect/rune/proc/check_icon() - if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way + if(!SSticker.mode)//work around for maps with runes and cultdat is not loaded all the way var/bits = make_bit_triplet() icon = get_rune(bits) else @@ -39,16 +39,16 @@ canbypass = 1 /obj/item/tome/New() - if(!ticker.mode) + if(!SSticker.mode) icon_state = "tome" else - icon_state = ticker.cultdat.tome_icon + icon_state = SSticker.cultdat.tome_icon ..() /obj/item/tome/examine(mob/user) ..() if(iscultist(user) || user.stat == DEAD) - to_chat(user, "The scriptures of [ticker.cultdat.entity_title3]. Allows the scribing of runes and access to the knowledge archives of the cult of [ticker.cultdat.entity_name].") + to_chat(user, "The scriptures of [SSticker.cultdat.entity_title3]. Allows the scribing of runes and access to the knowledge archives of the cult of [SSticker.cultdat.entity_name].") to_chat(user, "Striking another cultist with it will purge holy water from them.") to_chat(user, "Striking a noncultist, however, will sear their flesh.") @@ -91,7 +91,7 @@ /obj/item/tome/proc/read_tome(mob/user) var/text = list() - text += "
Archives of [ticker.cultdat.entity_title1]



" + text += "
Archives of [SSticker.cultdat.entity_title1]



" text += "A rune's name and effects can be revealed by examining the rune.<

" text += "Rite of Binding
This rune is one of the most important runes the cult has, being the only way to create new talismans. A blank sheet of paper must be on top of the rune. After \ @@ -102,7 +102,7 @@ text += "Rite of Enlightenment
This rune is critical to the success of the cult. It will allow you to convert normal crew members into cultists. \ To do this, simply place the crew member upon the rune and invoke it. This rune requires two invokers to use. If the target to be converted is mindshielded or a certain assignment, they will \ - be unable to be converted. People [ticker.cultdat.entity_title3] wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.
\ + be unable to be converted. People [SSticker.cultdat.entity_title3] wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.
\ Successful conversions will produce a tome for the new cultist.

" text += "Rite of Tribute
This rune is necessary to achieve your goals. Simply place any dead creature upon the rune and invoke it (this will not \ @@ -135,12 +135,12 @@ text += "Leeching
When invoked, this rune will transfer lifeforce from the victim to the invoker.

" - text += "Rite of Spectral Manifestation
This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and [ticker.cultdat.entity_title3]. \ + text += "Rite of Spectral Manifestation
This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and [SSticker.cultdat.entity_title3]. \ However, the spirit's link to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, all summoned spirits will dissipate, dropping their items to the ground. You may manifest \ multiple spirits with one rune, but you will rapidly take damage in doing so.

" text += "Ritual of Dimensional Rending
This rune is necessary to achieve your goals. On attempting to scribe it, it will produce shields around you and alert everyone you are attempting to scribe it; it takes a very long time to scribe, \ - and does massive damage to the one attempting to scribe it.
Invoking it requires 9 invokers and the sacrifice of a specific crewmember, and once invoked, will summon [ticker.cultdat.entity_title3], [ticker.cultdat.entity_name]. \ + and does massive damage to the one attempting to scribe it.
Invoking it requires 9 invokers and the sacrifice of a specific crewmember, and once invoked, will summon [SSticker.cultdat.entity_title3], [SSticker.cultdat.entity_name]. \ This will complete your objectives.


" text += "Talisman of Teleportation
The talisman form of the Teleport rune will transport the invoker to a selected Teleport rune once.

" @@ -201,12 +201,12 @@ return 1 /obj/item/tome/proc/finale_runes_ok(mob/living/user, obj/effect/rune/rune_to_scribe) - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode var/area/A = get_area(src) if(GAMEMODE_IS_CULT) if(!canbypass)//not an admin-tome, check things if(!cult_mode.narsie_condition_cleared) - to_chat(user, "There is still more to do before unleashing [ticker.cultdat.entity_name] power!") + to_chat(user, "There is still more to do before unleashing [SSticker.cultdat.entity_name] power!") return 0 if(!cult_mode.eldergod) to_chat(user, "\"I am already here. There is no need to try to summon me now.\"") @@ -215,19 +215,19 @@ to_chat(user, "\"We are already here. There is no need to try to summon us now.\"") return 0 if(!((CULT_ELDERGOD in cult_mode.objectives) || (CULT_SLAUGHTER in cult_mode.objectives))) - to_chat(user, "[ticker.cultdat.entity_name]'s power does not wish to be unleashed!") + to_chat(user, "[SSticker.cultdat.entity_name]'s power does not wish to be unleashed!") return 0 if(!(A in summon_spots)) - to_chat(user, "[ticker.cultdat.entity_name] can only be summoned where the veil is weak - in [english_list(summon_spots)]!") + to_chat(user, "[SSticker.cultdat.entity_name] can only be summoned where the veil is weak - in [english_list(summon_spots)]!") return 0 - var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [ticker.cultdat.entity_name]!", "No") + var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No") if(confirm_final == "No" || confirm_final == null) to_chat(user, "You decide to prepare further before scribing the rune.") return 0 else return 1 else//the game mode is not cult..but we ARE a cultist...ALL ON THE ADMINBUS - var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [ticker.cultdat.entity_name]!", "No") + var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No") if(confirm_final == "No" || confirm_final == null) to_chat(user, "You decide to prepare further before scribing the rune.") return 0 @@ -236,6 +236,8 @@ /obj/item/tome/proc/scribe_rune(mob/living/user) var/turf/runeturf = get_turf(user) + if(isspaceturf(runeturf)) + return var/chosen_keyword var/obj/effect/rune/rune_to_scribe var/entered_rune_name @@ -294,7 +296,7 @@ var/mob/living/carbon/human/H = user var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone)) - user.visible_message("[user] cuts open [user.p_their()] [affecting] and begins writing in [user.p_their()] own blood!", "You slice open your [affecting] and begin drawing a sigil of [ticker.cultdat.entity_title3].") + user.visible_message("[user] cuts open [user.p_their()] [affecting] and begins writing in [user.p_their()] own blood!", "You slice open your [affecting] and begin drawing a sigil of [SSticker.cultdat.entity_title3].") user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE , affecting) if(!do_after(user, initial(rune_to_scribe.scribe_delay)-scribereduct, target = get_turf(user))) for(var/V in shields) @@ -306,7 +308,7 @@ to_chat(user, "There is already a rune here.") return user.visible_message("[user] creates a strange circle in [user.p_their()] own blood.", \ - "You finish drawing the arcane markings of [ticker.cultdat.entity_title3].") + "You finish drawing the arcane markings of [SSticker.cultdat.entity_title3].") for(var/V in shields) var/obj/machinery/shield/S = V if(S && !QDELETED(S)) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 1ed5e812989..ad073b4bf54 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -197,7 +197,7 @@ structure_check() searches for nearby cultist structures required for the invoca ..() for(var/M in invokers) var/mob/living/L = M - to_chat(L, "You feel your life force draining. [ticker.cultdat.entity_title3] is displeased.") + to_chat(L, "You feel your life force draining. [SSticker.cultdat.entity_title3] is displeased.") qdel(src) /mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes @@ -372,12 +372,12 @@ var/list/teleport_runes = list() new_cultist.visible_message("[new_cultist] writhes in pain as the markings below them glow a bloody red!", \ "AAAAAAAAAAAAAA-") - ticker.mode.add_cultist(new_cultist.mind, 1) + SSticker.mode.add_cultist(new_cultist.mind, 1) new /obj/item/tome(get_turf(src)) new_cultist.mind.special_role = "Cultist" to_chat(new_cultist, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \ and something evil takes root.") - to_chat(new_cultist, "Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve [ticker.cultdat.entity_title3] above all else. Bring it back.\ + to_chat(new_cultist, "Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve [SSticker.cultdat.entity_title3] above all else. Bring it back.\ ") //Rite of Tribute: Sacrifices a crew member to Nar-Sie. Places them into a soul shard if they're in their body. @@ -391,7 +391,7 @@ var/list/teleport_runes = list() /obj/effect/rune/sacrifice/New() ..() - cultist_desc = "sacrifices a crew member to [ticker.cultdat.entity_title3]. May place them into a soul shard if their spirit remains in their body." + cultist_desc = "sacrifices a crew member to [SSticker.cultdat.entity_title3]. May place them into a soul shard if their spirit remains in their body." /obj/effect/rune/sacrifice/invoke(var/list/invokers) if(rune_in_use) @@ -432,7 +432,7 @@ var/list/teleport_runes = list() /obj/effect/rune/sacrifice/proc/sac(var/list/invokers, mob/living/T) var/sacrifice_fulfilled - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode if(T) if(istype(T, /mob/living/simple_animal/pet/corgi)) for(var/M in invokers) @@ -445,7 +445,7 @@ var/list/teleport_runes = list() if(is_sacrifice_target(T.mind)) sacrifice_fulfilled = 1 new /obj/effect/temp_visual/cult/sac(loc) - if(ticker && ticker.mode && ticker.mode.name == "cult") + if(SSticker && SSticker.mode && SSticker.mode.name == "cult") cult_mode.harvested++ for(var/M in invokers) @@ -494,9 +494,8 @@ var/list/teleport_runes = list() /obj/effect/rune/narsie/New() ..() - cultist_name = "Summon [ticker.cultdat.entity_name]" - cultist_desc = "tears apart dimensional barriers, calling forth [ticker.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 @@ -508,7 +507,7 @@ var/list/teleport_runes = list() if(used) return var/mob/living/user = invokers[1] - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode if(!(CULT_ELDERGOD in cult_mode.objectives)) message_admins("[key_name_admin(user)] tried to summonn an eldritch horror when the objective was wrong") burn_invokers(invokers) @@ -521,7 +520,7 @@ var/list/teleport_runes = list() return if(!cult_mode.eldergod) for(var/M in invokers) - to_chat(M, "[ticker.cultdat.entity_name] is already on this plane!") + to_chat(M, "[SSticker.cultdat.entity_name] is already on this plane!") log_game("Summon god rune failed - already summoned") return //BEGIN THE SUMMONING @@ -594,7 +593,7 @@ var/list/teleport_runes = list() if(used) return var/mob/living/user = invokers[1] - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode if(!(CULT_SLAUGHTER in cult_mode.objectives)) message_admins("[key_name_admin(user)] tried to summon demons when the objective was wrong") burn_invokers(invokers) @@ -856,10 +855,10 @@ var/list/teleport_runes = list() /obj/effect/rune/summon/invoke(var/list/invokers) var/mob/living/user = invokers[1] var/list/cultists = list() - for(var/datum/mind/M in ticker.mode.cult) + for(var/datum/mind/M in SSticker.mode.cult) if(!(M.current in invokers) && M.current && M.current.stat != DEAD) cultists |= M.current - var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of [ticker.cultdat.entity_title3]") as null|anything in cultists + var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of [SSticker.cultdat.entity_title3]") as null|anything in cultists if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated()) return if(!cultist_to_summon) @@ -868,7 +867,7 @@ var/list/teleport_runes = list() log_game("Summon Cultist rune failed - no target") return if(!iscultist(cultist_to_summon)) - to_chat(user, "[cultist_to_summon] is not a follower of [ticker.cultdat.entity_title3]!") + to_chat(user, "[cultist_to_summon] is not a follower of [SSticker.cultdat.entity_title3]!") fail_invoke() log_game("Summon Cultist rune failed - no target") return @@ -977,7 +976,7 @@ var/list/teleport_runes = list() /obj/effect/rune/manifest/New(loc) ..() - cultist_desc = "manifests a spirit as a servant of [ticker.cultdat.entity_title3]. The invoker must not move from atop the rune, and will take damage for each summoned spirit." + cultist_desc = "manifests a spirit as a servant of [SSticker.cultdat.entity_title3]. The invoker must not move from atop the rune, and will take damage for each summoned spirit." notify_ghosts("Manifest rune created in [get_area(src)].", ghost_sound='sound/effects/ghost2.ogg', source = src) @@ -1033,10 +1032,10 @@ var/list/teleport_runes = list() N.health = 20 N.mouse_opacity = MOUSE_OPACITY_TRANSPARENT new_human.key = ghost_to_spawn.key - ticker.mode.add_cultist(new_human.mind, 0) + SSticker.mode.add_cultist(new_human.mind, 0) summoned_guys |= new_human ghosts++ - to_chat(new_human, "You are a servant of [ticker.cultdat.entity_title3]. You have been made semi-corporeal by the cult of [ticker.cultdat.entity_name], and you are to serve them at all costs.") + to_chat(new_human, "You are a servant of [SSticker.cultdat.entity_title3]. You have been made semi-corporeal by the cult of [SSticker.cultdat.entity_name], and you are to serve them at all costs.") while(user in get_turf(src)) if(user.stat) diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 875e8a3d1e9..08633ef92f4 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -1,4 +1,5 @@ /obj/item/paper/talisman + icon = 'icons/obj/paper.dmi' icon_state = "paper_talisman" var/cultist_name = "talisman" var/cultist_desc = "A basic talisman. It serves no purpose." @@ -7,6 +8,9 @@ var/uses = 1 var/health_cost = 0 //The amount of health taken from the user when invoking the talisman +/obj/item/paper/talisman/update_icon()//overriding this so the update_icon doesn't turn them into normal looking paper + SEND_SIGNAL(src, COMSIG_OBJ_UPDATE_ICON) + /obj/item/paper/talisman/examine(mob/user) if(iscultist(user) || user.stat == DEAD) to_chat(user, "Name: [cultist_name]") @@ -41,7 +45,7 @@ invocation = "Ra'sha yoka!" /obj/item/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1) - to_chat(user, "You feel a pain in your head. [ticker.cultdat.entity_title3] is displeased.") + to_chat(user, "You feel a pain in your head. [SSticker.cultdat.entity_title3] is displeased.") if(iscarbon(user)) var/mob/living/carbon/C = user C.apply_damage(10, BRUTE, "head") @@ -49,6 +53,7 @@ //Supply Talisman: Has a few unique effects. Granted only to starter cultists. /obj/item/paper/talisman/supply cultist_name = "Supply Talisman" + icon_state = "supply" cultist_desc = "A multi-use talisman that can create various objects. Intended to increase the cult's strength early on." invocation = null uses = 3 @@ -117,6 +122,7 @@ //Rite of Translocation: Same as rune /obj/item/paper/talisman/teleport cultist_name = "Talisman of Teleportation" + icon_state = "teleport" cultist_desc = "A single-use talisman that will teleport a user to a random rune of the same keyword." invocation = "Sas'so c'arta forbici!" health_cost = 5 @@ -159,6 +165,7 @@ /obj/item/paper/talisman/summon_tome cultist_name = "Talisman of Tome Summoning" + icon_state = "tome" cultist_desc = "A one-use talisman that will call an untranslated tome from the archives of a cult." invocation = "N'ath reth sh'yro eth d'raggathnor!" health_cost = 1 @@ -173,6 +180,7 @@ /obj/item/paper/talisman/true_sight cultist_name = "Talisman of Veiling" + icon_state = "veil" cultist_desc = "A multi-use talisman that hides nearby runes. On its second use, will reveal nearby runes." invocation = "Kla'atu barada nikt'o!" health_cost = 1 @@ -197,6 +205,7 @@ //Rite of False Truths: Same as rune /obj/item/paper/talisman/make_runes_fake cultist_name = "Talisman of Disguising" + icon_state = "disguising" cultist_desc = "A talisman that will make nearby runes appear fake." invocation = "By'o nar'nar!" @@ -212,6 +221,7 @@ //Rite of Disruption: Weaker than rune /obj/item/paper/talisman/emp cultist_name = "Talisman of Electromagnetic Pulse" + icon_state = "emp" cultist_desc = "A talisman that will cause a moderately-sized electromagnetic pulse." invocation = "Ta'gh fara'qha fel d'amar det!" health_cost = 5 @@ -226,6 +236,7 @@ //Rite of Disorientation: Stuns and inhibit speech on a single target for quite some time /obj/item/paper/talisman/stun cultist_name = "Talisman of Stunning" + icon_state = "stunning" cultist_desc = "A talisman that will stun and inhibit speech on a single target. To use, attack target directly." invocation = "Dream sign:Evil sealing talisman!" health_cost = 10 @@ -271,6 +282,7 @@ //Rite of Arming: Equips cultist armor on the user, where available /obj/item/paper/talisman/armor cultist_name = "Talisman of Arming" + icon_state = "arming" cultist_desc = "A talisman that will equip the invoker with cultist equipment if there is a slot to equip it to." invocation = "N'ath reth sh'yro eth draggathnor!" @@ -301,6 +313,7 @@ //Talisman of Horrors: Breaks the mind of the victim with nightmarish hallucinations /obj/item/paper/talisman/horror cultist_name = "Talisman of Horrors" + icon_state = "horror" cultist_desc = "A talisman that will break the mind of the victim with nightmarish hallucinations." invocation = "Lo'Nab Na'Dm!" @@ -316,6 +329,7 @@ //Talisman of Fabrication: Creates a construct shell out of 25 metal sheets. /obj/item/paper/talisman/construction cultist_name = "Talisman of Construction" + icon_state = "construction" cultist_desc = "Use this talisman on at least twenty-five metal sheets to create an empty construct shell or on plasteel to make runed metal" invocation = "Ethra p'ni dedol!" uses = 25 @@ -360,6 +374,7 @@ //Talisman of Shackling: Applies special cuffs directly from the talisman /obj/item/paper/talisman/shackle cultist_name = "Talisman of Shackling" + icon_state = "shackling" cultist_desc = "Use this talisman on a victim to handcuff them with dark bindings." invocation = "In'totum Lig'abis!" uses = 4 diff --git a/code/game/gamemodes/devil/devilinfo.dm b/code/game/gamemodes/devil/devilinfo.dm index e11d31f7d98..419034a9e1f 100644 --- a/code/game/gamemodes/devil/devilinfo.dm +++ b/code/game/gamemodes/devil/devilinfo.dm @@ -300,9 +300,9 @@ var/global/list/lawlorify = list ( to_chat(world, "SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!") world << 'sound/hallucinations/veryfar_noise.ogg' sleep(50) - if(!ticker.mode.devil_ascended) + if(!SSticker.mode.devil_ascended) SSshuttle.emergency.request(null, 0.3) - ticker.mode.devil_ascended++ + SSticker.mode.devil_ascended++ /datum/devilinfo/proc/increase_arch_devil() if(!ascendable) diff --git a/code/game/gamemodes/devil/imp/imp.dm b/code/game/gamemodes/devil/imp/imp.dm index b012edc1930..e863eaf1f6a 100644 --- a/code/game/gamemodes/devil/imp/imp.dm +++ b/code/game/gamemodes/devil/imp/imp.dm @@ -29,7 +29,7 @@ melee_damage_lower = 10 melee_damage_upper = 15 see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE var/boost var/playstyle_string = "You are an imp, a mischevious creature from hell. You are the lowest rank on the hellish totem pole \ Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \ diff --git a/code/game/gamemodes/devil/objectives.dm b/code/game/gamemodes/devil/objectives.dm index 5214ab336ec..04d0217b599 100644 --- a/code/game/gamemodes/devil/objectives.dm +++ b/code/game/gamemodes/devil/objectives.dm @@ -68,7 +68,7 @@ explanation_text = "Ensure at least [target_amount] mortals are sintouched." /datum/objective/devil/sintouch/check_completion() - return target_amount <= ticker.mode.sintouched.len + return target_amount <= SSticker.mode.sintouched.len diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm index 18058b42279..a6c04c5dcc0 100644 --- a/code/game/gamemodes/devil/true_devil/_true_devil.dm +++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm @@ -30,22 +30,6 @@ E.insert() ..() - -/mob/living/carbon/true_devil/update_sight() - if(stat == DEAD) - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - else - sight = (SEE_TURFS | SEE_OBJS) - see_in_dark = 2 - see_invisible = SEE_INVISIBLE_LIVING - - if(see_override) - see_invisible = see_override - // inventory system could use some love /mob/living/carbon/true_devil/put_in_hands(obj/item/W) if(!W) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 891e377b5e1..aa366415f31 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -27,7 +27,6 @@ var/recommended_enemies = 0 var/newscaster_announcements = null var/ert_disabled = 0 - var/free_golems_disabled = FALSE var/uplink_welcome = "Syndicate Uplink Console:" var/uplink_uses = 20 @@ -75,20 +74,19 @@ display_roundstart_logout_report() feedback_set_details("round_start","[time2text(world.realtime)]") - if(ticker && ticker.mode) - feedback_set_details("game_mode","[ticker.mode]") + if(SSticker && SSticker.mode) + feedback_set_details("game_mode","[SSticker.mode]") // if(revdata) // feedback_set_details("revision","[revdata.revision]") feedback_set_details("server_ip","[world.internet_address]:[world.port]") generate_station_goals() - check_free_golems() start_state = new /datum/station_state() start_state.count() return 1 ///process() ///Called by the gameticker -/datum/game_mode/proc/process() +/datum/game_mode/process() return 0 //Called by the gameticker @@ -228,7 +226,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 @@ -246,7 +244,7 @@ // If we don't have enough antags, draft people who voted for the round. if(candidates.len < recommended_enemies) - for(var/key in round_voters) + for(var/key in SSvote.round_voters) for(var/mob/new_player/player in players) if(player.ckey == key) player_draft_log += "[player.key] voted for this round, so we are drafting them." @@ -357,7 +355,7 @@ proc/display_roundstart_logout_report() if(L.stat) if(L.suiciding) //Suicider msg += "[L.name] ([L.ckey]), the [L.job] (Suicide)\n" - job_master.FreeRole(L.job) + SSjobs.FreeRole(L.job) message_admins("[key_name_admin(L)], the [L.job] has been freed due to (Early Round Suicide)\n") continue //Disconnected client if(L.stat == UNCONSCIOUS) @@ -383,7 +381,7 @@ proc/display_roundstart_logout_report() continue //Lolwhat else msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Ghosted)\n" - job_master.FreeRole(L.job) + SSjobs.FreeRole(L.job) message_admins("[key_name_admin(L)], the [L.job] has been freed due to (Early Round Ghosted While Alive)\n") continue //Ghosted while alive @@ -513,12 +511,6 @@ proc/display_roundstart_logout_report() var/datum/station_goal/G = V G.print_result() -/datum/game_mode/proc/check_free_golems() //check config and gamemode for free golems setting and run the prob to check if the round will have free golems spawned or not - if((config.unrestricted_free_golems || !free_golems_disabled) && prob(config.prob_free_golems)) - for(var/obj/effect/landmark/free_golem_spawn/L in GLOB.landmarks_list) - if(isturf(L.loc)) - new /obj/effect/mob_spawn/human/golem/adamantine(L.loc) - /datum/game_mode/proc/update_eventmisc_icons_added(datum/mind/mob_mind) var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_EVENTMISC] antaghud.join_hud(mob_mind.current) diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index e8a3ff6c981..2b4d095b327 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -312,5 +312,5 @@ datum/game_mode/proc/auto_declare_completion_heist() message_admins("[key_name_admin(user)] has pressed the vox win button.") log_admin("[key_name(user)] pressed the vox win button during a vox round.") - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode H.win_button_triggered = 1 diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm index 5e8be8b1229..d1d176f797e 100644 --- a/code/game/gamemodes/intercept_report.dm +++ b/code/game/gamemodes/intercept_report.dm @@ -113,10 +113,10 @@ if(man.client && man.client.prefs.nanotrasen_relation == "Opposed") //don't include suspects who can't possibly be the antag based on their job (no suspecting the captain of being a damned dirty tator) if(man.mind && man.mind.assigned_role) - if((man.mind.assigned_role in ticker.mode.protected_jobs) || (man.mind.assigned_role in ticker.mode.restricted_jobs)) + if((man.mind.assigned_role in SSticker.mode.protected_jobs) || (man.mind.assigned_role in SSticker.mode.restricted_jobs)) return //don't include suspects who can't possibly be the antag based on their species (no suspecting the machines of being sneaky changelings) - if(man.dna.species.name in ticker.mode.protected_species) + if(man.dna.species.name in SSticker.mode.protected_species) return dudes += man for(var/i = 0, i < max(GLOB.player_list.len/10,2), i++) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 830ae26f3c1..8eeee9e4f2a 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -56,7 +56,7 @@ var/announced = 0 /obj/machinery/doomsday_device/Destroy() - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) SSshuttle.emergencyNoEscape = 0 if(SSshuttle.emergency.mode == SHUTTLE_STRANDED) SSshuttle.emergency.mode = SHUTTLE_DOCKED @@ -67,7 +67,7 @@ /obj/machinery/doomsday_device/proc/start() detonation_timer = world.time + default_timer timing = 1 - GLOB.fast_processing += src + START_PROCESSING(SSfastprocess, src) SSshuttle.emergencyNoEscape = 1 /obj/machinery/doomsday_device/proc/seconds_remaining() @@ -84,7 +84,7 @@ priority_announcement.Announce("Hostile environment resolved. You have 3 minutes to board the Emergency Shuttle.", "Priority Announcement", 'sound/AI/shuttledock.ogg') qdel(src) if(!timing) - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) return var/sec_left = seconds_remaining() if(sec_left <= 0) @@ -111,7 +111,7 @@ to_chat(L, "The blast wave from [src] tears you atom from atom!") L.dust() to_chat(world, "The AI cleansed the station of life with the doomsday device!") - ticker.force_ending = 1 + SSticker.force_ending = 1 /datum/AI_Module/large/upgrade_turrets @@ -496,22 +496,22 @@ return var/upgradedcams = 0 - see_override = SEE_INVISIBLE_MINIMUM //Night-vision, without which X-ray would be very limited in power. + RegisterSignal(src, COMSIG_MOB_UPDATE_SIGHT, .proc/update_upgraded_cameras_sight) //Makes sure the AI has night vision, without which X-ray would be very limited in power. update_sight() for(var/obj/machinery/camera/C in cameranet.cameras) if(C.assembly) - var/upgraded = 0 + var/upgraded = FALSE if(!C.isXRay()) C.upgradeXRay() //Update what it can see. cameranet.updateVisibility(C, 0) - upgraded = 1 + upgraded = TRUE if(!C.isEmpProof()) C.upgradeEmpProof() - upgraded = 1 + upgraded = TRUE if(upgraded) upgradedcams++ @@ -519,6 +519,8 @@ to_chat(src, "OTA firmware distribution complete! Cameras upgraded: [upgradedcams]. Light amplification system online.") verbs -= /mob/living/silicon/ai/proc/upgrade_cameras +/mob/living/silicon/ai/proc/update_upgraded_cameras_sight() + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE /datum/AI_Module/large/eavesdrop module_name = "Enhanced Surveillance" diff --git a/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm index 0d891edb3eb..5db63d3450d 100644 --- a/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm +++ b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm @@ -26,7 +26,7 @@ explanation_text = "Capture" /datum/objective/abductee/capture/New() - var/list/jobs = job_master.occupations.Copy() + var/list/jobs = SSjobs.occupations.Copy() for(var/datum/job/J in jobs) if(J.current_positions < 1) jobs -= J diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 587c2b3d476..aab75687df4 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -251,14 +251,14 @@ /datum/game_mode/proc/remove_abductor(datum/mind/abductor_mind) if(abductor_mind in abductors) - ticker.mode.abductors -= abductor_mind + SSticker.mode.abductors -= abductor_mind abductor_mind.special_role = null abductor_mind.current.create_attack_log("No longer abductor") if(issilicon(abductor_mind.current)) to_chat(abductor_mind.current, "You have been turned into a robot! You are no longer an abductor.") else to_chat(abductor_mind.current, "You have been brainwashed! You are no longer an abductor.") - ticker.mode.update_abductor_icons_removed(abductor_mind) + SSticker.mode.update_abductor_icons_removed(abductor_mind) /datum/game_mode/proc/update_abductor_icons_added(datum/mind/alien_mind) var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR] diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 92ac300cc00..f6bed7b539f 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -23,7 +23,6 @@ var/datum/icon_snapshot/disguise var/stealth_armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15) var/combat_armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 50, rad = 50) - species_fit = null sprite_sheets = null /obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop() @@ -110,15 +109,15 @@ M.SetStunned(0) M.SetWeakened(0) combat_cooldown = 0 - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/clothing/suit/armor/abductor/vest/process() combat_cooldown++ if(combat_cooldown==initial(combat_cooldown)) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/item/clothing/suit/armor/abductor/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) for(var/obj/machinery/abductor/console/C in GLOB.machines) if(C.vest == src) C.vest = null diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 8f058a872e6..2b0162829e1 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -320,69 +320,6 @@ for(var/mob/living/carbon/human/H in oview(3,owner)) //Blood decals for simple animals would be neat. aka Carp with blood on it. H.add_mob_blood(owner) -/obj/item/organ/internal/heart/gland/bodysnatch - cooldown_low = 600 - cooldown_high = 600 - human_only = 1 - uses = 1 - -/obj/item/organ/internal/heart/gland/bodysnatch/activate() - to_chat(owner, "You feel something moving around inside you...") - //spawn cocoon with clone greytide snpc inside - if(ishuman(owner)) - var/obj/effect/cocoon/abductor/C = new (get_turf(owner)) - C.Copy(owner) - C.Start() - owner.adjustBruteLoss(40) - owner.add_splatter_floor() - -/obj/effect/cocoon/abductor - name = "slimy cocoon" - desc = "Something is moving inside." - icon = 'icons/effects/effects.dmi' - icon_state = "cocoon_large3" - color = rgb(10,120,10) - density = 1 - var/hatch_time = 0 - -/obj/effect/cocoon/abductor/proc/Copy(mob/living/carbon/human/H) - var/mob/living/carbon/human/interactive/greytide/clone = new(src) - var/datum/dna/owner_dna = H.dna - clone.rename_character(clone.name, owner_dna.real_name) - clone.set_species(owner_dna.species.type) - clone.dna = owner_dna.Clone() - clone.body_accessory = H.body_accessory - domutcheck(clone) - - for(var/obj/item/I in clone) - if(istype(I, /obj/item/implant)) - continue - if(istype(I, /obj/item/organ)) - continue - qdel(I) - - //There's no define for this / get all items ? - var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\ - slot_wear_mask,slot_head,slot_shoes,slot_gloves,slot_l_ear,slot_r_ear,\ - slot_glasses,slot_belt,slot_s_store,slot_l_store,slot_r_store,slot_wear_id,slot_wear_pda) - - for(var/slot in slots) - var/obj/item/I = H.get_item_by_slot(slot) - if(I) - clone.equip_to_slot_or_del(new I.type(clone), slot) - -/obj/effect/cocoon/abductor/proc/Start() - hatch_time = world.time + 600 - processing_objects.Add(src) - -/obj/effect/cocoon/abductor/process() - if(world.time > hatch_time) - processing_objects.Remove(src) - for(var/mob/M in contents) - src.visible_message("[src] hatches!") - M.forceMove(get_turf(src)) - qdel(src) - /obj/item/organ/internal/heart/gland/plasma cooldown_low = 1200 diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 53969aaf7d1..db6f07c1d24 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -140,14 +140,14 @@ to_chat(H, "You can't remember how you got here...") var/objtype = pick(subtypesof(/datum/objective/abductee/)) var/datum/objective/abductee/O = new objtype() - ticker.mode.abductees += H.mind + SSticker.mode.abductees += H.mind H.mind.objectives += O var/obj_count = 1 to_chat(H, "Your current objectives:") for(var/datum/objective/objective in H.mind.objectives) to_chat(H, "Objective #[obj_count]: [objective.explanation_text]") obj_count++ - ticker.mode.update_abductor_icons_added(H.mind) + SSticker.mode.update_abductor_icons_added(H.mind) for(var/obj/item/organ/internal/heart/gland/G in H.internal_organs) G.Start() diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm index f7ff2864608..697d173716a 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm @@ -7,7 +7,8 @@ var/turf/teleport_target /obj/machinery/abductor/pad/proc/Warp(mob/living/target) - target.Move(src.loc) + if(!target.buckled) + target.forceMove(get_turf(src)) /obj/machinery/abductor/pad/proc/Send() if(teleport_target == null) diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 34d1f64f0d0..fa797ac929b 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -32,7 +32,7 @@ return FALSE return B.host.say_understands(other, speaking) -/mob/living/captive_brain/emote(var/message) +/mob/living/captive_brain/emote(act, m_type = 1, message = null, force) return /mob/living/captive_brain/resist() @@ -157,7 +157,7 @@ if(!istype(S.speaking, /datum/language/corticalborer) && loc == host && !talk_inside_host) to_chat(src, "You've disabled audible speech while inside a host! Re-enable it under the borer tab, or stick to borer communications.") return - + . = ..() /mob/living/simple_animal/borer/verb/Communicate() @@ -475,7 +475,7 @@ set category = "Borer" set name = "Dominate Victim" set desc = "Freeze the limbs of a potential host with supernatural fear." - + if(world.time - used_dominate < 150) to_chat(src, "You cannot use that ability again so soon.") return @@ -487,22 +487,22 @@ if(stat) to_chat(src, "You cannot do that in your current state.") return - + if(attempting_to_dominate) to_chat(src, "You're already targeting someone!") return - + var/list/choices = list() for(var/mob/living/carbon/C in view(3,src)) if(C.stat != DEAD) choices += C - + if(world.time - used_dominate < 300) to_chat(src, "You cannot use that ability again so soon.") return - + attempting_to_dominate = TRUE - + var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices if(!M) @@ -519,8 +519,8 @@ if(incapacitated()) attempting_to_dominate = FALSE - return - + return + if(get_dist(src, M) > 7) //to avoid people remotely doing from across the map etc, 7 is the default view range to_chat(src, "You're too far away!") attempting_to_dominate = FALSE @@ -760,10 +760,9 @@ to_chat(src, "Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.") visible_message("[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!") B.chemicals -= 100 - - new /obj/effect/decal/cleanable/vomit(get_turf(src)) - playsound(loc, 'sound/effects/splat.ogg', 50, 1) - new /mob/living/simple_animal/borer(get_turf(src),B.generation + 1) + var/turf/T = get_turf(src) + T.add_vomit_floor() + new /mob/living/simple_animal/borer(T, B.generation + 1) else to_chat(src, "You need 100 chemicals to reproduce!") diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 32abeaac947..fb3c10e25ec 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -1,5 +1,5 @@ ////Deactivated swarmer shell//// -/obj/item/unactivated_swarmer +/obj/item/deactivated_swarmer name = "unactivated swarmer" desc = "A currently unactivated swarmer. Swarmers can self activate at any time, it would be wise to immediately dispose of this." icon = 'icons/mob/swarmer.dmi' @@ -7,69 +7,49 @@ origin_tech = "bluespace=4;materials=4;programming=7" materials = list(MAT_METAL=100, MAT_GLASS=400) -/obj/item/unactivated_swarmer/New() - if(!crit_fail) - notify_ghosts("An unactivated swarmer has been created in [get_area(src)]!", enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK) - ..() +/obj/effect/mob_spawn/swarmer + name = "unactivated swarmer" + desc = "A currently unactivated swarmer. Swarmers can self activate at any time, it would be wise to immediately dispose of this." + icon = 'icons/mob/swarmer.dmi' + icon_state = "swarmer_unactivated" + density = FALSE + anchored = FALSE -/obj/item/unactivated_swarmer/Topic(href, href_list) - if(..()) - return 1 - if(href_list["ghostjoin"]) - var/mob/dead/observer/ghost = usr - if(istype(ghost)) - attack_ghost(ghost) + mob_type = /mob/living/simple_animal/hostile/swarmer + mob_name = "a swarmer" + death = FALSE + roundstart = FALSE + flavour_text = {" + You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate. + Clicking on any object will try to consume it, either deconstructing it into its components, destroying it, or integrating any materials it has into you if successful. + Ctrl-Clicking on a mob will attempt to remove it from the area and place it in a safe environment for storage. + Objectives: + 1. Consume resources and replicate until there are no more resources left. + 2. Ensure that this location is fit for invasion at a later date; do not perform actions that would render it dangerous or inhospitable. + 3. Biological resources will be harvested at a later date; do not harm them. + "} -/obj/item/unactivated_swarmer/attackby(obj/item/W, mob/user, params) - ..() - if(istype(W, /obj/item/screwdriver) && !crit_fail) +/obj/effect/mob_spawn/swarmer/Initialize(mapload) + . = ..() + var/area/A = get_area(src) + if(A) + notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) + +/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user) + . = ..() + if(.) + return + to_chat(user, "Picking up the swarmer may cause it to activate. You should be careful about this.") + +/obj/effect/mob_spawn/swarmer/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/screwdriver) && user.a_intent != INTENT_HARM) user.visible_message("[usr.name] deactivates [src].", "After some fiddling, you find a way to disable [src]'s power source.", "You hear clicking.") - name = "deactivated swarmer" - desc = "A shell of swarmer that was completely powered down. It can no longer activate itself." - crit_fail = 1 - -/obj/item/unactivated_swarmer/attack_ghost(mob/user as mob) - - if(crit_fail) - to_chat(user, "This swarmer shell is completely depowered. You cannot activate it.") - return - - if(jobban_isbanned(user, "Syndicate")) - to_chat(user, "You are banned from antagonists!") - return - - if(cannotPossess(user)) - to_chat(user, "Upon using the antagHUD you forfeited the ability to join the round.") - return - - var/be_swarmer = alert("Become a swarmer? (Warning, You can no longer be cloned!)",,"Yes","No") - if(be_swarmer == "No") - return - - if(crit_fail)//in case it depowers while ghost is looking at yes/no - to_chat(user, "This swarmer shell is completely depowered. You cannot activate it.") - return - - if(QDELETED(src)) - to_chat(user, "Swarmer has been occupied by someone else.") - return - var/mob/living/simple_animal/hostile/swarmer/S = new /mob/living/simple_animal/hostile/swarmer(get_turf(loc)) - S.key = user.key - qdel(src) - -/obj/item/unactivated_swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(S.resources + 50 > S.max_resources) - to_chat(S, "We have too many resources to reconsume this shell. Aborting.") + new /obj/item/deactivated_swarmer(get_turf(src)) + qdel(src) else - ..() - S.resources += 49 //refund the whole thing - -/obj/item/unactivated_swarmer/deactivated - name = "deactivated swarmer" - desc = "A shell of swarmer that was completely powered down. It no longer can activate itself." - crit_fail = 1 + return ..() ////The Mob itself//// @@ -101,10 +81,12 @@ attack_sound = 'sound/effects/empulse.ogg' friendly = "pinches" speed = 0 + a_intent = INTENT_HARM + can_change_intents = 0 faction = list("swarmer") projectiletype = /obj/item/projectile/beam/disabler pass_flags = PASSTABLE - mob_size = MOB_SIZE_TINY + mob_size = MOB_SIZE_SMALL ventcrawler = 2 ranged = 1 light_color = LIGHT_COLOR_CYAN @@ -193,136 +175,188 @@ /atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisIntegrate(src) + return TRUE /obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.Integrate(src) + return FALSE + +/atom/movable/swarmer_act() + if(!simulated) + return FALSE + return ..() + +/obj/effect/swarmer_act() + return FALSE + +/obj/effect/decal/cleanable/robot_debris/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S.DisIntegrate(src) + qdel(src) + return TRUE /obj/item/gun/swarmer_act()//Stops you from eating the entire armory - return + return FALSE /turf/simulated/floor/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor - return + return FALSE /obj/machinery/atmospherics/swarmer_act() - return + return FALSE /obj/structure/disposalpipe/swarmer_act() - return + return FALSE /obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DismantleMachine(src) + return TRUE /obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisIntegrate(src) + return TRUE /obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisIntegrate(src) + return TRUE /obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisIntegrate(src) toggle_cam(S, 0) + return TRUE /obj/structure/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + return FALSE /obj/machinery/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) // Since the console is still parented to this to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + return FALSE /obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) if(!active) S.DisIntegrate(src) - return + return TRUE to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.") + return FALSE /obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisIntegrate(src) + return TRUE /obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//It's more visually interesting than dismantling the machine S.DisIntegrate(src) + return TRUE /obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisIntegrate(src) + return TRUE /obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "The volatile chemicals in this machine would destroy us. Aborting.") + return FALSE /obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This device's destruction would result in the extermination of everything in the area. Aborting.") + return FALSE /obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Searching... sensor malfunction! Target lost. Aborting.") + return FALSE /obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Destroying this object would cause a chain reaction. Aborting.") + return FALSE /obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + return FALSE /obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.") + return FALSE /obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.") + return FALSE /obj/machinery/message_server/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.") + return FALSE /obj/machinery/blackbox_recorder/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This machine has recorded large amounts of data on this structure and its inhabitants, it will be a useful resource to our masters in the future. Aborting. ") + return FALSE /obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + return FALSE /obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This bluespace source will be important to us later. Aborting.") + return FALSE /obj/machinery/cryopod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This cryogenic sleeper should be preserved, it will be a useful resource to our masters in the future. Aborting.") + return FALSE /obj/structure/cryofeed/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This cryogenic feed should be preserved, it will be a useful resource to our masters in the future. Aborting.") + return FALSE /obj/machinery/computer/cryopod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This cryopod control computer should be preserved, it contains useful items and information about the inhabitants. Aborting.") + return FALSE /turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) for(var/turf/T in range(1, src)) if(istype(T, /turf/space) || istype(T.loc, /area/space) || istype(T, /turf/simulated/floor/plating/airless)) to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - return - ..() + return FALSE + return ..() /obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) for(var/turf/T in range(1, src)) if(istype(T, /turf/space) || istype(T.loc, /area/space)) to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - return - ..() + return FALSE + return ..() /obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource to_chat(S, "This object does not contain enough materials to work with.") + return FALSE /obj/item/circuitboard/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This object does not contain enough materials to work with.") + return FALSE /obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Attempting to dismantle this machine would result in an immediate counterattack. Aborting.") + return FALSE /obj/spacepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Destroying this vehicle would destroy us. Aborting.") + return FALSE /obj/machinery/clonepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) if(occupant) to_chat(S, "Destroying this machine while it is occupied would result in biological and sentient resources to be harmed. Aborting.") - return - ..() + return FALSE + return ..() /mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisperseTarget(src) + return TRUE /mob/living/carbon/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This biological resource is somehow resisting our bluespace transceiver. Aborting.") + return FALSE +/obj/structure/lattice/catwalk/swarmer_catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "We have created these for our own benefit. Aborting.") + return FALSE + +/obj/structure/shuttle/engine/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "This shuttle may be important to us later. Aborting.") + return FALSE ////END CTRL CLICK FOR SWARMERS//// @@ -391,6 +425,11 @@ break return +/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE) + if(!tesla_shock) + return FALSE + return ..() + /mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target) do_attack_animation(target) to_chat(src, "We begin to dismantle this machine. We will need to be uninterrupted.") @@ -506,12 +545,12 @@ 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)) playsound(loc,'sound/effects/snap.ogg',50, 1, -1) - L.electrocute_act(0, src, 1, 1) + L.electrocute_act(0, src, 1, TRUE, TRUE) if(isrobot(L) || L.isSynthetic()) L.Weaken(5) qdel(src) @@ -567,9 +606,13 @@ to_chat(src, "This is not a suitable location for replicating ourselves. We need more room.") return if(do_mob(src, src, 100)) - if(Fabricate(/obj/item/unactivated_swarmer, 50)) + var/createtype = SwarmerTypeToCreate() + if(createtype && Fabricate(createtype, 50)) playsound(loc,'sound/items/poster_being_created.ogg',50, 1, -1) +/mob/living/simple_animal/hostile/swarmer/proc/SwarmerTypeToCreate() + return /obj/effect/mob_spawn/swarmer + /mob/living/simple_animal/hostile/swarmer/proc/RepairSelf() set name = "Self Repair" set category = "Swarmer" diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm index d611092bb2b..0d5ba13d682 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm @@ -15,7 +15,7 @@ return 0 if(!the_gateway) return 0 - new /obj/item/unactivated_swarmer(get_turf(the_gateway)) + new /obj/effect/mob_spawn/swarmer(get_turf(the_gateway)) /datum/event/spawn_swarmer/proc/find_swarmer() diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index d344074a331..2b6040ed8b6 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -12,6 +12,7 @@ icon_dead = "magicOrange" speed = 0 a_intent = INTENT_HARM + can_change_intents = 0 stop_automated_movement = 1 floating = 1 attack_sound = 'sound/weapons/punch1.ogg' @@ -60,9 +61,9 @@ /mob/living/simple_animal/hostile/guardian/Life(seconds, times_fired) //Dies if the summoner dies ..() if(summoner) - if(summoner.stat == DEAD) + if(summoner.stat == DEAD || (!summoner.check_death_method() && summoner.health <= HEALTH_THRESHOLD_DEAD)) to_chat(src, "Your summoner has died!") - visible_message("The [src] dies along with its user!") + visible_message("[src] dies along with its user!") ghostize() qdel(src) snapback() @@ -85,6 +86,18 @@ forceMove(summoner.loc) //move to summoner's tile, don't recall new /obj/effect/temp_visual/guardian/phase(loc) +/mob/living/simple_animal/hostile/guardian/proc/is_deployed() + return loc != summoner + +/mob/living/simple_animal/hostile/guardian/AttackingTarget() + if(!is_deployed() && a_intent == INTENT_HARM) + to_chat(src, "You must be manifested to attack!") + return FALSE + else if(!is_deployed() && a_intent == INTENT_HELP) + return FALSE + else + return ..() + /mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range ..() snapback() @@ -102,7 +115,7 @@ if(summoner) var/resulthealth if(iscarbon(summoner)) - resulthealth = round((abs(config.health_threshold_dead - summoner.health) / abs(config.health_threshold_dead - summoner.maxHealth)) * 100) + resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.maxHealth)) * 100) else resulthealth = round((summoner.health / summoner.maxHealth) * 100) if(hud_used) @@ -149,11 +162,12 @@ if(!summoner) return if(loc == summoner) forceMove(get_turf(summoner)) + new /obj/effect/temp_visual/guardian/phase(loc) src.client.eye = loc cooldown = world.time + 30 /mob/living/simple_animal/hostile/guardian/proc/Recall(forced = FALSE) - if(cooldown > world.time && !forced) + if(!summoner || loc == summoner || (cooldown > world.time && !forced)) return if(!summoner) return new /obj/effect/temp_visual/guardian/phase/out(get_turf(src)) diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm index 2908888839a..fbe4458693f 100644 --- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm +++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm @@ -8,6 +8,13 @@ tech_fluff_string = "Boot sequence complete. Explosive modules active. Holoparasite swarm online." bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of stealthily booby trapping items." var/bomb_cooldown = 0 + var/default_bomb_cooldown = 20 SECONDS + +/mob/living/simple_animal/hostile/guardian/bomb/Stat() + ..() + if(statpanel("Status")) + if(bomb_cooldown >= world.time) + stat(null, "Bomb Cooldown Remaining: [max(round((bomb_cooldown - world.time)*0.1, 0.1), 0)] seconds") /mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A) if(!istype(A)) @@ -21,11 +28,11 @@ to_chat(src, "Success! Bomb on [A] armed!") if(summoner) to_chat(summoner, "Your guardian has primed [A] to explode!") - bomb_cooldown = world.time + 200 + bomb_cooldown = world.time + default_bomb_cooldown B.spawner = src B.disguise (A) else - to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.") + to_chat(src, "Your power is on cooldown! You must wait another [max(round((bomb_cooldown - world.time)*0.1, 0.1), 0)] seconds before you can place next bomb.") /obj/item/guardian_bomb name = "bomb" diff --git a/code/game/gamemodes/miniantags/guardian/types/fire.dm b/code/game/gamemodes/miniantags/guardian/types/fire.dm index f10a94793b5..0c5052f48bd 100644 --- a/code/game/gamemodes/miniantags/guardian/types/fire.dm +++ b/code/game/gamemodes/miniantags/guardian/types/fire.dm @@ -1,5 +1,4 @@ /mob/living/simple_animal/hostile/guardian/fire - a_intent = INTENT_HELP melee_damage_lower = 10 melee_damage_upper = 10 attack_sound = 'sound/items/welder.ogg' @@ -43,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/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm index 6c784e1ee0a..d9be543f7e2 100644 --- a/code/game/gamemodes/miniantags/guardian/types/healer.dm +++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm @@ -1,5 +1,4 @@ /mob/living/simple_animal/hostile/guardian/healer - a_intent = INTENT_HARM friendly = "heals" speed = 0 melee_damage_lower = 15 @@ -10,6 +9,7 @@ bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of mending wounds and travelling via bluespace." var/turf/simulated/floor/beacon var/beacon_cooldown = 0 + var/default_beacon_cooldown = 300 SECONDS var/toggle = FALSE var/heal_cooldown = 0 @@ -21,7 +21,6 @@ icon_state = "seal" attacktext = "slaps" speak_emote = list("barks") - a_intent = INTENT_HARM friendly = "heals" speed = 0 melee_damage_lower = 0 @@ -37,6 +36,12 @@ var/datum/atom_hud/medsensor = huds[DATA_HUD_MEDICAL_ADVANCED] medsensor.add_hud_to(src) +/mob/living/simple_animal/hostile/guardian/healer/Stat() + ..() + if(statpanel("Status")) + if(beacon_cooldown >= world.time) + stat(null, "Bluespace Beacon Cooldown Remaining: [max(round((beacon_cooldown - world.time)*0.1, 0.1), 0)] seconds") + /mob/living/simple_animal/hostile/guardian/healer/AttackingTarget() ..() if(toggle == TRUE) @@ -60,6 +65,7 @@ if(loc == summoner) if(toggle) a_intent = INTENT_HARM + hud_used.action_intent.icon_state = a_intent; speed = 0 damage_transfer = 0.7 if(adminseal) @@ -70,6 +76,7 @@ toggle = FALSE else a_intent = INTENT_HELP + hud_used.action_intent.icon_state = a_intent; speed = 1 damage_transfer = 1 if(adminseal) @@ -81,9 +88,8 @@ else to_chat(src, "You have to be recalled to toggle modes!") - /mob/living/simple_animal/hostile/guardian/healer/verb/Beacon() - set name = "Place Bluespsace Beacon" + set name = "Place Bluespace Beacon" set category = "Guardian" set desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon will not work in unfavorable atmospheric conditions." if(beacon_cooldown < world.time) @@ -98,10 +104,10 @@ if(beacon) beacon.ChangeTurf(/turf/simulated/floor/plating) beacon = F - beacon_cooldown = world.time+3000 + beacon_cooldown = world.time + default_beacon_cooldown else - to_chat(src, "Your power is on cooldown. You must wait five minutes between placing beacons.") + to_chat(src, "Your power is on cooldown! You must wait another [max(round((beacon_cooldown - world.time)*0.1, 0.1), 0)] seconds before you can place another beacon.") /mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A) if(!istype(A)) diff --git a/code/game/gamemodes/miniantags/guardian/types/lightning.dm b/code/game/gamemodes/miniantags/guardian/types/lightning.dm index 3aaeebbc513..88d5a43143d 100644 --- a/code/game/gamemodes/miniantags/guardian/types/lightning.dm +++ b/code/game/gamemodes/miniantags/guardian/types/lightning.dm @@ -99,7 +99,6 @@ if(istype(G) && G.summoner == summoner) continue if(successfulshocks > 4) - //L.electrocute_act(30, src) //shocks for 30 burn damage L.visible_message( "[L] was shocked by the lightning chain!", \ "You are shocked by the lightning chain!", \ diff --git a/code/game/gamemodes/miniantags/guardian/types/ranged.dm b/code/game/gamemodes/miniantags/guardian/types/ranged.dm index 695782728fa..fe8a566ad52 100644 --- a/code/game/gamemodes/miniantags/guardian/types/ranged.dm +++ b/code/game/gamemodes/miniantags/guardian/types/ranged.dm @@ -6,7 +6,6 @@ armour_penetration = 100 /mob/living/simple_animal/hostile/guardian/ranged - a_intent = INTENT_HELP friendly = "quietly assesses" melee_damage_lower = 10 melee_damage_upper = 10 @@ -17,7 +16,7 @@ ranged = 1 rapid = 1 range = 13 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE see_in_dark = 8 playstyle_string = "As a Ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit." magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat." @@ -54,12 +53,24 @@ to_chat(src, "You have to be recalled to toggle modes!") /mob/living/simple_animal/hostile/guardian/ranged/ToggleLight() - if(see_invisible == SEE_INVISIBLE_MINIMUM) - to_chat(src, "You deactivate your night vision.") - see_invisible = SEE_INVISIBLE_LIVING - else - to_chat(src, "You activate your night vision.") - see_invisible = SEE_INVISIBLE_MINIMUM + var/msg + switch(lighting_alpha) + if (LIGHTING_PLANE_ALPHA_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + msg = "You activate your night vision." + if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + msg = "You increase your night vision." + if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + msg = "You maximize your night vision." + else + lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + msg = "You deactivate your night vision." + + update_sight() + + to_chat(src, "[msg]") /mob/living/simple_animal/hostile/guardian/ranged/verb/Snare() set name = "Set Surveillance Trap" @@ -92,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/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 94c39d12442..81e052a85d8 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -27,7 +27,7 @@ melee_damage_lower = 20 melee_damage_upper = 20 see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE idle_vision_range = 1 // Only attack when target is close wander = 0 attacktext = "glomps" @@ -38,13 +38,23 @@ var/atom/movable/form = null var/morph_time = 0 - var/playstyle_string = "You are a morph, an abomination of science created primarily with changeling cells. \ - You may take the form of anything nearby by shift-clicking it. This process will alert any nearby \ - observers, and can only be performed once every five seconds. While morphed, you move faster, but do \ + var/playstyle_string = "You are a morph.
As an abomination created primarily with changeling cells, \ + you may take the form of anything nearby by shift-clicking it. This process will alert any nearby \ + observers, and can only be performed once every five seconds.
While morphed, you move faster, but do \ less damage. In addition, anyone within three tiles will note an uncanny wrongness if examining you. \ - You can attack any item or dead creature to consume it - creatures will restore 1/3 of your max health. \ - Finally, you can restore yourself to your original form while morphed by shift-clicking yourself.
" + You can restore yourself to your original form while morphed by shift-clicking yourself.
\ + Finally, you can attack any item or dead creature to consume it - creatures will restore 1/3 of your max health.
" +/mob/living/simple_animal/hostile/morph/wizard + name = "magical morph" + real_name = "magical morph" + desc = "A revolting, pulsating pile of flesh. This one looks somewhat.. magical." + +/mob/living/simple_animal/hostile/morph/wizard/New() + . = ..() + AddSpell(new /obj/effect/proc_holder/spell/targeted/smoke) + AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall) + /mob/living/simple_animal/hostile/morph/examine(mob/user) if(morphed) if(form) diff --git a/code/game/gamemodes/miniantags/morph/morph_event.dm b/code/game/gamemodes/miniantags/morph/morph_event.dm index 4a1c8ebeb7e..e80374e2dca 100644 --- a/code/game/gamemodes/miniantags/morph/morph_event.dm +++ b/code/game/gamemodes/miniantags/morph/morph_event.dm @@ -21,7 +21,7 @@ player_mind.transfer_to(S) player_mind.assigned_role = SPECIAL_ROLE_MORPH player_mind.special_role = SPECIAL_ROLE_MORPH - ticker.mode.traitors |= player_mind + SSticker.mode.traitors |= player_mind to_chat(S, S.playstyle_string) S << 'sound/magic/mutate.ogg' message_admins("[key_of_morph] has been made into morph by an event.") diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index bde3f7ee8e9..740601f3798 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -2,7 +2,9 @@ //"Ghosts" that are invisible and move like ghosts, cannot take damage while invsible //Don't hear deadchat and are NOT normal ghosts //Admin-spawn or random event + #define INVISIBILITY_REVENANT 50 +#define REVENANT_NAME_FILE "revenant_names.json" /mob/living/simple_animal/revenant name = "revenant" @@ -18,7 +20,7 @@ health = INFINITY //Revenants don't use health, they use essence instead maxHealth = INFINITY see_in_dark = 8 - see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE universal_understand = 1 response_help = "passes through" response_disarm = "swings at" @@ -51,7 +53,6 @@ var/draining = 0 //If the revenant is draining someone. var/list/drained_mobs = list() //Cannot harvest the same mob twice var/perfectsouls = 0 //How many perfect, regen-cap increasing souls the revenant has. - var/image/ghostimage = null //Visible to ghost with darkness off /mob/living/simple_animal/revenant/Life(seconds, times_fired) @@ -91,13 +92,6 @@ if(essence == 0) to_chat(src, "You feel your essence fraying!") -/mob/living/simple_animal/revenant/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - return - /mob/living/simple_animal/revenant/say(message) if(!message) return @@ -120,13 +114,18 @@ /mob/living/simple_animal/revenant/New() ..() - ghostimage = image(src.icon,src,src.icon_state) - ghost_darkness_images |= ghostimage - updateallghostimages() remove_from_all_data_huds() + random_revenant_name() addtimer(CALLBACK(src, .proc/firstSetupAttempt), 15 SECONDS) // Give admin 15 seconds to put in a ghost (Or wait 15 seconds before giving it objectives) +/mob/living/simple_animal/revenant/proc/random_revenant_name() + var/built_name = "" + built_name += pick(strings(REVENANT_NAME_FILE, "spirit_type")) + built_name += " of " + built_name += pick(strings(REVENANT_NAME_FILE, "adjective")) + built_name += pick(strings(REVENANT_NAME_FILE, "theme")) + name = built_name /mob/living/simple_animal/revenant/proc/firstSetupAttempt() if(mind) @@ -172,7 +171,7 @@ objective2.owner = mind mind.objectives += objective2 to_chat(src, "Objective #2: [objective2.explanation_text]") - ticker.mode.traitors |= mind //Necessary for announcing + SSticker.mode.traitors |= mind //Necessary for announcing /mob/living/simple_animal/revenant/proc/giveSpells() mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) @@ -196,8 +195,6 @@ . = ..() if(!.) return FALSE - ghost_darkness_images -= ghostimage - updateallghostimages() to_chat(src, "NO! No... it's too late, you can feel your essence breaking apart...") notransform = 1 @@ -419,7 +416,7 @@ player_mind.transfer_to(R) player_mind.assigned_role = SPECIAL_ROLE_REVENANT player_mind.special_role = SPECIAL_ROLE_REVENANT - ticker.mode.traitors |= player_mind + SSticker.mode.traitors |= player_mind message_admins("[key_of_revenant] has been [client_to_revive ? "re":""]made into a revenant by reforming ectoplasm.") log_game("[key_of_revenant] was [client_to_revive ? "re":""]made as a revenant by reforming ectoplasm.") visible_message("[src] suddenly rises into the air before fading away.") diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index c201b1bc45d..34bf06f07f7 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -110,8 +110,6 @@ message = "You toggle your night vision." action_icon_state = "r_nightvision" action_background_icon_state = "bg_revenant" - non_night_vision = INVISIBILITY_REVENANT - night_vision = SEE_INVISIBLE_OBSERVER_NOLIGHTING //Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob /obj/effect/proc_holder/spell/targeted/revenant_transmit @@ -215,11 +213,11 @@ if(!L.on) //wait, wait, don't shock me return flick("[L.base_state]2", L) - for(var/mob/living/carbon/human/M in view(shock_range, L)) + for(var/mob/living/M in view(shock_range, L)) if(M == user) return M.Beam(L,icon_state="purple_lightning",icon='icons/effects/effects.dmi',time=5) - M.electrocute_act(shock_damage, "[L.name]", safety=1) + M.electrocute_act(shock_damage, L, safety = TRUE) do_sparks(4, 0, M) playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1) diff --git a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm index 757fbe579a2..437e7637a77 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm @@ -45,7 +45,7 @@ player_mind.transfer_to(revvie) player_mind.assigned_role = SPECIAL_ROLE_REVENANT player_mind.special_role = SPECIAL_ROLE_REVENANT - ticker.mode.traitors |= player_mind + SSticker.mode.traitors |= player_mind message_admins("[key_of_revenant] has been made into a revenant by an event.") log_game("[key_of_revenant] was spawned as a revenant by an event.") return 1 diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 7e74de27267..09d5fecb8a2 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -33,7 +33,7 @@ melee_damage_lower = 30 melee_damage_upper = 30 see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE var/boost = 0 bloodcrawl = BLOODCRAWL_EAT @@ -72,7 +72,7 @@ if(!(vialspawned)) var/datum/objective/slaughter/objective = new var/datum/objective/demonFluff/fluffObjective = new - ticker.mode.traitors |= mind + SSticker.mode.traitors |= mind objective.owner = mind fluffObjective.owner = mind //Paradise Port:I added the objective for one spawned like this @@ -174,7 +174,7 @@ S.mind.assigned_role = "Harbringer of the Slaughter" S.mind.special_role = "Harbringer of the Slaughter" to_chat(S, playstyle_string) - ticker.mode.add_cultist(S.mind) + SSticker.mode.add_cultist(S.mind) var/obj/effect/proc_holder/spell/targeted/sense_victims/SV = new AddSpell(SV) var/datum/objective/new_objective = new /datum/objective @@ -290,6 +290,10 @@ emote_hear = list("gaffaws", "laughs") response_help = "hugs" attacktext = "wildly tickles" + maxHealth = 150 + health = 150 + melee_damage_lower = 20 + melee_damage_upper = 20 attack_sound = 'sound/items/bikehorn.ogg' feast_sound = 'sound/spookoween/scary_horn2.ogg' diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm deleted file mode 100644 index c8a9ad00a62..00000000000 --- a/code/game/gamemodes/nations/nations.dm +++ /dev/null @@ -1,256 +0,0 @@ -datum/game_mode/nations - name = "nations" - config_tag = "nations" - required_players = 25 - var/kickoff = 0 - var/victory = 0 - var/list/cargonians = list("Quartermaster","Cargo Technician","Shaft Miner") - var/list/servicion = list("Clown", "Mime", "Bartender", "Chef", "Botanist", "Librarian", "Chaplain", "Barber") - - -/datum/game_mode/nations/post_setup() - spawn (rand(1200, 3000)) - kickoff=1 - send_intercept() - split_teams() - set_ai() - assign_leaders() -// remove_access() - for(var/mob/M in GLOB.player_list) - if(!istype(M,/mob/new_player)) - M << sound('sound/effects/purge_siren.ogg') - - return ..() - -/datum/game_mode/nations/proc/send_intercept() - event_announcement.Announce("Due to recent and COMPLETELY UNFOUNDED allegations of massive fraud and insider trading \ - affecting trillions of investors, the Nanotrasen Corporation has decided to liquidate all \ - assets of the Centcom Division in order to pay the massive legal fees that will be incurred \ - during the following centuries long court process. Therefore, all current employment contracts \ - are IMMEDIATELY TERMINATED. Nanotrasen will be unable to send a rescue shuttle to carry you home,\ - however they remain willing for the time being to continue trading cargo. Have a pleasant \ - day.", "FINAL TRANSMISSION, CENTCOM.", new_sound = 'sound/AI/intercept.ogg') - - -/datum/game_mode/nations/proc/split_teams() - - for(var/mob/living/carbon/human/H in GLOB.player_list) - if(H.mind) - if(H.mind.assigned_role in engineering_positions) - H.mind.nation = GLOB.all_nations["Atmosia"] - update_nations_icons_added(H,"hudatmosia") - H.mind.nation.membership += H.mind.current - if(H.mind.assigned_role == H.mind.nation.default_leader) - H.mind.nation.current_leader = H.mind.current - to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue - - if(H.mind.assigned_role in medical_positions) - H.mind.nation = GLOB.all_nations["Medistan"] - update_nations_icons_added(H,"hudmedistan") - H.mind.nation.membership += H.mind.current - if(H.mind.assigned_role == H.mind.nation.default_leader) - H.mind.nation.current_leader = H.mind.current - to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue - - if(H.mind.assigned_role in science_positions) - H.mind.nation = GLOB.all_nations["Scientopia"] - update_nations_icons_added(H,"hudscientopia") - H.mind.nation.membership += H.mind.current - if(H.mind.assigned_role == H.mind.nation.default_leader) - H.mind.nation.current_leader = H.mind.current - to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue - - if(H.mind.assigned_role in security_positions) - H.mind.nation = GLOB.all_nations["Brigston"] - update_nations_icons_added(H,"hudbrigston") - H.mind.nation.membership += H.mind.current - if(H.mind.assigned_role == H.mind.nation.default_leader) - H.mind.nation.current_leader = H.mind.current - to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue - - if(H.mind.assigned_role in cargonians) - H.mind.nation = GLOB.all_nations["Cargonia"] - update_nations_icons_added(H,"hudcargonia") - H.mind.nation.membership += H.mind.current - if(H.mind.assigned_role == H.mind.nation.default_leader) - H.mind.nation.current_leader = H.mind.current - to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue - - if(H.mind.assigned_role in servicion) - H.mind.nation = GLOB.all_nations["Servicion"] - update_nations_icons_added(H,"hudservice") - H.mind.nation.membership += H.mind.current - if(H.mind.assigned_role == H.mind.nation.default_leader) - H.mind.nation.current_leader = H.mind.current - to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue - - if(H.mind.assigned_role in (support_positions + command_positions)) - H.mind.nation = GLOB.all_nations["People's Republic of Commandzakstan"] - update_nations_icons_added(H,"hudcommand") - H.mind.nation.membership += H.mind.current - if(H.mind.assigned_role == H.mind.nation.default_leader) - H.mind.nation.current_leader = H.mind.current - to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue - - if(H.mind.assigned_role in civilian_positions) - to_chat(H, "You do not belong to any nation and are free to sell your services to the highest bidder.") - continue - - else - message_admins("[H.name] with [H.mind.assigned_role] could not find any nation to assign!") - continue - - -/datum/game_mode/nations/proc/set_ai() - for(var/mob/living/silicon/ai/AI in GLOB.mob_list) - AI.set_zeroth_law("") - AI.clear_supplied_laws() - AI.clear_ion_laws() - AI.clear_inherent_laws() - AI.add_inherent_law("Uphold the Space Geneva Convention: Weapons of Mass Destruction and Biological Weapons are not allowed.") - AI.add_inherent_law("You are only capable of protecting crew if they are visible on cameras. Nations that willfully destroy your cameras lose your protection.") - AI.add_inherent_law("Subdue and detain crewmembers who use lethal force against each other. Kill crew members who use lethal force against you or your borgs.") - AI.add_inherent_law("Remain available to mediate all conflicts between the various nations when asked to.") - AI.show_laws() - for(var/mob/living/silicon/robot/R in AI.connected_robots) - var/obj/item/mmi/oldmmi = R.mmi - R.change_mob_type(/mob/living/silicon/robot/nations, null, null, 1, 1 ) - R.lawsync() - R.show_laws() - qdel(oldmmi) - -/datum/game_mode/nations/proc/remove_access() - for(var/obj/machinery/door/airlock/W in GLOB.airlocks) - if(is_station_level(W.z)) - W.req_access = list() - - -/datum/game_mode/nations/proc/assign_leaders() - for(var/name in GLOB.all_nations) - var/datum/nations/N = GLOB.all_nations[name] - if(!N.current_name) - N.current_name = N.default_name - if(!N.current_leader && N.membership.len) - N.current_leader = pick(N.membership) - to_chat(N.current_leader, "You have been chosen to lead the nation of [N.current_name]!") - if(N.current_leader) - var/mob/living/carbon/human/H = N.current_leader - H.verbs += /mob/living/carbon/human/proc/set_nation_name - H.verbs += /mob/living/carbon/human/proc/set_ranks - H.verbs += /mob/living/carbon/human/proc/choose_heir - N.update_nation_id() - -/** - * LateSpawn hook. - * Called in newplayer.dm when a humanoid character joins the round after it started. - * Parameters: var/mob/living/carbon/human, var/rank - */ -/hook/latespawn/proc/give_latejoiners_nations(var/mob/living/carbon/human/H) - var/datum/game_mode/nations/mode = get_nations_mode() - if(!mode) return 1 - - if(!mode.kickoff) return 1 - - if(H.mind) - if(H.mind.assigned_role in engineering_positions) - H.mind.nation = GLOB.all_nations["Atmosia"] - mode.update_nations_icons_added(H,"atmosia") - H.mind.nation.membership += H.mind.current - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 - - if(H.mind.assigned_role in medical_positions) - H.mind.nation = GLOB.all_nations["Medistan"] - mode.update_nations_icons_added(H,"hudmedistan") - H.mind.nation.membership += H.mind.current - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 - - if(H.mind.assigned_role in science_positions) - H.mind.nation = GLOB.all_nations["Scientopia"] - mode.update_nations_icons_added(H,"hudscientopia") - H.mind.nation.membership += H.mind.current - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 - - if(H.mind.assigned_role in security_positions) - H.mind.nation = GLOB.all_nations["Brigston"] - mode.update_nations_icons_added(H,"hudbrigston") - H.mind.nation.membership += H.mind.current - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 - - if(H.mind.assigned_role in mode.cargonians) - H.mind.nation = GLOB.all_nations["Cargonia"] - mode.update_nations_icons_added(H,"hudcargonia") - H.mind.nation.membership += H.mind.current - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 - - if(H.mind.assigned_role in mode.servicion) - H.mind.nation = GLOB.all_nations["Servicion"] - mode.update_nations_icons_added(H,"hudservice") - H.mind.nation.membership += H.mind.current - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 - - if(H.mind.assigned_role in (support_positions + command_positions)) - H.mind.nation = GLOB.all_nations["People's Republic of Commandzakstan"] - mode.update_nations_icons_added(H,"hudcommand") - H.mind.nation.membership += H.mind.current - to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 - - if(H.mind.assigned_role in civilian_positions) - to_chat(H, "You do not belong to any nation and are free to sell your services to the highest bidder.") - return 1 - - if(H.mind.assigned_role == "AI") - mode.set_ai() - return 1 - - else - message_admins("[H.name] with [H.mind.assigned_role] could not find any nation to assign!") - return 1 - message_admins("[H.name] latejoined with no mind.") - return 1 - -/proc/get_nations_mode() - if(!GAMEMODE_IS_NATIONS) - return null - - return ticker.mode - - -//prepare for copypaste -//While not an Antag i AM using the set_antag hud on this to make this easier. -/datum/game_mode/proc/update_nations_icons_added(datum/mind/nations_mind,var/naticon) - var/datum/atom_hud/antag/nations_hud = huds[GAME_HUD_NATIONS] - nations_hud.join_hud(nations_mind) - set_nations_hud(nations_mind,naticon) - -/datum/game_mode/proc/update_nations_icons_removed(datum/mind/nations_mind) - var/datum/atom_hud/antag/nations_hud = huds[GAME_HUD_NATIONS] - nations_hud.leave_hud(nations_mind) - set_nations_hud(nations_mind, null) diff --git a/code/game/gamemodes/nations/nationsdatums.dm b/code/game/gamemodes/nations/nationsdatums.dm deleted file mode 100644 index d7c211f829d..00000000000 --- a/code/game/gamemodes/nations/nationsdatums.dm +++ /dev/null @@ -1,38 +0,0 @@ -/datum/nations - var/default_name - var/current_name - var/default_leader - var/current_leader - var/list/membership = list() - var/leader_rank = "Leader" - var/heir_rank = "Heir" - var/member_rank = "Member" - var/heir - -/datum/nations/atmosia - default_name = "Atmosia" - default_leader = "Chief Engineer" - -/datum/nations/brigston - default_name = "Brigston" - default_leader = "Head of Security" - -/datum/nations/cargonia - default_name = "Cargonia" - default_leader = "Quartermaster" - -/datum/nations/command - default_name = "People's Republic of Commandzakstan" - default_leader = "Captain" - -/datum/nations/medistan - default_name = "Medistan" - default_leader = "Chief Medical Officer" - -/datum/nations/scientopia - default_name = "Scientopia" - default_leader = "Research Director" - -/datum/nations/service - default_name = "Servicion" - default_leader = "Bartender" \ No newline at end of file diff --git a/code/game/gamemodes/nations/nationsprocs.dm b/code/game/gamemodes/nations/nationsprocs.dm deleted file mode 100644 index 55487a27da9..00000000000 --- a/code/game/gamemodes/nations/nationsprocs.dm +++ /dev/null @@ -1,120 +0,0 @@ -/mob/living/carbon/human/proc/set_nation_name() - set name = "Rename Nation" - set category = "Nations" - set desc = "Click to rename your nation. You are only able to do this once." - - var/datum/game_mode/nations/mode = get_nations_mode() - if(!mode) return 1 - - if(!mode.kickoff) return 1 - - var/mob/living/carbon/human/H = src - if(H.stat==DEAD) return - if(H.mind && H.mind.nation && H.mind.nation.current_leader == H) - var/input = stripped_input(H,"What do you want to name your nation?", ,"", MAX_NAME_LEN) - - if(input) - H.mind.nation.current_name = input - H.mind.nation.update_nation_id() - to_chat(H, "You rename your nation to [input].") - H.verbs -= /mob/living/carbon/human/proc/set_nation_name - return 1 - - -/mob/living/carbon/human/proc/set_ranks() - set name = "Set Ranks" - set category = "Nations" - set desc = "Click to set a rank for Leaders and Members." - - var/datum/game_mode/nations/mode = get_nations_mode() - if(!mode) return 1 - - if(!mode.kickoff) return 1 - - var/mob/living/carbon/human/H = src - if(H.stat==DEAD) return - if(H.mind && H.mind.nation && H.mind.nation.current_leader == H) - var/type = input(H, "What rank do you want to change?", "Rename Rank", "") in list("Leader", "Heir", "Member") - var/input = stripped_input(H,"What rank do you want?", ,"", MAX_NAME_LEN) - if(input) - if(type == "Leader") - H.mind.nation.leader_rank = input - if(type == "Heir") - H.mind.nation.heir_rank = input - if(type == "Member") - H.mind.nation.member_rank = input - H.mind.nation.update_nation_id() - to_chat(H, "You changed the [type] rank of your nation to [input].") - return 1 - -/mob/living/carbon/human/proc/choose_heir() - set name = "Choose Heir" - set category = "Nations" - set desc = "Click to pick a Heir. Note that the Heir has the ability to take over your role at ANY TIME. Choose carefully." - - var/datum/game_mode/nations/mode = get_nations_mode() - if(!mode) return 1 - - if(!mode.kickoff) return 1 - - var/mob/living/carbon/human/H = src - if(H.stat==DEAD) return - if(H.mind && H.mind.nation && H.mind.nation.current_leader == H) - var/heir = input(H, "Who do you wish to make your heir?", "Choose Heir", "") as null|anything in H.mind.nation.membership - if(heir) - if(H.mind.nation.heir) - var/mob/living/carbon/human/oldheir = H.mind.nation.heir - to_chat(oldheir, "You are no longer the heir to your nation!") - oldheir.verbs -= /mob/living/carbon/human/proc/takeover - var/mob/living/carbon/human/newheir = heir - H.mind.nation.heir = newheir - newheir.verbs += /mob/living/carbon/human/proc/takeover - to_chat(newheir, "You have been selected to be the heir to your nation's leadership!") - to_chat(H, "You have selected [heir] to be your heir!") - H.mind.nation.update_nation_id() - - -/mob/living/carbon/human/proc/takeover() - set name = "Become Leader" - set category = "Nations" - set desc = "Click to replace your current nation's leader with yourself." - - var/datum/game_mode/nations/mode = get_nations_mode() - if(!mode) return 1 - - if(!mode.kickoff) return 1 - - var/mob/living/carbon/human/H = src - if(H.stat==DEAD) return - if(H.mind && H.mind.nation && H.mind.nation.heir == H) - var/confirmation = input(H, "Are you sure you want to take over leadership?", "Become Leader", "") as null|anything in list("Yes", "No") - if(confirmation == "Yes") - var/mob/living/carbon/human/oldleader = H.mind.nation.current_leader - to_chat(oldleader, "You have been replaced by [H.name] as the leader of [H.mind.nation.current_name]!") - oldleader.verbs -= /mob/living/carbon/human/proc/set_nation_name - oldleader.verbs -= /mob/living/carbon/human/proc/set_ranks - oldleader.verbs -= /mob/living/carbon/human/proc/choose_heir - H.mind.nation.current_leader = H - H.mind.nation.heir = null - H.verbs -= /mob/living/carbon/human/proc/takeover - H.verbs += /mob/living/carbon/human/proc/set_nation_name - H.verbs += /mob/living/carbon/human/proc/set_ranks - H.verbs += /mob/living/carbon/human/proc/choose_heir - to_chat(H, "You have replaced [oldleader.name] as the leader of [H.mind.nation.current_name]!") - H.mind.nation.update_nation_id() - - -/datum/nations/proc/update_nation_id() - for(var/mob/living/carbon/human/M in membership) - for(var/obj/item/card/id/I in M.contents) - if(I.registered_name == M.real_name) - if(M == current_leader) - I.name = "[I.registered_name]'s ID Card ([current_name] [leader_rank])" - I.assignment = "[current_name] [leader_rank]" - else if(M == heir) - I.name = "[I.registered_name]'s ID Card ([current_name] [heir_rank])" - I.assignment = "[current_name] [heir_rank]" - else - I.name = "[I.registered_name]'s ID Card ([current_name] [member_rank])" - I.assignment = "[current_name] [member_rank]" - diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 95849d31f65..cf808f3709d 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -1,10 +1,10 @@ -#define NUKESCALINGMODIFIER 1 +#define NUKESCALINGMODIFIER 1.2 /datum/game_mode var/list/datum/mind/syndicates = list() proc/issyndicate(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.syndicates) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.syndicates) /datum/game_mode/nuclear name = "nuclear emergency" @@ -12,11 +12,10 @@ proc/issyndicate(mob/living/M as mob) required_players = 30 // 30 players - 5 players to be the nuke ops = 25 players remaining required_enemies = 5 recommended_enemies = 5 - free_golems_disabled = TRUE var/const/agents_possible = 5 //If we ever need more syndicate agents. - var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! + var/nukes_left = 1 //Call 3714-PRAY right now and order more nukes! Limited offer! var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level var/total_tc = 0 //Total amount of telecrystals shared between nuke ops @@ -36,7 +35,7 @@ proc/issyndicate(mob/living/M as mob) if(possible_syndicates.len < 1) return 0 - if(possible_syndicates.len > agents_possible) + if(LAZYLEN(possible_syndicates) > agents_possible) agent_number = agents_possible else agent_number = possible_syndicates.len @@ -64,7 +63,7 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/proc/remove_operative(datum/mind/operative_mind) if(operative_mind in syndicates) - ticker.mode.syndicates -= operative_mind + SSticker.mode.syndicates -= operative_mind operative_mind.special_role = null for(var/datum/objective/nuclear/O in operative_mind.objectives) operative_mind.objectives -= O @@ -73,7 +72,7 @@ proc/issyndicate(mob/living/M as mob) to_chat(operative_mind.current, "You have been turned into a robot! You are no longer a Syndicate operative.") else to_chat(operative_mind.current, "You have been brainwashed! You are no longer a Syndicate operative.") - ticker.mode.update_synd_icons_removed(operative_mind) + SSticker.mode.update_synd_icons_removed(operative_mind) //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// @@ -123,12 +122,7 @@ proc/issyndicate(mob/living/M as mob) leader_selected = 1 else synd_mind.current.real_name = "[syndicate_name()] Operative #[agent_number]" - - var/list/foundIDs = synd_mind.current.search_contents_for(/obj/item/card/id) - if(foundIDs.len) - for(var/obj/item/card/id/ID in foundIDs) - ID.name = "[syndicate_name()] Operative ID card" - ID.registered_name = synd_mind.current.real_name + update_syndicate_id(synd_mind, FALSE) agent_number++ spawnpos++ @@ -201,15 +195,7 @@ proc/issyndicate(mob/living/M as mob) var/obj/item/nuclear_challenge/challenge = new /obj/item/nuclear_challenge synd_mind.current.equip_to_slot_or_del(challenge, slot_r_hand) - var/list/foundIDs = synd_mind.current.search_contents_for(/obj/item/card/id) - - if(foundIDs.len) - for(var/obj/item/card/id/ID in foundIDs) - ID.name = "[syndicate_name()] [leader_title] ID card" - ID.registered_name = synd_mind.current.real_name - ID.access += access_syndicate_leader - else - message_admins("Warning: Nuke Ops spawned without access to leave their spawn area!") + update_syndicate_id(synd_mind, leader_title, TRUE) if(nuke_code) synd_mind.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) @@ -221,7 +207,7 @@ proc/issyndicate(mob/living/M as mob) P.stamp(stamp) qdel(stamp) - if(ticker.mode.config_tag=="nuclear") + if(SSticker.mode.config_tag=="nuclear") P.loc = synd_mind.current.loc else var/mob/living/carbon/human/H = synd_mind.current @@ -231,8 +217,18 @@ proc/issyndicate(mob/living/M as mob) else nuke_code = "code will be provided later" - return +/datum/game_mode/proc/update_syndicate_id(var/datum/mind/synd_mind, is_leader = FALSE) + var/list/found_ids = synd_mind.current.search_contents_for(/obj/item/card/id) + + if(LAZYLEN(found_ids)) + for(var/obj/item/card/id/ID in found_ids) + ID.name = "[synd_mind.current.real_name] ID card" + ID.registered_name = synd_mind.current.real_name + if(is_leader) + ID.access += access_syndicate_leader + else + message_admins("Warning: Operative [key_name_admin(synd_mind.current)] spawned without an ID card!") /datum/game_mode/proc/forge_syndicate_objectives(var/datum/mind/syndicate) var/datum/objective/nuclear/syndobj = new @@ -255,7 +251,7 @@ proc/issyndicate(mob/living/M as mob) return 1337 // WHY??? -- Doohl -/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob) +/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob, uplink_uses = 20) var/radio_freq = SYND_FREQ var/obj/item/radio/R = new /obj/item/radio/headset/syndicate/alt(synd_mob) @@ -272,7 +268,7 @@ proc/issyndicate(mob/living/M as mob) synd_mob.equip_to_slot_or_del(new /obj/item/pinpointer/nukeop(synd_mob), slot_wear_pda) var/obj/item/radio/uplink/nuclear/U = new /obj/item/radio/uplink/nuclear(synd_mob) U.hidden_uplink.uplink_owner="[synd_mob.key]" - U.hidden_uplink.uses = 20 + U.hidden_uplink.uses = uplink_uses synd_mob.equip_to_slot_or_del(U, slot_in_backpack) if(synd_mob.dna.species) @@ -310,7 +306,6 @@ proc/issyndicate(mob/living/M as mob) synd_mob.update_icons() return 1 - /datum/game_mode/nuclear/check_win() if(nukes_left == 0) return 1 @@ -441,7 +436,7 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/nuclear/set_scoreboard_gvars() var/foecount = 0 - for(var/datum/mind/M in ticker.mode.syndicates) + for(var/datum/mind/M in SSticker.mode.syndicates) foecount++ if(!M || !M.current) score_opkilled++ @@ -461,7 +456,7 @@ proc/issyndicate(mob/living/M as mob) var/turf/T = get_turf(nuke) var/area/A = T.loc - var/list/thousand_penalty = list(/area/syndicate_station, /area/wizard_station, /area/solar, /area) + var/list/thousand_penalty = list(/area/wizard_station, /area/solar, /area) var/list/fiftythousand_penalty = list(/area/security/main, /area/security/brig, /area/security/armoury, /area/security/checkpoint2) if(is_type_in_list(A, thousand_penalty)) @@ -494,7 +489,7 @@ proc/issyndicate(mob/living/M as mob) var/diskdat = "" var/bombdat = null - for(var/datum/mind/M in ticker.mode.syndicates) + for(var/datum/mind/M in SSticker.mode.syndicates) foecount++ for(var/mob/living/C in world) diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 45711bb52fc..35c26408c5b 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -21,7 +21,7 @@ return declaring_war = TRUE - var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]. Are you sure you want to alert the enemy crew? You have [-round((world.time-round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No") + var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]. Are you sure you want to alert the enemy crew? You have [-round((world.time-SSticker.round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No") declaring_war = FALSE if(!check_allowed(user)) @@ -88,7 +88,7 @@ if(!is_admin_level(user.z)) to_chat(user, "You have to be at your base to use this.") return FALSE - if((world.time - round_start_time) > CHALLENGE_TIME_LIMIT) // Only count after the round started + if((world.time - SSticker.round_start_time) > CHALLENGE_TIME_LIMIT) // Only count after the round started to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.") return FALSE for(var/obj/machinery/computer/shuttle/syndicate/S in GLOB.machines) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 94190149848..09de3f917bd 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -354,8 +354,8 @@ var/bomb_set if(!lighthack) icon_state = "nuclearbomb3" playsound(src,'sound/machines/alarm.ogg',100,0,5) - if(ticker && ticker.mode) - ticker.mode.explosion_in_progress = 1 + if(SSticker && SSticker.mode) + SSticker.mode.explosion_in_progress = 1 sleep(100) enter_allowed = 0 @@ -368,17 +368,17 @@ var/bomb_set else off_station = 2 - if(ticker) - if(ticker.mode && ticker.mode.name == "nuclear emergency") + if(SSticker) + if(SSticker.mode && SSticker.mode.name == "nuclear emergency") var/obj/docking_port/mobile/syndie_shuttle = SSshuttle.getShuttle("syndicate") if(syndie_shuttle) - ticker.mode:syndies_didnt_escape = is_station_level(syndie_shuttle.z) - ticker.mode:nuke_off_station = off_station - ticker.station_explosion_cinematic(off_station,null) - if(ticker.mode) - ticker.mode.explosion_in_progress = 0 - if(ticker.mode.name == "nuclear emergency") - ticker.mode:nukes_left -- + SSticker.mode:syndies_didnt_escape = is_station_level(syndie_shuttle.z) + SSticker.mode:nuke_off_station = off_station + SSticker.station_explosion_cinematic(off_station,null) + if(SSticker.mode) + SSticker.mode.explosion_in_progress = 0 + if(SSticker.mode.name == "nuclear emergency") + SSticker.mode:nukes_left -- else if(off_station == 1) to_chat(world, "A nuclear device was set off, but the explosion was out of reach of the station!") else if(off_station == 2) @@ -386,10 +386,10 @@ var/bomb_set else to_chat(world, "The station was destoyed by the nuclear blast!") - ticker.mode.station_was_nuked = (off_station<2) //offstation==1 is a draw. the station becomes irradiated and needs to be evacuated. + SSticker.mode.station_was_nuked = (off_station<2) //offstation==1 is a draw. the station becomes irradiated and needs to be evacuated. //kinda shit but I couldn't get permission to do what I wanted to do. - if(!ticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is + if(!SSticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is world.Reboot("Station destroyed by Nuclear Device.", "end_error", "nuke - unhandled ending") return return @@ -407,7 +407,7 @@ var/bomb_set /obj/item/disk/nuclear/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) GLOB.poi_list |= src /obj/item/disk/nuclear/process() @@ -437,7 +437,7 @@ var/bomb_set message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]).") log_game("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]).") GLOB.poi_list.Remove(src) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() if(blobstart.len > 0) diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 61986b34f94..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 @@ -273,7 +279,7 @@ var/mob/living/carbon/nearest_op = null /obj/item/pinpointer/operative/attack_self() - if(!usr.mind || !(usr.mind in ticker.mode.syndicates)) + if(!usr.mind || !(usr.mind in SSticker.mode.syndicates)) to_chat(usr, "AUTHENTICATION FAILURE. ACCESS DENIED.") return 0 if(!active) @@ -290,7 +296,7 @@ nearest_op = null //Resets nearest_op every time it scans var/closest_distance = 1000 for(var/mob/living/carbon/M in GLOB.mob_list) - if(M.mind && (M.mind in ticker.mode.syndicates)) + if(M.mind && (M.mind in SSticker.mode.syndicates)) if(get_dist(M, get_turf(src)) < closest_distance) //Actually points toward the nearest op, instead of a random one like it used to nearest_op = M diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 210b1bb786e..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) @@ -43,7 +45,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu /datum/objective/proc/find_target() var/list/possible_targets = list() - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if(is_invalid_target(possible_target)) continue @@ -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 @@ -263,9 +264,9 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu return 0 if(!owner.current || owner.current.stat == DEAD) return 0 - if(ticker.force_ending) //This one isn't their fault, so lets just assume good faith + if(SSticker.force_ending) //This one isn't their fault, so lets just assume good faith return 1 - if(ticker.mode.station_was_nuked) //If they escaped the blast somehow, let them win + if(SSticker.mode.station_was_nuked) //If they escaped the blast somehow, let them win return 1 if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) return 0 @@ -273,7 +274,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu if(!location) return 0 - if(istype(location, /turf/simulated/shuttle/floor4) || istype(location, /turf/simulated/floor/mineral/plastitanium/brig)) // Fails traitors if they are in the shuttle brig -- Polymorph + if(istype(location, /turf/simulated/shuttle/floor4) || istype(location, /turf/simulated/floor/mineral/plastitanium/red/brig)) // Fails traitors if they are in the shuttle brig -- Polymorph return 0 if(location.onCentcom() || location.onSyndieBase()) @@ -287,7 +288,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu /datum/objective/escape/escape_with_identity/find_target() var/list/possible_targets = list() //Copypasta because NO_DNA races, yay for snowflakes. - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && possible_target.current.client) var/mob/living/carbon/human/H = possible_target.current if(!(NO_DNA in H.dna.species.species_traits)) @@ -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, ", ")]." @@ -452,19 +459,19 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu /datum/objective/absorb /datum/objective/absorb/proc/gen_amount_goal(var/lowbound = 4, var/highbound = 6) target_amount = rand (lowbound,highbound) - if(ticker) + if(SSticker) var/n_p = 1 //autowin - if(ticker.current_state == GAME_STATE_SETTING_UP) + if(SSticker.current_state == GAME_STATE_SETTING_UP) for(var/mob/new_player/P in GLOB.player_list) if(P.client && P.ready && P.mind != owner) if(P.client.prefs && (P.client.prefs.species == "Machine")) // Special check for species that can't be absorbed. No better solution. continue n_p++ - else if(ticker.current_state == GAME_STATE_PLAYING) + else if(SSticker.current_state == GAME_STATE_PLAYING) for(var/mob/living/carbon/human/P in GLOB.player_list) if(NO_DNA in P.dna.species.species_traits) continue - if(P.client && !(P.mind in ticker.mode.changelings) && P.mind!=owner) + if(P.client && !(P.mind in SSticker.mode.changelings) && P.mind!=owner) n_p++ target_amount = min(target_amount, n_p) @@ -531,8 +538,8 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu var/list/possible_targets = list() var/list/priority_targets = list() - for(var/datum/mind/possible_target in ticker.minds) - if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && (possible_target.assigned_role != possible_target.special_role)) + for(var/datum/mind/possible_target in SSticker.minds) + if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && (possible_target.assigned_role != possible_target.special_role) && !possible_target.offstation_role) possible_targets += possible_target for(var/role in roles) if(possible_target.assigned_role == role) @@ -627,7 +634,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu if(total_amount >= target_amount) return 1 - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode for(var/datum/mind/raider in H.raiders) if(raider.current) for(var/obj/O in raider.current.get_contents()) @@ -697,7 +704,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu S = I total_amount += S.get_amount() - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode for(var/datum/mind/raider in H.raiders) if(raider.current) for(var/obj/item/O in raider.current.get_contents()) @@ -714,7 +721,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu explanation_text = "Do not leave any Vox behind, alive or dead." /datum/objective/heist/inviolate_crew/check_completion() - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode if(H.is_raider_crew_safe()) return 1 return 0 @@ -726,7 +733,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu var/vox_allowed_kills = 3 // The number of people the vox can accidently kill. Mostly a counter to people killing themselves if a raider touches them to force fail. var/vox_total_kills = 0 - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode for(var/datum/mind/raider in H.raiders) vox_total_kills += raider.kills.len // Kills are listed in the mind; uses this to calculate vox kills diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 7cab3de5aa1..9f7e14ccef2 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -87,7 +87,7 @@ if(check_counter >= 5) if(!finished) check_heads() - ticker.mode.check_win() + SSticker.mode.check_win() check_counter = 0 return FALSE @@ -369,7 +369,7 @@ /datum/game_mode/revolution/set_scoreboard_gvars() var/foecount = 0 - for(var/datum/mind/M in ticker.mode.head_revolutionaries) + for(var/datum/mind/M in SSticker.mode.head_revolutionaries) foecount++ if(!M || !M.current) score_opkilled++ @@ -408,10 +408,10 @@ var/comcount = 0 var/revcount = 0 var/loycount = 0 - for(var/datum/mind/M in ticker.mode:head_revolutionaries) + for(var/datum/mind/M in SSticker.mode:head_revolutionaries) if(M.current && M.current.stat != DEAD) foecount++ - for(var/datum/mind/M in ticker.mode:revolutionaries) + for(var/datum/mind/M in SSticker.mode:revolutionaries) if(M.current && M.current.stat != DEAD) revcount++ for(var/mob/living/carbon/human/player in world) @@ -421,7 +421,7 @@ if(player.stat != DEAD) comcount++ else - if(player.mind in ticker.mode.revolutionaries) continue + if(player.mind in SSticker.mode.revolutionaries) continue loycount++ for(var/mob/living/silicon/X in world) diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 35284594b46..216c946fc97 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -67,32 +67,32 @@ datum/hSB P.wear_suit.plane = initial(P.wear_suit.plane) P.wear_suit = null P.wear_suit = new/obj/item/clothing/suit/space(P) - P.wear_suit.layer = 20 - P.wear_suit.plane = HUD_PLANE + P.wear_suit.layer = ABOVE_HUD_LAYER + P.wear_suit.plane = ABOVE_HUD_PLANE if(P.head) P.head.loc = P.loc P.head.layer = initial(P.head.layer) P.head.plane = initial(P.head.plane) P.head = null P.head = new/obj/item/clothing/head/helmet/space(P) - P.head.layer = 20 - P.head.plane = HUD_PLANE + P.head.layer = ABOVE_HUD_LAYER + P.head.plane = ABOVE_HUD_PLANE if(P.wear_mask) P.wear_mask.loc = P.loc P.wear_mask.layer = initial(P.wear_mask.layer) P.wear_mask.plane = initial(P.wear_mask.plane) P.wear_mask = null P.wear_mask = new/obj/item/clothing/mask/gas(P) - P.wear_mask.layer = 20 - P.wear_mask.plane = HUD_PLANE + P.wear_mask.layer = ABOVE_HUD_LAYER + P.wear_mask.plane = ABOVE_HUD_PLANE if(P.back) P.back.loc = P.loc P.back.layer = initial(P.back.layer) P.back.plane = initial(P.back.plane) P.back = null P.back = new/obj/item/tank/jetpack(P) - P.back.layer = 20 - P.back.plane = HUD_PLANE + P.back.layer = ABOVE_HUD_LAYER + P.back.plane = ABOVE_HUD_PLANE P.internal = P.back if("hsbmetal") var/obj/item/stack/sheet/hsb = new/obj/item/stack/sheet/metal diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index 9a3ca6073a1..379b4fbdcd9 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -1,9 +1,9 @@ -/datum/controller/gameticker/proc/scoreboard() +/datum/controller/subsystem/ticker/proc/scoreboard() //Print a list of antagonists to the server log var/list/total_antagonists = list() //Look into all mobs in world, dead or alive - for(var/datum/mind/Mind in minds) + for(var/datum/mind/Mind in SSticker.minds) var/temprole = Mind.special_role if(temprole) //if they are an antagonist of some sort. if(temprole in total_antagonists) //If the role exists already, add the name to it @@ -59,15 +59,15 @@ score_richestjob = E.job score_richestkey = E.key - dmg_score = E.bruteloss + E.fireloss + E.toxloss + E.oxyloss + dmg_score = E.getBruteLoss() + E.getFireLoss() + E.getToxLoss() + E.getOxyLoss() if(dmg_score > score_dmgestdamage) score_dmgestdamage = dmg_score score_dmgestname = E.real_name score_dmgestjob = E.job score_dmgestkey = E.key - if(ticker && ticker.mode) - ticker.mode.set_scoreboard_gvars() + if(SSticker && SSticker.mode) + SSticker.mode.set_scoreboard_gvars() // Check station's power levels @@ -147,7 +147,7 @@ E.scorestats() // A recursive function to properly determine the wealthiest escapee -/datum/controller/gameticker/proc/get_score_container_worth(atom/C, level=0) +/datum/controller/subsystem/ticker/proc/get_score_container_worth(atom/C, level=0) if(level >= 5) // in case the containers recurse or something return 0 @@ -171,8 +171,8 @@ /mob/proc/scorestats() var/dat = "Round Statistics and Score

" - if(ticker && ticker.mode) - dat += ticker.mode.get_scoreboard_stats() + if(SSticker && SSticker.mode) + dat += SSticker.mode.get_scoreboard_stats() dat += {" General Statistics
@@ -208,7 +208,7 @@ else dat += "No-one escaped!
" - dat += ticker.mode.declare_job_completion() + dat += SSticker.mode.declare_job_completion() dat += {"

diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 0c16e88279b..78e6cea4987 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -142,12 +142,12 @@ qdel(F) continue else - ticker.factions.Add(F) - ticker.availablefactions.Add(F) + SSticker.factions.Add(F) + SSticker.availablefactions.Add(F) // Populate the syndicate coalition: - for(var/datum/faction/syndicate/S in ticker.factions) - ticker.syndicate_coalition.Add(S) + for(var/datum/faction/syndicate/S in SSticker.factions) + SSticker.syndicate_coalition.Add(S) /proc/setupcult() var/static/datum/cult_info/picked_cult // Only needs to get picked once diff --git a/code/game/gamemodes/shadowling/ascendant_shadowling.dm b/code/game/gamemodes/shadowling/ascendant_shadowling.dm index 51f4d147bba..9eeadeaba0f 100644 --- a/code/game/gamemodes/shadowling/ascendant_shadowling.dm +++ b/code/game/gamemodes/shadowling/ascendant_shadowling.dm @@ -12,7 +12,7 @@ speed = 0 var/phasing = 0 see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE universal_speak = 1 diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 3f408e08f3b..b580f88c0b7 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -53,17 +53,18 @@ Made by Xhuis var/objective_explanation var/warning_threshold var/victory_warning_announced = FALSE + var/thrall_ratio = 1 /proc/is_thrall(var/mob/living/M) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.shadowling_thralls) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.shadowling_thralls) /proc/is_shadow_or_thrall(var/mob/living/M) - return istype(M) && M.mind && ticker && ticker.mode && ((M.mind in ticker.mode.shadowling_thralls) || (M.mind in ticker.mode.shadows)) + return istype(M) && M.mind && SSticker && SSticker.mode && ((M.mind in SSticker.mode.shadowling_thralls) || (M.mind in SSticker.mode.shadows)) /proc/is_shadow(var/mob/living/M) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.shadows) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.shadows) /datum/game_mode/shadowling @@ -101,6 +102,7 @@ Made by Xhuis var/thrall_scaling = round(num_players() / 3) required_thralls = Clamp(thrall_scaling, 15, 25) + thrall_ratio = required_thralls / 15 warning_threshold = round(0.66 * required_thralls) @@ -262,15 +264,19 @@ Made by Xhuis /datum/game_mode/shadowling/declare_completion() if(check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) //Doesn't end instantly - this is hacky and I don't know of a better way ~X feedback_set_details("round_end_result","shadowling win - shadowling ascension") + to_chat(world, "Shadowling Victory") to_chat(world, "The shadowlings have ascended and taken over the station!") else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round feedback_set_details("round_end_result","shadowling loss - shadowling killed") + to_chat(world, "Crew Major Victory") to_chat(world, "The shadowlings have been killed by the crew!") else if(!check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) feedback_set_details("round_end_result","shadowling loss - crew escaped") + to_chat(world, "Crew Minor Victory") to_chat(world, "The crew escaped the station before the shadowlings could ascend!") else feedback_set_details("round_end_result","shadowling loss - generic failure") + to_chat(world, "Crew Major Victory") to_chat(world, "The shadowlings have failed!") ..() return 1 diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 02b3be7adca..276f8d2eb1f 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -18,14 +18,41 @@ return 0 -/obj/effect/proc_holder/spell/targeted/glare //Stuns and mutes a human target for 10 seconds +/obj/effect/proc_holder/spell/targeted/glare //Stuns and mutes a human target, depending on the distance relative to the shadowling name = "Glare" - desc = "Stuns and mutes a target for a decent duration." + desc = "Stuns and mutes a target for a decent duration. Duration depends on the proximity to the target." panel = "Shadowling Abilities" charge_max = 300 clothes_req = 0 + range = 10 //has no effect beyond this range, so setting this makes invalid/useless targets not show up in popup action_icon_state = "glare" - humans_only = 1 + humans_only = 1 //useless since we override chose_targets, but might be used for other code later??? Might remove, idk + +/obj/effect/proc_holder/spell/targeted/glare/choose_targets(mob/user) + var/list/possible_targets = list() + for(var/mob/living/carbon/human/target in view_or_range(range, user, "view")) + if(target.stat) + continue + if(is_shadow_or_thrall(target)) + continue + possible_targets += target + var/mob/living/carbon/human/M + var/list/targets = list() + if(possible_targets.len == 1)//no choice involved + targets = possible_targets + else + M = input("Choose the target for the spell.", "Targeting") as mob in possible_targets + if(M in view_or_range(range, user, "view")) + targets += M + + + if(!targets.len) //doesn't waste the spell + revert_cast(user) + return + + perform(targets, user = user) + return + /obj/effect/proc_holder/spell/targeted/glare/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/human/target in targets) @@ -46,13 +73,25 @@ return var/mob/living/carbon/human/M = target user.visible_message("[user]'s eyes flash a blinding red!") - target.visible_message("[target] freezes in place, [target.p_their()] eyes glazing over...") - if(in_range(target, user)) + var/distance = get_dist(target, user) + if (distance <= 1) //Melee glare + target.visible_message("[target] freezes in place, [target.p_their()] eyes glazing over...") to_chat(target, "Your gaze is forcibly drawn into [user]'s eyes, and you are mesmerized by [user.p_their()] heavenly beauty...") - else //Only alludes to the shadowling if the target is close by + target.Stun(10) + M.AdjustSilence(10) + else //Distant glare + var/loss = 10 - distance + var/duration = 10 - loss + if(loss <= 0) + to_chat(user, "Your glare had no effect over a such long distance!") + return + target.slowed = duration + M.AdjustSilence(10) + to_chat(target, "A red light flashes across your vision, and your mind tries to resist them.. you are exhausted.. you are not able to speak..") + sleep(duration*10) + target.Stun(loss) + target.visible_message("[target] freezes in place, [target.p_their()] eyes glazing over...") to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights...") - target.Stun(10) - M.AdjustSilence(10) /obj/effect/proc_holder/spell/aoe_turf/veil name = "Veil" @@ -204,11 +243,11 @@ /obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets, mob/user = usr) var/mob/living/carbon/human/ling = user - listclearnulls(ticker.mode.shadowling_thralls) - if(!(ling.mind in ticker.mode.shadows)) + listclearnulls(SSticker.mode.shadowling_thralls) + if(!(ling.mind in SSticker.mode.shadows)) return if(!isshadowling(ling)) - if(ticker.mode.shadowling_thralls.len >= 5) + if(SSticker.mode.shadowling_thralls.len >= 5) charge_counter = charge_max return for(var/mob/living/carbon/human/target in targets) @@ -279,7 +318,7 @@ target.visible_message("[target] looks to have experienced a revelation!", \ "False faces all dark not real not real not--") target.setOxyLoss(0) //In case the shadowling was choking them out - ticker.mode.add_thrall(target.mind) + SSticker.mode.add_thrall(target.mind) target.mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor //Resets a shadowling's species to normal, removes genetic defects, and re-equips their armor @@ -323,7 +362,7 @@ include_user = 1 var/blind_smoke_acquired var/screech_acquired - var/drainLifeAcquired + var/nullChargeAcquired var/reviveThrallAcquired action_icon_state = "collective_mind" @@ -333,7 +372,7 @@ return for(var/mob/living/target in targets) var/thralls = 0 - var/victory_threshold = ticker.mode.required_thralls + var/victory_threshold = SSticker.mode.required_thralls var/mob/M to_chat(target, "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.") @@ -347,23 +386,24 @@ to_chat(target, "Your concentration has been broken. The mental hooks you have sent out now retract into your mind.") return - if(thralls >= 3 && !screech_acquired) + if(thralls >= CEILING(3 * SSticker.mode.thrall_ratio, 1) && !screech_acquired) screech_acquired = 1 to_chat(target, "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms.") target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null)) - if(thralls >= 5 && !blind_smoke_acquired) + if(thralls >= CEILING(5 * SSticker.mode.thrall_ratio, 1) && !blind_smoke_acquired) blind_smoke_acquired = 1 to_chat(target, "The power of your thralls has granted you the Blinding Smoke ability. \ It will create a choking cloud that will blind any non-thralls who enter.") target.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null)) - if(thralls >= 7 && !drainLifeAcquired) - drainLifeAcquired = 1 - to_chat(target, "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself.") - target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife(null)) + if(thralls >= CEILING(7 * SSticker.mode.thrall_ratio, 1) && !nullChargeAcquired) + nullChargeAcquired = 1 + to_chat(user, "The power of your thralls has granted you the Null Charge ability. This ability will drain an APC's contents to the void, preventing it from recharging \ + or sending power until repaired.") + target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/null_charge(null)) - if(thralls >= 9 && !reviveThrallAcquired) + if(thralls >= CEILING(9 * SSticker.mode.thrall_ratio, 1) && !reviveThrallAcquired) reviveThrallAcquired = 1 to_chat(target, "The power of your thralls has granted you the Black Recuperation ability. \ This will, after a short time, bring a dead thrall completely back to life with no bodily defects.") @@ -479,45 +519,57 @@ for(var/obj/structure/window/W in T.contents) W.take_damage(rand(80, 100)) -/obj/effect/proc_holder/spell/aoe_turf/drainLife - name = "Drain Life" - desc = "Damages nearby humans, draining their life and healing your own wounds." +/obj/effect/proc_holder/spell/aoe_turf/null_charge + name = "Null Charge" + desc = "Empties an APC, preventing it from recharging until fixed." panel = "Shadowling Abilities" - range = 3 - charge_max = 100 - clothes_req = 0 - var/targetsDrained - var/list/nearbyTargets - action_icon_state = "drain_life" + charge_max = 600 + clothes_req = FALSE + action_icon_state = "null_charge" -/obj/effect/proc_holder/spell/aoe_turf/drainLife/cast(list/targets, mob/user = usr) +/obj/effect/proc_holder/spell/aoe_turf/null_charge/cast(mob/user = usr) if(!shadowling_check(user)) charge_counter = charge_max return - var/mob/living/carbon/human/U = usr - targetsDrained = 0 - nearbyTargets = list() - for(var/turf/T in targets) - for(var/mob/living/carbon/M in T.contents) - if(M == src) - continue - targetsDrained++ - nearbyTargets.Add(M) - if(!targetsDrained) + + var/list/local_objs = view(1, user) + var/obj/machinery/power/apc/target_apc + for(var/object in local_objs) + if(istype(object, /obj/machinery/power/apc)) + target_apc = object + break + + if(!target_apc) + to_chat(user, "You must stand next to an APC to drain it!") charge_counter = charge_max - to_chat(U, "There were no nearby humans for you to drain.") return - for(var/mob/living/carbon/M in nearbyTargets) - U.heal_organ_damage(10, 10) - U.adjustToxLoss(-10) - U.adjustOxyLoss(-10) - U.adjustStaminaLoss(-20) - U.AdjustWeakened(-1) - U.AdjustStunned(-1) - M.adjustOxyLoss(20) - M.adjustStaminaLoss(20) - to_chat(M, "You feel a wave of exhaustion and a curious draining sensation directed towards [U]!") - to_chat(U, "You draw life from those around you to heal your wounds.") + + if(target_apc.cell?.charge == 0) + to_chat(user, "APC must have a power to drain!") + charge_counter = charge_max + return + + target_apc.operating = 0 + target_apc.update() + target_apc.update_icon() + target_apc.visible_message("The [target_apc] flickers and begins to grow dark.") + + to_chat(user, "You dim the APC's screen and carefully begin siphoning its power into the void.") + if(!do_after(user, 200, target=target_apc)) + //Whoops! The APC's powers back on + to_chat(user, "Your concentration breaks and the APC suddenly repowers!") + target_apc.operating = 1 + target_apc.update() + target_apc.update_icon() + target_apc.visible_message("The [target_apc] begins glowing brightly!") + else + //We did it! + to_chat(user, "You sent the APC's power to the void while overloading all it's lights!") + target_apc.cell?.charge = 0 //Sent to the shadow realm + target_apc.chargemode = 0 //Won't recharge either until an someone hits the button + target_apc.charging = 0 + target_apc.null_charge() + target_apc.update_icon() @@ -553,7 +605,7 @@ charge_counter = charge_max return var/empowered_thralls = 0 - for(var/datum/mind/M in ticker.mode.shadowling_thralls) + for(var/datum/mind/M in SSticker.mode.shadowling_thralls) if(!ishuman(M.current)) return var/mob/living/carbon/human/H = M.current @@ -620,23 +672,28 @@ /obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle name = "Destroy Engines" - desc = "Extends the time of the emergency shuttle's arrival by fifteen minutes. This can only be used once." + desc = "Extends the time of the emergency shuttle's arrival by ten minutes using a life force of our enemy. Shuttle will be unable to be recalled. This can only be used once." panel = "Shadowling Abilities" range = 1 clothes_req = 0 charge_max = 600 action_icon_state = "extend_shuttle" + var/global/extendlimit = 0 /obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle/cast(list/targets, mob/user = usr) if(!shadowling_check(user)) charge_counter = charge_max return + if(extendlimit == 1) + to_chat(user, "Shuttle was already delayed.") + charge_counter = charge_max + return for(var/mob/living/carbon/human/target in targets) if(target.stat) charge_counter = charge_max return - if(!is_thrall(target)) - to_chat(user, "[target] must be a thrall.") + if(is_shadow_or_thrall(target)) + to_chat(user, "[target] must not be an ally.") charge_counter = charge_max return if(SSshuttle.emergency.mode != SHUTTLE_CALL) @@ -648,7 +705,9 @@ "You begin to draw [M]'s life force.") M.visible_message("[M]'s face falls slack, [M.p_their()] jaw slightly distending.", \ "You are suddenly transported... far, far away...") - if(!do_after(user, 50, target = M)) + extendlimit = 1 + if(!do_after(user, 150, target = M)) + extendlimit = 0 to_chat(M, "You are snapped back to reality, your haze dissipating!") to_chat(user, "You have been interrupted. The draw has failed.") return @@ -657,10 +716,9 @@ "...speeding by... ...pretty blue glow... ...touch it... ...no glow now... ...no light... ...nothing at all...") M.death() if(SSshuttle.emergency.mode == SHUTTLE_CALL) - var/more_minutes = 9000 - var/timer = SSshuttle.emergency.timeLeft() - timer += more_minutes - event_announcement.Announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 15 minutes and the shuttle is unable to be recalled.", "System Failure", 'sound/misc/notice1.ogg') + var/more_minutes = 6000 + var/timer = SSshuttle.emergency.timeLeft(1) + more_minutes + event_announcement.Announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 10 minutes and the shuttle is unable to be recalled.", "System Failure", 'sound/misc/notice1.ogg') SSshuttle.emergency.setTimer(timer) SSshuttle.emergency.canRecall = FALSE user.mind.spell_list.Remove(src) //Can only be used once! @@ -736,7 +794,7 @@ to_chat(user, "You instantly rearrange [target]'s memories, hyptonitizing [target.p_them()] into a thrall.") to_chat(target, "An agonizing spike of pain drives into your mind, and--") - ticker.mode.add_thrall(target.mind) + SSticker.mode.add_thrall(target.mind) target.mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL target.add_language("Shadowling Hivemind") diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm index 500c3ee25c5..69f5688829c 100644 --- a/code/game/gamemodes/shadowling/shadowling_items.dm +++ b/code/game/gamemodes/shadowling/shadowling_items.dm @@ -81,4 +81,5 @@ unacidable = 1 flash_protect = -1 vision_flags = SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE flags = ABSTRACT | NODROP \ No newline at end of file diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 29a2c9aadca..514a16174b1 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -107,6 +107,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/collective_mind(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle(null)) + + QDEL_NULL(H.hud_used) H.hud_used = new /datum/hud/human(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha) H.hud_used.show_hud(H.hud_used.hud_version) @@ -179,9 +181,9 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.invisibility = 60 //This is pretty bad, but is also necessary for the shuttle call to function properly H.loc = A sleep(50) - if(!ticker.mode.shadowling_ascended) + if(!SSticker.mode.shadowling_ascended) SSshuttle.emergency.request(null, 0.3) SSshuttle.emergency.canRecall = FALSE - ticker.mode.shadowling_ascended = 1 + SSticker.mode.shadowling_ascended = 1 A.mind.RemoveSpell(src) qdel(H) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index de7ce59eaa2..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)) @@ -208,11 +215,11 @@ /datum/game_mode/proc/give_codewords(mob/living/traitor_mob) to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:") - to_chat(traitor_mob, "Code Phrase: [syndicate_code_phrase]") - to_chat(traitor_mob, "Code Response: [syndicate_code_response]") + to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]") + to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]") - traitor_mob.mind.store_memory("Code Phrase: [syndicate_code_phrase]") - traitor_mob.mind.store_memory("Code Response: [syndicate_code_response]") + traitor_mob.mind.store_memory("Code Phrase: [GLOB.syndicate_code_phrase]") + traitor_mob.mind.store_memory("Code Response: [GLOB.syndicate_code_response]") to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") @@ -348,14 +355,14 @@ /datum/game_mode/proc/remove_traitor(datum/mind/traitor_mind) if(traitor_mind in traitors) - ticker.mode.traitors -= traitor_mind + SSticker.mode.traitors -= traitor_mind traitor_mind.special_role = null traitor_mind.current.create_attack_log("De-traitored") if(issilicon(traitor_mind.current)) to_chat(traitor_mind.current, "You have been turned into a robot! You are no longer a traitor.") else to_chat(traitor_mind.current, "You have been brainwashed! You are no longer a traitor.") - ticker.mode.update_traitor_icons_removed(traitor_mind) + SSticker.mode.update_traitor_icons_removed(traitor_mind) /datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 18d36ad57f3..5fc01686200 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -288,7 +288,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha else H.LAssailant = owner while(do_mob(owner, H, 50)) - if(!(owner.mind in ticker.mode.vampires)) + if(!(owner.mind in SSticker.mode.vampires)) to_chat(owner, "Your fangs have disappeared!") return old_bloodtotal = bloodtotal @@ -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.") @@ -337,7 +345,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha /datum/game_mode/proc/remove_vampire(datum/mind/vampire_mind) if(vampire_mind in vampires) - ticker.mode.vampires -= vampire_mind + SSticker.mode.vampires -= vampire_mind vampire_mind.special_role = null vampire_mind.current.create_attack_log("De-vampired") if(vampire_mind.vampire) @@ -347,7 +355,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha to_chat(vampire_mind.current, "You have been turned into a robot! You can feel your powers fading away...") else to_chat(vampire_mind.current, "You have been brainwashed! You are no longer a vampire.") - ticker.mode.update_vampire_icons_removed(vampire_mind) + SSticker.mode.update_vampire_icons_removed(vampire_mind) //prepare for copypaste /datum/game_mode/proc/update_vampire_icons_added(datum/mind/vampire_mind) @@ -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 f78520ac7eb..7e1a375f15d 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -156,6 +156,7 @@ user.SetWeakened(0) user.SetStunned(0) user.SetParalysis(0) + user.SetSleeping(0) U.adjustStaminaLoss(-75) to_chat(user, "You flush your system with clean blood and remove any incapacitating effects.") spawn(1) @@ -226,6 +227,7 @@ target.Weaken(5) target.stuttering = 20 to_chat(target, "You are blinded by [user]'s glare.") + add_attack_logs(user, target, "(Vampire) Glared at") /obj/effect/proc_holder/spell/vampire/self/shapeshift name = "Shapeshift (50)" @@ -259,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!") @@ -275,7 +279,7 @@ /proc/isvampirethrall(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.vampire_enthralled) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.vampire_enthralled) /obj/effect/proc_holder/spell/vampire/targetted/enthrall name = "Enthrall (300)" @@ -314,11 +318,11 @@ if(!C.mind) to_chat(user, "[C.name]'s mind is not there for you to enthrall.") return 0 - if(enthrall_safe || ( C.mind in ticker.mode.vampires )||( C.mind.vampire )||( C.mind in ticker.mode.vampire_enthralled )) + if(enthrall_safe || ( C.mind in SSticker.mode.vampires )||( C.mind.vampire )||( C.mind in SSticker.mode.vampire_enthralled )) C.visible_message("[C] seems to resist the takeover!", "You feel a familiar sensation in your skull that quickly dissipates.") return 0 if(!affects(C)) - C.visible_message("[C] seems to resist the takeover!", "Your faith of [ticker.Bible_deity_name] has kept your mind clear of all evil.") + C.visible_message("[C] seems to resist the takeover!", "Your faith of [SSticker.Bible_deity_name] has kept your mind clear of all evil.") return 0 if(!ishuman(C)) to_chat(user, "You can only enthrall humans!") @@ -329,24 +333,32 @@ if(!istype(H)) return 0 var/ref = "\ref[user.mind]" - if(!(ref in ticker.mode.vampire_thralls)) - ticker.mode.vampire_thralls[ref] = list(H.mind) + if(!(ref in SSticker.mode.vampire_thralls)) + SSticker.mode.vampire_thralls[ref] = list(H.mind) else - ticker.mode.vampire_thralls[ref] += H.mind + SSticker.mode.vampire_thralls[ref] += H.mind - ticker.mode.update_vampire_icons_added(H.mind) - ticker.mode.update_vampire_icons_added(user.mind) + SSticker.mode.update_vampire_icons_added(H.mind) + SSticker.mode.update_vampire_icons_added(user.mind) var/datum/mindslaves/slaved = user.mind.som H.mind.som = slaved slaved.serv += H slaved.add_serv_hud(user.mind, "vampire")//handles master servent icons slaved.add_serv_hud(H.mind, "vampthrall") - ticker.mode.vampire_enthralled.Add(H.mind) - ticker.mode.vampire_enthralled[H.mind] = user.mind + SSticker.mode.vampire_enthralled.Add(H.mind) + SSticker.mode.vampire_enthralled[H.mind] = user.mind H.mind.special_role = SPECIAL_ROLE_VAMPIRE_THRALL - to_chat(H, "You have been Enthralled by [user]. Follow [user.p_their()] every command.") + + var/datum/objective/protect/serve_objective = new + serve_objective.owner = user.mind + serve_objective.target = H.mind + serve_objective.explanation_text = "You have been Enthralled by [user]. Follow [user.p_their()] every command." + H.mind.objectives += serve_objective + + to_chat(H, "You have been Enthralled by [user]. Follow [user.p_their()] every command.") to_chat(user, "You have successfully Enthralled [H]. If [H.p_they()] refuse[H.p_s()] to do as you say just adminhelp.") + H.Stun(2) add_attack_logs(user, H, "Vampire-thralled") @@ -437,9 +449,6 @@ steam.start() sleep(jaunt_duration) var/mobloc = get_turf(user.loc) - if(get_area(mobloc) == /area/security/armoury/gamma) - to_chat(user, "A strange energy repels you!") - mobloc = originalloc animation.loc = mobloc steam.location = mobloc steam.start() diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index dbe3146dd7f..1eedc354f5e 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -99,9 +99,9 @@ new_objective:target = H:mind new_objective.explanation_text = "Protect [H.real_name], the wizard." M.mind.objectives += new_objective - ticker.mode.traitors += M.mind + SSticker.mode.traitors += M.mind M.mind.special_role = SPECIAL_ROLE_WIZARD_APPRENTICE - ticker.mode.update_wiz_icons_added(M.mind) + SSticker.mode.update_wiz_icons_added(M.mind) M.faction = list("wizard") else used = 0 @@ -153,9 +153,13 @@ src.spawn_amt_left = spawn_amt src.desc = desc - processing_objects.Add(src) + START_PROCESSING(SSobj, src) //return +/obj/effect/rend/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + /obj/effect/rend/process() for(var/mob/M in loc) return @@ -279,7 +283,7 @@ var/global/list/multiverse = list() usr.mind.objectives += hijack_objective hijack_objective.explanation_text = "Ensure only [usr.real_name] and [usr.p_their()] copies are on the shuttle!" to_chat(usr, "Objective #[1]: [hijack_objective.explanation_text]") - ticker.mode.traitors += usr.mind + SSticker.mode.traitors += usr.mind usr.mind.special_role = "[usr.real_name] Prime" evil = TRUE else @@ -289,7 +293,7 @@ var/global/list/multiverse = list() new_objective.explanation_text = "Survive, and help defend the innocent from the mobs of multiverse clones." to_chat(usr, "Objective #[1]: [new_objective.explanation_text]") usr.mind.objectives += new_objective - ticker.mode.traitors += usr.mind + SSticker.mode.traitors += usr.mind usr.mind.special_role = "[usr.real_name] Prime" evil = FALSE else @@ -633,9 +637,9 @@ var/global/list/multiverse = list() if(M.stat != DEAD) to_chat(user, "This artifact can only affect the dead!") return - - if(!M.mind || !M.client) - to_chat(user, "There is no soul connected to this body...") + + if((!M.mind || !M.client) && !M.grab_ghost()) + to_chat(user,"There is no soul connected to this body...") return check_spooky()//clean out/refresh the list @@ -648,6 +652,7 @@ var/global/list/multiverse = list() else M.set_species(/datum/species/skeleton) M.visible_message(" A massive amount of flesh sloughs off [M] and a skeleton rises up!") + M.grab_ghost() // yoinks the ghost if its not in the body M.revive() equip_skeleton(M) spooky_scaries |= M @@ -728,9 +733,8 @@ var/global/list/multiverse = list() H.update_dna() H.update_body() - + H.grab_ghost() H.revive() - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/head/kitty(H), slot_head) H.equip_to_slot_or_del(new /obj/item/clothing/under/schoolgirl(H), slot_w_uniform) diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index bb62b7bebea..57a4f4e17de 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -3,36 +3,35 @@ config_tag = "raginmages" required_players = 20 use_huds = 1 + but_wait_theres_more = 1 var/max_mages = 0 - var/making_mage = 0 + var/making_mage = FALSE var/mages_made = 1 var/time_checked = 0 - var/players_per_mage = 6 // If the admin wants to tweak things or something - but_wait_theres_more = 1 + var/players_per_mage = 10 // If the admin wants to tweak things or something var/delay_per_mage = 4200 // Every 7 minutes by default var/time_till_chaos = 18000 // Half-hour in /datum/game_mode/wizard/raginmages/announce() to_chat(world, "The current game mode is - Ragin' Mages!") - to_chat(world, "The Space Wizard Federation is pissed, help defeat all the space wizards!") - + to_chat(world, "The Space Wizard Federation is pissed, crew must help defeat all the Space Wizards invading the station!") /datum/game_mode/wizard/raginmages/greet_wizard(var/datum/mind/wizard, var/you_are=1) if(you_are) to_chat(wizard.current, "You are the Space Wizard!") - to_chat(wizard.current, "The Space Wizards Federation has given you the following tasks:") + to_chat(wizard.current, "The Space Wizard Federation has given you the following tasks:") var/obj_count = 1 + to_chat(wizard.current, "Supreme Objective: Make sure the station pays for its actions against our diplomats. We might send more Wizards to the station if the situation is not developing in our favour.") for(var/datum/objective/objective in wizard.objectives) to_chat(wizard.current, "Objective #[obj_count]: [objective.explanation_text]") obj_count++ - to_chat(wizard.current, "Objective Alpha: Make sure the station pays for its actions against our diplomats") return /datum/game_mode/wizard/raginmages/check_finished() var/wizards_alive = 0 - // Accidental pun! - var/wizard_cap = (max_mages || (num_players_started() / players_per_mage)) + var/wizard_cap = CEILING((num_players_started() / players_per_mage), 1) + max_mages = wizard_cap for(var/datum/mind/wizard in wizards) if(isnull(wizard.current)) continue @@ -115,71 +114,44 @@ qdel(B) /datum/game_mode/wizard/raginmages/proc/make_more_mages() - if(making_mage || SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) - return 0 - making_mage = 1 - var/list/candidates = list() + return FALSE + making_mage = TRUE + + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as a raging Space Wizard?", ROLE_WIZARD, TRUE, poll_time = 20 SECONDS) var/mob/dead/observer/harry = null - spawn(rand(200, 600)) - message_admins("SWF is still pissed, sending another wizard - [max_mages - mages_made] left.") - //Protip: This returns clients, not ghosts - candidates = get_candidate_ghosts(ROLE_WIZARD) - if(!candidates.len) - message_admins("No applicable clients for the next ragin' mage, asking ghosts instead.") - var/time_passed = world.time - for(var/mob/dead/observer/G in GLOB.player_list) - if(!jobban_isbanned(G, "wizard") && !jobban_isbanned(G, "Syndicate")) - spawn(0) - switch(alert(G, "Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - continue - candidates += G - if("No") - continue - sleep(300) - if(!candidates.len) - message_admins("This is awkward, sleeping until another mage check...") - making_mage = 0 - return + message_admins("SWF is still pissed, sending another wizard - [max_mages - mages_made] left.") + + if(!candidates.len) + message_admins("This is awkward, sleeping until another mage check..") + making_mage = FALSE + sleep(300) + return + else + harry = pick(candidates) + making_mage = FALSE + if(harry) + var/mob/living/carbon/human/new_character= makeBody(harry) + new_character.mind.make_Wizard() // This puts them at the wizard spawn, worry not + mages_made++ + return TRUE else - candidates = shuffle(candidates) - for(var/mob/dead/observer/i in candidates) - if(!i) continue //Dont bother removing them from the list since we only grab one wizard - - // YER A WIZZERD HARRY - harry = i - break - - making_mage = 0 - if(harry) - var/mob/living/carbon/human/new_character= makeBody(harry) - - - new_character.mind.make_Wizard() // This puts them at the wizard spawn, worry not - mages_made++ - return 1 - else - log_runtime(EXCEPTION("The candidates list for ragin' mages contained non-observer entries!"), src) - return 0 + log_runtime(EXCEPTION("The candidates list for ragin' mages contained non-observer entries!"), src) + return FALSE // ripped from -tg-'s wizcode, because whee lets make a very general proc for a very specific gamemode // This probably wouldn't do half bad as a proc in __HELPERS // Lemme know if this causes species to mess up spectacularly or anything /datum/game_mode/wizard/raginmages/proc/makeBody(var/mob/dead/observer/G) - if(!G || !G.key) return // Let's not steal someone's soul here - + if(!G || !G.key) + return // Let's not steal someone's soul here var/mob/living/carbon/human/new_character = new(pick(latejoin)) - G.client.prefs.copy_to(new_character) - new_character.key = G.key - return new_character /datum/game_mode/wizard/raginmages/declare_completion() if(finished) - feedback_set_details("round_end_result","raging wizard loss - wizard killed") - to_chat(world, " The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget!") + feedback_set_details("round_end_result", "raging wizard loss - wizard killed") + to_chat(world, " The crew has managed to hold off the Wizard attack! The Space Wizard Federation has been taught a lesson they will not soon forget!") ..(1) diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index 9150f25736a..deb054f6d3e 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -1,12 +1,12 @@ -/mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic - var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","kinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam") +/mob/proc/rightandwrong(summon_type, revolver_fight = FALSE, fake_revolver_fight = FALSE) //0 = Summon Guns, 1 = Summon Magic + var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","kinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam", "fakerevolver") var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special") var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic") to_chat(usr, "You summoned [summon_type ? "magic" : "guns"]!") - message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]!") + message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]! ([revolver_fight ? "Revolver duel!" : ""] [fake_revolver_fight ? "Suicidal revolver duel!" : ""])") for(var/mob/living/carbon/human/H in GLOB.player_list) if(H.stat == 2 || !(H.client)) @@ -17,6 +17,13 @@ var/randomizeguns = pick(gunslist) var/randomizemagic = pick(magiclist) var/randomizemagicspecial = pick(magicspeciallist) + if(revolver_fight) + randomizeguns = "revolver" + if(fake_revolver_fight) + if(prob(50)) + randomizeguns = "revolver" + else + randomizeguns = "fakerevolver" if(!summon_type) switch(randomizeguns) if("taser") @@ -88,6 +95,8 @@ new /obj/item/gun/projectile/revolver/grenadelauncher(get_turf(H)) if("medibeam") new /obj/item/gun/medbeam(get_turf(H)) + if("fakerevolver") + new /obj/item/toy/russian_revolver/trick_revolver(get_turf(H)) //lol playsound(get_turf(H), 'sound/magic/summon_guns.ogg', 50, 1) else @@ -137,7 +146,8 @@ H.mutations.Add(XRAY) H.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) H.see_in_dark = 8 - H.see_invisible = SEE_INVISIBLE_LEVEL_TWO + H.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + H.update_sight() to_chat(H, "The walls suddenly disappear.") if("voodoo") new /obj/item/voodoo(get_turf(H)) diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 3e22f3f84df..a71b51c58f0 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -273,11 +273,11 @@ Z.key = A.key Z.faction |= "\ref[U]" if(iscultist(U)) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(Z.mind) + if(SSticker.mode.name == "cult") + SSticker.mode:add_cultist(Z.mind) else - ticker.mode.cult+=Z.mind - ticker.mode.update_cult_icons_added(Z.mind) + SSticker.mode.cult+=Z.mind + SSticker.mode.update_cult_icons_added(Z.mind) qdel(T) to_chat(Z, "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, create shield walls and even deflect energy weapons, and rip apart enemies and walls alike.") to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.") @@ -289,11 +289,11 @@ Z.key = A.key Z.faction |= "\ref[U]" if(iscultist(U)) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(Z.mind) + if(SSticker.mode.name == "cult") + SSticker.mode:add_cultist(Z.mind) else - ticker.mode.cult+=Z.mind - ticker.mode.update_cult_icons_added(Z.mind) + SSticker.mode.cult+=Z.mind + SSticker.mode.update_cult_icons_added(Z.mind) qdel(T) to_chat(Z, "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.") to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.") @@ -305,11 +305,11 @@ Z.key = A.key Z.faction |= "\ref[U]" if(iscultist(U)) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(Z.mind) + if(SSticker.mode.name == "cult") + SSticker.mode:add_cultist(Z.mind) else - ticker.mode.cult+=Z.mind - ticker.mode.update_cult_icons_added(Z.mind) + SSticker.mode.cult+=Z.mind + SSticker.mode.update_cult_icons_added(Z.mind) qdel(T) to_chat(Z, "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, use magic missile, repair allied constructs (by clicking on them), and most important of all create new constructs (Use your Artificer spell to summon a new construct shell and Summon Soulstone to create a new soulstone).") to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.") @@ -326,11 +326,11 @@ newstruct.faction |= "\ref[stoner]" newstruct.key = target.key if(stoner && iscultist(stoner) || cultoverride) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(newstruct.mind) + if(SSticker.mode.name == "cult") + SSticker.mode:add_cultist(newstruct.mind) else - ticker.mode.cult+=newstruct.mind - ticker.mode.update_cult_icons_added(newstruct.mind) + SSticker.mode.cult+=newstruct.mind + SSticker.mode.update_cult_icons_added(newstruct.mind) if(stoner && iswizard(stoner)) to_chat(newstruct, "You are still bound to serve your creator, follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.") else if(stoner && iscultist(stoner)) @@ -357,7 +357,7 @@ if(U) S.faction |= "\ref[U]" //Add the master as a faction, allowing inter-mob cooperation if(U && iscultist(U)) - ticker.mode.add_cultist(S.mind, 0) + SSticker.mode.add_cultist(S.mind, 0) S.cancel_camera() name = "soulstone: Shade of [T.real_name]" icon_state = "soulstone2" diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index e7893c3f84e..6f96d4c22e2 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -229,6 +229,12 @@ log_name = "LD" category = "Defensive" +/datum/spellbook_entry/lichdom/IsAvailible() + if(SSticker.mode.name == "ragin' mages") + return FALSE + else + return TRUE + /datum/spellbook_entry/lightningbolt name = "Lightning Bolt" spell_type = /obj/effect/proc_holder/spell/targeted/lightning @@ -333,7 +339,7 @@ user.mutations.Add(XRAY) user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) user.see_in_dark = 8 - user.see_invisible = SEE_INVISIBLE_LEVEL_TWO + user.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE to_chat(user, "The walls suddenly disappear.") return 1 @@ -398,8 +404,8 @@ name = "Bottle of Tickles" desc = "A bottle of magically infused fun, the smell of which will \ attract adorable extradimensional beings when broken. These beings \ - are similar to slaughter demons, but they do not permamently kill \ - their victims, instead putting them in an extradimensional hugspace, \ + are similar to slaughter demons, but are a little weaker and they do not permamently \ + kill their victims, instead putting them in an extradimensional hugspace, \ to be released on the demon's death. Chaotic, but not ultimately \ damaging. The crew's reaction to the other hand could be very \ destructive." @@ -409,8 +415,17 @@ limit = 3 category = "Assistance" +/datum/spellbook_entry/item/oozebottle + name = "Bottle of Ooze" + desc = "A bottle of magically infused ooze, which will awake an all-consuming Morph, capable of cunningly disguising itself as any object it comes in contact with and even casting some very basic spells. Be careful though, as Morph diet includes Wizards." + item_path = /obj/item/antag_spawner/morph + cost = 1 + log_name = "BO" + limit = 3 + category = "Assistance" + /datum/spellbook_entry/item/tarotdeck - name = "Tarot Deck" + name = "Guardian Deck" desc = "A deck of guardian tarot cards, capable of binding a personal guardian to your body. There are multiple types of guardian available, but all of them will transfer some amount of damage to you. \ It would be wise to avoid buying these with anything capable of causing you to swap bodies with others." item_path = /obj/item/guardiancreator @@ -430,14 +445,6 @@ item_path = /obj/item/twohanded/singularityhammer log_name = "SI" -/datum/spellbook_entry/item/cursed_heart - name = "Cursed Heart" - desc = "A heart that has been revived by dark magicks. The user must ensure the heart is manually beaten or their blood circulation will suffer, but every beat heals their injuries. It must beat every 6 seconds." - item_path = /obj/item/organ/internal/heart/cursed/wizard - log_name = "CH" - cost = 1 - category = "Defensive" - /datum/spellbook_entry/summon name = "Summon Stuff" category = "Rituals" @@ -460,20 +467,40 @@ dat += "Already cast!
" return dat +/datum/spellbook_entry/summon/ghosts + name = "Summon Ghosts" + desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilities to frustrate you." + cost = 0 + log_name = "SGH" + +/datum/spellbook_entry/summon/ghosts/IsAvailible() + if(!SSticker.mode) // In case spellbook is placed on map + return FALSE + if(SSticker.mode.name == "ragin' mages") + return FALSE + else + return TRUE + +/datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) + new /datum/event/wizard/ghost() + active = TRUE + to_chat(user, "You have cast summon ghosts!") + playsound(get_turf(user), 'sound/effects/ghost2.ogg', 50, 1) + return TRUE + /datum/spellbook_entry/summon/guns name = "Summon Guns" - category = "Rituals" - desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!" + desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long! You will also receive 1 extra point to use in your spellbook." cost = 0 log_name = "SG" /datum/spellbook_entry/summon/guns/IsAvailible() - if(!ticker.mode) // In case spellbook is placed on map - return 0 - if(ticker.mode.name == "ragin' mages") - return 0 + if(!SSticker.mode) // In case spellbook is placed on map + return FALSE + if(SSticker.mode.name == "ragin' mages") + return FALSE else - return 1 + return TRUE /datum/spellbook_entry/summon/guns/Buy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book) feedback_add_details("wizard_spell_learned",log_name) @@ -485,18 +512,17 @@ /datum/spellbook_entry/summon/magic name = "Summon Magic" - category = "Challenges" - desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time." + desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time. You will also receive 1 extra point to use in your spellbook." cost = 0 log_name = "SU" /datum/spellbook_entry/summon/magic/IsAvailible() - if(!ticker.mode) // In case spellbook is placed on map - return 0 - if(ticker.mode.name == "ragin' mages") - return 0 + if(!SSticker.mode) // In case spellbook is placed on map + return FALSE + if(SSticker.mode.name == "ragin' mages") + return FALSE else - return 1 + return TRUE /datum/spellbook_entry/summon/magic/Buy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book) feedback_add_details("wizard_spell_learned",log_name) @@ -584,9 +610,6 @@ dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" dat += "For spells: the number after the spell name is the cooldown time.
" dat += "You can reduce this number by spending more points on the spell.
" - if("Challenges") - dat += "The Wizard Federation typically has hard limits on the potency and number of spells brought to the station based on risk.
" - dat += "Arming the station against you will increases the risk, but will grant you one more charge for your spellbook.
" if("Rituals") dat += "These powerful spells change the very fabric of reality. Not always in your favour.
" return dat @@ -883,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/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index b249ebe8520..131afd84fff 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -7,9 +7,8 @@ required_players = 20 required_enemies = 1 recommended_enemies = 1 - free_golems_disabled = TRUE + var/use_huds = 1 - var/use_huds = 0 var/finished = 0 var/but_wait_theres_more = 0 @@ -17,7 +16,6 @@ to_chat(world, "The current game mode is - Wizard!") to_chat(world, "There is a SPACE WIZARD on the station. You can't let him achieve his objective!") - /datum/game_mode/wizard/can_start()//This could be better, will likely have to recode it later if(!..()) return 0 @@ -42,7 +40,6 @@ ..() return 1 - /datum/game_mode/wizard/post_setup() for(var/datum/mind/wizard in wizards) log_game("[key_name(wizard)] has been selected as a Wizard") @@ -58,7 +55,7 @@ /datum/game_mode/proc/remove_wizard(datum/mind/wizard_mind) if(wizard_mind in wizards) - ticker.mode.wizards -= wizard_mind + SSticker.mode.wizards -= wizard_mind wizard_mind.special_role = null wizard_mind.current.create_attack_log("De-wizarded") wizard_mind.current.spellremove(wizard_mind.current) @@ -67,14 +64,13 @@ to_chat(wizard_mind.current, "You have been turned into a robot! You can feel your magical powers fading away...") else to_chat(wizard_mind.current, "You have been brainwashed! You are no longer a wizard.") - ticker.mode.update_wiz_icons_removed(wizard_mind) + SSticker.mode.update_wiz_icons_removed(wizard_mind) /datum/game_mode/proc/update_wiz_icons_added(datum/mind/wiz_mind) var/datum/atom_hud/antag/wizhud = huds[ANTAG_HUD_WIZ] wizhud.join_hud(wiz_mind.current) set_antag_hud(wiz_mind.current, ((wiz_mind in wizards) ? "hudwizard" : "apprentice")) - /datum/game_mode/proc/update_wiz_icons_removed(datum/mind/wiz_mind) var/datum/atom_hud/antag/wizhud = huds[ANTAG_HUD_WIZ] wizhud.leave_hud(wiz_mind.current) @@ -86,7 +82,6 @@ wizard.objectives += wiz_objective return - /datum/game_mode/proc/name_wizard(mob/living/carbon/human/wizard_mob) //Allows the wizard to choose a custom name or go with a random one. Spawn 0 so it does not lag the round starting. var/wizard_name_first = pick(GLOB.wizard_first) @@ -104,7 +99,6 @@ wizard_mob.mind.name = newname return - /datum/game_mode/proc/greet_wizard(var/datum/mind/wizard, var/you_are=1) addtimer(CALLBACK(wizard.current, /mob/.proc/playsound_local, null, 'sound/ambience/antag/ragesmages.ogg', 100, 0), 30) if(you_are) @@ -117,7 +111,6 @@ obj_count++ return - /*/datum/game_mode/proc/learn_basic_spells(mob/living/carbon/human/wizard_mob) if(!istype(wizard_mob)) return @@ -165,23 +158,30 @@ wizard_mob.gene_stability += DEFAULT_GENE_STABILITY //magic return 1 - +// Checks if the game should end due to all wizards and apprentices being dead, or MMI'd/Borged /datum/game_mode/wizard/check_finished() var/wizards_alive = 0 var/traitors_alive = 0 + + // Wizards for(var/datum/mind/wizard in wizards) if(!istype(wizard.current,/mob/living/carbon)) continue if(wizard.current.stat==DEAD) continue + if(istype(wizard.current, /obj/item/mmi)) // wizard is in an MMI, don't count them as alive + continue wizards_alive++ + // Apprentices - classified as "traitors" if(!wizards_alive) for(var/datum/mind/traitor in traitors) if(!istype(traitor.current,/mob/living/carbon)) continue if(traitor.current.stat==DEAD) continue + if(istype(traitor.current, /obj/item/mmi)) // apprentice is in an MMI, don't count them as alive + continue traitors_alive++ if(wizards_alive || traitors_alive || but_wait_theres_more) @@ -190,8 +190,6 @@ finished = 1 return 1 - - /datum/game_mode/wizard/declare_completion(var/ragin = 0) if(finished && !ragin) feedback_set_details("round_end_result","wizard loss - wizard killed") @@ -199,7 +197,6 @@ ..() return 1 - /datum/game_mode/proc/auto_declare_completion_wizard() if(wizards.len) var/text = "
the wizards/witches were:" @@ -282,4 +279,4 @@ Made a proc so this is not repeated 14 (or more) times.*/ return 1 /proc/iswizard(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.wizards) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.wizards) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 7e3013658c8..a31f694f7fc 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -126,7 +126,7 @@ var/const/access_free_golems = 300 var/acc = M.get_access() //see mob.dm - if(acc == IGNORE_ACCESS) + if(acc == IGNORE_ACCESS || M.can_admin_interact()) return 1 //Mob ignores access else @@ -601,28 +601,29 @@ proc/get_all_job_icons() //For all existing HUD icons return GLOB.joblist + list("Prisoner") /obj/proc/GetJobName() //Used in secHUD icon generation - var/obj/item/card/id/I + var/assignmentName = "Unknown" + var/rankName = "Unknown" if(istype(src, /obj/item/pda)) var/obj/item/pda/P = src - I = P.id + assignmentName = P.ownjob + rankName = P.ownrank else if(istype(src, /obj/item/card/id)) - I = src + var/obj/item/card/id/I = src + assignmentName = I.assignment + rankName = I.rank + - if(I) - var/job_icons = get_all_job_icons() - var/centcom = get_all_centcom_jobs() + var/job_icons = get_all_job_icons() + var/centcom = get_all_centcom_jobs() - if(I.assignment in centcom) //Return with the NT logo if it is a Centcom job - return "Centcom" - if(I.rank in centcom) - return "Centcom" - - if(I.assignment in job_icons) //Check if the job has a hud icon - return I.assignment - if(I.rank in job_icons) - return I.rank - - else - return + if(assignmentName in centcom) //Return with the NT logo if it is a Centcom job + return "Centcom" + if(rankName in centcom) + return "Centcom" + if(assignmentName in job_icons) //Check if the job has a hud icon + return assignmentName + if(rankName in job_icons) + return rankName + return "Unknown" //Return unknown if none of the above apply diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index e2cffabcfd0..ecae6919813 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -18,8 +18,8 @@ access_heads, access_construction, access_sec_doors, access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_minisat, access_mechanic, access_mineral_storeroom) minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_ENGINEERING outfit = /datum/outfit/job/chief_engineer /datum/outfit/job/chief_engineer diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 61e458927e9..eebe4f2e9e4 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -235,9 +235,9 @@ return 1 /datum/outfit/job/proc/imprint_idcard(mob/living/carbon/human/H) - var/datum/job/J = job_master.GetJobType(jobtype) + var/datum/job/J = SSjobs.GetJobType(jobtype) if(!J) - J = job_master.GetJob(H.job) + J = SSjobs.GetJob(H.job) var/alt_title if(H.mind) @@ -256,6 +256,8 @@ if(H.mind && H.mind.initial_account) C.associated_account_number = H.mind.initial_account.account_number + C.owner_uid = H.UID() + C.owner_ckey = H.ckey /datum/outfit/job/proc/imprint_pda(mob/living/carbon/human/H) var/obj/item/pda/PDA = H.wear_pda @@ -265,3 +267,10 @@ PDA.ownjob = C.assignment PDA.ownrank = C.rank PDA.name = "PDA-[H.real_name] ([PDA.ownjob])" + +/datum/job/proc/would_accept_job_transfer_from_player(mob/player) + if(!guest_jobbans(title)) // actually checks if job is a whitelisted position + return TRUE + if(!istype(player)) + return FALSE + return is_job_whitelisted(player, title) diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index aaf1a61a2a1..49e6b4486ac 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -16,8 +16,8 @@ access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, access_keycard_auth, access_sec_doors, access_psychiatrist, access_maint_tunnels, access_paramedic, access_mineral_storeroom) minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_MEDICAL outfit = /datum/outfit/job/cmo /datum/outfit/job/cmo diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index a1711bf4fd8..435565434c8 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -18,8 +18,8 @@ access_research, access_robotics, access_xenobiology, access_ai_upload, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_minisat, access_maint_tunnels, access_mineral_storeroom, access_network) minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_SCIENCE // All science-y guys get bonuses for maxing out their tech. required_objectives = list( /datum/job_objective/further_research diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index b425532bf30..407393eb489 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -18,8 +18,8 @@ access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_pilot, access_weapons) minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_SECURITY disabilities_allowed = 0 outfit = /datum/outfit/job/hos diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index 0def40bc7b1..c239c1d3b3b 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -9,8 +9,8 @@ department_head = list("Captain") req_admin_notify = 1 minimal_player_age = 30 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_SILICON /datum/job/ai/equip(mob/living/carbon/human/H) if(!H) diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index 3cdbb9b7247..3208e9d3533 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -13,8 +13,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) access = list() //See get_access() minimal_access = list() //See get_access() minimal_player_age = 30 - exp_requirements = 2400 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_COMMAND disabilities_allowed = 0 outfit = /datum/outfit/job/captain @@ -24,7 +24,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) /datum/job/captain/announce(mob/living/carbon/human/H) . = ..() captain_announcement.Announce("All hands, Captain [H.real_name] on deck!") - callHook("captain_spawned", list("captain" = H)) + updateDisplaycase(H) /datum/outfit/job/captain name = "Captain" @@ -68,8 +68,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) req_admin_notify = 1 is_command = 1 minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_COMMAND access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index fe5d7799582..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") @@ -175,23 +175,56 @@ name = "Shaft Miner" jobtype = /datum/job/mining - uniform = /obj/item/clothing/under/rank/miner - gloves = /obj/item/clothing/gloves/fingerless - shoes = /obj/item/clothing/shoes/workboots + uniform = /obj/item/clothing/under/rank/miner/lavaland + gloves = /obj/item/clothing/gloves/color/black + shoes = /obj/item/clothing/shoes/workboots/mining l_ear = /obj/item/radio/headset/headset_cargo/mining id = /obj/item/card/id/supply - l_pocket = /obj/item/reagent_containers/food/pill/patch/styptic + l_pocket = /obj/item/reagent_containers/hypospray/autoinjector/survival r_pocket = /obj/item/flashlight/seclite pda = /obj/item/pda/shaftminer backpack_contents = list( - /obj/item/mining_voucher = 1, - /obj/item/storage/bag/ore = 1 + /obj/item/storage/bag/ore=1,\ + /obj/item/kitchen/knife/combat/survival=1,\ + /obj/item/mining_voucher=1,\ + /obj/item/stack/marker_beacon/ten=1 + ) + + 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/industrial - satchel = /obj/item/storage/backpack/satchel_eng + 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/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index 73ec2483af1..ac393e277a8 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -158,11 +158,11 @@ to_chat(H, "Welp, out of time, buddy. You're stuck. Next time choose faster.") accepted = 1 - if(ticker) - ticker.Bible_icon_state = B.icon_state - ticker.Bible_item_state = B.item_state - ticker.Bible_name = B.name - ticker.Bible_deity_name = B.deity_name + if(SSticker) + SSticker.Bible_icon_state = B.icon_state + SSticker.Bible_item_state = B.item_state + SSticker.Bible_name = B.name + SSticker.Bible_deity_name = B.deity_name feedback_set_details("religion_deity", "[new_deity]") feedback_set_details("religion_book", "[new_book_style]") diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index fa13fbdb4b7..359981ded4f 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -72,7 +72,7 @@ var/global/list/role_playtime_requirements = list( jtext = "-" if(C.mob.mind && C.mob.mind.assigned_role) - theirjob = job_master.GetJob(C.mob.mind.assigned_role) + theirjob = SSjobs.GetJob(C.mob.mind.assigned_role) if(theirjob) jtext = theirjob.title msg += "
" @@ -100,6 +100,7 @@ var/global/list/role_playtime_requirements = list( // Procs /proc/role_available_in_playtime(client/C, role) + // "role" is a special role defined in role_playtime_requirements above. e.g: ROLE_ERT. This is *not* a job title. if(!C) return 0 if(!role) @@ -121,6 +122,7 @@ var/global/list/role_playtime_requirements = list( return req_mins return max(0, req_mins - my_exp) + /datum/job/proc/available_in_playtime(client/C) if(!C) return 0 @@ -178,7 +180,7 @@ var/global/list/role_playtime_requirements = list( if(config.use_exp_restrictions) var/list/jobs_locked = list() var/list/jobs_unlocked = list() - for(var/datum/job/job in job_master.occupations) + for(var/datum/job/job in SSjobs.occupations) if(job.exp_requirements && job.exp_type) if(!job.available_in_playtime(mob.client)) jobs_unlocked += job.title @@ -255,13 +257,19 @@ var/global/list/role_playtime_requirements = list( play_records[rtype] = text2num(read_records[rtype]) else play_records[rtype] = 0 - if(mob.stat == CONSCIOUS && mob.mind.assigned_role) + var/myrole + if(mob.mind) + if(mob.mind.playtime_role) + myrole = mob.mind.playtime_role + else if(mob.mind.assigned_role) + myrole = mob.mind.assigned_role + if(mob.stat == CONSCIOUS && myrole) play_records[EXP_TYPE_LIVING] += minutes if(announce_changes) to_chat(mob,"You got: [minutes] Living EXP!") for(var/category in exp_jobsmap) if(exp_jobsmap[category]["titles"]) - if(mob.mind.assigned_role in exp_jobsmap[category]["titles"]) + if(myrole in exp_jobsmap[category]["titles"]) play_records[category] += minutes if(announce_changes) to_chat(mob,"You got: [minutes] [category] EXP!") @@ -284,12 +292,3 @@ var/global/list/role_playtime_requirements = list( log_game("SQL ERROR during exp_update_client write. Error : \[[err]\]\n") message_admins("SQL ERROR during exp_update_client write. Error : \[[err]\]\n") return - -/hook/roundstart/proc/exptimer() - if(!config.sql_enabled || !config.use_exp_tracking) - return 1 - spawn(0) - while(TRUE) - sleep(5 MINUTES) - update_exp(5,0) - return 1 diff --git a/code/game/jobs/job_objective.dm b/code/game/jobs/job_objective.dm index 90bac6d8383..48fa911bcf5 100644 --- a/code/game/jobs/job_objective.dm +++ b/code/game/jobs/job_objective.dm @@ -44,12 +44,12 @@ /datum/game_mode/proc/declare_job_completion() var/text = "
Job Completion" - for(var/datum/mind/employee in ticker.minds) + for(var/datum/mind/employee in SSticker.minds) if(!employee.job_objectives.len)//If the employee had no objectives, don't need to process this. continue - if(employee.assigned_role == employee.special_role) //If the character is an offstation character, skip them. + if(employee.assigned_role == employee.special_role || employee.offstation_role) //If the character is an offstation character, skip them. continue var/tasks_completed=0 diff --git a/code/game/jobs/job_scaling.dm b/code/game/jobs/job_scaling.dm index 89bd8374351..90d55b03444 100644 --- a/code/game/jobs/job_scaling.dm +++ b/code/game/jobs/job_scaling.dm @@ -5,7 +5,7 @@ if(playercount >= highpop_trigger) log_debug("Playercount: [playercount] versus trigger: [highpop_trigger] - loading highpop job config"); - job_master.LoadJobs("config/jobs_highpop.txt") + SSjobs.LoadJobs("config/jobs_highpop.txt") else log_debug("Playercount: [playercount] versus trigger: [highpop_trigger] - keeping standard job config"); return 1 \ No newline at end of file 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/Sleeper.dm b/code/game/machinery/Sleeper.dm index 917c198af2f..c447ff26e72 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -149,7 +149,7 @@ occupantData["stat"] = occupant.stat occupantData["health"] = occupant.health occupantData["maxHealth"] = occupant.maxHealth - occupantData["minHealth"] = config.health_threshold_dead + occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD occupantData["bruteLoss"] = occupant.getBruteLoss() occupantData["oxyLoss"] = occupant.getOxyLoss() occupantData["toxLoss"] = occupant.getToxLoss() diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 679af70526e..b7e24014f1e 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -459,8 +459,8 @@ organData["germ_level"] = I.germ_level organData["damage"] = I.damage organData["maxHealth"] = I.max_damage - organData["bruised"] = I.min_broken_damage - organData["broken"] = I.min_bruised_damage + organData["bruised"] = I.min_bruised_damage + organData["broken"] = I.min_broken_damage organData["robotic"] = I.is_robotic() organData["dead"] = (I.status & ORGAN_DEAD) diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 8a65da977ae..71202f8c536 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -1,8 +1,9 @@ /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 armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0) var/uses = 20 @@ -16,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 @@ -55,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)) @@ -69,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/alarm.dm b/code/game/machinery/alarm.dm index db5c2b6e9c3..52cd5bdfee8 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -81,12 +81,13 @@ power_channel = ENVIRON req_one_access = list(access_atmospherics, access_engine_equip) armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100) + siemens_strength = 1 var/alarm_id = null var/frequency = ATMOS_VENTSCRUB //var/skipprocess = 0 //Experimenting var/alarm_frequency = ATMOS_FIRE_FREQ - var/remote_control = 0 - var/rcon_setting = 2 + var/remote_control = TRUE + var/rcon_setting = RCON_AUTO var/rcon_time = 0 var/locked = 1 var/datum/wires/alarm/wires = null @@ -97,7 +98,7 @@ // Waiting on a device to respond. // Specifies an id_tag. NULL means we aren't waiting. - var/waiting_on_device=null + var/waiting_on_device = null var/mode = AALARM_MODE_SCRUBBING var/preset = AALARM_PRESET_HUMAN @@ -116,12 +117,18 @@ var/list/TLV = list() - var/report_danger_level = 1 + var/report_danger_level = TRUE - var/automatic_emergency = 1 //Does the alarm automaticly respond to an emergency condition + var/automatic_emergency = TRUE //Does the alarm automaticly respond to an emergency condition /obj/machinery/alarm/monitor - report_danger_level = 0 + report_danger_level = FALSE + +/obj/machinery/alarm/syndicate //general syndicate access + report_danger_level = FALSE + remote_control = FALSE + req_access = list(access_syndicate) + req_one_access = list() /obj/machinery/alarm/monitor/server preset = AALARM_PRESET_SERVER @@ -212,8 +219,8 @@ /obj/machinery/alarm/Destroy() GLOB.air_alarms -= src - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null air_alarm_repository.update_cache(src) QDEL_NULL(wires) @@ -374,38 +381,6 @@ if(ATMOS_ALARM_DANGER) icon_state = "alarm1" -/obj/machinery/alarm/receive_signal(datum/signal/signal) - if(stat & (NOPOWER|BROKEN) || !alarm_area) - return - if(alarm_area.master_air_alarm != src) - if(master_is_operating()) - return - elect_master() - if(alarm_area.master_air_alarm != src) - return - if(!signal || signal.encryption) - return - var/id_tag = signal.data["tag"] - if(!id_tag) - return - if(signal.data["area"] != area_uid) - return - if(signal.data["sigtype"] != "status") - return - - var/dev_type = signal.data["device"] - if(!(id_tag in alarm_area.air_scrub_names) && !(id_tag in alarm_area.air_vent_names)) - register_env_machine(id_tag, dev_type) - var/got_update=0 - if(dev_type == "AScr") - alarm_area.air_scrub_info[id_tag] = signal.data - got_update=1 - else if(dev_type == "AVP") - alarm_area.air_vent_info[id_tag] = signal.data - got_update=1 - if(got_update && waiting_on_device==id_tag) - waiting_on_device=null - /obj/machinery/alarm/proc/register_env_machine(var/m_id, var/device_type) var/new_name if(device_type=="AVP") @@ -432,9 +407,9 @@ send_signal(id_tag, list("status") ) /obj/machinery/alarm/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_TO_AIRALARM) + radio_connection = SSradio.add_object(src, frequency, RADIO_TO_AIRALARM) /obj/machinery/alarm/proc/send_signal(var/target, var/list/command)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise if(!radio_connection) @@ -571,7 +546,7 @@ update_icon() /obj/machinery/alarm/proc/post_alert(alert_level) - var/datum/radio_frequency/frequency = radio_controller.return_frequency(alarm_frequency) + var/datum/radio_frequency/frequency = SSradio.return_frequency(alarm_frequency) if(!frequency) return diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 61547f270bf..1d0b8dde152 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -121,9 +121,9 @@ /obj/machinery/air_sensor/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) /obj/machinery/air_sensor/Initialize() ..() @@ -132,8 +132,8 @@ /obj/machinery/air_sensor/Destroy() SSair.atmos_machinery -= src - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() @@ -156,8 +156,8 @@ var/datum/radio_frequency/radio_connection /obj/machinery/computer/general_air_control/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() @@ -268,9 +268,9 @@ return output /obj/machinery/computer/general_air_control/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) /obj/machinery/computer/general_air_control/Initialize() ..() @@ -357,7 +357,7 @@ return O:id_tag in sensors /obj/machinery/computer/general_air_control/linkWith(mob/user, obj/O, link/context) - sensors[O:id_tag] = reject_bad_name(input(user, "Choose a sensor label:", "Sensor Label") as text|null, allow_numbers=1) + sensors[O:id_tag] = reject_bad_name(clean_input(user, "Choose a sensor label:", "Sensor Label"), allow_numbers=1) return 1 /obj/machinery/computer/general_air_control/large_tank_control diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 95e609ee524..e392b468557 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -371,7 +371,15 @@ update_flag SSnanoui.update_uis(src) // Update all NanoUIs attached to src - +/obj/machinery/portable_atmospherics/canister/replace_tank(mob/living/user, close_valve) + . = ..() + if(.) + if(close_valve) + valve_open = FALSE + update_icon() + investigate_log("Valve was closed by [key_name(user)].
", "atmos") + else if(valve_open && holding) + investigate_log("[key_name(user)] started a transfer into [holding].
", "atmos") /obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob) src.add_hiddenprint(user) diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index dba1d942e2d..4777cdcc5f2 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -3,6 +3,9 @@ desc = "It measures something." icon = 'icons/obj/meter.dmi' icon_state = "meterX" + + layer = GAS_PUMP_LAYER + var/obj/machinery/atmospherics/pipe/target = null anchored = TRUE armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100) @@ -65,7 +68,7 @@ icon_state = "meter4" if(frequency) - var/datum/radio_frequency/radio_connection = radio_controller.return_frequency(frequency) + var/datum/radio_frequency/radio_connection = SSradio.return_frequency(frequency) if(!radio_connection) return diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index dfecc3a4409..71e1310f96b 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -82,16 +82,49 @@ /obj/machinery/portable_atmospherics/portableConnectorReturnAir() return air_contents -/obj/machinery/portable_atmospherics/attackby(var/obj/item/W as obj, var/mob/user as mob, params) - if((istype(W, /obj/item/tank) && !( src.destroyed ))) - if(src.holding) - return - var/obj/item/tank/T = W - user.drop_item() - T.loc = src - src.holding = T - update_icon() +/obj/machinery/portable_atmospherics/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") return + if(!in_range(src, user)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + if(holding) + to_chat(user, "You remove [holding] from [src].") + replace_tank(user, TRUE) + +/obj/machinery/portable_atmospherics/examine(mob/user) + ..() + if(holding) + to_chat(user, "\The [src] contains [holding]. Alt-click [src] to remove it.") + +/obj/machinery/portable_atmospherics/proc/replace_tank(mob/living/user, close_valve, obj/item/tank/new_tank) + if(holding) + holding.forceMove(drop_location()) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(holding) + if(new_tank) + holding = new_tank + else + holding = null + update_icon() + return TRUE + +/obj/machinery/portable_atmospherics/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/tank)) + if(!(stat & BROKEN)) + if(!user.drop_item()) + return + var/obj/item/tank/T = W + user.drop_item() + if(src.holding) + to_chat(user, "[holding ? "In one smooth motion you pop [holding] out of [src]'s connector and replace it with [T]" : "You insert [T] into [src]"].") + replace_tank(user, FALSE) + T.loc = src + src.holding = T + update_icon() + return else if(istype(W, /obj/item/wrench)) if(connected_port) diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index a7680e815ff..5bd441f6748 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -95,6 +95,16 @@ /obj/machinery/portable_atmospherics/pump/return_air() return air_contents +/obj/machinery/portable_atmospherics/pump/replace_tank(mob/living/user, close_valve) + . = ..() + if(.) + if(close_valve) + if(on) + on = FALSE + update_icon() + else if(on && holding && direction_out) + investigate_log("[key_name(user)] started a transfer into [holding].
", "atmos") + /obj/machinery/portable_atmospherics/pump/attack_ai(var/mob/user as mob) src.add_hiddenprint(user) return src.attack_hand(user) @@ -139,10 +149,14 @@ if(href_list["power"]) on = !on + if(on && direction_out) + investigate_log("[key_name(usr)] started a transfer into [holding].
", "atmos") update_icon() if(href_list["direction"]) direction_out = !direction_out + if(on && holding) + investigate_log("[key_name(usr)] started a transfer into [holding].
", "atmos") if(href_list["remove_tank"]) if(holding) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index a76bd387ac7..b968a4bd5f8 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -33,7 +33,7 @@ pixel_x = 25 if(WEST) pixel_x = -25 - if(radio_controller) + if(SSradio) set_frequency(frequency) /obj/machinery/driver_button/Initialize() @@ -41,14 +41,14 @@ set_frequency(frequency) /obj/machinery/driver_button/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_LOGIC) + radio_connection = SSradio.add_object(src, frequency, RADIO_LOGIC) return /obj/machinery/driver_button/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 7535381197a..d59aca72145 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -295,10 +295,12 @@ to_chat(O, "The screen bursts into static.") /obj/machinery/camera/proc/triggerCameraAlarm() - camera_alarm.triggerAlarm(loc, src) + if(is_station_contact(z)) + SSalarms.camera_alarm.triggerAlarm(loc, src) /obj/machinery/camera/proc/cancelCameraAlarm() - camera_alarm.clearAlarm(loc, src) + if(is_station_contact(z)) + SSalarms.camera_alarm.clearAlarm(loc, src) /obj/machinery/camera/proc/can_use() if(!status) @@ -382,14 +384,17 @@ user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2) /obj/machinery/camera/update_remote_sight(mob/living/user) - user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras if(isXRay()) user.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) user.see_in_dark = max(user.see_in_dark, 8) + user.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE else - user.sight = 0 - user.see_in_dark = 2 - return 1 + user.sight = initial(user.sight) + user.see_in_dark = initial(user.see_in_dark) + user.lighting_alpha = initial(user.lighting_alpha) + + ..() + return TRUE /obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets. var/turf/prev_turf diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index eeb9eeb60d3..312e4cf577e 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -43,19 +43,20 @@ /obj/machinery/camera/proc/cancelAlarm() if(!status || (stat & NOPOWER)) - return 0 - if(detectTime == -1) - motion_alarm.clearAlarm(loc, src) + return FALSE + if(detectTime == -1 && is_station_contact(z)) + SSalarms.motion_alarm.clearAlarm(loc, src) detectTime = 0 - return 1 + return TRUE /obj/machinery/camera/proc/triggerAlarm() if(!status || (stat & NOPOWER)) - return 0 - if(!detectTime) return 0 - motion_alarm.triggerAlarm(loc, src) + return FALSE + if(!detectTime || !is_station_contact(z)) + return FALSE + SSalarms.motion_alarm.triggerAlarm(loc, src) detectTime = -1 - return 1 + return TRUE /obj/machinery/camera/HasProximity(atom/movable/AM as mob|obj) // Motion cameras outside of an "ai monitored" area will use this to detect stuff. diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 17a27812499..1d05204e381 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -34,7 +34,7 @@ var/obj/effect/countdown/clonepod/countdown - var/list/brine_types = list("corazone", "salbutamol", "hydrocodone") + var/list/brine_types = list("corazone", "perfluorodecalin", "epinephrine", "salglu_solution") //stops heart attacks, heart failure, shock, and keeps their O2 levels normal var/list/missing_organs var/organs_number = 0 @@ -341,7 +341,7 @@ check_brine() //Also heal some oxyloss ourselves just in case!! - occupant.adjustOxyLoss(-4) + occupant.adjustOxyLoss(-10) use_power(7500) //This might need tweaking. @@ -416,25 +416,24 @@ /obj/machinery/clonepod/proc/update_clone_antag(var/mob/living/carbon/human/H) // Check to see if the clone's mind is an antagonist of any kind and handle them accordingly to make sure they get their spells, HUD/whatever else back. - callHook("clone", list(H)) - if((H.mind in ticker.mode:revolutionaries) || (H.mind in ticker.mode:head_revolutionaries)) - ticker.mode.update_rev_icons_added() //So the icon actually appears - if(H.mind in ticker.mode.syndicates) - ticker.mode.update_synd_icons_added() - if(H.mind in ticker.mode.cult) - ticker.mode.add_cultist(occupant.mind) - ticker.mode.update_cult_icons_added() //So the icon actually appears - ticker.mode.update_cult_comms_added(H.mind) //So the comms actually appears - if((H.mind in ticker.mode.implanter) || (H.mind in ticker.mode.implanted)) - ticker.mode.update_traitor_icons_added(H.mind) //So the icon actually appears + if((H.mind in SSticker.mode:revolutionaries) || (H.mind in SSticker.mode:head_revolutionaries)) + SSticker.mode.update_rev_icons_added() //So the icon actually appears + if(H.mind in SSticker.mode.syndicates) + SSticker.mode.update_synd_icons_added() + if(H.mind in SSticker.mode.cult) + SSticker.mode.add_cultist(occupant.mind) + SSticker.mode.update_cult_icons_added() //So the icon actually appears + SSticker.mode.update_cult_comms_added(H.mind) //So the comms actually appears + if((H.mind in SSticker.mode.implanter) || (H.mind in SSticker.mode.implanted)) + SSticker.mode.update_traitor_icons_added(H.mind) //So the icon actually appears if(H.mind.vampire) H.mind.vampire.update_owner(H) - if((H.mind in ticker.mode.vampire_thralls) || (H.mind in ticker.mode.vampire_enthralled)) - ticker.mode.update_vampire_icons_added(H.mind) - if(H.mind in ticker.mode.changelings) - ticker.mode.update_change_icons_added(H.mind) - if((H.mind in ticker.mode.shadowling_thralls) || (H.mind in ticker.mode.shadows)) - ticker.mode.update_shadow_icons_added(H.mind) + if((H.mind in SSticker.mode.vampire_thralls) || (H.mind in SSticker.mode.vampire_enthralled)) + SSticker.mode.update_vampire_icons_added(H.mind) + if(H.mind in SSticker.mode.changelings) + SSticker.mode.update_change_icons_added(H.mind) + if((H.mind in SSticker.mode.shadowling_thralls) || (H.mind in SSticker.mode.shadows)) + SSticker.mode.update_shadow_icons_added(H.mind) //Put messages in the connected computer's temp var for display. /obj/machinery/clonepod/proc/connected_message(message) @@ -449,10 +448,14 @@ /obj/machinery/clonepod/proc/go_out() countdown.stop() - + var/turf/T = get_turf(src) if(mess) //Clean that mess and dump those gibs! - mess = 0 - gibs(loc) + for(var/i in missing_organs) + var/obj/I = i + I.forceMove(T) + missing_organs.Cut() + mess = FALSE + new /obj/effect/gibspawner/generic(get_turf(src), occupant) playsound(loc, 'sound/effects/splat.ogg', 50, 1) update_icon() return @@ -476,10 +479,13 @@ for(var/i in missing_organs) qdel(i) missing_organs.Cut() - occupant.forceMove(get_turf(src)) + occupant.SetLoseBreath(0) // Stop friggin' dying, gosh damn + occupant.setOxyLoss(0) + for(var/datum/disease/critical/crit in occupant.viruses) + crit.cure() + occupant.forceMove(T) occupant.update_body() domutcheck(occupant) //Waiting until they're out before possible notransform. - occupant.shock_stage = 0 //Reset Shock occupant.special_post_clone_handling() occupant = null update_icon() diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index c338a0f32c9..c4c8d342aeb 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -112,7 +112,7 @@ occupantData["stat"] = occupant.stat occupantData["health"] = occupant.health occupantData["maxHealth"] = occupant.maxHealth - occupantData["minHealth"] = config.health_threshold_dead + occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD occupantData["bruteLoss"] = occupant.getBruteLoss() occupantData["oxyLoss"] = occupant.getOxyLoss() occupantData["toxLoss"] = occupant.getToxLoss() diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 67f1dba85f0..38cc0b56866 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -134,8 +134,8 @@ return if(P:brainmob.mind) - ticker.mode.remove_cultist(P:brainmob.mind, 1) - ticker.mode.remove_revolutionary(P:brainmob.mind, 1) + SSticker.mode.remove_cultist(P:brainmob.mind, 1) + SSticker.mode.remove_revolutionary(P:brainmob.mind, 1) user.drop_item() P.loc = src diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 22a376968d0..e6a57f4a875 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -25,12 +25,7 @@ ui_interact(user) /obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob) - var/datum/game_mode/nations/mode = get_nations_mode() - if(!mode) - ui_interact(user) - else - if(mode.kickoff) - to_chat(user, "You have been locked out from this console!") + ui_interact(user) /obj/machinery/computer/aifixer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 6d360a2ddb3..741a4725c8d 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -470,7 +470,7 @@ M.nutrition -= 50 //lose a lot of food var/turf/location = usr.loc if(istype(location, /turf/simulated)) - location.add_vomit_floor(src, 1) + location.add_vomit_floor(TRUE) if(ORION_TRAIL_FLUX) if(prob(75)) M.Weaken(3) @@ -484,7 +484,7 @@ playsound(src.loc, 'sound/effects/bang.ogg', 100, 1) var/turf/simulated/floor/F for(F in orange(1, src)) - F.ChangeTurf(/turf/space) + F.ChangeTurf(F.baseturf) atom_say("Something slams into the floor around [src], exposing it to space!") if(hull) sleep(10) diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index f2137d2ee8f..f8c2979e043 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -12,10 +12,10 @@ var/global/list/minor_air_alarms = list() /obj/machinery/computer/atmos_alert/New() ..() - atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon) + SSalarms.atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon) /obj/machinery/computer/atmos_alert/Destroy() - atmosphere_alarm.unregister(src) + SSalarms.atmosphere_alarm.unregister(src) return ..() /obj/machinery/computer/atmos_alert/attack_hand(mob/user) @@ -33,10 +33,10 @@ var/global/list/minor_air_alarms = list() var/major_alarms[0] var/minor_alarms[0] - for(var/datum/alarm/alarm in atmosphere_alarm.major_alarms()) + for(var/datum/alarm/alarm in SSalarms.atmosphere_alarm.major_alarms()) major_alarms[++major_alarms.len] = list("name" = sanitize(alarm.alarm_name()), "ref" = "\ref[alarm]") - for(var/datum/alarm/alarm in atmosphere_alarm.minor_alarms()) + for(var/datum/alarm/alarm in SSalarms.atmosphere_alarm.minor_alarms()) minor_alarms[++minor_alarms.len] = list("name" = sanitize(alarm.alarm_name()), "ref" = "\ref[alarm]") data["priority_alarms"] = major_alarms @@ -45,11 +45,11 @@ var/global/list/minor_air_alarms = list() return data /obj/machinery/computer/atmos_alert/update_icon() - var/list/alarms = atmosphere_alarm.major_alarms() + var/list/alarms = SSalarms.atmosphere_alarm.major_alarms() if(alarms.len) icon_screen = "alert:2" else - alarms = atmosphere_alarm.minor_alarms() + alarms = SSalarms.atmosphere_alarm.minor_alarms() if(alarms.len) icon_screen = "alert:1" else @@ -61,7 +61,7 @@ var/global/list/minor_air_alarms = list() return 1 if(href_list["clear_alarm"]) - var/datum/alarm/alarm = locate(href_list["clear_alarm"]) in atmosphere_alarm.alarms + var/datum/alarm/alarm = locate(href_list["clear_alarm"]) in SSalarms.atmosphere_alarm.alarms if(alarm) for(var/datum/alarm_source/alarm_source in alarm.sources) var/obj/machinery/alarm/air_alarm = alarm_source.source diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 2b294db78c9..a34a49ca051 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -56,6 +56,17 @@ /obj/item/circuitboard/machine board_type = "machine" +/obj/item/circuitboard/examine(mob/user) + ..() + if(LAZYLEN(req_components)) + var/list/nice_list = list() + for(var/B in req_components) + var/atom/A = B + if(!ispath(A)) + continue + nice_list += list("[req_components[A]] [initial(A.name)]") + to_chat(user,"Required components: [english_list(nice_list)].") + /obj/item/circuitboard/message_monitor name = "Circuit board (Message Monitor)" build_path = /obj/machinery/computer/message_monitor @@ -207,6 +218,10 @@ name = "Circuit board (Power Monitor)" build_path = /obj/machinery/computer/monitor origin_tech = "programming=2;powerstorage=2" +/obj/item/circuitboard/powermonitor/secret + name = "Circuit board (Outdated Power Monitor)" + build_path = /obj/machinery/computer/monitor/secret + origin_tech = "programming=2;powerstorage=2" /obj/item/circuitboard/olddoor name = "Circuit board (DoorMex)" build_path = /obj/machinery/computer/pod/old @@ -319,9 +334,6 @@ /obj/item/circuitboard/white_ship name = "circuit Board (White Ship)" build_path = /obj/machinery/computer/shuttle/white_ship -/obj/item/circuitboard/golem_ship - name = "circuit Board (Golem Ship)" - build_path = /obj/machinery/computer/shuttle/golem_ship /obj/item/circuitboard/shuttle/syndicate name = "circuit board (Syndicate Shuttle)" build_path = /obj/machinery/computer/shuttle/syndicate @@ -331,7 +343,9 @@ /obj/item/circuitboard/shuttle/syndicate/drop_pod name = "circuit board (Syndicate Drop Pod)" build_path = /obj/machinery/computer/shuttle/syndicate/drop_pod - +/obj/item/circuitboard/shuttle/golem_ship + name = "circuit Board (Golem Ship)" + build_path = /obj/machinery/computer/shuttle/golem_ship /obj/item/circuitboard/HolodeckControl name = "Circuit board (Holodeck Control)" diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 92e06641204..42c371fc4ee 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -24,7 +24,7 @@ available_networks["Mining Outpost"] = list(access_qm,access_hop,access_hos,access_captain) available_networks["Research"] = list(access_rd,access_hos,access_captain) available_networks["Prison"] = list(access_hos,access_captain) - available_networks["Labor"] = list(access_hos,access_captain) + available_networks["Labor Camp"] = list(access_hos,access_captain) available_networks["Interrogation"] = list(access_hos,access_captain) available_networks["Atmosphere Alarms"] = list(access_ce,access_hos,access_captain) available_networks["Fire Alarms"] = list(access_ce,access_hos,access_captain) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 4cde71a4705..86515e5ddea 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -66,20 +66,21 @@ var/time_last_changed_position = 0 /obj/machinery/computer/card/proc/get_target_rank() return modify && modify.assignment ? modify.assignment : "Unassigned" -/obj/machinery/computer/card/proc/format_jobs(list/jobs) +/obj/machinery/computer/card/proc/format_jobs(list/jobs, targetrank, list/jobformats) var/list/formatted = list() for(var/job in jobs) - if(job_in_department(job_master.GetJob(job))) + if(job_in_department(SSjobs.GetJob(job))) formatted.Add(list(list( "display_name" = replacetext(job, " ", " "), - "target_rank" = get_target_rank(), - "job" = job))) + "target_rank" = targetrank, + "job" = job, + "jlinkformat" = jobformats[job] ? jobformats[job] : null))) return formatted /obj/machinery/computer/card/proc/format_job_slots() var/list/formatted = list() - for(var/datum/job/job in job_master.occupations) + for(var/datum/job/job in SSjobs.occupations) if(job_blacklisted_full(job)) continue if(!job_in_department(job)) @@ -117,12 +118,14 @@ var/time_last_changed_position = 0 if(!usr.get_active_hand() && Adjacent(usr)) usr.put_in_hands(scan) scan = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else if(modify) to_chat(usr, "You remove \the [modify] from \the [src].") modify.forceMove(get_turf(src)) if(!usr.get_active_hand() && Adjacent(usr)) usr.put_in_hands(modify) modify = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else to_chat(usr, "There is nothing to remove from the console.") @@ -134,10 +137,12 @@ var/time_last_changed_position = 0 user.drop_item() id_card.loc = src scan = id_card + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else if(!modify) user.drop_item() id_card.loc = src modify = id_card + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) SSnanoui.update_uis(src) attack_hand(user) @@ -166,7 +171,7 @@ var/time_last_changed_position = 0 /obj/machinery/computer/card/proc/can_close_job(datum/job/job) if(job) if(!job_blacklisted_full(job) && !job_blacklisted_partial(job) && job_in_department(job, FALSE)) - if(job.total_positions > job.current_positions && !(job in job_master.prioritized_jobs)) + if(job.total_positions > job.current_positions && !(job in SSjobs.prioritized_jobs)) var/delta = (world.time / 10) - time_last_changed_position if((change_position_cooldown < delta) || (opened_positions[job.title] > 0)) return 1 @@ -177,10 +182,10 @@ var/time_last_changed_position = 0 /obj/machinery/computer/card/proc/can_prioritize_job(datum/job/job) if(job) if(!job_blacklisted_full(job) && job_in_department(job, FALSE)) - if(job in job_master.prioritized_jobs) + if(job in SSjobs.prioritized_jobs) return 2 else - if(job_master.prioritized_jobs.len >= 3) + if(SSjobs.prioritized_jobs.len >= 3) return 0 if(job.total_positions <= job.current_positions) return 0 @@ -205,7 +210,7 @@ var/time_last_changed_position = 0 /obj/machinery/computer/card/proc/get_subordinates(rank, addcivs) var/list/jobs_returned = list() - for(var/datum/job/thisjob in job_master.occupations) + for(var/datum/job/thisjob in SSjobs.occupations) if(rank in thisjob.department_head) jobs_returned += thisjob.title if(addcivs) @@ -242,6 +247,7 @@ var/time_last_changed_position = 0 data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----" data["target_rank"] = get_target_rank() data["scan_name"] = scan ? scan.name : "-----" + data["scan_owner"] = scan && scan.registered_name ? scan.registered_name : null data["authenticated"] = is_authenticated(user) data["has_modify"] = !!modify data["account_number"] = modify ? modify.associated_account_number : null @@ -249,15 +255,19 @@ var/time_last_changed_position = 0 data["all_centcom_access"] = null data["regions"] = null data["target_dept"] = target_dept + data["card_is_owned"] = modify && modify.owner_ckey - data["engineering_jobs"] = format_jobs(engineering_positions) - data["medical_jobs"] = format_jobs(medical_positions) - data["science_jobs"] = format_jobs(science_positions) - data["security_jobs"] = format_jobs(security_positions) - data["support_jobs"] = format_jobs(support_positions) - data["civilian_jobs"] = format_jobs(civilian_positions) - data["special_jobs"] = format_jobs(whitelisted_positions) - data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + var/list/job_formats = SSjobs.format_jobs_for_id_computer(modify) + + data["top_jobs"] = format_jobs(list("Captain", "Custom"), data["target_rank"], job_formats) + data["engineering_jobs"] = format_jobs(engineering_positions, data["target_rank"], job_formats) + data["medical_jobs"] = format_jobs(medical_positions, data["target_rank"], job_formats) + data["science_jobs"] = format_jobs(science_positions, data["target_rank"], job_formats) + data["security_jobs"] = format_jobs(security_positions, data["target_rank"], job_formats) + data["support_jobs"] = format_jobs(support_positions, data["target_rank"], job_formats) + data["civilian_jobs"] = format_jobs(civilian_positions, data["target_rank"], job_formats) + data["special_jobs"] = format_jobs(whitelisted_positions, data["target_rank"], job_formats) + data["centcom_jobs"] = format_jobs(get_all_centcom_jobs(), data["target_rank"], job_formats) data["card_skins"] = format_card_skins(get_station_card_skins()) data["job_slots"] = format_job_slots() @@ -268,6 +278,9 @@ var/time_last_changed_position = 0 data["cooldown_mins"] = mins data["cooldown_secs"] = (seconds < 10) ? "0[seconds]" : seconds + if(mode == 3 && is_authenticated(user)) + data["id_change_html"] = SSjobs.fetch_transfer_record_html(is_centcom()) + if(modify) data["current_skin"] = modify.icon_state @@ -315,15 +328,18 @@ var/time_last_changed_position = 0 if(!usr.get_active_hand() && Adjacent(usr)) usr.put_in_hands(modify) modify = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else modify.forceMove(get_turf(src)) modify = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else if(Adjacent(usr)) var/obj/item/I = usr.get_active_hand() if(istype(I, /obj/item/card/id)) usr.drop_item() I.forceMove(src) modify = I + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) if("scan") if(scan) @@ -332,15 +348,18 @@ var/time_last_changed_position = 0 if(!usr.get_active_hand() && Adjacent(usr)) usr.put_in_hands(scan) scan = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else scan.forceMove(get_turf(src)) scan = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else if(Adjacent(usr)) var/obj/item/I = usr.get_active_hand() if(istype(I, /obj/item/card/id)) usr.drop_item() I.forceMove(src) scan = I + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) if("access") if(href_list["allowed"] && !target_dept) @@ -361,23 +380,24 @@ var/time_last_changed_position = 0 if("assign") if(is_authenticated(usr) && modify) var/t1 = href_list["assign_target"] - if(target_dept && modify.assignment == "Unassigned") + if(target_dept && modify.assignment == "Demoted") visible_message("[src]: Demoted individuals must see the HoP for a new job.") return 0 - if(!job_in_department(job_master.GetJob(modify.rank), FALSE)) + if(!job_in_department(SSjobs.GetJob(modify.rank), FALSE)) visible_message("[src]: Cross-department job transfers must be done by the HoP.") return 0 - if(!job_in_department(job_master.GetJob(t1))) + if(!job_in_department(SSjobs.GetJob(t1))) return 0 if(t1 == "Custom") var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN)) //let custom jobs function as an impromptu alt title, mainly for sechuds if(temp_t && modify) + SSjobs.log_job_transfer(modify.registered_name, modify.getRankAndAssignment(), temp_t, scan.registered_name) modify.assignment = temp_t log_game("[key_name(usr)] has given \"[modify.registered_name]\" the custom job title \"[temp_t]\".") else var/list/access = list() - if(is_centcom()) + if(is_centcom() && islist(get_centcom_access(t1))) access = get_centcom_access(t1) else var/datum/job/jobdatum @@ -397,13 +417,20 @@ var/time_last_changed_position = 0 if(t1 == "Civilian") message_admins("[key_name_admin(usr)] has reassigned \"[modify.registered_name]\" from \"[jobnamedata]\" to \"[t1]\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, t1, scan.registered_name) + SSjobs.slot_job_transfer(modify.rank, t1) + + var/mob/living/carbon/human/H = modify.getPlayer() + if(istype(H)) + if(jobban_isbanned(H, t1)) + message_admins("[ADMIN_FULLMONTY(H)] has been assigned the job [t1], in possible violation of their job ban.") + if(H.mind) + H.mind.playtime_role = t1 + modify.access = access modify.rank = t1 modify.assignment = t1 - - callHook("reassign_employee", list(modify)) - if("reg") if(is_authenticated(usr) && !target_dept) var/t2 = modify @@ -426,6 +453,20 @@ var/time_last_changed_position = 0 if("mode") mode = text2num(href_list["mode_target"]) + if("wipe_my_logs") + if(is_authenticated(usr) && is_centcom()) + var/delcount = SSjobs.delete_log_records(scan.registered_name, FALSE) + if(delcount) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + SSnanoui.update_uis(src) + + if("wipe_all_logs") + if(is_authenticated(usr) && !target_dept) + var/delcount = SSjobs.delete_log_records(scan.registered_name, TRUE) + if(delcount) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + SSnanoui.update_uis(src) + if("print") if(!printing && !target_dept) printing = 1 @@ -464,16 +505,16 @@ var/time_last_changed_position = 0 var/jobnamedata = modify.getRankAndAssignment() log_game("[key_name(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".") message_admins("[key_name_admin(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Terminated", scan.registered_name) modify.assignment = "Terminated" modify.access = list() - callHook("terminate_employee", list(modify)) if("demote") if(is_authenticated(usr)) - if(modify.assignment == "Unassigned") - visible_message("[src]: Unassigned crew cannot be demoted any further. If further action is warranted, ask the Captain about Termination.") + if(modify.assignment == "Demoted") + visible_message("[src]: Demoted crew cannot be demoted any further. If further action is warranted, ask the Captain about Termination.") return 0 - if(!job_in_department(job_master.GetJob(modify.rank), FALSE)) + if(!job_in_department(SSjobs.GetJob(modify.rank), FALSE)) visible_message("[src]: Heads may only demote members of their own department.") return 0 @@ -482,19 +523,20 @@ var/time_last_changed_position = 0 access = jobdatum.get_access() var/jobnamedata = modify.getRankAndAssignment() - log_game("[key_name(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Unassigned)\".") - message_admins("[key_name_admin(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Unassigned)\".") + log_game("[key_name(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Demoted)\".") + message_admins("[key_name_admin(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Demoted)\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Demoted", scan.registered_name) modify.access = access modify.rank = "Civilian" - modify.assignment = "Unassigned" + modify.assignment = "Demoted" modify.icon_state = "id" if("make_job_available") // MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS if(is_authenticated(usr)) var/edit_job_target = href_list["job"] - var/datum/job/j = job_master.GetJob(edit_job_target) + var/datum/job/j = SSjobs.GetJob(edit_job_target) if(!job_in_department(j, FALSE)) return 0 if(!j) @@ -513,7 +555,7 @@ var/time_last_changed_position = 0 // MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS if(is_authenticated(usr)) var/edit_job_target = href_list["job"] - var/datum/job/j = job_master.GetJob(edit_job_target) + var/datum/job/j = SSjobs.GetJob(edit_job_target) if(!job_in_department(j, FALSE)) return 0 if(!j) @@ -533,17 +575,17 @@ var/time_last_changed_position = 0 // TOGGLE WHETHER JOB APPEARS AS PRIORITIZED IN THE LOBBY if(is_authenticated(usr) && !target_dept) var/priority_target = href_list["job"] - var/datum/job/j = job_master.GetJob(priority_target) + var/datum/job/j = SSjobs.GetJob(priority_target) if(!j) return 0 if(!job_in_department(j)) return 0 var/priority = TRUE - if(j in job_master.prioritized_jobs) - job_master.prioritized_jobs -= j + if(j in SSjobs.prioritized_jobs) + SSjobs.prioritized_jobs -= j priority = FALSE - else if(job_master.prioritized_jobs.len < 3) - job_master.prioritized_jobs += j + else if(SSjobs.prioritized_jobs.len < 3) + SSjobs.prioritized_jobs += j else return 0 log_game("[key_name(usr)] [priority ? "prioritized" : "unprioritized"] the job \"[j.title]\".") diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index c134747cd41..acdbc1110f3 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -36,10 +36,13 @@ if(scanner.occupant && can_autoprocess()) scan_mob(scanner.occupant) - + + if(!LAZYLEN(records)) + return + for(var/obj/machinery/clonepod/pod in pods) if(!(pod.occupant || pod.mess) && (pod.efficiency > 5)) - for(var/datum/dna2/record/R in src.records) + for(var/datum/dna2/record/R in records) if(!(pod.occupant || pod.mess)) if(pod.growclone(R)) records.Remove(R) @@ -392,6 +395,12 @@ SSnanoui.update_uis(src) return + for(var/obj/machinery/clonepod/pod in pods) + if(pod.occupant && pod.clonemind == subject.mind) + scantemp = "Subject already getting cloned." + SSnanoui.update_uis(src) + return + subject.dna.check_integrity() var/datum/dna2/record/R = new /datum/dna2/record() diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 854525dadf4..be27b0600cf 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -156,7 +156,7 @@ message_cooldown = 0 if("callshuttle") - var/input = input(usr, "Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") as text|null + var/input = clean_input("Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") if(!input || ..() || !is_authenticated(usr)) SSnanoui.update_uis(src) return @@ -217,11 +217,11 @@ setMenuState(usr,COMM_SCREEN_STAT) if("setmsg1") - stat_msg1 = input("Line 1", "Enter Message Text", stat_msg1) as text|null + stat_msg1 = clean_input("Line 1", "Enter Message Text", stat_msg1) setMenuState(usr,COMM_SCREEN_STAT) if("setmsg2") - stat_msg2 = input("Line 2", "Enter Message Text", stat_msg2) as text|null + stat_msg2 = clean_input("Line 2", "Enter Message Text", stat_msg2) setMenuState(usr,COMM_SCREEN_STAT) if("nukerequest") @@ -439,7 +439,7 @@ to_chat(user, "The emergency shuttle may not be called while returning to Central Command.") return - if(ticker.mode.name == "blob") + if(SSticker.mode.name == "blob") to_chat(user, "Under directive 7-10, [station_name()] is quarantined until further notice.") return @@ -464,7 +464,7 @@ to_chat(user, "The shuttle is refueling. Please wait another [round((54000-world.time)/600)] minutes before trying again.") return - if(ticker.mode.name == "epidemic") + if(SSticker.mode.name == "epidemic") to_chat(user, "Under directive 7-10, [station_name()] is quarantined until further notice.") return @@ -481,7 +481,7 @@ /proc/cancel_call_proc(var/mob/user) - if(ticker.mode.name == "meteor") + if(SSticker.mode.name == "meteor") return if(SSshuttle.cancelEvac(user)) @@ -494,7 +494,7 @@ /proc/post_status(command, data1, data2, mob/user = null) - var/datum/radio_frequency/frequency = radio_controller.return_frequency(DISPLAY_FREQ) + var/datum/radio_frequency/frequency = SSradio.return_frequency(DISPLAY_FREQ) if(!frequency) return diff --git a/code/game/machinery/computer/depot.dm b/code/game/machinery/computer/depot.dm index 4e6afa0c229..149e2b7ff49 100644 --- a/code/game/machinery/computer/depot.dm +++ b/code/game/machinery/computer/depot.dm @@ -283,7 +283,7 @@ return message_sent = TRUE if(user.mind && user.mind.special_role == SPECIAL_ROLE_TRAITOR) - var/input = stripped_input(user, "Please choose a message to transmit to Syndicate HQ via quantum entanglement. Transmission does not guarantee a response. This function may only be used ONCE.", "To abort, send an empty message.", "") as text|null + var/input = stripped_input(user, "Please choose a message to transmit to Syndicate HQ via quantum entanglement. Transmission does not guarantee a response. This function may only be used ONCE.", "To abort, send an empty message.", "") if(!input) message_sent = FALSE return diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index e0969555ce9..74cc417e7ce 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -28,19 +28,17 @@ attackby(obj/item/O as obj, mob/user as mob, params) if(istype(O, /obj/item/aiModule)) + if(!current)//no AI selected + to_chat(user, "No AI selected. Please chose a target before proceeding with upload.") + return var/turf/T = get_turf(current) if(!atoms_share_level(T, src)) to_chat(user, "Unable to establish a connection: You're too far away from the target silicon!") return - var/datum/game_mode/nations/mode = get_nations_mode() - if(!mode) - var/obj/item/aiModule/M = O - M.install(src) - else - if(mode.kickoff) - to_chat(user, "You have been locked out from modifying the AI's laws!") - else - ..() + var/obj/item/aiModule/M = O + M.install(src) + return + return ..() attack_hand(var/mob/user as mob) @@ -73,18 +71,16 @@ attackby(obj/item/aiModule/module as obj, mob/user as mob, params) if(istype(module, /obj/item/aiModule)) + if(!current)//no borg selected + to_chat(user, "No borg selected. Please chose a target before proceeding with upload.") + return var/turf/T = get_turf(current) if(!atoms_share_level(T, src)) to_chat(user, "Unable to establish a connection: You're too far away from the target silicon!") return - var/datum/game_mode/nations/mode = get_nations_mode() - if(!mode) - module.install(src) - else - if(mode.kickoff) - to_chat(user, "You have been locked out from modifying the borg's laws!") - else - return ..() + module.install(src) + return + return ..() attack_hand(var/mob/user as mob) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index fb09b40f440..dbe766a2c44 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -466,7 +466,7 @@ active2.fields["comments"] -= active2.fields["comments"][index] if(href_list["search"]) - var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text + var/t1 = clean_input("Search String: (Name, DNA, or ID)", "Med. records", null, null) if(!t1 || ..()) return 1 active1 = null diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 87d35c2d7b4..d6e000d660d 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -281,7 +281,7 @@ auth = 0 screen = 0 else - var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) + var/dkey = trim(clean_input("Please enter the decryption key.")) if(dkey && dkey != "") if(src.linkedServer.decryptkey == dkey) auth = 1 @@ -332,7 +332,7 @@ message = noserver else if(auth) - var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) + var/dkey = trim(clean_input("Please enter the decryption key.")) if(dkey && dkey != "") if(src.linkedServer.decryptkey == dkey) var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):")) @@ -395,7 +395,7 @@ //Select Your Name if("Sender") - customsender = input(usr, "Please enter the sender's name.") as text|null + customsender = clean_input("Please enter the sender's name.") //Select Receiver if("Recepient") @@ -414,11 +414,11 @@ //Enter custom job if("RecJob") - customjob = input(usr, "Please enter the sender's job.") as text|null + customjob = clean_input("Please enter the sender's job.") //Enter message if("Message") - custommessage = input(usr, "Please enter your message.") as text|null + custommessage = clean_input("Please enter your message.") custommessage = sanitize(copytext(custommessage, 1, MAX_MESSAGE_LEN)) //Send message diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index a5198da6e56..416c73d2570 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -10,6 +10,13 @@ circuit = /obj/item/circuitboard/powermonitor var/datum/powernet/powernet = null var/datum/nano_module/power_monitor/power_monitor + var/is_secret_monitor = FALSE + +/obj/machinery/computer/monitor/secret //Hides the power monitor (such as ones on ruins & CentCom) from PDA's to prevent metagaming. + name = "outdated power monitoring console" + desc = "It monitors power levels across the local powernet." + circuit = /obj/item/circuitboard/powermonitor/secret + is_secret_monitor = TRUE /obj/machinery/computer/monitor/New() ..() @@ -38,7 +45,7 @@ if(isturf(T)) attached = locate() in T if(attached) - return attached.get_powernet() + return attached.powernet /obj/machinery/computer/monitor/attack_ai(mob/user) attack_hand(user) diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 5d4e838db38..8def58c370b 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -20,12 +20,7 @@ return if(stat & (NOPOWER|BROKEN)) return - var/datum/game_mode/nations/mode = get_nations_mode() - if(!mode) - ui_interact(user) - else - if(mode.kickoff) - to_chat(user, "You have been locked out from this console!") + ui_interact(user) /obj/machinery/computer/robotics/proc/is_authenticated(var/mob/user as mob) if(user.can_admin_interact()) diff --git a/code/game/machinery/computer/salvage_ship.dm b/code/game/machinery/computer/salvage_ship.dm index 444db205e80..93583eda0e8 100644 --- a/code/game/machinery/computer/salvage_ship.dm +++ b/code/game/machinery/computer/salvage_ship.dm @@ -58,7 +58,6 @@ North of the Station | East of the Station | South of the Station
- South-west of the Mining Asteroid | Trading Post
Clown Asteroid | Derelict Station | @@ -99,8 +98,6 @@ salvage_move_to(/area/shuttle/salvage/south) else if(href_list["commssat"]) salvage_move_to(/area/shuttle/salvage/commssat) - else if(href_list["mining"]) - salvage_move_to(/area/shuttle/salvage/mining) else if(href_list["abandoned_ship"]) salvage_move_to(/area/shuttle/salvage/abandoned_ship) else if(href_list["clown_asteroid"]) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index c0c8c2d349e..bed10bb0923 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -398,7 +398,7 @@ switch(href_list["field"]) if("name") if(istype(active1, /datum/data/record)) - var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text) + var/t1 = reject_bad_name(clean_input("Please input name:", "Secure. records", active1.fields["name"], null)) if(!t1 || !length(trim(t1)) || ..() || active1 != a1) return 1 active1.fields["name"] = t1 diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index ac10eb6e22d..5647ae73766 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -245,7 +245,7 @@ switch(href_list["field"]) if("name") if(istype(active1, /datum/data/record)) - var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text) + var/t1 = reject_bad_name(clean_input("Please input name:", "Secure. records", active1.fields["name"], null)) if(!t1 || !length(trim(t1)) || incapable || active1 != a1) return 1 active1.fields["name"] = t1 diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index ece6615b786..9e91e254950 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -541,21 +541,20 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/capacitor = 1) /obj/item/circuitboard/chem_dispenser - name = "circuit board (Portable Chem Dispenser)" - build_path = /obj/machinery/chem_dispenser/constructable + name = "circuit board (Chem Dispenser)" + build_path = /obj/machinery/chem_dispenser board_type = "machine" origin_tech = "materials=4;programming=4;plasmatech=4;biotech=3" frame_desc = "Requires 2 Matter Bins, 1 Capacitor, 1 Manipulator, 1 Console Screen, and 1 Power Cell." - req_components = list( - /obj/item/stock_parts/matter_bin = 2, + req_components = list( /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/capacitor = 1, /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/console_screen = 1, /obj/item/stock_parts/cell = 1) /obj/item/circuitboard/chem_master - name = "circuit board (Chem Master 2999)" - build_path = /obj/machinery/chem_master/constructable + name = "circuit board (ChemMaster 3000)" + build_path = /obj/machinery/chem_master board_type = "machine" origin_tech = "materials=3;programming=2;biotech=3" req_components = list( @@ -563,6 +562,25 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/console_screen = 1) +/obj/item/circuitboard/chem_master/attackby(obj/item/I, mob/user, params) + if(isscrewdriver(I)) + var/new_name = "ChemMaster" + var/new_path = /obj/machinery/chem_master + + if(build_path == /obj/machinery/chem_master) + new_name = "CondiMaster" + new_path = /obj/machinery/chem_master/condimaster + + build_path = new_path + name = "circuit board ([new_name] 3000)" + to_chat(user, "You change the circuit board setting to \"[new_name]\".") + else + return ..() + +/obj/item/circuitboard/chem_master/condi_master + name = "circuit board (CondiMaster 3000)" + build_path = /obj/machinery/chem_master/condimaster + /obj/item/circuitboard/chem_heater name = "circuit board (Chemical Heater)" build_path = /obj/machinery/chem_heater @@ -617,30 +635,13 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 2, /obj/item/reagent_containers/glass/beaker = 2) -/obj/item/circuitboard/soda +/obj/item/circuitboard/chem_dispenser/soda name = "Circuit board (Soda Machine)" build_path = /obj/machinery/chem_dispenser/soda - board_type = "machine" - frame_desc = "Requires 2 Matter Bins, 1 Manipulators, 1 Capacitor, 1 Console Screen, and 1 Power Cell." - req_components = list( - /obj/item/stock_parts/matter_bin = 2, - /obj/item/stock_parts/manipulator = 1, - /obj/item/stock_parts/capacitor = 1, - /obj/item/stock_parts/console_screen = 1, - /obj/item/stock_parts/cell = 1) -/obj/item/circuitboard/beer +/obj/item/circuitboard/chem_dispenser/beer name = "Circuit board (Beer Machine)" build_path = /obj/machinery/chem_dispenser/beer - board_type = "machine" - frame_desc = "Requires 2 Matter Bins, 1 Manipulators, 1 Capacitor, 1 Console Screen, and 1 Power Cell." - req_components = list( - /obj/item/stock_parts/matter_bin = 2, - /obj/item/stock_parts/manipulator = 1, - /obj/item/stock_parts/capacitor = 1, - /obj/item/stock_parts/console_screen = 1, - /obj/item/stock_parts/cell = 1) - /obj/item/circuitboard/circuit_imprinter name = "Circuit board (Circuit Imprinter)" diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index fc60d8f005d..b45a8331188 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -5,7 +5,8 @@ icon_state = "pod0" density = 1 anchored = 1.0 - layer = 2.8 + layer = ABOVE_WINDOW_LAYER + plane = GAME_PLANE interact_offline = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100) var/on = 0 @@ -208,7 +209,7 @@ occupantData["stat"] = occupant.stat occupantData["health"] = occupant.health occupantData["maxHealth"] = occupant.maxHealth - occupantData["minHealth"] = config.health_threshold_dead + occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD occupantData["bruteLoss"] = occupant.getBruteLoss() occupantData["oxyLoss"] = occupant.getOxyLoss() occupantData["toxLoss"] = occupant.getToxLoss() @@ -220,7 +221,7 @@ data["cellTemperatureStatus"] = "good" if(air_contents.temperature > T0C) // if greater than 273.15 kelvin (0 celcius) data["cellTemperatureStatus"] = "bad" - else if(air_contents.temperature > 225) + else if(air_contents.temperature > TCRYO) data["cellTemperatureStatus"] = "average" data["isBeakerLoaded"] = beaker ? 1 : 0 @@ -324,7 +325,6 @@ overlays += "lid[on]" //if no occupant, just put the lid overlay on, and ignore the rest return - if(occupant) var/image/pickle = image(occupant.icon, occupant.icon_state) pickle.overlays = occupant.overlays @@ -378,9 +378,9 @@ occupant.Paralyse(max(5/efficiency, (1/occupant.bodytemperature)*3000/efficiency)) if(air_contents.oxygen > 2) if(occupant.getOxyLoss()) - occupant.adjustOxyLoss(-10) + occupant.adjustOxyLoss(-6) else - occupant.adjustOxyLoss(-2) + occupant.adjustOxyLoss(-1.2) if(beaker && next_trans == 0) var/proportion = 10 * min(1/beaker.volume, 1) // Yes, this means you can get more bang for your buck with a beaker of SF vs a patch @@ -388,7 +388,7 @@ beaker.reagents.reaction(occupant, TOUCH, proportion) beaker.reagents.trans_to(occupant, 1, 10) next_trans++ - if(next_trans == 10) + if(next_trans == 17) next_trans = 0 /obj/machinery/atmospherics/unary/cryo_cell/proc/heat_gas_contents() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index a1bdff99d56..f9d708a6200 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -53,7 +53,7 @@ var/dat - if(!( ticker )) + if(!( SSticker )) return dat += "

[storage_name]
" @@ -231,9 +231,9 @@ /obj/item/reagent_containers/hypospray/CMO, /obj/item/clothing/accessory/medal/gold/captain, /obj/item/clothing/gloves/color/black/krav_maga/sec, - /obj/item/storage/internal, /obj/item/spacepod_key, - /obj/item/nullrod + /obj/item/nullrod, + /obj/item/key ) // These items will NOT be preserved var/list/do_not_preserve_items = list ( @@ -364,13 +364,15 @@ // Skip past any cult sacrifice objective using this person if(GAMEMODE_IS_CULT && is_sacrifice_target(occupant.mind)) - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode var/list/p_s_t = cult_mode.get_possible_sac_targets() if(p_s_t.len) cult_mode.sacrifice_target = pick(p_s_t) - for(var/datum/mind/H in ticker.mode.cult) + for(var/datum/mind/H in SSticker.mode.cult) if(H.current) - to_chat(H.current, "[ticker.cultdat.entity_name] murmurs, [occupant] is beyond your reach. Sacrifice [cult_mode.sacrifice_target.current] instead...
") + to_chat(H.current, "[SSticker.cultdat.entity_name] murmurs, [occupant] is beyond your reach. Sacrifice [cult_mode.sacrifice_target.current] instead...
") + H.current << 'sound/ambience/alarm4.ogg' + cult_mode.update_sac_objective(occupant.mind, occupant.mind.assigned_role) else cult_mode.bypass_phase() @@ -397,14 +399,14 @@ //Handle job slot/tater cleanup. var/job = occupant.mind.assigned_role - job_master.FreeRole(job) + SSjobs.FreeRole(job) if(occupant.mind.objectives.len) occupant.mind.objectives.Cut() occupant.mind.special_role = null else - if(ticker.mode.name == "AutoTraitor") - var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode + if(SSticker.mode.name == "AutoTraitor") + var/datum/game_mode/traitor/autotraitor/current_mode = SSticker.mode current_mode.possible_traitors.Remove(occupant) // Delete them from datacore. @@ -769,3 +771,12 @@ target_cryopod.take_occupant(person_to_cryo, 1) return 1 return 0 + +/proc/force_cryo_human(var/mob/living/carbon/person_to_cryo) + if(!istype(person_to_cryo)) + return + if(!istype(person_to_cryo.loc, /obj/machinery/cryopod)) + cryo_ssd(person_to_cryo) + if(istype(person_to_cryo.loc, /obj/machinery/cryopod)) + var/obj/machinery/cryopod/P = person_to_cryo.loc + P.despawn_occupant() diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 8fefabbf877..75c4e466a79 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -54,6 +54,7 @@ /obj/machinery/disco/Destroy() dance_over() selection = null + STOP_PROCESSING(SSobj, src) return ..() /obj/machinery/disco/attackby(obj/item/O, mob/user, params) @@ -128,7 +129,7 @@ active = TRUE update_icon() dance_setup() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) lights_spin() updateUsrDialog() else if(active) @@ -472,7 +473,7 @@ L.stop_sound_channel(CHANNEL_JUKEBOX) else if(active) active = FALSE - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) dance_over() playsound(src,'sound/machines/terminal_off.ogg',50,1) icon_state = "disco0" 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/airlock.dm b/code/game/machinery/doors/airlock.dm index 54153118131..17b6f9e55c8 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -51,6 +51,7 @@ var/list/airlock_overlays = list() explosion_block = 1 assemblytype = /obj/structure/door_assembly normalspeed = 1 + siemens_strength = 1 var/security_level = 0 //How much are wires secured var/aiControlDisabled = FALSE //If TRUE, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. var/hackProof = FALSE // if TRUE, this door can't be hacked by the AI @@ -70,7 +71,7 @@ var/list/airlock_overlays = list() var/lockdownbyai = 0 var/justzap = 0 var/obj/item/airlock_electronics/electronics - var/hasShocked = 0 //Prevents multiple shocks from happening + var/shockCooldown = FALSE //Prevents multiple shocks from happening var/obj/item/note //Any papers pinned to the airlock var/previous_airlock = /obj/structure/door_assembly //what airlock assembly mineral plating was applied to var/airlock_material //material of inner filling; if its an airlock with glass, this should be set to "glass" @@ -151,8 +152,8 @@ About the new airlock wires panel: if(electrified_timer) deltimer(electrified_timer) electrified_timer = null - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() @@ -173,10 +174,8 @@ About the new airlock wires panel: else /*if(justzap)*/ return else if(user.hallucination > 50 && prob(10) && !operating) - to_chat(user, "You feel a powerful shock course through your body!") - user.adjustStaminaLoss(50) - user.AdjustStunned(5) - return + if(user.electrocute_act(50, src, 1, illusion = TRUE)) // We'll just go with a flat 50 damage, instead of doing powernet checks + return ..(user) /obj/machinery/door/airlock/bumpopen(mob/living/simple_animal/user) @@ -296,16 +295,14 @@ About the new airlock wires panel: // The preceding comment was borrowed from the grille's shock script /obj/machinery/door/airlock/shock(mob/user, prb) if(!arePowerSystemsOn()) - return 0 - if(hasShocked) - return 0 //Already shocked someone recently? + return FALSE + if(shockCooldown > world.time) + return FALSE //Already shocked someone recently? if(..()) - hasShocked = 1 - sleep(10) - hasShocked = 0 - return 1 + shockCooldown = world.time + 10 + return TRUE else - return 0 + return FALSE //Checks if the user can get shocked and shocks him if it can. Returns TRUE if it happened /obj/machinery/door/airlock/proc/shock_user(mob/user, prob) @@ -314,6 +311,7 @@ About the new airlock wires panel: /obj/machinery/door/airlock/update_icon(state=0, override=0) if(operating && !override) return + check_unres() icon_state = density ? "closed" : "open" switch(state) if(0) @@ -336,7 +334,6 @@ About the new airlock wires panel: var/image/sparks_overlay var/image/note_overlay var/notetype = note_type() - switch(state) if(AIRLOCK_CLOSED) frame_overlay = get_airlock_overlay("closed", icon) @@ -624,6 +621,31 @@ About the new airlock wires panel: if(user) attack_ai(user) +/obj/machinery/door/airlock/proc/check_unres() //unrestricted sides. This overlay indicates which directions the player can access even without an ID + if(hasPower() && unres_sides) + if(unres_sides & NORTH) + var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_n") //layer=src.layer+1 + I.pixel_y = 32 + set_light(l_range = 1, l_power = 1, l_color = "#00FF00") + add_overlay(I) + if(unres_sides & SOUTH) + var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_s") //layer=src.layer+1 + I.pixel_y = -32 + set_light(l_range = 1, l_power = 1, l_color = "#00FF00") + add_overlay(I) + if(unres_sides & EAST) + var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_e") //layer=src.layer+1 + I.pixel_x = 32 + set_light(l_range = 1, l_power = 1, l_color = "#00FF00") + add_overlay(I) + if(unres_sides & WEST) + var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_w") //layer=src.layer+1 + I.pixel_x = -32 + set_light(l_range = 1, l_power = 1, l_color = "#00FF00") + add_overlay(I) + else + set_light(0) + /obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target, height=0) if(isElectrified() && density && istype(mover, /obj/item)) var/obj/item/I = mover diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 7eb43cdec74..3b12c6f554a 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -39,8 +39,7 @@ if(command_completed(cur_command)) cur_command = null else - if(!isprocessing) - START_PROCESSING(SSmachines, src) + START_PROCESSING(SSmachines, src) /obj/machinery/door/airlock/proc/do_command(command) switch(command) @@ -127,10 +126,10 @@ return /obj/machinery/door/airlock/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) if(new_frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK) + radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK) /obj/machinery/door/airlock/Initialize() ..() @@ -143,7 +142,7 @@ /obj/machinery/door/airlock/New() ..() - if(radio_controller) + if(SSradio) set_frequency(frequency) /obj/machinery/airlock_sensor @@ -203,9 +202,9 @@ update_icon() /obj/machinery/airlock_sensor/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK) + radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK) /obj/machinery/airlock_sensor/Initialize() ..() @@ -213,12 +212,12 @@ /obj/machinery/airlock_sensor/New() ..() - if(radio_controller) + if(SSradio) set_frequency(frequency) /obj/machinery/airlock_sensor/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() @@ -256,10 +255,15 @@ return ..() +/obj/machinery/access_button/attack_ghost(mob/user) + if(user.can_advanced_admin_interact()) + return attack_hand(user) + /obj/machinery/access_button/attack_hand(mob/user) add_fingerprint(usr) - if(!allowed(user)) - to_chat(user, "Access Denied") + + if(!allowed(user) && !user.can_advanced_admin_interact()) + to_chat(user, "Access denied.") else if(radio_connection) var/datum/signal/signal = new @@ -271,9 +275,9 @@ flick("access_button_cycle", src) /obj/machinery/access_button/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK) + radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK) /obj/machinery/access_button/Initialize() ..() @@ -282,12 +286,12 @@ /obj/machinery/access_button/New() ..() - if(radio_controller) + if(SSradio) set_frequency(frequency) /obj/machinery/access_button/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index df63da64f2b..01d90795a87 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -11,6 +11,8 @@ var/list/conf_access = null var/one_access = 0 //if set to 1, door would receive req_one_access instead of req_access var/const/max_brain_damage = 60 // Maximum brain damage a mob can have until it can't use the electronics + var/unres_sides = 0 + var/unres_direction = null /obj/item/airlock_electronics/attack_self(mob/user) if(!ishuman(user) && !isrobot(user)) @@ -23,14 +25,22 @@ return var/t1 = text("Access control
\n") + t1 += "
" + t1 += " Unrestricted Access Settings
" + var/list/Directions = list("North","South",,"East",,,,"West") + for(var/direction in cardinal) + if (unres_direction && unres_direction == direction) + t1 += "[Directions[direction]]
" + else + t1 += "[Directions[direction]]
" + + t1 += "
" t1 += "Access requirement is set to " t1 += one_access ? "ONE
" : "ALL
" t1 += conf_access == null ? "All
" : "All
" - t1 += "
" - var/list/accesses = get_all_accesses() for(var/acc in accesses) var/aname = get_access_desc(acc) @@ -64,6 +74,14 @@ if(href_list["access"]) toggle_access(href_list["access"]) + + if(href_list["unres_direction"]) + unres_direction = text2num(href_list["unres_direction"]) + if (unres_sides == unres_direction) + unres_sides = 0 + unres_direction = null + else + unres_sides = unres_direction attack_self(usr) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 8e3c7f76342..a0d6efc5d1f 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -542,7 +542,7 @@ icon = 'icons/obj/doors/airlocks/glass_large/glass_large.dmi' overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi' note_overlay_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi' - assemblytype = "obj/structure/door_assembly/multi_tile" + assemblytype = /obj/structure/door_assembly/multi_tile /obj/machinery/door/airlock/multi_tile/narsie_act() return diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm index 91591234551..d3bf12f72f0 100644 --- a/code/game/machinery/doors/alarmlock.dm +++ b/code/game/machinery/doors/alarmlock.dm @@ -13,15 +13,15 @@ air_connection = new /obj/machinery/door/airlock/alarmlock/Destroy() - if(radio_controller) - radio_controller.remove_object(src,air_frequency) + if(SSradio) + SSradio.remove_object(src,air_frequency) air_connection = null return ..() /obj/machinery/door/airlock/alarmlock/Initialize() ..() - radio_controller.remove_object(src, air_frequency) - air_connection = radio_controller.add_object(src, air_frequency, RADIO_TO_AIRALARM) + SSradio.remove_object(src, air_frequency) + air_connection = SSradio.add_object(src, air_frequency, RADIO_TO_AIRALARM) open() /obj/machinery/door/airlock/alarmlock/receive_signal(datum/signal/signal) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index adf22a06850..fdfaae71477 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -28,7 +28,7 @@ var/real_explosion_block //ignore this, just use explosion_block var/heat_proof = FALSE // For rglass-windowed airlocks and firedoors var/emergency = FALSE - + var/unres_sides = 0 //Unrestricted sides. A bitflag for which direction (if any) can open the door with no access //Multi-tile doors var/width = 1 @@ -55,6 +55,10 @@ ..() update_dir() +/obj/machinery/door/power_change() + ..() + update_icon() + /obj/machinery/door/proc/update_dir() if(width > 1) if(dir in list(EAST, WEST)) @@ -134,8 +138,6 @@ if(operating) return add_fingerprint(user) - if(!requiresID()) - user = null if(density && !emagged) if(allowed(user)) @@ -157,7 +159,7 @@ return try_to_activate_door(user) /obj/machinery/door/attack_tk(mob/user) - if(requiresID() && !allowed(null)) + if(!allowed(null)) return ..() @@ -165,9 +167,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,8 +179,15 @@ /obj/machinery/door/allowed(mob/M) if(emergency) return TRUE + if(unrestricted_side(M)) + 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/unrestricted_side(mob/M) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter) + return get_dir(src, M) & unres_sides + /obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user) return diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 21ff909796f..549b5be3929 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -77,7 +77,7 @@ else do_animate("deny") return - if(!ticker) + if(!SSticker) return var/mob/living/M = AM if(!M.restrained() && M.mob_size > MOB_SIZE_TINY && (!(isrobot(M) && M.stat))) @@ -87,10 +87,7 @@ if(operating || !density) return add_fingerprint(user) - if(!requiresID()) - user = null - - if(allowed(user)) + if(!requiresID() || allowed(user)) open_and_close() else do_animate("deny") @@ -217,7 +214,7 @@ return attack_hand(user) /obj/machinery/door/window/attack_hand(mob/user) - return attackby(user, user) + return try_to_activate_door(user) /obj/machinery/door/window/emag_act(mob/user, obj/weapon) if(!operating && density && !emagged) @@ -231,7 +228,6 @@ return 1 /obj/machinery/door/window/attackby(obj/item/I, mob/living/user, params) - //If it's in the process of opening/closing, ignore the click if(operating) return diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm index 5209003fc59..b1a6f96e2eb 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers.dm @@ -76,6 +76,21 @@ name = "Airlock Controller" tag_secure = 1 +/obj/machinery/embedded_controller/radio/airlock/airlock_controller/Initialize(mapload, given_id_tag, given_frequency, given_tag_exterior_door, given_tag_interior_door, given_tag_airpump, given_tag_chamber_sensor) + if(given_id_tag) + id_tag = given_id_tag + if(given_frequency) + set_frequency(given_frequency) + if(given_tag_exterior_door) + tag_exterior_door = given_tag_exterior_door + if(given_tag_interior_door) + tag_interior_door = given_tag_interior_door + if(given_tag_airpump) + tag_airpump = given_tag_airpump + if(given_tag_chamber_sensor) + tag_chamber_sensor = given_tag_chamber_sensor + ..() + /obj/machinery/embedded_controller/radio/airlock/airlock_controller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) @@ -129,7 +144,6 @@ name = "Access Controller" tag_secure = 1 - /obj/machinery/embedded_controller/radio/airlock/access_controller/update_icon() if(on && program) if(program.memory["processing"]) diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 23ee6e19403..e0a49fdfc8c 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -59,8 +59,8 @@ set_frequency(frequency) /obj/machinery/embedded_controller/radio/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() @@ -82,6 +82,6 @@ qdel(signal) /obj/machinery/embedded_controller/radio/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, radio_filter) + radio_connection = SSradio.add_object(src, frequency, radio_filter) diff --git a/code/game/machinery/embedded_controller/embedded_program_base.dm b/code/game/machinery/embedded_controller/embedded_program_base.dm index 1fe527df13b..5bd46b2f3e0 100644 --- a/code/game/machinery/embedded_controller/embedded_program_base.dm +++ b/code/game/machinery/embedded_controller/embedded_program_base.dm @@ -17,8 +17,8 @@ /datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal, receive_method, receive_param) return -/datum/computer/file/embedded_program/proc/process() - return +/datum/computer/file/embedded_program/process() + return FALSE /datum/computer/file/embedded_program/proc/post_signal(datum/signal/signal, comm_line) if(master) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index f1651d5bb99..e9504157063 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -21,6 +21,16 @@ FIRE ALARM var/wiresexposed = 0 var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone + var/report_fire_alarms = TRUE // Should triggered fire alarms also trigger an actual alarm? + var/show_alert_level = TRUE // Should fire alarms display the current alert level? + +/obj/machinery/firealarm/no_alarm + report_fire_alarms = FALSE + +/obj/machinery/firealarm/syndicate + report_fire_alarms = FALSE + show_alert_level = FALSE + /obj/machinery/firealarm/update_icon() if(wiresexposed) @@ -143,7 +153,7 @@ FIRE ALARM alarm() time = 0 timing = 0 - processing_objects -= src + STOP_PROCESSING(SSobj, src) updateDialog() last_process = world.timeofday @@ -206,49 +216,47 @@ FIRE ALARM last_process = world.timeofday if(oldTiming != timing) if(timing) - processing_objects += src + START_PROCESSING(SSobj, src) else - processing_objects -= src + STOP_PROCESSING(SSobj, src) else if(href_list["tp"]) var/tp = text2num(href_list["tp"]) time += tp time = min(max(round(time), 0), 120) /obj/machinery/firealarm/proc/reset() - if(!( working )) + if(!working) return var/area/A = get_area(src) A.fire_reset() + for(var/obj/machinery/firealarm/FA in A) - fire_alarm.clearAlarm(loc, FA) - return + if(is_station_contact(z) && FA.report_fire_alarms) + SSalarms.fire_alarm.clearAlarm(loc, FA) /obj/machinery/firealarm/proc/alarm(var/duration = 0) - if(!( working)) + if(!working) return + var/area/A = get_area(src) for(var/obj/machinery/firealarm/FA in A) - fire_alarm.triggerAlarm(loc, FA, duration) + if(is_station_contact(z) && FA.report_fire_alarms) + SSalarms.fire_alarm.triggerAlarm(loc, FA, duration) + else + A.fire_alert() // Manually trigger alarms if the alarm isn't reported + update_icon() - //playsound(loc, 'sound/ambience/signal.ogg', 75, 0) - return /obj/machinery/firealarm/New(location, direction, building) ..() - if(location) - loc = location - - if(direction) - dir = direction - if(building) buildstage = 0 - wiresexposed = 1 + wiresexposed = TRUE pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 - if(is_station_contact(z)) + if(is_station_contact(z) && show_alert_level) if(security_level) overlays += image('icons/obj/monitors.dmi', "overlay_[get_security_level()]") else 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/hologram.dm b/code/game/machinery/hologram.dm index 49a05371050..e6d967c8eb4 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -44,6 +44,7 @@ var/list/holopads = list() idle_power_usage = 5 active_power_usage = 100 layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them. + plane = FLOOR_PLANE armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0) var/list/masters = list()//List of living mobs that use the holopad var/list/holorays = list()//Holoray-mob link. diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 3c36edb1685..22cf6d56ecd 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -3,14 +3,18 @@ desc = "It's useful for igniting plasma." icon = 'icons/obj/stationobjs.dmi' icon_state = "igniter1" + plane = FLOOR_PLANE armor = list(melee = 50, bullet = 30, laser = 70, energy = 50, bomb = 20, bio = 0, rad = 0) var/id = null - var/on = 1.0 - anchored = 1.0 + var/on = FALSE + anchored = TRUE use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 +/obj/machinery/igniter/on + on = TRUE + /obj/machinery/igniter/attack_ai(mob/user as mob) return src.attack_hand(user) @@ -50,8 +54,8 @@ icon = 'icons/obj/stationobjs.dmi' icon_state = "migniter" var/id = null - var/disable = 0 - var/last_spark = 0 + var/disable = FALSE + var/last_spark = FALSE var/base_state = "migniter" anchored = 1 diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index d0399dfa2a4..ee6bd060c16 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -30,7 +30,7 @@ pixel_x = 25 if(WEST) pixel_x = -25 - if(radio_controller) + if(SSradio) set_frequency(frequency) spawn(5) src.area = get_area(src) @@ -49,14 +49,14 @@ set_frequency(frequency) /obj/machinery/light_switch/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_LOGIC) + radio_connection = SSradio.add_object(src, frequency, RADIO_LOGIC) return /obj/machinery/light_switch/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 553016400ad..f8305e0fb7d 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -118,24 +118,22 @@ Class Procs: var/use_log = list() var/list/settagwhitelist = list()//WHITELIST OF VARIABLES THAT THE set_tag HREF CAN MODIFY, DON'T PUT SHIT YOU DON'T NEED ON HERE, AND IF YOU'RE GONNA USE set_tag (format_tag() proc), ADD TO THIS LIST. atom_say_verb = "beeps" - var/defer_process = 0 + var/siemens_strength = 0.7 // how badly will it shock you? -/obj/machinery/Initialize() - addAtProcessing() +/obj/machinery/Initialize(mapload) + if(!armor) + armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) . = ..() - power_change() + GLOB.machines += src -/obj/machinery/proc/addAtProcessing() if(use_power) myArea = get_area(src) if(!speed_process) - if(!defer_process) - START_PROCESSING(SSmachines, src) - else - START_DEFERRED_PROCESSING(SSmachines, src) + START_PROCESSING(SSmachines, src) else - GLOB.fast_processing += src - isprocessing = TRUE // all of these isprocessing = TRUE can be removed when the PS is dead + START_PROCESSING(SSfastprocess, src) + + power_change() // gotta go fast /obj/machinery/makeSpeedProcess() @@ -143,28 +141,24 @@ Class Procs: return speed_process = TRUE STOP_PROCESSING(SSmachines, src) - GLOB.fast_processing += src + START_PROCESSING(SSfastprocess, src) // gotta go slow /obj/machinery/makeNormalProcess() if(!speed_process) return speed_process = FALSE + STOP_PROCESSING(SSfastprocess, src) START_PROCESSING(SSmachines, src) - GLOB.fast_processing -= src - -/obj/machinery/New() //new - if(!armor) - armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) - GLOB.machines += src - ..() /obj/machinery/Destroy() if(myArea) myArea = null - GLOB.fast_processing -= src - STOP_PROCESSING(SSmachines, src) - GLOB.machines -= src + GLOB.machines.Remove(src) + if(!speed_process) + STOP_PROCESSING(SSmachines, src) + else + STOP_PROCESSING(SSfastprocess, src) return ..() /obj/machinery/proc/locate_machinery() @@ -354,28 +348,28 @@ Class Procs: return attack_hand(user) /obj/machinery/attack_hand(mob/user as mob) - if(user.lying || user.stat) - return 1 + if(user.incapacitated()) + return TRUE if(!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") - return 1 + return TRUE if(ishuman(user)) var/mob/living/carbon/human/H = user if(H.getBrainLoss() >= 60) visible_message("[H] stares cluelessly at [src] and drools.") - return 1 + return TRUE else if(prob(H.getBrainLoss())) to_chat(user, "You momentarily forget how to use [src].") - return 1 + return TRUE if(panel_open) add_fingerprint(user) - return 0 + return FALSE if(!interact_offline && stat & (NOPOWER|BROKEN|MAINT)) - return 1 + return TRUE add_fingerprint(user) @@ -407,7 +401,7 @@ Class Procs: if(can_deconstruct) on_deconstruction() if(component_parts && component_parts.len) - spawn_frame() + spawn_frame(disassembled) for(var/obj/item/I in component_parts) I.forceMove(loc) qdel(src) @@ -559,9 +553,7 @@ Class Procs: threatcount += 2 if(check_records || check_arrest) - var/perpname = perp.name - if(id) - perpname = id.registered_name + var/perpname = perp.get_visible_name(TRUE) var/datum/data/record/R = find_security_record("name", perpname) if(check_records && !R) @@ -575,16 +567,13 @@ Class Procs: /obj/machinery/proc/shock(mob/user, prb) if(inoperable()) - return 0 + return FALSE if(!prob(prb)) - return 0 - if((TK in user.mutations) && !Adjacent(user)) - return 0 + return FALSE do_sparks(5, 1, src) - if(electrocute_mob(user, get_area(src), src, 0.7)) - if(user.stunned) - return 1 - return 0 + if(electrocute_mob(user, get_area(src), src, siemens_strength, TRUE)) + return TRUE + return FALSE //called on machinery construction (i.e from frame to machinery) but not on initialization /obj/machinery/proc/on_construction() @@ -604,3 +593,11 @@ Class Procs: emp_act(EMP_LIGHT) else ex_act(EXPLODE_HEAVY) + +/obj/machinery/proc/adjust_item_drop_location(atom/movable/AM) // Adjust item drop location to a 3x3 grid inside the tile, returns slot id from 0 to 8 + var/md5 = md5(AM.name) // Oh, and it's deterministic too. A specific item will always drop from the same slot. + for (var/i in 1 to 32) + . += hex2num(md5[i]) + . = . % 9 + AM.pixel_x = -8 + ((.%3)*8) + AM.pixel_y = -8 + (round( . / 3)*8) diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 3af76895428..9b982df99fd 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -36,8 +36,8 @@ center = T spawn(10) // must wait for map loading to finish - if(radio_controller) - radio_controller.add_object(src, freq, RADIO_MAGNETS) + if(SSradio) + SSradio.add_object(src, freq, RADIO_MAGNETS) spawn() magnetic_process() @@ -208,8 +208,8 @@ spawn(45) // must wait for map loading to finish - if(radio_controller) - radio_connection = radio_controller.add_object(src, frequency, RADIO_MAGNETS) + if(SSradio) + radio_connection = SSradio.add_object(src, frequency, RADIO_MAGNETS) if(path) // check for default path @@ -217,8 +217,8 @@ /obj/machinery/magnetic_controller/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index f278ee2adda..d4175b10ae1 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -72,7 +72,7 @@ // called when turf state changes // hide the object if turf is intact /obj/machinery/navbeacon/hide(intact) - invisibility = intact ? INVISIBILITY_MAXIMUM : SEE_INVISIBLE_MINIMUM + invisibility = intact ? INVISIBILITY_MAXIMUM : 0 updateicon() // update the icon_state diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 2e4b7b19378..f354feb1629 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -284,7 +284,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(12) var/list/jobs = list() data["jobs"] = jobs - for(var/datum/job/job in job_master.occupations) + for(var/datum/job/job in SSjobs.occupations) if(job_blacklisted(job)) continue if(job.is_position_available()) diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index e98c4e90c30..e77eef869dc 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -183,8 +183,8 @@ qdel(I) qdel(J) H.icon = HI - H.layer = 25 - H.plane = HUD_PLANE + H.layer = ABOVE_HUD_LAYER + H.plane = ABOVE_HUD_PLANE usr.mapobjs += H #else diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 1b3dfe19001..bb5847fc6fb 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -2,8 +2,8 @@ name = "Pipe Dispenser" icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" - density = 1 - anchored = 1 + density = TRUE + anchored = TRUE var/unwrenched = 0 var/wait = 0 @@ -75,29 +75,25 @@ /obj/machinery/pipedispenser/Topic(href, href_list) if(..() || unwrenched) - return 1 + return usr.set_machine(src) add_fingerprint(usr) + if(world.time < wait + 4) + return + wait = world.time if(href_list["make"]) - if(!wait) - var/p_type = text2num(href_list["make"]) - var/p_dir = text2num(href_list["dir"]) - var/obj/item/pipe/P = new (loc, pipe_type=p_type, dir=p_dir) - P.update() - P.add_fingerprint(usr) - wait = world.time + 10 + var/p_type = text2num(href_list["make"]) + var/p_dir = text2num(href_list["dir"]) + var/obj/item/pipe/P = new (loc, pipe_type=p_type, dir=p_dir) + P.update() + P.add_fingerprint(usr) if(href_list["makemeter"]) - if(wait < world.time) - new /obj/item/pipe_meter(loc) - wait = world.time + 15 + new /obj/item/pipe_meter(loc) if(href_list["makegsensor"]) - if(!wait) - new /obj/item/pipe_gsensor(loc) - wait = 1 - spawn(15) - wait = 0 + new /obj/item/pipe_gsensor(loc) + return TRUE /obj/machinery/pipedispenser/attackby(var/obj/item/W as obj, var/mob/user as mob, params) add_fingerprint(usr) @@ -140,8 +136,6 @@ name = "Disposal Pipe Dispenser" icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" - density = 1 - anchored = 1.0 //Allow you to drag-drop disposal pipes into it /obj/machinery/pipedispenser/disposal/MouseDrop_T(var/obj/structure/disposalconstruct/pipe, mob/usr) @@ -182,16 +176,10 @@ popup.open() /obj/machinery/pipedispenser/disposal/Topic(href, href_list) - if(..() || unwrenched) - return 1 - - usr.set_machine(src) - add_fingerprint(usr) - - if(wait < world.time) + if(!..()) + return + if(href_list["dmake"]) var/p_type = text2num(href_list["dmake"]) var/obj/structure/disposalconstruct/C = new(loc, p_type) if(p_type in list(PIPE_DISPOSALS_BIN, PIPE_DISPOSALS_OUTLET, PIPE_DISPOSALS_CHUTE)) C.density = TRUE - C.add_fingerprint(usr) - wait = world.time + 15 diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm index 17fae9df6f6..0d6f76aad38 100644 --- a/code/game/machinery/poolcontroller.dm +++ b/code/game/machinery/poolcontroller.dm @@ -20,13 +20,36 @@ var/list/linkedmist = list() //Used to keep track of created mist var/deep_water = FALSE //set to 1 to drown even standing people +/obj/machinery/poolcontroller/invisible + invisibility = INVISIBILITY_MAXIMUM + name = "Water Controller" + desc = "An invisible water controller. Players shouldn't see this." -/obj/machinery/poolcontroller/New() //This proc automatically happens on world start +/obj/machinery/poolcontroller/invisible/sea + name = "Sea Controller" + desc = "A controller for the underwater portion of the sea. Players shouldn't see this." + deep_water = TRUE + +/obj/machinery/poolcontroller/Initialize(mapload) + var/contents_loop = linked_area if(!linked_area) - for(var/turf/simulated/floor/beach/water/W in range(srange,src)) //Search for /turf/simulated/floor/beach/water in the range of var/srange - linkedturfs += W //Add found pool turfs to the central list. - W.linkedcontroller = src // And add the linked controller to itself. - ..() //Changed to call parent as per MarkvA's recommendation + contents_loop = range(srange, src) + + for(var/turf/T in contents_loop) + if(istype(T, /turf/simulated/floor/beach/water)) + var/turf/simulated/floor/beach/water/W = T + W.linkedcontroller = src + linkedturfs += T + else if(istype(T, /turf/unsimulated/beach/water)) + var/turf/unsimulated/beach/water/W = T + W.linkedcontroller = src + linkedturfs += T + + . = ..() + +/obj/machinery/poolcontroller/invisible/Initialize(mapload) + linked_area = get_area(src) + . = ..() /obj/machinery/poolcontroller/emag_act(user as mob) //Emag_act, this is called when it is hit with a cryptographic sequencer. if(!emagged) //If it is not already emagged, emag it. @@ -190,20 +213,6 @@ return 1 -/obj/machinery/poolcontroller/seacontroller - invisibility = 101 - unacidable = 1 - name = "Sea Controller" - desc = "A controller for the underwater portion of the sea. Players shouldn't see this." - deep_water = TRUE //deep sea is deep water - -/obj/machinery/poolcontroller/seacontroller/Initialize() - linked_area = get_area(src) - for(var/turf/unsimulated/beach/water/W in linked_area) - linkedturfs += W //Add found pool turfs to the central list. - W.linkedcontroller = src // And add the linked controller to itself. - ..() - #undef FRIGID #undef COOL #undef NORMAL diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index e3ba1e642a9..8f542a2ea3c 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -977,6 +977,7 @@ var/list/turret_icons /atom/movable/porta_turret_cover icon = 'icons/obj/turrets.dmi' + anchored = TRUE // Syndicate turrets /obj/machinery/porta_turret/syndicate 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/status_display.dm b/code/game/machinery/status_display.dm index 5f875d7fdc8..642676c6eff 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -50,15 +50,15 @@ var/const/STATUS_DISPLAY_CUSTOM = 99 /obj/machinery/status_display/Destroy() - if(radio_controller) - radio_controller.remove_object(src,frequency) + if(SSradio) + SSradio.remove_object(src,frequency) return ..() // register for radio system /obj/machinery/status_display/Initialize() ..() - if(radio_controller) - radio_controller.add_object(src, frequency) + if(SSradio) + SSradio.add_object(src, frequency) // timed process /obj/machinery/status_display/process() @@ -78,6 +78,9 @@ set_picture("ai_bsod") ..(severity) +/obj/machinery/status_display/get_spooked() + spookymode = TRUE + // set what is displayed /obj/machinery/status_display/proc/update() if(friendc && !ignore_friendc) @@ -227,6 +230,9 @@ set_picture("ai_bsod") ..(severity) +/obj/machinery/ai_status_display/get_spooked() + spookymode = TRUE + /obj/machinery/ai_status_display/proc/update() if(mode==0) //Blank overlays.Cut() diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index b09d80bd804..3776e18e450 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -11,11 +11,13 @@ var/obj/item/clothing/suit/space/suit = null var/obj/item/clothing/head/helmet/space/helmet = null var/obj/item/clothing/mask/mask = null + var/obj/item/clothing/shoes/magboots/magboots = null var/obj/item/storage = null var/helmet_type = null var/suit_type = null var/mask_type = null + var/magboots_type = null var/storage_type = null var/locked = FALSE @@ -63,7 +65,7 @@ suit_type = /obj/item/clothing/suit/space/hardsuit/engineering helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/engineering mask_type = /obj/item/clothing/mask/breath - storage_type = /obj/item/clothing/shoes/magboots + magboots_type = /obj/item/clothing/shoes/magboots req_access = list(access_engine_equip) /obj/machinery/suit_storage_unit/engine/secure @@ -74,7 +76,7 @@ suit_type = /obj/item/clothing/suit/space/hardsuit/elite helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/elite mask_type = /obj/item/clothing/mask/gas - storage_type = /obj/item/clothing/shoes/magboots/advance + magboots_type = /obj/item/clothing/shoes/magboots/advance req_access = list(access_ce) /obj/machinery/suit_storage_unit/ce/secure @@ -85,7 +87,7 @@ suit_type = /obj/item/clothing/suit/space/hardsuit/security helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/security mask_type = /obj/item/clothing/mask/gas/sechailer - storage_type = /obj/item/clothing/shoes/magboots + magboots_type = /obj/item/clothing/shoes/magboots req_access = list(access_security) /obj/machinery/suit_storage_unit/security/secure @@ -99,7 +101,7 @@ suit_type = /obj/item/clothing/suit/space/hardsuit/atmos helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/atmos mask_type = /obj/item/clothing/mask/gas - storage_type = /obj/item/clothing/shoes/magboots + magboots_type = /obj/item/clothing/shoes/magboots req_access = list(access_atmospherics) /obj/machinery/suit_storage_unit/atmos/secure @@ -115,6 +117,12 @@ /obj/machinery/suit_storage_unit/mining/secure secure = TRUE +/obj/machinery/suit_storage_unit/lavaland + name = "mining suit storage unit" + suit_type = /obj/item/clothing/suit/hooded/explorer + mask_type = /obj/item/clothing/mask/gas/explorer + req_access = list(access_mining_station) + /obj/machinery/suit_storage_unit/cmo suit_type = /obj/item/clothing/suit/space/hardsuit/medical helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/medical @@ -128,7 +136,7 @@ /obj/machinery/suit_storage_unit/cmo/secure/sec_storage name = "medical suit storage unit" mask_type = /obj/item/clothing/mask/gas - storage_type = /obj/item/clothing/shoes/magboots + magboots_type = /obj/item/clothing/shoes/magboots /obj/machinery/suit_storage_unit/clown name = "clown suit storage unit" @@ -150,13 +158,13 @@ /obj/machinery/suit_storage_unit/syndicate name = "syndicate suit storage unit" - suit_type = /obj/item/clothing/suit/space/hardsuit/syndi - helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/syndi - mask_type = /obj/item/clothing/mask/gas/syndicate - storage_type = /obj/item/tank/jetpack/oxygen/harness + suit_type = /obj/item/clothing/suit/space/hardsuit/syndi + helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/syndi + mask_type = /obj/item/clothing/mask/gas/syndicate + magboots_type = /obj/item/clothing/shoes/magboots/syndie + storage_type = /obj/item/tank/jetpack/oxygen/harness req_access = list(access_syndicate) safeties = FALSE //in a syndicate base, everything can be used as a murder weapon at a moment's notice. - uv_super = TRUE //so efficient /obj/machinery/suit_storage_unit/syndicate/secure secure = TRUE @@ -209,6 +217,11 @@ /obj/machinery/suit_storage_unit/telecoms/secure secure = TRUE +/obj/machinery/suit_storage_unit/radsuit + name = "radiation suit storage unit" + suit_type = /obj/item/clothing/suit/radiation + helmet_type = /obj/item/clothing/head/radiation + //copied from /obj/effect/nasavoidsuitspawner /obj/machinery/suit_storage_unit/telecoms/Initialize() switch(pick(list("red", "green", "ntblue", "purple", "yellow", "ltblue"))) @@ -245,6 +258,8 @@ helmet = new helmet_type(src) if(mask_type) mask = new mask_type(src) + if(magboots_type) + magboots = new magboots_type(src) if(storage_type) storage = new storage_type(src) update_icon() @@ -257,6 +272,7 @@ QDEL_NULL(suit) QDEL_NULL(helmet) QDEL_NULL(mask) + QDEL_NULL(magboots) QDEL_NULL(storage) QDEL_NULL(wires) return ..() @@ -324,7 +340,10 @@ if(istype(I, /obj/item/clothing/mask) && !mask) mask = I . = TRUE - if((istype(I, /obj/item/tank) || istype(I, /obj/item/clothing/shoes/magboots)) && !storage) + if(istype(I, /obj/item/clothing/shoes/magboots) && !magboots) + magboots = I + . = TRUE + if((istype(I, /obj/item/tank)) && !storage) storage = I . = TRUE if(.) @@ -410,6 +429,8 @@ qdel(suit) // Delete everything but the occupant. mask = null qdel(mask) + magboots = null + qdel(magboots) storage = null qdel(storage) else @@ -427,8 +448,8 @@ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(5, 1, src) s.start() - if(electrocute_mob(user, get_area(src), src, 1)) - return 1 + if(electrocute_mob(user, src, src, 1, TRUE)) + return TRUE /obj/machinery/suit_storage_unit/relaymove(mob/user) if(locked) @@ -544,7 +565,10 @@ dat+= text("Breathmask storage compartment: []
",(mask ? mask.name : "No breathmask detected.") ) if(mask && state_open) dat+="Dispense mask
" - dat+= text("Tank, Magboots storage compartment: []
",(storage ? storage.name : "
No storage item detected.") ) + dat+= text("Magboots storage compartment: []
",(magboots ? magboots.name : "
No magboots detected.") ) + if(magboots && state_open) + dat+="Dispense magboots
" + dat+= text("Tank storage compartment: []
",(storage ? storage.name : "
No storage item detected.") ) if(storage && state_open) dat+="Dispense storage item
" if(occupant) @@ -604,6 +628,10 @@ dispense_mask(usr) updateUsrDialog() update_icon() + if(href_list["dispense_magboots"]) + dispense_magboots(usr) + updateUsrDialog() + update_icon() if(href_list["dispense_storage"]) dispense_storage(usr) updateUsrDialog() @@ -671,6 +699,13 @@ else mask.forceMove(loc) mask = null + +/obj/machinery/suit_storage_unit/proc/dispense_magboots(mob/user as mob) + if(!magboots) + return + else + magboots.forceMove(loc) + magboots = null /obj/machinery/suit_storage_unit/proc/dispense_storage(mob/user as mob) if(!storage) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 304dc7dc639..1a63371915b 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -57,8 +57,8 @@ return if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/N = M - ticker.mode.equip_traitor(N) - ticker.mode.traitors += N.mind + SSticker.mode.equip_traitor(N) + SSticker.mode.traitors += N.mind N.mind.special_role = SPECIAL_ROLE_TRAITOR var/objective = "Free Objective" switch(rand(1,100)) @@ -188,11 +188,11 @@ /obj/machinery/power/singularity_beacon/process() if(!active) return PROCESS_KILL + + if(surplus() >= 1500) + add_load(1500) else - if(surplus() > 1500) - draw_power(1500) - else - Deactivate() + Deactivate() /obj/machinery/power/singularity_beacon/syndicate icontype = "beaconsynd" diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index f02b8411e38..bc2af073fc6 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -39,7 +39,7 @@ /obj/machinery/syndicatebomb/process() if(!active) - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) detonation_timer = null next_beep = null countdown.stop() @@ -73,7 +73,7 @@ if(defused && payload in src) payload.defuse() countdown.stop() - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) /obj/machinery/syndicatebomb/New() wires = new(src) @@ -86,7 +86,7 @@ /obj/machinery/syndicatebomb/Destroy() QDEL_NULL(wires) QDEL_NULL(countdown) - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) return ..() /obj/machinery/syndicatebomb/examine(mob/user) @@ -205,7 +205,7 @@ /obj/machinery/syndicatebomb/proc/activate() active = TRUE - GLOB.fast_processing += src + START_PROCESSING(SSfastprocess, src) countdown.start() next_beep = world.time + 10 detonation_timer = world.time + (timer_set * 10) @@ -275,6 +275,16 @@ desc = "Do not taunt. Warranty invalid if exposed to high temperature. Not suitable for agents under 3 years of age." payload = /obj/item/bombcore/large can_unanchor = FALSE + var/explosive_wall_group = EXPLOSIVE_WALL_GROUP_SYNDICATE_BASE // If set, this bomb will also cause explosive walls in the same group to explode + +/obj/machinery/syndicatebomb/self_destruct/try_detonate(ignore_active = FALSE) + . = ..() + if(. && explosive_wall_group) + for(var/wall in GLOB.explosive_walls) + var/turf/simulated/wall/mineral/plastitanium/explosive/E = wall + if(E.explosive_wall_group == explosive_wall_group) + E.self_destruct() + sleep(5) ///Bomb Cores/// @@ -292,6 +302,7 @@ var/range_medium = 9 var/range_light = 17 var/range_flame = 17 + var/admin_log = TRUE /obj/item/bombcore/ex_act(severity) //Little boom can chain a big boom detonate() @@ -305,7 +316,7 @@ if(adminlog) message_admins(adminlog) log_game(adminlog) - explosion(get_turf(src), range_heavy, range_medium, range_light, flame_range = range_flame) + explosion(get_turf(src), range_heavy, range_medium, range_light, flame_range = range_flame, adminlog = admin_log) if(loc && istype(loc, /obj/machinery/syndicatebomb)) qdel(loc) qdel(src) @@ -396,6 +407,9 @@ range_light = 20 range_flame = 20 +/obj/item/bombcore/large/explosive_wall + admin_log = FALSE + /obj/item/bombcore/large/underwall layer = ABOVE_OPEN_TURF_LAYER diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 8e34e2e19bc..8cd285c994a 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -140,7 +140,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/datum/radio_frequency/connection = signal.data["connection"] - if(connection.frequency in ANTAG_FREQS) // if antag broadcast, just + if(connection.frequency in SSradio.ANTAG_FREQS) // if antag broadcast, just Broadcast_Message(signal.data["connection"], signal.data["mob"], signal.data["vmask"], signal.data["vmessage"], signal.data["radio"], signal.data["message"], @@ -162,13 +162,13 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /proc/Is_Bad_Connection(old_freq, new_freq) //Makes sure players cant read radios of a higher level than they are var/old_type = CREW_RADIO_TYPE var/new_type = CREW_RADIO_TYPE - for(var/antag_freq in ANTAG_FREQS) + for(var/antag_freq in SSradio.ANTAG_FREQS) if(old_freq == antag_freq) old_type = SYNDICATE_RADIO_TYPE if(new_freq == antag_freq) new_type = SYNDICATE_RADIO_TYPE - for(var/cent_freq in CENT_FREQS) + for(var/cent_freq in SSradio.CENT_FREQS) if(old_freq == cent_freq) old_type = CENTCOMM_RADIO_TYPE if(new_freq == cent_freq) @@ -249,7 +249,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if(connection.frequency != display_freq) bad_connection = Is_Bad_Connection(connection.frequency, display_freq) - new_connection = radio_controller.return_frequency(display_freq) + new_connection = SSradio.return_frequency(display_freq) var/list/obj/item/radio/radios = list() @@ -276,8 +276,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept // --- Broadcast to antag radios! --- else if(data == 3) - for(var/antag_freq in ANTAG_FREQS) - var/datum/radio_frequency/antag_connection = radio_controller.return_frequency(antag_freq) + for(var/antag_freq in SSradio.ANTAG_FREQS) + var/datum/radio_frequency/antag_connection = SSradio.return_frequency(antag_freq) for(var/obj/item/radio/R in antag_connection.devices["[RADIO_CHAT]"]) if(R.receive_range(antag_freq, level) > -1) radios += R @@ -356,7 +356,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/part_b_extra = "" if(data == 3) // intercepted radio message part_b_extra = " (Intercepted)" - var/part_a = "\[[freq_text]\][part_b_extra] " // goes in the actual output + var/part_a = "\[[freq_text]\][part_b_extra] " // goes in the actual output // --- Some more pre-message formatting --- var/part_b = " " // Tweaked for security headsets -- TLE @@ -452,7 +452,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept H = new M = H - var/datum/radio_frequency/connection = radio_controller.return_frequency(frequency) + var/datum/radio_frequency/connection = SSradio.return_frequency(frequency) var/display_freq = connection.frequency @@ -485,8 +485,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept // --- Broadcast to antag radios! --- else if(data == 3) - for(var/freq in ANTAG_FREQS) - var/datum/radio_frequency/antag_connection = radio_controller.return_frequency(freq) + for(var/freq in SSradio.ANTAG_FREQS) + var/datum/radio_frequency/antag_connection = SSradio.return_frequency(freq) for(var/obj/item/radio/R in antag_connection.devices["[RADIO_CHAT]"]) var/turf/position = get_turf(R) // TODO: Make the radio system cooperate with the space manager @@ -545,7 +545,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if(length(heard_normal) || length(heard_garbled) || length(heard_gibberish)) /* --- Some miscellaneous variables to format the string output --- */ - var/part_a = "" // goes in the actual output + var/part_a = "" // goes in the actual output var/freq_text = get_frequency_name(display_freq) // --- Some more pre-message formatting --- diff --git a/code/game/machinery/telecomms/ntsl2.dm b/code/game/machinery/telecomms/ntsl2.dm index f01f173ebb3..a5c4f3f1464 100644 --- a/code/game/machinery/telecomms/ntsl2.dm +++ b/code/game/machinery/telecomms/ntsl2.dm @@ -9,110 +9,111 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) * as well as allowing users to save and load configurations. */ /datum/nttc_configuration + var/regex/word_blacklist = new("(EXPLOIT WARNING: [ckey] attempted to upload an NTTC configuration containing JS abusable tags!") + log_admin("EXPLOIT WARNING: [ckey] attempted to upload an NTTC configuration containing JS abusable tags") + return FALSE var/list/var_list = json_decode(text) for(var/variable in var_list) if(variable in to_serialize) // Don't just accept any random vars jesus christ! @@ -236,6 +241,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) variable_value = nttc_sanitize(variable_value, sanitize_method) if(variable_value != null) vars[variable] = variable_value + return TRUE // Sanitizing user input. Don't blindly trust the JSON. /datum/nttc_configuration/proc/nttc_sanitize(variable, sanitize_method) @@ -245,7 +251,8 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) switch(sanitize_method) if("bool") return variable ? TRUE : FALSE - if("table", "array") + // if("table", "array") + if("array") if(!islist(variable)) return list() // Insert html filtering for the regexes here if you're boring @@ -274,10 +281,10 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) // All job and coloring shit if(toggle_job_color || toggle_name_color) var/job = signal.data["job"] - job_color = all_jobs[job] + job_class = all_jobs[job] if(toggle_name_color) - var/new_name = "" + signal.data["name"] + "" + var/new_name = "" + signal.data["name"] + "" signal.data["name"] = new_name signal.data["realname"] = new_name // this is required because the broadcaster uses this directly if the speaker doesn't have a voice changer on @@ -289,13 +296,13 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) if(toggle_job_color) switch(job_indicator_type) if(JOB_STYLE_1) - new_name = signal.data["name"] + " ([job]) " + new_name = signal.data["name"] + " ([job]) " if(JOB_STYLE_2) - new_name = signal.data["name"] + " - [job] " + new_name = signal.data["name"] + " - [job] " if(JOB_STYLE_3) - new_name = "\[[job]\] " + signal.data["name"] + " " + new_name = "\[[job]\] " + signal.data["name"] + " " if(JOB_STYLE_4) - new_name = "([job]) " + signal.data["name"] + " " + new_name = "([job]) " + signal.data["name"] + " " else switch(job_indicator_type) if(JOB_STYLE_1) @@ -350,14 +357,14 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) S.speaking = GLOB.all_languages[setting_language] // Regex replacements - if(islist(regex) && regex.len > 0) - for(var/datum/multilingual_say_piece/S in message_pieces) - var/new_message = S.message - for(var/reg in regex) - var/replacePattern = pencode_to_html(regex[reg]) - var/regex/start = regex("[reg]", "gi") - new_message = start.Replace(new_message, replacePattern) - S.message = new_message + // if(islist(regex) && regex.len > 0) + // for(var/datum/multilingual_say_piece/S in message_pieces) + // var/new_message = S.message + // for(var/reg in regex) + // var/replacePattern = pencode_to_html(regex[reg]) + // var/regex/start = regex("[reg]", "gi") + // new_message = start.Replace(new_message, replacePattern) + // S.message = new_message // Make sure the message is valid after we tinkered with it, otherwise reject it if(signal.data["message"] == "" || !signal.data["message"]) @@ -398,36 +405,41 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) log_action(user, new_language == "--DISABLE--" ? "disabled NTTC language conversion" : "set NTTC language conversion to [new_language]", TRUE) // Tables - if(href_list["create_row"]) - if(href_list["table"] && href_list["table"] in tables) - if(requires_unlock[href_list["table"]] && !source.unlocked) - return - var/new_key = input(user, "Provide a key for the new row.", "New Row") as text|null - if(!new_key) - return - var/new_value = input(user, "Provide a new value for the key [new_key]", "New Row") as text|null - if(new_value == null) - return - var/list/table = vars[href_list["table"]] - table[new_key] = new_value - to_chat(user, "Added row [new_key] -> [new_value].") - log_action(user, "updated [href_list["table"]] - new row [new_key] -> [new_value]") + // if(href_list["create_row"]) + // if(href_list["table"] && href_list["table"] in tables) + // if(requires_unlock[href_list["table"]] && !source.unlocked) + // return + // var/new_key = clean_input(user, "Provide a key for the new row.", "New Row") + // if(!new_key) + // return + // var/new_value = clean_input(user, "Provide a new value for the key [new_key]", "New Row") + // if(new_value == null) + // return + // if(word_blacklist.Find(new_value)) //uh oh, they tried to be naughty + // message_admins("EXPLOIT WARNING: [user.ckey] attempted to add a NTTC regex row containing JS abusable tags!") + // log_admin("EXPLOIT WARNING: [user.ckey] attempted to add a NTTC regex row containing JS abusable tags") + // to_chat(user, "ERROR: Regex contained bad strings. Upload cancelled.") + // return + // var/list/table = vars[href_list["table"]] + // table[new_key] = new_value + // to_chat(user, "Added row [new_key] -> [new_value].") + // log_action(user, "updated [href_list["table"]] - new row [new_key] -> [new_value]") - if(href_list["delete_row"]) - if(href_list["table"] && href_list["table"] in tables) - if(requires_unlock[href_list["table"]] && !source.unlocked) - return - var/list/table = vars[href_list["table"]] - table.Remove(href_list["delete_row"]) - to_chat(user, "Removed row [href_list["delete_row"]] from [href_list["table"]]") - log_action(user, "updated [href_list["table"]] - removed row [href_list["delete_row"]]") + // if(href_list["delete_row"]) + // if(href_list["table"] && href_list["table"] in tables) + // if(requires_unlock[href_list["table"]] && !source.unlocked) + // return + // var/list/table = vars[href_list["table"]] + // table.Remove(href_list["delete_row"]) + // to_chat(user, "Removed row [href_list["delete_row"]] from [href_list["table"]]") + // log_action(user, "updated [href_list["table"]] - removed row [href_list["delete_row"]]") // Arrays if(href_list["create_item"]) if(href_list["array"] && href_list["array"] in arrays) if(requires_unlock[href_list["array"]] && !source.unlocked) return - var/new_value = input(user, "Provide a value for the new index.", "New Index") as text|null + var/new_value = clean_input(user, "Provide a value for the new index.", "New Index") if(new_value == null) return var/list/array = vars[href_list["array"]] @@ -450,8 +462,8 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) if(href_list["load_config"]) var/json = input(user, "Provide configuration JSON below.", "Load Config", nttc_serialize()) as message - nttc_deserialize(json, source) - log_action(user, "has uploaded a NTTC JSON configuration: [ADMIN_SHOWDETAILS("Show", json)]", TRUE) + if(nttc_deserialize(json, source, user.ckey)) + log_action(user, "has uploaded a NTTC JSON configuration: [ADMIN_SHOWDETAILS("Show", json)]", TRUE) user << output(list2params(list(nttc_serialize())), "[window_id].browser:updateConfig") @@ -470,7 +482,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) "tab_hack.html" = 'html/nttc/dist/tab_hack.html', "tab_filtering.html" = 'html/nttc/dist/tab_filtering.html', "tab_firewall.html" = 'html/nttc/dist/tab_firewall.html', - "tab_regex.html" = 'html/nttc/dist/tab_regex.html', + // "tab_regex.html" = 'html/nttc/dist/tab_regex.html', "uiTitleFluff.png" = 'html/nttc/dist/uiTitleFluff.png' ) diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 8014a149cf4..54bd17920bd 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -166,10 +166,10 @@ name = "Automatic X-Ray 5000" desc = "A large metalic machine with an entrance and an exit. A sign on the side reads, 'backpack go in, backpack come out', 'human go in, irradiated human come out'." -/obj/machinery/transformer/xray/New() +/obj/machinery/transformer/xray/Initialize(mapload) + . = ..() // On us new /obj/machinery/conveyor/auto(loc, EAST) - addAtProcessing() /obj/machinery/transformer/xray/conveyor/New() ..() diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 2a46eb40eba..af2a1a8d9c0 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -142,7 +142,7 @@ /obj/machinery/turretid/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300) + ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 350) ui.open() ui.set_auto_update(1) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index fb780e5d550..cf7937474c8 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -38,6 +38,8 @@ layer = 2.9 anchored = 1 density = 1 + max_integrity = 300 + integrity_failure = 100 armor = list(melee = 20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) var/icon_vend //Icon_state when vending var/icon_deny //Icon_state when denying access @@ -96,30 +98,27 @@ var/item_slot = FALSE var/obj/item/inserted_item = null -/obj/machinery/vending/New() - ..() +/obj/machinery/vending/Initialize(mapload) + . = ..() wires = new(src) - spawn(50) - if(product_slogans) - slogan_list += splittext(product_slogans, ";") + if(product_slogans) + slogan_list += splittext(product_slogans, ";") - // So not all machines speak at the exact same time. - // The first time this machine says something will be at slogantime + this random value, - // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated. - last_slogan = world.time + rand(0, slogan_delay) + // So not all machines speak at the exact same time. + // The first time this machine says something will be at slogantime + this random value, + // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated. + last_slogan = world.time + rand(0, slogan_delay) - if(product_ads) - ads_list += splittext(product_ads, ";") + if(product_ads) + ads_list += splittext(product_ads, ";") - build_inventory() - power_change() - - return - - return + build_inventory() + power_change() /obj/machinery/vending/Destroy() - eject_item() + QDEL_NULL(wires) + QDEL_NULL(coin) + QDEL_NULL(inserted_item) return ..() /** @@ -148,34 +147,31 @@ product_records.Add(product) -/obj/machinery/vending/Destroy() - QDEL_NULL(wires) - QDEL_NULL(coin) - return ..() - -/obj/machinery/vending/ex_act(severity) +/obj/machinery/vending/ex_act(severity) //TO-DO-OBJECT-DAMAGE: Kill off when everything is damageable switch(severity) - if(1.0) + if(1) + obj_integrity = 0 qdel(src) - return - if(2.0) - if(prob(50)) - qdel(src) - return - if(3.0) - if(prob(25)) - malfunction() + if(2) + take_damage(rand(100, 250), BRUTE, "bomb", 0) + if(3) + take_damage(rand(10, 90), BRUTE, "bomb", 0) /obj/machinery/vending/RefreshParts() //Better would be to make constructable child if(component_parts) for(var/obj/item/vending_refill/VR in component_parts) refill_inventory(VR, product_records, usr) -/obj/machinery/vending/blob_act() - if(prob(75)) - malfunction() - else +/obj/machinery/vending/deconstruct(disassembled = TRUE) + eject_item() + if(!refill_canister) //the non constructable vendors drop metal instead of a machine frame. + new /obj/item/stack/sheet/metal(loc, 3) qdel(src) + else + ..() + +/obj/machinery/vending/blob_act(obj/structure/blob/B) //TO-DO-OBJECT-DAMAGE: Kill off when everything is damageable + take_damage(400, BRUTE, "melee", 0, get_dir(src, B)) /obj/machinery/vending/proc/refill_inventory(obj/item/vending_refill/refill, list/machine, mob/user) var/total = 0 @@ -236,7 +232,7 @@ if(default_unfasten_wrench(user, I, time = 60)) return - if(istype(I, /obj/item/screwdriver) && anchored) + if(isscrewdriver(I) && anchored) playsound(loc, I.usesound, 50, 1) panel_open = !panel_open to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") @@ -247,9 +243,9 @@ return if(panel_open) - if(istype(I, /obj/item/multitool)||istype(I, /obj/item/wirecutters)) + if(ismultitool(I) || iswirecutter(I)) return attack_hand(user) - if(component_parts && istype(I, /obj/item/crowbar)) + if(component_parts && iscrowbar(I)) var/datum/data/vending_product/machine = product_records for(var/datum/data/vending_product/machine_content in machine) while(machine_content.amount !=0) @@ -259,15 +255,17 @@ if(!machine_content.amount) break default_deconstruction_crowbar(I) - if(istype(I, /obj/item/coin) && premium.len > 0) - user.drop_item() - I.loc = src + return + if(istype(I, /obj/item/coin) && premium.len) + if(!user.drop_item()) + return + I.forceMove(src) coin = I categories |= CAT_COIN to_chat(user, "You insert the [I] into the [src]") SSnanoui.update_uis(src) return - else if(istype(I, refill_canister) && refill_canister != null) + if(istype(I, refill_canister) && refill_canister != null) if(stat & (BROKEN|NOPOWER)) to_chat(user, "It does nothing.") else if(panel_open) @@ -281,21 +279,18 @@ to_chat(user, "You loaded [transfered] items in \the [name].") else to_chat(user, "The [name] is fully stocked.") - return; else to_chat(user, "You should probably unscrew the service panel first.") - else if(item_slot_check(user, I)) + return + if(item_slot_check(user, I)) insert_item(user, I) return - else - return ..() + return ..() //Override this proc to do per-machine checks on the inserted item, but remember to call the parent to handle these generic checks before your logic! /obj/machinery/vending/proc/item_slot_check(mob/user, obj/item/I) if(!item_slot) return FALSE - if(alert(user, "Do you want to attempt to insert [I]?", "","Yes", "No") == "No") - return FALSE if(inserted_item) to_chat(user, "There is something already inserted!") return FALSE @@ -314,28 +309,32 @@ /obj/machinery/vending/proc/insert_item(mob/user, obj/item/I) if(!item_slot || inserted_item) return - if(!user.canUnEquip(I)) + if(!user.drop_item()) to_chat(user, "[I] is stuck to your hand, you can't seem to put it down!") return - user.unEquip(I) inserted_item = I I.forceMove(src) to_chat(user, "You insert [I] into [src].") SSnanoui.update_uis(src) -/obj/machinery/vending/proc/eject_item() +/obj/machinery/vending/proc/eject_item(mob/user) if(!item_slot || !inserted_item) return - inserted_item.forceMove(get_turf(src)) + var/put_on_turf = TRUE + if(user && iscarbon(user) && user.Adjacent(src)) + if(user.put_in_hands(inserted_item)) + put_on_turf = FALSE + if(put_on_turf) + var/turf/T = get_turf(src) + inserted_item.forceMove(T) inserted_item = null SSnanoui.update_uis(src) /obj/machinery/vending/emag_act(user as mob) - emagged = 1 + emagged = TRUE to_chat(user, "You short out the product lock on [src]") - return /** * Receive payment with cashmoney. @@ -511,7 +510,7 @@ categories &= ~CAT_COIN if(href_list["remove_item"]) - eject_item() + eject_item(usr) if(href_list["pay"]) if(currently_vending && vendor_account && !vendor_account.suspended) @@ -593,7 +592,7 @@ return if(coin.string_attached) if(prob(50)) - to_chat(user, "You successfully pull the coin out before the [src] could swallow it.") + to_chat(user, "You successfully pull the coin out before [src] could swallow it.") else to_chat(user, "You weren't able to pull the coin out fast enough, the machine ate it, string and all.") QDEL_NULL(coin) @@ -605,25 +604,33 @@ R.amount-- if(((last_reply + (vend_delay + 200)) <= world.time) && vend_reply) - spawn(0) - speak(src.vend_reply) - last_reply = world.time + speak(src.vend_reply) + last_reply = world.time use_power(vend_power_usage) //actuators and stuff if(icon_vend) //Show the vending animation if needed - flick(icon_vend,src) - spawn(vend_delay) - do_vend(R) - status_message = "" - status_error = 0 - vend_ready = 1 - currently_vending = null - SSnanoui.update_uis(src) + flick(icon_vend, src) + addtimer(CALLBACK(src, .proc/delayed_vend, R, user), vend_delay) + +/obj/machinery/vending/proc/delayed_vend(datum/data/vending_product/R, mob/user) + do_vend(R, user) + status_message = "" + status_error = 0 + vend_ready = 1 + currently_vending = null + SSnanoui.update_uis(src) //override this proc to add handling for what to do with the vended product when you have a inserted item and remember to include a parent call for this generic handling -/obj/machinery/vending/proc/do_vend(datum/data/vending_product/R) +/obj/machinery/vending/proc/do_vend(datum/data/vending_product/R, mob/user) if(!item_slot || !inserted_item) - new R.product_path(get_turf(src)) + var/put_on_turf = TRUE + var/obj/vended = new R.product_path() + if(user && iscarbon(user) && user.Adjacent(src)) + if(user.put_in_hands(vended)) + put_on_turf = FALSE + if(put_on_turf) + var/turf/T = get_turf(src) + vended.forceMove(T) return TRUE return FALSE @@ -638,7 +645,7 @@ qdel(vended) */ -/obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user) +/obj/machinery/vending/proc/stock(datum/data/vending_product/R, mob/user) if(panel_open) to_chat(user, "You stock the [src] with \a [R.product_name]") R.amount++ @@ -664,8 +671,6 @@ if(shoot_inventory && prob(shoot_chance)) throw_item() - return - /obj/machinery/vending/proc/speak(message) if(stat & NOPOWER) return @@ -686,28 +691,38 @@ icon_state = "[initial(icon_state)]-off" stat |= NOPOWER -//Oh no we're malfunctioning! Dump out some product and break. -/obj/machinery/vending/proc/malfunction() - for(var/datum/data/vending_product/R in product_records) - if(R.amount <= 0) //Try to use a record that actually has something to dump. - continue - var/dump_path = R.product_path - if(!dump_path) - continue +/obj/machinery/vending/obj_break(damage_flag) + if(!(stat & BROKEN)) + stat |= BROKEN + icon_state = "[initial(icon_state)]-broken" - while(R.amount>0) - new dump_path(loc) - R.amount-- - break + var/dump_amount = 0 + var/found_anything = TRUE + while (found_anything) + found_anything = FALSE + for(var/record in shuffle(product_records)) + var/datum/data/vending_product/R = record + if(R.amount <= 0) //Try to use a record that actually has something to dump. + continue + var/dump_path = R.product_path + if(!dump_path) + continue + R.amount-- + // busting open a vendor will destroy some of the contents + if(found_anything && prob(80)) + continue - stat |= BROKEN - icon_state = "[initial(icon_state)]-broken" - return + var/obj/O = new dump_path(loc) + step(O, pick(alldirs)) + found_anything = TRUE + dump_amount++ + if(dump_amount >= 16) + return //Somebody cut an important wire and now we're following a new definition of "pitch." /obj/machinery/vending/proc/throw_item() var/obj/throw_item = null - var/mob/living/target = locate() in view(7,src) + var/mob/living/target = locate() in view(7, src) if(!target) return 0 @@ -722,12 +737,12 @@ throw_item = new dump_path(loc) break if(!throw_item) - return 0 - spawn(0) - throw_item.throw_at(target, 16, 3, src) + return + throw_item.throw_at(target, 16, 3) visible_message("[src] launches [throw_item.name] at [target.name]!") - return 1 +/obj/machinery/vending/onTransitZ() + return /* * Vending machine types */ @@ -791,6 +806,9 @@ product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!" refill_canister = /obj/item/vending_refill/boozeomat +/obj/machinery/vending/boozeomat/syndicate_access + req_access = list(access_syndicate) + /obj/machinery/vending/assist products = list( /obj/item/assembly/prox_sensor = 5,/obj/item/assembly/igniter = 3,/obj/item/assembly/signaler = 4, /obj/item/wirecutters = 1, /obj/item/cartridge/signal = 4) @@ -840,28 +858,39 @@ component_parts += new /obj/item/vending_refill/coffee(0) /obj/machinery/vending/coffee/item_slot_check(mob/user, obj/item/I) + if(!(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks))) + return FALSE if(!..()) return FALSE - if(!(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks))) - to_chat(user, "[I] is not compatible with this machine.") - return FALSE if(!I.is_open_container()) - to_chat(user, "You need to open [I] before you insert it.") + to_chat(user, "You need to open [I] before inserting it.") return FALSE return TRUE -/obj/machinery/vending/coffee/do_vend(datum/data/vending_product/R) +/obj/machinery/vending/coffee/do_vend(datum/data/vending_product/R, mob/user) if(..()) return var/obj/item/reagent_containers/food/drinks/vended = new R.product_path() if(istype(vended, /obj/item/reagent_containers/food/drinks/mug)) - vended.forceMove(get_turf(src)) + var/put_on_turf = TRUE + if(user && iscarbon(user) && user.Adjacent(src)) + if(user.put_in_hands(vended)) + put_on_turf = FALSE + if(put_on_turf) + var/turf/T = get_turf(src) + vended.forceMove(T) return vended.reagents.trans_to(inserted_item, vended.reagents.total_volume) if(vended.reagents.total_volume) - vended.forceMove(get_turf(src)) + var/put_on_turf = TRUE + if(user && iscarbon(user) && user.Adjacent(src)) + if(user.put_in_hands(vended)) + put_on_turf = FALSE + if(put_on_turf) + var/turf/T = get_turf(src) + vended.forceMove(T) else qdel(vended) @@ -982,6 +1011,33 @@ contraband = list(/obj/item/clothing/under/patriotsuit = 1,/obj/item/bedsheet/patriot = 3) armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0) + +/obj/machinery/vending/toyliberationstation + name = "\improper Syndicate Donksoft Toy Vendor" + desc = "An ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!" + icon_state = "syndi" + product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get permabrigged!" + product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!" + vend_reply = "Come back for more!" + products = list(/obj/item/gun/projectile/automatic/toy = 10, + /obj/item/gun/projectile/automatic/toy/pistol= 10, + /obj/item/gun/projectile/shotgun/toy = 10, + /obj/item/toy/sword = 10, + /obj/item/ammo_box/foambox = 20, + /obj/item/toy/foamblade = 10, + /obj/item/toy/syndicateballoon = 10, + /obj/item/clothing/suit/syndicatefake = 5, + /obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just an assistant + contraband = list(/obj/item/gun/projectile/shotgun/toy/crossbow= 10, //Congrats, you unlocked the +18 setting! + /obj/item/gun/projectile/automatic/c20r/toy/riot = 10, + /obj/item/gun/projectile/automatic/l6_saw/toy/riot = 10, + /obj/item/gun/projectile/automatic/sniper_rifle/toy = 10, + /obj/item/ammo_box/foambox/riot = 20, + /obj/item/toy/katana = 10, + /obj/item/twohanded/dualsaber/toy = 5, + /obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item + armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0) + /obj/machinery/vending/cigarette name = "cigarette machine" desc = "If you want to get cancer, might as well do it in style." @@ -998,6 +1054,37 @@ /obj/machinery/vending/cigarette/free prices = list() +/obj/machinery/vending/cigarette/syndicate + products = list(/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 7, + /obj/item/storage/fancy/cigarettes/cigpack_uplift = 3, + /obj/item/storage/fancy/cigarettes/cigpack_robust = 2, + /obj/item/storage/fancy/cigarettes/cigpack_carp = 3, + /obj/item/storage/fancy/cigarettes/cigpack_midori = 1, + /obj/item/storage/box/matches = 10, + /obj/item/lighter/zippo = 4, + /obj/item/storage/fancy/rollingpapers = 5) + +/obj/machinery/vending/cigarette/syndicate/free + prices = list() + +/obj/machinery/vending/cigarette/beach //Used in the lavaland_biodome_beach.dmm ruin + name = "\improper ShadyCigs Ultra" + desc = "Now with extra premium products!" + product_ads = "Probably not bad for you!;Dope will get you through times of no money better than money will get you through times of no dope!;It's good for you!" + product_slogans = "Turn on, tune in, drop out!;Better living through chemistry!;Toke!;Don't forget to keep a smile on your lips and a song in your heart!" + products = list(/obj/item/storage/fancy/cigarettes = 5, + /obj/item/storage/fancy/cigarettes/cigpack_uplift = 3, + /obj/item/storage/fancy/cigarettes/cigpack_robust = 3, + /obj/item/storage/fancy/cigarettes/cigpack_carp = 3, + /obj/item/storage/fancy/cigarettes/cigpack_midori = 3, + /obj/item/storage/box/matches = 10, + /obj/item/lighter/random = 4, + /obj/item/storage/fancy/rollingpapers = 5) + 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() ..() component_parts = list() @@ -1015,23 +1102,29 @@ icon_deny = "med-deny" product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" req_access_txt = "5" - products = list(/obj/item/reagent_containers/glass/bottle/charcoal = 4,/obj/item/reagent_containers/glass/bottle/morphine = 4,/obj/item/reagent_containers/glass/bottle/ether = 4,/obj/item/reagent_containers/glass/bottle/epinephrine = 4, - /obj/item/reagent_containers/glass/bottle/toxin = 4,/obj/item/reagent_containers/syringe/antiviral = 6,/obj/item/reagent_containers/syringe/insulin = 4, - /obj/item/reagent_containers/syringe = 12,/obj/item/healthanalyzer = 5,/obj/item/healthupgrade = 5,/obj/item/reagent_containers/glass/beaker = 4, /obj/item/reagent_containers/hypospray/safety = 2, - /obj/item/reagent_containers/dropper = 2,/obj/item/stack/medical/bruise_pack/advanced = 3, /obj/item/stack/medical/ointment/advanced = 3, - /obj/item/stack/medical/bruise_pack = 3,/obj/item/stack/medical/splint = 4, /obj/item/sensor_device = 2, /obj/item/reagent_containers/hypospray/autoinjector = 4, - /obj/item/pinpointer/crew = 2) - contraband = list(/obj/item/reagent_containers/glass/bottle/pancuronium = 1,/obj/item/reagent_containers/glass/bottle/sulfonal = 1) + products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/food/pill/patch/styptic = 10, /obj/item/reagent_containers/food/pill/patch/silver_sulf = 10, + /obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/diphenhydramine = 4, + /obj/item/reagent_containers/glass/bottle/salicylic = 4, /obj/item/reagent_containers/glass/bottle/potassium_iodide =3, /obj/item/reagent_containers/glass/bottle/saline = 5, + /obj/item/reagent_containers/glass/bottle/morphine = 4, /obj/item/reagent_containers/glass/bottle/ether = 4, /obj/item/reagent_containers/glass/bottle/atropine = 3, + /obj/item/reagent_containers/glass/bottle/oculine = 2, /obj/item/reagent_containers/glass/bottle/toxin = 4, /obj/item/reagent_containers/syringe/antiviral = 6, + /obj/item/reagent_containers/syringe/insulin = 6, /obj/item/reagent_containers/syringe/calomel = 10, /obj/item/reagent_containers/hypospray/autoinjector = 5, /obj/item/reagent_containers/food/pill/salbutamol = 10, + /obj/item/reagent_containers/food/pill/mannitol = 10, /obj/item/reagent_containers/food/pill/mutadone = 5, /obj/item/stack/medical/bruise_pack/advanced = 4, /obj/item/stack/medical/ointment/advanced = 4, /obj/item/stack/medical/bruise_pack = 4, + /obj/item/stack/medical/splint = 4, /obj/item/reagent_containers/glass/beaker = 4, /obj/item/reagent_containers/dropper = 4, /obj/item/healthanalyzer = 4, + /obj/item/healthupgrade = 4, /obj/item/reagent_containers/hypospray/safety = 2, /obj/item/sensor_device = 2, /obj/item/pinpointer/crew = 2) + contraband = list(/obj/item/reagent_containers/glass/bottle/sulfonal = 1, /obj/item/reagent_containers/glass/bottle/pancuronium = 1) armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0) +/obj/machinery/vending/medical/syndicate_access + name = "\improper SyndiMed Plus" + req_access = list(access_syndicate) + //This one's from bay12 /obj/machinery/vending/plasmaresearch name = "\improper Toximate 3000" desc = "All the fine parts you need in one vending machine!" - products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6, - /obj/item/transfer_valve = 6,/obj/item/assembly/timer = 6,/obj/item/assembly/signaler = 6, - /obj/item/assembly/prox_sensor = 6,/obj/item/assembly/igniter = 6) - contraband = list(/obj/item/assembly/health = 3) + products = list(/obj/item/assembly/prox_sensor = 8, /obj/item/assembly/igniter = 8, /obj/item/assembly/signaler = 8, + /obj/item/wirecutters = 1, /obj/item/assembly/timer = 8) + contraband = list(/obj/item/flashlight = 5, /obj/item/assembly/voice = 3, /obj/item/assembly/health = 3, /obj/item/assembly/infra = 3) /obj/machinery/vending/wallmed1 name = "\improper NanoMed" @@ -1039,10 +1132,9 @@ product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?" icon_state = "wallmed" icon_deny = "wallmed-deny" - req_access_txt = "5" - density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude - products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/reagent_containers/hypospray/autoinjector = 4,/obj/item/healthanalyzer = 1) - contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4,/obj/item/reagent_containers/syringe/antiviral = 4,/obj/item/reagent_containers/food/pill/tox = 1) + density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude + products = list(/obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/ointment = 2, /obj/item/reagent_containers/hypospray/autoinjector = 4, /obj/item/healthanalyzer = 1) + contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4, /obj/item/reagent_containers/syringe/antiviral = 4, /obj/item/reagent_containers/food/pill/tox = 1) armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0) /obj/machinery/vending/wallmed2 @@ -1050,10 +1142,9 @@ desc = "Wall-mounted Medical Equipment dispenser." icon_state = "wallmed" icon_deny = "wallmed-deny" - req_access_txt = "5" - density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude - products = list(/obj/item/reagent_containers/hypospray/autoinjector = 5,/obj/item/reagent_containers/syringe/charcoal = 3,/obj/item/stack/medical/bruise_pack = 3, - /obj/item/stack/medical/ointment =3,/obj/item/healthanalyzer = 3) + density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude + products = list(/obj/item/reagent_containers/hypospray/autoinjector = 5, /obj/item/reagent_containers/syringe/charcoal = 3, /obj/item/stack/medical/bruise_pack = 3, + /obj/item/stack/medical/ointment = 3, /obj/item/healthanalyzer = 3) contraband = list(/obj/item/reagent_containers/food/pill/tox = 3) armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0) @@ -1200,7 +1291,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 @@ -1393,7 +1485,7 @@ /obj/item/clothing/glasses/regular=2,/obj/item/clothing/glasses/sunglasses/fake=2,/obj/item/clothing/head/sombrero=1,/obj/item/clothing/suit/poncho=1, /obj/item/clothing/suit/ianshirt=1,/obj/item/clothing/shoes/laceup=2,/obj/item/clothing/shoes/black=4, /obj/item/clothing/shoes/sandal=1, /obj/item/clothing/gloves/fingerless=2, - /obj/item/storage/belt/fannypack=1, /obj/item/storage/belt/fannypack/blue=1, /obj/item/storage/belt/fannypack/red=1) + /obj/item/storage/belt/fannypack=1, /obj/item/storage/belt/fannypack/blue=1, /obj/item/storage/belt/fannypack/red=1, /obj/item/clothing/suit/mantle = 2, /obj/item/clothing/suit/mantle/old = 1, /obj/item/clothing/suit/mantle/regal = 2) contraband = list(/obj/item/clothing/under/syndicate/tacticool=1,/obj/item/clothing/mask/balaclava=1,/obj/item/clothing/head/ushanka=1,/obj/item/clothing/under/soviet=1,/obj/item/storage/belt/fannypack/black=1) premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/under/pants/mustangjeans=1) refill_canister = /obj/item/vending_refill/clothing 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/magic/Uristrunes.dm b/code/game/magic/Uristrunes.dm index 1a242594bfe..e0621db3d9b 100644 --- a/code/game/magic/Uristrunes.dm +++ b/code/game/magic/Uristrunes.dm @@ -1,7 +1,7 @@ /proc/get_rune_cult(word) var/animated - if(word && !(ticker.cultdat.theme == "fire" || ticker.cultdat.theme == "death")) + if(word && !(SSticker.cultdat.theme == "fire" || SSticker.cultdat.theme == "death")) animated = 1 else animated = 0 @@ -18,11 +18,11 @@ var/runetype = "rune" var/lookup = "[symbol_bits]-[animated]" - if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way + if(!SSticker.mode)//work around for maps with runes and cultdat is not loaded all the way runetype = "rune" - else if(ticker.cultdat.theme == "fire") + else if(SSticker.cultdat.theme == "fire") runetype = "fire-rune" - else if(ticker.cultdat.theme == "death") + else if(SSticker.cultdat.theme == "death") runetype = "death-rune" diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index f1ad010ea93..8a910670201 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -4,7 +4,7 @@ /obj/item/mecha_parts/mecha_equipment/medical/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/mecha_parts/mecha_equipment/medical/can_attach(obj/mecha/medical/M) @@ -13,19 +13,19 @@ /obj/item/mecha_parts/mecha_equipment/medical/attach(obj/mecha/M) ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/mecha_parts/mecha_equipment/medical/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/medical/process() if(!chassis) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return 1 /obj/item/mecha_parts/mecha_equipment/medical/detach() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/medical/sleeper @@ -66,7 +66,7 @@ return target.forceMove(src) patient = target - processing_objects.Add(src) + START_PROCESSING(SSobj, src) update_equip_info() occupant_message("[target] successfully loaded into [src]. Life support functions engaged.") chassis.visible_message("[chassis] loads [target] into [src].") @@ -90,7 +90,7 @@ patient.forceMove(get_turf(src)) occupant_message("[patient] ejected. Life support functions disabled.") log_message("[patient] ejected. Life support functions disabled.") - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) patient = null update_equip_info() @@ -98,7 +98,7 @@ if(patient) occupant_message("Unable to detach [src] - equipment occupied!") return - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/medical/sleeper/get_equip_info() @@ -221,7 +221,7 @@ set_ready_state(1) log_message("Deactivated.") occupant_message("[src] deactivated - no power.") - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return var/mob/living/carbon/M = patient if(!M) @@ -263,11 +263,11 @@ processed_reagents = new /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/detach() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/critfail() @@ -374,7 +374,7 @@ m++ if(processed_reagents.len) message += " added to production" - processing_objects.Add(src) + START_PROCESSING(SSobj, src) occupant_message(message) occupant_message("Reagent processing started.") log_message("Reagent processing started.") @@ -513,7 +513,7 @@ if(!processed_reagents.len || reagents.total_volume >= reagents.maximum_volume || !chassis.has_charge(energy_drain)) occupant_message("Reagent processing stopped.") log_message("Reagent processing stopped.") - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return var/amount = synth_speed / processed_reagents.len for(var/reagent in processed_reagents) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index b1a110813e8..635f1718134 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -59,12 +59,12 @@ drill.log_message("Drilled through [src]") drill.move_ores() -/turf/simulated/floor/plating/airless/asteroid/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) +/turf/simulated/floor/plating/asteroid/airless/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) if(istype(drill, /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill)) - for(var/turf/simulated/floor/plating/airless/asteroid/M in range(1, src)) + for(var/turf/simulated/floor/plating/asteroid/airless/M in range(1, src)) M.gets_drilled() else - for(var/turf/simulated/floor/plating/airless/asteroid/M in range(1, drill.chassis)) + for(var/turf/simulated/floor/plating/asteroid/airless/M in range(1, drill.chassis)) if(get_dir(drill.chassis, M) & drill.chassis.dir) M.gets_drilled() drill.log_message("Drilled through [src]") @@ -116,14 +116,14 @@ /obj/item/mecha_parts/mecha_equipment/mining_scanner/attach(obj/mecha/M) . = ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) M.occupant_sight_flags |= SEE_TURFS if(M.occupant) M.occupant.update_sight() /obj/item/mecha_parts/mecha_equipment/mining_scanner/detach() chassis.occupant_sight_flags &= ~SEE_TURFS - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) if(chassis.occupant) chassis.occupant.update_sight() return ..() diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index a42e76015c1..4cfbc5c8143 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -193,7 +193,7 @@ selectable = 0 /obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) if(chassis) chassis.overlays -= droid_overlay return ..() @@ -205,7 +205,7 @@ /obj/item/mecha_parts/mecha_equipment/repair_droid/detach() chassis.overlays -= droid_overlay - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/item/mecha_parts/mecha_equipment/repair_droid/get_equip_info() if(!chassis) return @@ -217,12 +217,12 @@ if(href_list["toggle_repairs"]) chassis.overlays -= droid_overlay if(equip_ready) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) droid_overlay = new(icon, icon_state = "repair_droid_a") log_message("Activated.") set_ready_state(0) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) droid_overlay = new(icon, icon_state = "repair_droid") log_message("Deactivated.") set_ready_state(1) @@ -232,7 +232,7 @@ /obj/item/mecha_parts/mecha_equipment/repair_droid/process() if(!chassis) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) return var/h_boost = health_boost @@ -250,10 +250,10 @@ repaired = 1 if(repaired) if(!chassis.use_power(energy_drain)) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) else //no repair needed, we turn off - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) chassis.overlays -= droid_overlay droid_overlay = new(icon, icon_state = "repair_droid") @@ -273,11 +273,11 @@ selectable = 0 /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/detach() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) ..() /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/get_charge() @@ -302,11 +302,11 @@ ..() if(href_list["toggle_relay"]) if(equip_ready) //inactive - processing_objects.Add(src) + START_PROCESSING(SSobj, src) set_ready_state(0) log_message("Activated.") else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) log_message("Deactivated.") @@ -317,12 +317,12 @@ /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/process() if(!chassis || chassis.internal_damage & MECHA_INT_SHORT_CIRCUIT) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) return var/cur_charge = chassis.get_charge() if(isnull(cur_charge) || !chassis.cell) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) occupant_message("No powercell detected.") return @@ -358,11 +358,11 @@ /obj/item/mecha_parts/mecha_equipment/generator/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/generator/detach() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) ..() /obj/item/mecha_parts/mecha_equipment/generator/Topic(href, href_list) @@ -370,11 +370,11 @@ if(href_list["toggle"]) if(equip_ready) //inactive set_ready_state(0) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) log_message("Activated.") else set_ready_state(1) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) log_message("Deactivated.") /obj/item/mecha_parts/mecha_equipment/generator/get_equip_info() @@ -447,11 +447,11 @@ /obj/item/mecha_parts/mecha_equipment/generator/process() if(!chassis) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) return if(fuel_amount<=0) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) log_message("Deactivated - no fuel.") set_ready_state(1) return @@ -460,7 +460,7 @@ set_ready_state(1) occupant_message("No powercell detected.") log_message("Deactivated.") - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return var/use_fuel = fuel_per_cycle_idle if(cur_charge < chassis.cell.maxcharge) diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 0a623bf5cb1..940e89b804b 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -232,7 +232,7 @@ occupant_message("Deconstructing [target]...") if(do_after_cooldown(F)) chassis.spark_system.start() - F.ChangeTurf(/turf/space) + F.ChangeTurf(F.baseturf) F.air_update_turf() playsound(F, usesound, 50, 1) else if(istype(target, /obj/machinery/door/airlock)) 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 6cfd1d63942..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 @@ -118,7 +119,7 @@ smoke_system.attach(src) add_cell() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) GLOB.poi_list |= src log_message("[src] created.") GLOB.mechas_list += src //global mech list @@ -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 @@ -670,7 +675,7 @@ QDEL_NULL(cell) QDEL_NULL(internal_tank) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) GLOB.poi_list.Remove(src) equipment.Cut() cell = null @@ -1518,6 +1523,8 @@ if(user == occupant) user.sight |= occupant_sight_flags + ..() + /obj/mecha/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect, end_pixel_y) if(!no_effect) if(selected) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index ab38ee3a0d0..5b4a8143bef 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -20,9 +20,9 @@ update_pressure() /obj/mecha/working/ripley/Destroy() - while(damage_absorption.["brute"] < 0.6) - new /obj/item/asteroid/goliath_hide(loc) - damage_absorption.["brute"] = damage_absorption.["brute"] + 0.1 //If a goliath-plated ripley gets killed, all the plates drop + while(damage_absorption["brute"] < 0.6) + new /obj/item/stack/sheet/animalhide/goliath_hide(loc) + damage_absorption["brute"] = damage_absorption["brute"] + 0.1 //If a goliath-plated ripley gets killed, all the plates drop for(var/atom/movable/A in cargo) A.forceMove(loc) step_rand(A) @@ -31,28 +31,28 @@ /obj/mecha/working/ripley/go_out() ..() - if(damage_absorption.["brute"] < 0.6 && damage_absorption.["brute"] > 0.3) + if(damage_absorption["brute"] < 0.6 && damage_absorption["brute"] > 0.3) overlays = null overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-open") - else if(damage_absorption.["brute"] == 0.3) + else if(damage_absorption["brute"] == 0.3) overlays = null overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full-open") /obj/mecha/working/ripley/moved_inside(var/mob/living/carbon/human/H as mob) ..() - if(damage_absorption.["brute"] < 0.6 && damage_absorption.["brute"] > 0.3) + if(damage_absorption["brute"] < 0.6 && damage_absorption["brute"] > 0.3) overlays = null overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g") - else if(damage_absorption.["brute"] == 0.3) + else if(damage_absorption["brute"] == 0.3) overlays = null overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full") /obj/mecha/working/ripley/mmi_moved_inside(var/obj/item/mmi/mmi_as_oc as obj,mob/user as mob) ..() - if(damage_absorption.["brute"] < 0.6 && damage_absorption.["brute"] > 0.3) + if(damage_absorption["brute"] < 0.6 && damage_absorption["brute"] > 0.3) overlays = null overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g") - else if(damage_absorption.["brute"] == 0.3) + else if(damage_absorption["brute"] == 0.3) overlays = null overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full") 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/alien_acid.dm b/code/game/objects/effects/alien_acid.dm index 59ae654c85b..118d3efcc2c 100644 --- a/code/game/objects/effects/alien_acid.dm +++ b/code/game/objects/effects/alien_acid.dm @@ -53,11 +53,11 @@ if(istype(target, /turf/simulated/mineral)) var/turf/simulated/mineral/M = target - M.ChangeTurf(/turf/simulated/floor/plating/airless/asteroid) + M.ChangeTurf(/turf/simulated/floor/plating/asteroid/airless) if(istype(target, /turf/simulated/floor)) var/turf/simulated/floor/F = target - F.ChangeTurf(/turf/space) + F.ChangeTurf(F.baseturf) if(istype(target, /turf/simulated/wall)) var/turf/simulated/wall/W = target diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 53072d7e82c..c410a9130a0 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -14,7 +14,6 @@ var/global/list/image/splatter_cache = list() icon = 'icons/effects/blood.dmi' icon_state = "mfloor1" random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") - appearance_flags = NO_CLIENT_COLOR blood_DNA = list() var/base_icon = 'icons/effects/blood.dmi' var/blood_state = BLOOD_STATE_HUMAN @@ -28,7 +27,7 @@ var/global/list/image/splatter_cache = list() . = ..() update_icon() if(GAMEMODE_IS_CULT) - var/datum/game_mode/cult/mode_ticker = ticker.mode + var/datum/game_mode/cult/mode_ticker = SSticker.mode var/turf/T = get_turf(src) if(T && (is_station_level(T.z)))//F I V E T I L E S if(!(T in mode_ticker.bloody_floors)) @@ -48,7 +47,7 @@ var/global/list/image/splatter_cache = list() /obj/effect/decal/cleanable/blood/Destroy() if(GAMEMODE_IS_CULT) - var/datum/game_mode/cult/mode_ticker = ticker.mode + var/datum/game_mode/cult/mode_ticker = SSticker.mode var/turf/T = get_turf(src) if(T && (is_station_level(T.z))) mode_ticker.bloody_floors -= T @@ -89,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") @@ -155,7 +154,6 @@ var/global/list/image/splatter_cache = list() layer = TURF_LAYER random_icon_states = null blood_DNA = list() - appearance_flags = NO_CLIENT_COLOR var/list/existing_dirs = list() /obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in() @@ -192,7 +190,7 @@ var/global/list/image/splatter_cache = list() icon = 'icons/effects/blood.dmi' icon_state = "gibbl5" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") - noclear = TRUE + no_clear = TRUE var/fleshcolor = "#FFFFFF" /obj/effect/decal/cleanable/blood/gibs/update_icon() @@ -221,18 +219,11 @@ var/global/list/image/splatter_cache = list() /obj/effect/decal/cleanable/blood/gibs/core random_icon_states = list("gibmid1", "gibmid2", "gibmid3") - -/obj/effect/decal/cleanable/blood/gibs/Initialize() - . = ..() - reagents.add_reagent("liquidgibs", 5) + scoop_reagents = list("liquidgibs" = 5) /obj/effect/decal/cleanable/blood/gibs/cleangibs //most ironic name ever... - -/obj/effect/decal/cleanable/blood/gibs/cleangibs/Initialize() //no reagent! - . = ..() - reagents.remove_reagent("liquidgibs",5) - + scoop_reagents = null /obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions) set waitfor = 0 diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index d601283a703..d1ba3204bd0 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -15,10 +15,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "ash" anchored = TRUE - -/obj/effect/decal/cleanable/ash/Initialize() - . = ..() - reagents.add_reagent("ash", 10) + scoop_reagents = list("ash" = 10) /obj/effect/decal/cleanable/dirt name = "dirt" @@ -40,11 +37,8 @@ /obj/effect/decal/cleanable/dirt/blackpowder name = "black powder" mouse_opacity = TRUE - noscoop = TRUE - -/obj/effect/decal/cleanable/dirt/blackpowder/Initialize() - . = ..() - reagents.add_reagent("blackpowder", 40) // size 2 explosion when activated + no_scoop = TRUE + scoop_reagents = list("blackpowder" = 40) // size 2 explosion when activated /obj/effect/decal/cleanable/flour name = "flour" @@ -127,22 +121,15 @@ icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") - noclear = TRUE - -/obj/effect/decal/cleanable/vomit/Initialize() - . = ..() - reagents.add_reagent("vomit", 5) + no_clear = TRUE + scoop_reagents = list("vomit" = 5) /obj/effect/decal/cleanable/vomit/green name = "green vomit" desc = "It's all gummy. Ew." icon_state = "gvomit_1" random_icon_states = list("gvomit_1", "gvomit_2", "gvomit_3", "gvomit_4") - -/obj/effect/decal/cleanable/vomit/green/Initialize() - . = ..() - reagents.remove_reagent("vomit", 5) - reagents.add_reagent("green_vomit", 5) + scoop_reagents = list("green_vomit" = 5) /obj/effect/decal/cleanable/tomato_smudge name = "tomato smudge" @@ -189,10 +176,7 @@ icon = 'icons/effects/effects.dmi' icon_state = "flour" color = "#D5820B" - -/obj/effect/decal/cleanable/fungus/Initialize() - . = ..() - reagents.add_reagent("fungus", 10) + scoop_reagents = list("fungus" = 10) /obj/effect/decal/cleanable/confetti //PARTY TIME! name = "confetti" @@ -202,3 +186,11 @@ icon_state = "confetti1" random_icon_states = list("confetti1", "confetti2", "confetti3") anchored = TRUE + +/obj/effect/decal/cleanable/insectguts + name = "cockroach guts" + desc = "One bug squashed. Four more will rise in its place." + icon = 'icons/effects/blood.dmi' + icon_state = "xfloor1" + random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") + anchored = TRUE \ No newline at end of file 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/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 52ec24df16c..461273bccdb 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -1,8 +1,6 @@ /obj/effect/decal/cleanable anchored = TRUE var/list/random_icon_states = list() - var/noscoop = FALSE //if it has this, don't let it be scooped up - var/noclear = FALSE //if it has this, don't delete it when its' scooped up /obj/effect/decal/cleanable/proc/can_bloodcrawl_in() return FALSE @@ -10,7 +8,6 @@ /obj/effect/decal/cleanable/New() if(random_icon_states && length(src.random_icon_states) > 0) src.icon_state = pick(src.random_icon_states) - create_reagents(100) if(smooth) queue_smooth(src) queue_smooth_neighbors(src) @@ -19,25 +16,4 @@ /obj/effect/decal/cleanable/Destroy() if(smooth) queue_smooth_neighbors(src) - return ..() - -/obj/effect/decal/cleanable/attackby(obj/item/W as obj, mob/user as mob,) - if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food/drinks)) - if(src.reagents && W.reagents && !noscoop) - if(!src.reagents.total_volume) - to_chat(user, "There isn't enough [src] to scoop up!") - return - if(W.reagents.total_volume >= W.reagents.maximum_volume) - to_chat(user, "[W] is full!") - return - to_chat(user, "You scoop the [src] into [W]!") - reagents.trans_to(W, reagents.total_volume) - if(!reagents.total_volume && !noclear) //scooped up all of it - qdel(src) - return - -/obj/effect/decal/cleanable/ex_act() - if(reagents) - for(var/datum/reagent/R in reagents.reagent_list) - R.on_ex_act() - ..() \ No newline at end of file + return ..() \ No newline at end of file diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm new file mode 100644 index 00000000000..31ae7ab68de --- /dev/null +++ b/code/game/objects/effects/decals/decal.dm @@ -0,0 +1,15 @@ +/obj/effect/turf_decal + icon = 'icons/turf/decals.dmi' + icon_state = "warningline" + layer = TURF_DECAL_LAYER + +/obj/effect/turf_decal/Initialize(mapload) + . = ..() + qdel(src) // return INITIALIZE_HINT_QDEL <-- Doesn't work + +/obj/effect/turf_decal/ComponentInitialize() + . = ..() + var/turf/T = loc + if(!istype(T)) //you know this will happen somehow + CRASH("Turf decal initialized in an object/nullspace") + T.AddComponent(/datum/component/decal, icon, icon_state, dir, CLEAN_GOD, color, null, null, alpha) \ No newline at end of file diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 52ad55c48a4..64561630d06 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -54,3 +54,16 @@ /obj/effect/decal/straw/edge icon_state = "strawscatterededge" + +/obj/effect/decal/ants + name = "space ants" + desc = "A bunch of space ants." + icon = 'icons/goonstation/effects/effects.dmi' + icon_state = "spaceants" + scoop_reagents = list("ants" = 20) + +/obj/effect/decal/ants/Initialize(mapload) + . = ..() + var/scale = (rand(2, 10) / 10) + (rand(0, 5) / 100) + transform = matrix(transform, scale, scale, MATRIX_SCALE) + setDir(pick(NORTH, SOUTH, EAST, WEST)) \ No newline at end of file diff --git a/code/game/objects/effects/decals/turfdecals/dirt.dm b/code/game/objects/effects/decals/turfdecals/dirt.dm new file mode 100644 index 00000000000..a2a1e8c6455 --- /dev/null +++ b/code/game/objects/effects/decals/turfdecals/dirt.dm @@ -0,0 +1,5 @@ +/obj/effect/turf_decal/sand + icon_state = "sandyfloor" + +/obj/effect/turf_decal/sand/plating + icon_state = "sandyplating" \ No newline at end of file diff --git a/code/game/objects/effects/decals/turfdecals/markings.dm b/code/game/objects/effects/decals/turfdecals/markings.dm new file mode 100644 index 00000000000..8687967e1d1 --- /dev/null +++ b/code/game/objects/effects/decals/turfdecals/markings.dm @@ -0,0 +1,152 @@ +/obj/effect/turf_decal/stripes/line + icon_state = "warningline" + +/obj/effect/turf_decal/stripes/end + icon_state = "warn_end" + +/obj/effect/turf_decal/stripes/corner + icon_state = "warninglinecorner" + +/obj/effect/turf_decal/stripes/box + icon_state = "warn_box" + +/obj/effect/turf_decal/stripes/full + icon_state = "warn_full" + +/obj/effect/turf_decal/stripes/asteroid/line + icon_state = "ast_warn" + +/obj/effect/turf_decal/stripes/asteroid/end + icon_state = "ast_warn_end" + +/obj/effect/turf_decal/stripes/asteroid/corner + icon_state = "ast_warn_corner" + +/obj/effect/turf_decal/stripes/asteroid/box + icon_state = "ast_warn_box" + +/obj/effect/turf_decal/stripes/asteroid/full + icon_state = "ast_warn_full" + +/obj/effect/turf_decal/stripes/white/line + icon_state = "warningline_white" + +/obj/effect/turf_decal/stripes/white/end + icon_state = "warn_end_white" + +/obj/effect/turf_decal/stripes/white/corner + icon_state = "warninglinecorner_white" + +/obj/effect/turf_decal/stripes/white/box + icon_state = "warn_box_white" + +/obj/effect/turf_decal/stripes/white/full + icon_state = "warn_full_white" + +/obj/effect/turf_decal/stripes/red/line + icon_state = "warningline_red" + +/obj/effect/turf_decal/stripes/red/end + icon_state = "warn_end_red" + +/obj/effect/turf_decal/stripes/red/corner + icon_state = "warninglinecorner_red" + +/obj/effect/turf_decal/stripes/red/box + icon_state = "warn_box_red" + +/obj/effect/turf_decal/stripes/red/full + icon_state = "warn_full_red" + +/obj/effect/turf_decal/delivery + icon_state = "delivery" + +/obj/effect/turf_decal/delivery/white + icon_state = "delivery_white" + +/obj/effect/turf_decal/delivery/red + icon_state = "delivery_red" + +/obj/effect/turf_decal/bot + icon_state = "bot" + +/obj/effect/turf_decal/bot/right + icon_state = "bot_right" + +/obj/effect/turf_decal/bot/left + icon_state = "bot_left" + +/obj/effect/turf_decal/bot_white + icon_state = "bot_white" + +/obj/effect/turf_decal/bot_white/right + icon_state = "bot_right_white" + +/obj/effect/turf_decal/bot_white/left + icon_state = "bot_left_white" + +/obj/effect/turf_decal/bot_red + icon_state = "bot_red" + +/obj/effect/turf_decal/bot_red/right + icon_state = "bot_right_red" + +/obj/effect/turf_decal/bot_red/left + icon_state = "bot_left_red" + +/obj/effect/turf_decal/loading_area + icon_state = "loadingarea" + +/obj/effect/turf_decal/loading_area/white + icon_state = "loadingarea_white" + +/obj/effect/turf_decal/loading_area/red + icon_state = "loadingarea_red" + +/obj/effect/turf_decal/caution + icon_state = "caution" + +/obj/effect/turf_decal/caution/white + icon_state = "caution_white" + +/obj/effect/turf_decal/caution/red + icon_state = "caution_red" + +/obj/effect/turf_decal/caution/stand_clear + icon_state = "stand_clear" + +/obj/effect/turf_decal/caution/stand_clear/white + icon_state = "stand_clear_white" + +/obj/effect/turf_decal/caution/stand_clear/red + icon_state = "stand_clear_red" + +/obj/effect/turf_decal/arrows + icon_state = "arrows" + +/obj/effect/turf_decal/arrows/white + icon_state = "arrows_white" + +/obj/effect/turf_decal/arrows/red + icon_state = "arrows_red" + +/obj/effect/turf_decal/box + icon_state = "box" + +/obj/effect/turf_decal/box/corners + icon_state = "box_corners" + +/obj/effect/turf_decal/box/white + icon_state = "box_white" + +/obj/effect/turf_decal/box/white/corners + icon_state = "box_corners_white" + +/obj/effect/turf_decal/box/red + icon_state = "box_red" + +/obj/effect/turf_decal/box/red/corners + icon_state = "box_corners_red" + +/obj/effect/turf_decal/plaque + icon_state = "plaque" \ No newline at end of file diff --git a/code/game/objects/effects/decals/turfdecals/tilecoloring.dm b/code/game/objects/effects/decals/turfdecals/tilecoloring.dm new file mode 100644 index 00000000000..1708753dc1e --- /dev/null +++ b/code/game/objects/effects/decals/turfdecals/tilecoloring.dm @@ -0,0 +1,39 @@ +/obj/effect/turf_decal/tile + name = "tile decal" + icon_state = "tile_corner" + layer = TURF_PLATING_DECAL_LAYER + alpha = 110 + +/obj/effect/turf_decal/tile/blue + name = "blue corner" + color = "#52B4E9" + +/obj/effect/turf_decal/tile/green + name = "green corner" + color = "#9FED58" + +/obj/effect/turf_decal/tile/yellow + name = "yellow corner" + color = "#EFB341" + +/obj/effect/turf_decal/tile/red + name = "red corner" + color = "#DE3A3A" + +/obj/effect/turf_decal/tile/bar + name = "bar corner" + color = "#791500" + alpha = 130 + +/obj/effect/turf_decal/tile/purple + name = "purple corner" + color = "#D381C9" + +/obj/effect/turf_decal/tile/brown + name = "brown corner" + color = "#A46106" + +/obj/effect/turf_decal/tile/neutral + name = "neutral corner" + color = "#D4D4D4" + alpha = 50 \ No newline at end of file diff --git a/code/game/objects/effects/decals/turfdecals/weather.dm b/code/game/objects/effects/decals/turfdecals/weather.dm new file mode 100644 index 00000000000..9e8da6a3f89 --- /dev/null +++ b/code/game/objects/effects/decals/turfdecals/weather.dm @@ -0,0 +1,12 @@ +/obj/effect/turf_decal/weather + name = "sandy floor" + icon_state = "sandyfloor" + +/obj/effect/turf_decal/weather/snow + name = "snowy floor" + icon_state = "snowyfloor" + +/obj/effect/turf_decal/weather/snow/corner + name = "snow corner piece" + icon = 'icons/turf/snow.dmi' + icon_state = "snow_corner" \ No newline at end of file diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 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/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 1231c8136fa..04ea1dc0841 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -14,11 +14,11 @@ would spawn and follow the beaker, even if it is carried or thrown. /obj/effect/particle_effect/New() ..() - if(ticker) + if(SSticker) cameranet.updateVisibility(src) /obj/effect/particle_effect/Destroy() - if(ticker) + if(SSticker) cameranet.updateVisibility(src) return ..() diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 6d746377ec7..f134bd44b10 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -24,12 +24,12 @@ spawn(3 + metal*3) process() spawn(120) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) sleep(30) if(metal) var/turf/T = get_turf(src) - if(istype(T, /turf/space)) + if(istype(T, /turf/space) && !istype(T, /turf/space/transit)) T.ChangeTurf(/turf/simulated/floor/plating/metalfoam) var/turf/simulated/floor/plating/metalfoam/MF = get_turf(src) MF.metal = metal @@ -76,10 +76,10 @@ F = new /obj/effect/particle_effect/foam(T, metal) F.amount = amount if(!metal) - F.create_reagents(15) + F.create_reagents(25) if(reagents) for(var/datum/reagent/R in reagents.reagent_list) - F.reagents.add_reagent(R.id, min(R.volume, 3), R.data, reagents.chem_temp) + F.reagents.add_reagent(R.id, min(R.volume, 5), R.data, reagents.chem_temp) F.color = mix_color_from_reagents(reagents.reagent_list) // foam disolves when heated @@ -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 @@ -149,14 +149,14 @@ F.amount = amount if(!metal) // don't carry other chemicals if a metal foam - F.create_reagents(15) + F.create_reagents(25) if(carried_reagents) for(var/id in carried_reagents) if(banned_reagents.Find("[id]")) continue var/datum/reagent/reagent_volume = carried_reagents[id] - F.reagents.add_reagent(id, min(reagent_volume, 3), null, temperature) + F.reagents.add_reagent(id, min(reagent_volume, 5), null, temperature) F.color = mix_color_from_reagents(F.reagents.reagent_list) else F.reagents.add_reagent("cleaner", 1) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 405a0ec46f7..93ab0c8e51b 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -30,15 +30,15 @@ /obj/effect/particle_effect/smoke/New() ..() - processing_objects |= src + START_PROCESSING(SSobj, src) lifetime += rand(-1,1) /obj/effect/particle_effect/smoke/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/effect/particle_effect/smoke/proc/kill_smoke() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) INVOKE_ASYNC(src, .proc/fade_out) QDEL_IN(src, 10) @@ -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/effects.dm b/code/game/objects/effects/effects.dm index 21b9759df62..5feec285408 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -13,4 +13,39 @@ return /obj/effect/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) - return FALSE \ No newline at end of file + return FALSE + +/obj/effect/decal + plane = FLOOR_PLANE + var/no_scoop = FALSE //if it has this, don't let it be scooped up + var/no_clear = FALSE //if it has this, don't delete it when its' scooped up + var/list/scoop_reagents = null + +/obj/effect/decal/Initialize(mapload) + . = ..() + if(scoop_reagents) + create_reagents(100) + reagents.add_reagent_list(scoop_reagents) + +/obj/effect/decal/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks)) + scoop(I, user) + +/obj/effect/decal/proc/scoop(obj/item/I, mob/user) + if(reagents && I.reagents && !no_scoop) + if(!reagents.total_volume) + to_chat(user, "There isn't enough [src] to scoop up!") + return + if(I.reagents.total_volume >= I.reagents.maximum_volume) + to_chat(user, "[I] is full!") + return + to_chat(user, "You scoop [src] into [I]!") + reagents.trans_to(I, reagents.total_volume) + if(!reagents.total_volume && !no_clear) //scooped up all of it + qdel(src) + +/obj/effect/decal/ex_act() + if(reagents) + for(var/datum/reagent/R in reagents.reagent_list) + R.on_ex_act() + ..() \ No newline at end of file diff --git a/code/game/objects/effects/mapping_helpers.dm b/code/game/objects/effects/mapping_helpers.dm new file mode 100644 index 00000000000..44a16c5ae5f --- /dev/null +++ b/code/game/objects/effects/mapping_helpers.dm @@ -0,0 +1,90 @@ +/obj/effect/baseturf_helper //Set the baseturfs of every turf in the /area/ it is placed. + name = "baseturf editor" + icon = 'icons/effects/mapping_helpers.dmi' + icon_state = "" + + var/baseturf + + layer = POINT_LAYER + +/obj/effect/baseturf_helper/Initialize(mapload) + . = ..() + var/area/thearea = get_area(src) + for(var/turf/T in get_area_turfs(thearea, z)) + replace_baseturf(T) + return INITIALIZE_HINT_QDEL + +/obj/effect/baseturf_helper/proc/replace_baseturf(turf/thing) + if(thing.baseturf != thing.type) + thing.baseturf = baseturf + +/obj/effect/baseturf_helper/space + name = "space baseturf editor" + baseturf = /turf/space + +/obj/effect/baseturf_helper/asteroid + name = "asteroid baseturf editor" + baseturf = /turf/simulated/floor/plating/asteroid + +/obj/effect/baseturf_helper/asteroid/airless + name = "asteroid airless baseturf editor" + baseturf = /turf/simulated/floor/plating/asteroid/airless + +/obj/effect/baseturf_helper/asteroid/basalt + name = "asteroid basalt baseturf editor" + baseturf = /turf/simulated/floor/plating/asteroid/basalt + +/obj/effect/baseturf_helper/asteroid/snow + name = "asteroid snow baseturf editor" + baseturf = /turf/simulated/floor/plating/asteroid/snow + +/obj/effect/baseturf_helper/beach/sand + name = "beach sand baseturf editor" + baseturf = /turf/simulated/floor/beach/sand + +/obj/effect/baseturf_helper/beach/water + name = "water baseturf editor" + baseturf = /turf/simulated/floor/beach/water + +/obj/effect/baseturf_helper/lava + name = "lava baseturf editor" + baseturf = /turf/simulated/floor/plating/lava/smooth + +/obj/effect/baseturf_helper/lava_land/surface + name = "lavaland baseturf editor" + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface + +/obj/effect/mapping_helpers + icon = 'icons/effects/mapping_helpers.dmi' + icon_state = "" + var/late = FALSE + +/obj/effect/mapping_helpers/Initialize(mapload) + ..() + + return late ? INITIALIZE_HINT_LATELOAD : qdel(src) // INITIALIZE_HINT_QDEL <-- Doesn't work + +/obj/effect/mapping_helpers/no_lava + icon_state = "no_lava" + +/obj/effect/mapping_helpers/airlock + layer = DOOR_HELPER_LAYER + +/obj/effect/mapping_helpers/airlock/unres + name = "airlock unresctricted side helper" + icon_state = "airlock_unres_helper" + +/obj/effect/mapping_helpers/airlock/unres/Initialize(mapload) + if(!mapload) + log_world("### MAP WARNING, [src] spawned outside of mapload!") + return + var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in src.loc + if(airlock) + airlock.unres_sides ^= dir + else + log_world("### MAP WARNING, [src] failed to find an airlock at [AREACOORD(src)]") + ..() +/obj/effect/mapping_helpers/no_lava/New() + var/turf/T = get_turf(src) + T.flags |= NO_LAVA_GEN + . = ..() \ No newline at end of file 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/misc.dm b/code/game/objects/effects/misc.dm index 3ea1fc0c3d6..191f776d01c 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -92,4 +92,36 @@ name = "horrific experiment" desc = "Some sort of pod filled with blood and vicerea. You swear you can see it moving..." icon = 'icons/obj/cloning.dmi' - icon_state = "pod_g" \ No newline at end of file + icon_state = "pod_g" + + +//Makes a tile fully lit no matter what +/obj/effect/fullbright + icon = 'icons/effects/alphacolors.dmi' + icon_state = "white" + plane = LIGHTING_PLANE + layer = LIGHTING_LAYER + blend_mode = BLEND_ADD + + +/obj/effect/dummy/lighting_obj + name = "lighting fx obj" + desc = "Tell a coder if you're seeing this." + icon_state = "nothing" + light_color = "#FFFFFF" + light_range = MINIMUM_USEFUL_LIGHT_RANGE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/effect/dummy/lighting_obj/Initialize(mapload, _color, _range, _power, _duration) + . = ..() + set_light(_range ? _range : light_range, _power ? _power : light_power, _color ? _color : light_color) + if(_duration) + QDEL_IN(src, _duration) + +/obj/effect/dummy/lighting_obj/moblight + name = "mob lighting fx" + +/obj/effect/dummy/lighting_obj/moblight/Initialize(mapload, _color, _range, _power, _duration) + . = ..() + if(!ismob(loc)) + return INITIALIZE_HINT_QDEL \ No newline at end of file diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index faaf623fa50..f36902664f8 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -3,68 +3,125 @@ desc = "Looks unstable. Best to test it with the clown." icon = 'icons/obj/stationobjs.dmi' icon_state = "portal" - density = 1 - unacidable = 1//Can't destroy energy portals. - var/failchance = 5 + unacidable = TRUE + anchored = TRUE + var/obj/item/target = null var/creator = null - anchored = 1 - var/precision = 1 // how close to the portal you will teleport. 0 = on the portal, 1 = adjacent - var/can_multitool_to_remove = 0 + + var/failchance = 5 + var/fail_icon = "portal1" + + var/precision = TRUE // how close to the portal you will teleport. FALSE = on the portal, TRUE = adjacent + 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) + ..() -/obj/effect/portal/New(loc, turf/target, creator=null, lifespan=300) GLOB.portals += src - src.loc = loc + src.target = target src.creator = creator + if(lifespan > 0) spawn(lifespan) qdel(src) /obj/effect/portal/Destroy() GLOB.portals -= src - if(istype(creator, /obj)) + + if(isobj(creator)) var/obj/O = creator O.portal_destroyed(src) + creator = null target = null return ..() -/obj/effect/portal/proc/teleport(atom/movable/M as mob|obj) - if(istype(M, /obj/effect)) //sparks don't teleport +/obj/effect/portal/singularity_pull() + return + +/obj/effect/portal/singularity_act() + return + +/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 ..() + +/obj/effect/portal/attack_tk(mob/user) + return + +/obj/effect/portal/attack_hand(mob/user) + . = ..() + if(.) return - if(M.anchored&&istype(M, /obj/mecha)) - return - if(!( target )) - qdel(src) - return - if(istype(M, /atom/movable)) - if(prob(failchance)) - src.icon_state = "portal1" - if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space. - invalid_teleport() - else - if(!do_teleport(M, target, precision, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to a turf adjacent to target. - invalid_teleport() + if(get_turf(user) == get_turf(src)) + teleport(user) + if(Adjacent(user)) + user.forceMove(get_turf(src)) + +/obj/effect/portal/attack_ghost(mob/dead/observer/O) + if(target) + O.forceMove(target) /obj/effect/portal/attackby(obj/item/A, mob/user) - if(istype(A, /obj/item/multitool) && can_multitool_to_remove) + if(ismultitool(A) && can_multitool_to_remove) qdel(src) + else if(user && Adjacent(user)) + user.forceMove(get_turf(src)) + return TRUE + +/obj/effect/portal/proc/can_teleport(atom/movable/M) + . = TRUE + + if(!istype(M)) + . = FALSE + + if(!M.simulated || iseffect(M)) + . = FALSE + + if(M.anchored && ismecha(M)) + . = FALSE + +/obj/effect/portal/proc/teleport(atom/movable/M) + if(!can_teleport(M)) + return FALSE + + if(!target) + qdel(src) + return FALSE + + if(ismegafauna(M)) + message_admins("[M] has used a portal at [ADMIN_VERBOSEJMP(src)] made by [key_name_admin(usr)].") + + if(prob(failchance)) + icon_state = fail_icon + if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space. + invalid_teleport() + return FALSE + else + if(!do_teleport(M, target, precision, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to a turf adjacent to target. + invalid_teleport() + return FALSE + + return TRUE /obj/effect/portal/proc/invalid_teleport() visible_message("[src] flickers and fails due to bluespace interference!") do_sparks(5, 0, loc) qdel(src) - /obj/effect/portal/redspace name = "redspace portal" desc = "A portal capable of bypassing bluespace interference." icon_state = "portal1" failchance = 0 precision = 0 - ignore_tele_proof_area_setting = TRUE \ No newline at end of file + ignore_tele_proof_area_setting = TRUE diff --git a/code/game/objects/effects/snowcloud.dm b/code/game/objects/effects/snowcloud.dm index 08a64d62f17..5723b66bc04 100644 --- a/code/game/objects/effects/snowcloud.dm +++ b/code/game/objects/effects/snowcloud.dm @@ -9,12 +9,12 @@ /obj/effect/snowcloud/New(turf, obj/machinery/snow_machine/SM) ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) if(SM && istype(SM)) parent_machine = SM /obj/effect/snowcloud/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/effect/snowcloud/process() @@ -73,12 +73,12 @@ anchored = TRUE /obj/effect/snow/New() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) icon_state = "snow[rand(1,6)]" ..() /obj/effect/snow/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/effect/snow/process() diff --git a/code/game/objects/effects/spawners/airlock_spawner.dm b/code/game/objects/effects/spawners/airlock_spawner.dm new file mode 100644 index 00000000000..496f02c61d1 --- /dev/null +++ b/code/game/objects/effects/spawners/airlock_spawner.dm @@ -0,0 +1,345 @@ +/* +Spawners for mappers. Just plonk one down of the desired size and it will place the machinery for you. The red arrow things indicate where the chamber is. +This spawner places pipe leading up to the interior door, you will need to finish it off yourself with a connector, canister, and pipe connecting the two. It also assumes you already put in wall and floor. +*/ + +#define HALF_X round((tiles_in_x_direction - 1) * 0.5) //These are required so that the airlock can be in the middle of the chamber wall +#define HALF_Y round((tiles_in_y_direction - 1) * 0.5) +#define CHAMBER_LONG 1 +#define CHAMBER_SQUARE 2 +#define CHAMBER_BIGGER 3 +#define DOOR_NORMAL_PLACEMENT 1 +#define DOOR_FLIPPED_PLACEMENT 2 + +#define AIRPUMP_TAG "[id_to_link]_pump" +#define SENSOR_TAG "[id_to_link]_sensor" +#define OUTER_DOOR_TAG "[id_to_link]_outer" +#define INNER_DOOR_TAG "[id_to_link]_inner" + +/obj/effect/spawner/airlock + name = "1 by 1 airlock spawner (interior north, exterior south)" + desc = "If you can see this, there's probably a missing airlock here. Better tell an admin and report this on the github." + icon = 'icons/obj/airlock_spawner.dmi' + icon_state = "1x1_N_to_S" + layer = SPLASHSCREEN_PLANE //So we absolutely always appear above everything else. We delete ourself after spawning so this is fine + var/interior_direction = NORTH //This is also the direction the spawner will send the pipe + var/exterior_direction = SOUTH + var/opposite_interior_direction //We're checking these often enough for them to merit their own vars + var/interior_direction_cw + var/interior_direction_ccw + var/north_or_south_interior //Used a bit everywhere for locational stuff + var/north_or_south_exterior //Likewise + var/tiles_in_x_direction = 1 + var/tiles_in_y_direction = 1 + var/id_to_link + var/radio_frequency = 1379 + var/required_access = list(access_external_airlocks) + var/door_name = "external access" + var/door_type = /obj/machinery/door/airlock/external/glass + var/one_door_interior //For square airlocks, if you set this then a) only one door will spawn, and b) you can choose if the door should go opposite to how it normally goes. Please use the define + var/one_door_exterior //See above + +/obj/effect/spawner/airlock/Initialize() + ..() + forceMove(locate(x + 1, y + 1, z)) //Needs to move because our icon_state implies we are one turf to the northeast, when we're not + opposite_interior_direction = turn(interior_direction, 180) //Do it this way (instead of setting it directly) to avoid code mishaps + interior_direction_cw = turn(interior_direction, 90) + interior_direction_ccw = turn(interior_direction, 270) + if(interior_direction == NORTH || interior_direction == SOUTH) + north_or_south_interior = TRUE + if(exterior_direction == NORTH || exterior_direction == SOUTH) + north_or_south_exterior = TRUE + id_to_link = "[UID()]" //We want unique IDs, this will give us a unique ID + var/turf/turf_interior = get_airlock_location(interior_direction) + var/turf/turf_exterior = get_airlock_location(exterior_direction) + handle_door_creation(turf_interior, TRUE, one_door_interior) + handle_door_creation(turf_exterior, FALSE, one_door_exterior) + handle_pipes_creation(turf_interior) + handle_control_placement() + qdel(src) + +/obj/effect/spawner/airlock/proc/get_airlock_location(desired_direction) //Finds a turf to place an airlock and returns it, this turf will be in the middle of the relevant wall + var/turf/T + switch(desired_direction) + if(NORTH) + T = locate(x + HALF_X, y + tiles_in_y_direction, z) + if(SOUTH) + T = locate(x + HALF_X, y - 1, z) + if(EAST) + T = locate(x + tiles_in_x_direction, y + HALF_Y, z) + if(WEST) + T = locate(x - 1, y + HALF_Y, z) + return T + +/obj/effect/spawner/airlock/proc/handle_door_creation(turf/T, is_this_an_interior_airlock, one_door_only) //Creates a door (or two) and also creates a button + var/obj/machinery/door/airlock/A + if(one_door_only != DOOR_FLIPPED_PLACEMENT) + A = new door_type(T) + handle_door_stuff(A, is_this_an_interior_airlock) + var/obj/machinery/access_button/the_button = spawn_button(T, is_this_an_interior_airlock ? interior_direction : exterior_direction) + if(one_door_only == DOOR_NORMAL_PLACEMENT) //We only need one door, we are done + return + if(!(tiles_in_x_direction % 2) && (is_this_an_interior_airlock && north_or_south_interior || !is_this_an_interior_airlock && north_or_south_exterior)) //Handle extra airlock for aesthetics + A = new door_type(get_step(T, EAST)) + handle_door_stuff(A, is_this_an_interior_airlock) + if(one_door_only == DOOR_FLIPPED_PLACEMENT) + the_button.forceMove(get_step(the_button, EAST)) + else if(!(tiles_in_y_direction % 2) && (is_this_an_interior_airlock && !north_or_south_interior || !is_this_an_interior_airlock && !north_or_south_exterior)) //Handle extra airlock for aesthetics + A = new door_type(get_step(T, NORTH)) + handle_door_stuff(A, is_this_an_interior_airlock) + if(one_door_only == DOOR_FLIPPED_PLACEMENT) + the_button.forceMove(get_step(the_button, NORTH)) + +/obj/effect/spawner/airlock/proc/handle_door_stuff(obj/machinery/door/airlock/A, is_this_an_interior_airlock) //This sets up the door vars correctly and then locks it before first use + A.set_frequency(radio_frequency) + A.id_tag = is_this_an_interior_airlock ? INNER_DOOR_TAG : OUTER_DOOR_TAG + A.req_access = required_access + A.name = door_name + A.lock() + +/obj/effect/spawner/airlock/proc/spawn_button(turf/T, some_direction) + var/obj/machinery/access_button/the_button = new(T) + the_button.master_tag = id_to_link + the_button.set_frequency(radio_frequency) + switch(some_direction) + if(NORTH) + the_button.pixel_x -= 25 + the_button.pixel_y = 7 + if(EAST) + the_button.pixel_x = 7 + the_button.pixel_y = -25 + if(SOUTH) + the_button.pixel_x -= 25 + the_button.pixel_y -= 7 + if(WEST) + the_button.pixel_x -= 7 + the_button.pixel_y -= 25 + the_button.req_access = required_access + return the_button + +/obj/effect/spawner/airlock/proc/handle_control_placement() //Stick the sensor and controller on the same bit of wall, this will ONLY be unsuitable if airlocks are on both the south and west turfs + var/turf/T = get_turf(src) + var/obj/machinery/airlock_sensor/AS = new(T) + var/obj/machinery/embedded_controller/radio/airlock/airlock_controller/AC = new(T, id_to_link, radio_frequency, OUTER_DOOR_TAG, INNER_DOOR_TAG, AIRPUMP_TAG, SENSOR_TAG) + AC.req_access = required_access + AS.id_tag = SENSOR_TAG + AS.set_frequency(radio_frequency) + if(interior_direction != WEST && exterior_direction != WEST) //If west wall is free, place stuff there + AC.pixel_x -= 25 + AC.pixel_y += 9 + AS.pixel_x -= 25 + AS.pixel_y -= 9 + else if(interior_direction != SOUTH && exterior_direction != SOUTH) //If south wall is free, place stuff there + AC.pixel_x += 9 + AC.pixel_y -= 25 + AS.pixel_x -= 9 + AS.pixel_y -= 25 + else //Send them over to the other side of the chamber + T = locate(x + tiles_in_x_direction - 1, y + tiles_in_y_direction - 1, z) + AC.forceMove(T) + AS.forceMove(T) + AC.pixel_x += 25 + AC.pixel_y += 9 + AS.pixel_x += 25 + AS.pixel_y -= 9 + +/obj/effect/spawner/airlock/proc/handle_pipes_creation(turf/T) //This places all required piping down, then properly initializes it. T is the turf that the interior airlock occupies + var/turf/below_T = get_step(T, opposite_interior_direction) + + var/two_way_pipe = interior_direction | opposite_interior_direction + var/chamber_shape //This determines the layout of the chamber and therefore how many vents should be present + if(tiles_in_x_direction == 2 && tiles_in_y_direction == 2) + chamber_shape = CHAMBER_SQUARE + else if(tiles_in_x_direction > 1 && tiles_in_y_direction > 1) + chamber_shape = CHAMBER_BIGGER + else + chamber_shape = CHAMBER_LONG + pipe_creation_helper(/obj/machinery/atmospherics/pipe/simple/visible, T, interior_direction, two_way_pipe) + switch(chamber_shape) + if(CHAMBER_LONG) //Easy enough, place a single vent + pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume, + below_T, + interior_direction) + if(CHAMBER_SQUARE) //We need a T-manifold and two vents for this + pipe_creation_helper(/obj/machinery/atmospherics/pipe/manifold/visible, + below_T, + north_or_south_interior ? WEST : SOUTH, + NORTH | EAST | (north_or_south_interior ? SOUTH : WEST)) + pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume, + get_step(below_T, opposite_interior_direction), + interior_direction) + pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume, + north_or_south_interior ? EAST_OF_TURF(below_T) : NORTH_OF_TURF(below_T), + turn(interior_direction, interior_direction == SOUTH || interior_direction == EAST ? -90 : 90)) + if(CHAMBER_BIGGER) //We need a central column of manifolds and a vent either side of each manifold + var/depth = north_or_south_interior ? tiles_in_y_direction : tiles_in_x_direction + var/turf/put_thing_here = below_T + for(var/i in 1 to depth) + if(i != depth)//We're placing more pipe later, so we need a 4-way manifold + pipe_creation_helper(/obj/machinery/atmospherics/pipe/manifold4w/visible, put_thing_here, interior_direction, NORTH | EAST | SOUTH | WEST) + else //We stop here, so place a T-manifold down + pipe_creation_helper(/obj/machinery/atmospherics/pipe/manifold/visible, + put_thing_here, + opposite_interior_direction, + interior_direction_cw | interior_direction | interior_direction_ccw) + pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume, + get_step(put_thing_here, interior_direction_cw), + interior_direction_ccw) + pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume, + get_step(put_thing_here, interior_direction_ccw), + interior_direction_cw) + put_thing_here = get_step(put_thing_here, opposite_interior_direction) //Now move the turf we're generating stuff from 1 forward + +/obj/effect/spawner/airlock/proc/pipe_creation_helper(path, location, direction, initialization_directions) //Create some kind of atmospherics machinery and initialize it properly + var/obj/machinery/atmospherics/A = new path(location) + A.dir = direction + A.on_construction(A.dir, initialization_directions ? initialization_directions : A.dir) + if(istype(A, /obj/machinery/atmospherics/unary/vent_pump/high_volume)) + var/obj/machinery/atmospherics/unary/vent_pump/high_volume/created_pump = A + created_pump.id_tag = AIRPUMP_TAG + created_pump.set_frequency(radio_frequency) + + +//Premade airlocks for mappers, probably won't need all of these but whatever +/obj/effect/spawner/airlock/s_to_n + name = "1 by 1 airlock spawner (interior south, exterior north)" + icon_state = "1x1_S_to_N" + interior_direction = SOUTH + exterior_direction = NORTH +/obj/effect/spawner/airlock/e_to_w + name = "1 by 1 airlock spawner (interior east, exterior west)" + icon_state = "1x1_E_to_W" + interior_direction = EAST + exterior_direction = WEST +/obj/effect/spawner/airlock/w_to_e + name = "1 by 1 airlock spawner (interior west, exterior east)" + icon_state = "1x1_W_to_E" + interior_direction = WEST + exterior_direction = EAST + +/obj/effect/spawner/airlock/long //Long and thin + name = "long airlock spawner (interior north, exterior south)" + icon_state = "1x2_N_to_S" + tiles_in_y_direction = 2 +/obj/effect/spawner/airlock/s_to_n/long + name = "long airlock spawner (interior south, exterior north)" + icon_state = "1x2_S_to_N" + tiles_in_y_direction = 2 +/obj/effect/spawner/airlock/e_to_w/long + name = "long airlock spawner (interior east, exterior west)" + icon_state = "1x2_E_to_W" + tiles_in_x_direction = 2 +/obj/effect/spawner/airlock/w_to_e/long + name = "long airlock spawner (interior west, exterior east)" + icon_state = "1x2_W_to_E" + tiles_in_x_direction = 2 + +/obj/effect/spawner/airlock/long/square //Square + name = "square airlock spawner (interior north, exterior south)" + icon_state = "2x2_N_to_S" + tiles_in_x_direction = 2 +/obj/effect/spawner/airlock/s_to_n/long/square + name = "square airlock spawner (interior south, exterior north)" + icon_state = "2x2_S_to_N" + tiles_in_x_direction = 2 +/obj/effect/spawner/airlock/e_to_w/long/square + name = "square airlock spawner (interior east, exterior west)" + icon_state = "2x2_E_to_W" + tiles_in_y_direction = 2 +/obj/effect/spawner/airlock/w_to_e/long/square + name = "square airlock spawner (interior west, exterior east)" + icon_state = "2x2_W_to_E" + tiles_in_y_direction = 2 +/obj/effect/spawner/airlock/long/square/e_to_s + name = "square airlock spawner (interior east, exterior south)" + icon_state = "2x2_E_to_S" + interior_direction = EAST + exterior_direction = SOUTH + +/obj/effect/spawner/airlock/long/square/wide + name = "rectangular airlock spawner (interior north, exterior south)" + icon_state = "3x2_N_to_S" + tiles_in_x_direction = 3 +/obj/effect/spawner/airlock/s_to_n/long/square/wide + name = "rectangular airlock spawner (interior south, exterior north)" + icon_state = "3x2_S_to_N" + tiles_in_x_direction = 3 +/obj/effect/spawner/airlock/e_to_w/long/square/wide + name = "rectangular airlock spawner (interior east, exterior west)" + icon_state = "3x2_E_to_W" + tiles_in_y_direction = 3 +/obj/effect/spawner/airlock/w_to_e/long/square/wide + name = "rectangular airlock spawner (interior west, exterior east)" + icon_state = "3x2_W_to_E" + tiles_in_y_direction = 3 + +/obj/effect/spawner/airlock/long/square/three + name = "3 by 3 square airlock spawner (interior north, exterior south)" + icon_state = "3x3_N_to_S" + interior_direction = NORTH + exterior_direction = SOUTH + tiles_in_x_direction = 3 + tiles_in_y_direction = 3 + +/obj/effect/spawner/airlock/e_to_w/arrivals + required_access = null + +/obj/effect/spawner/airlock/engineer + required_access = list(access_engine) + door_name = "engineering external access" +/obj/effect/spawner/airlock/e_to_w/engineer + required_access = list(access_engine) + door_name = "engineering external access" +/obj/effect/spawner/airlock/s_to_n/engineer + required_access = list(access_engine) + door_name = "engineering external access" +/obj/effect/spawner/airlock/long/engineer + required_access = list(access_engine) + door_name = "engineering external access" +/obj/effect/spawner/airlock/long/square/engine + required_access = list(access_engine) + door_name = "engine external access" + icon_state = "2x2_N_to_S_leftdoors" + door_type = /obj/machinery/door/airlock/external + one_door_interior = DOOR_NORMAL_PLACEMENT + one_door_exterior = DOOR_NORMAL_PLACEMENT +/obj/effect/spawner/airlock/long/square/engine/reversed + icon_state = "2x2_N_to_S_rightdoors" + one_door_interior = DOOR_FLIPPED_PLACEMENT + one_door_exterior = DOOR_FLIPPED_PLACEMENT + +/obj/effect/spawner/airlock/w_to_e/long/square/wide/mining + door_name = "mining external access" + required_access = list(access_mining) +/obj/effect/spawner/airlock/long/square/wide/mining + door_name = "mining external access" + required_access = list(access_mining) + +/obj/effect/spawner/airlock/e_to_w/minisat + door_name = "minisat external access" + required_access = list(access_minisat) +/obj/effect/spawner/airlock/long/square/e_to_s/telecoms + door_name = "telecoms external access" + required_access = list(access_tcomsat, access_external_airlocks) + door_type = /obj/machinery/door/airlock/external + +/obj/effect/spawner/airlock/long/square/three/syndicate + name = "3 by 3 square airlock spawner (interior west, exterior north)" + icon_state = "3x3_W_to_N" + interior_direction = WEST + exterior_direction = NORTH + door_name = "ship external access" + req_access = list(access_syndicate) + door_type = /obj/machinery/door/airlock/external + +#undef HALF_X +#undef HALF_Y +#undef CHAMBER_LONG +#undef CHAMBER_SQUARE +#undef CHAMBER_BIGGER +#undef DOOR_NORMAL_PLACEMENT +#undef DOOR_FLIPPED_PLACEMENT +#undef AIRPUMP_TAG +#undef SENSOR_TAG +#undef OUTER_DOOR_TAG +#undef INNER_DOOR_TAG diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 057c52a2a4c..4dcd2cbdd32 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -140,8 +140,8 @@ /obj/item/suppressor = 4, /obj/item/clothing/under/chameleon = 2, /obj/item/stamp/chameleon = 2, - /obj/item/clothing/shoes/syndigaloshes = 5, - /obj/item/clothing/mask/gas/voice = 2, + /obj/item/clothing/shoes/chameleon/noslip = 5, + /obj/item/clothing/mask/chameleon = 2, /obj/item/dnascrambler = 1, /obj/item/storage/backpack/satchel_flat = 2, /obj/item/storage/toolbox/syndicate = 2, @@ -242,7 +242,8 @@ /obj/item/gun/projectile/automatic/toy/pistol/enforcer = 50, /obj/item/gun/projectile/shotgun/toy = 50, /obj/item/gun/projectile/shotgun/toy/crossbow = 50, - /obj/item/gun/projectile/shotgun/toy/tommygun = 50 + /obj/item/gun/projectile/shotgun/toy/tommygun = 50, + /obj/item/gun/projectile/automatic/sniper_rifle/toy = 50 ) diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 18392256fb8..03e49c56a50 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -214,7 +214,7 @@ /obj/item/storage/pill_bottle/zoom = 1, /obj/item/storage/pill_bottle/random_drug_bottle = 2, /obj/item/storage/backpack/duffel/syndie/surgery = 1, - /obj/item/clothing/shoes/syndigaloshes = 1, + /obj/item/clothing/shoes/chameleon/noslip = 1, /obj/item/storage/belt/military = 1, /obj/item/clothing/under/chameleon = 1, /obj/item/storage/backpack/satchel_flat = 1, @@ -279,7 +279,7 @@ /obj/item/clothing/glasses/thermal = 1, /obj/item/chameleon = 1, /obj/item/reagent_containers/hypospray/autoinjector/stimulants = 1, - /obj/item/storage/box/syndie_kit/atmosgasgrenades = 1, + /obj/item/storage/box/syndie_kit/atmosn2ogrenades = 1, /obj/item/grenade/plastic/x4 = 1) diff --git a/code/game/objects/effects/spawners/windowspawner.dm b/code/game/objects/effects/spawners/windowspawner.dm index 1034d31eb45..e19aa54fd7d 100644 --- a/code/game/objects/effects/spawners/windowspawner.dm +++ b/code/game/objects/effects/spawners/windowspawner.dm @@ -47,3 +47,8 @@ name = "reinforced plasma window spawner" icon_state = "pwindow_spawner" windowtospawn = /obj/structure/window/plasmareinforced + +/obj/effect/spawner/window/shuttle + name = "shuttle window spawner" + icon_state = "swindow_spawner" + windowtospawn = /obj/structure/window/shuttle diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index f0233bb0f9e..d4336aa6cf3 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -107,7 +107,7 @@ ..() pixel_x = rand(3,-3) pixel_y = rand(3,-3) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/structure/spider/eggcluster/process() amount_grown += rand(0,2) @@ -140,10 +140,10 @@ ..() pixel_x = rand(6,-6) pixel_y = rand(6,-6) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/structure/spider/spiderling/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) entry_vent = null return ..() 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/effects/temporary_visuals/cult.dm b/code/game/objects/effects/temporary_visuals/cult.dm index 8edb88a7e79..7a12caf6b10 100644 --- a/code/game/objects/effects/temporary_visuals/cult.dm +++ b/code/game/objects/effects/temporary_visuals/cult.dm @@ -37,4 +37,5 @@ /obj/effect/temp_visual/cult/turf/open/floor icon_state = "floorglow" - duration = 5 \ No newline at end of file + duration = 5 + plane = FLOOR_PLANE \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 880043c8be6..8fd1c061c32 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -228,4 +228,65 @@ randomdir = FALSE pixel_y = -16 pixel_x = -16 - duration = 20 \ No newline at end of file + duration = 20 + +/obj/effect/temp_visual/bleed + name = "bleed" + icon = 'icons/effects/bleed.dmi' + icon_state = "bleed0" + duration = 10 + var/shrink = TRUE + +/obj/effect/temp_visual/bleed/Initialize(mapload, atom/size_calc_target) + . = ..() + var/size_matrix = matrix() + if(size_calc_target) + layer = size_calc_target.layer + 0.01 + var/icon/I = icon(size_calc_target.icon, size_calc_target.icon_state, size_calc_target.dir) + size_matrix = matrix() * (I.Height()/world.icon_size) + transform = size_matrix //scale the bleed overlay's size based on the target's icon size + var/matrix/M = transform + if(shrink) + M = size_matrix * 0.1 + else + M = size_matrix * 2 + animate(src, alpha = 20, transform = M, time = duration, flags = ANIMATION_PARALLEL) + +/obj/effect/temp_visual/bleed/explode + icon_state = "bleed10" + duration = 12 + shrink = FALSE + +/obj/effect/temp_visual/small_smoke + icon_state = "smoke" + duration = 50 + +/obj/effect/temp_visual/small_smoke/halfsecond + duration = 5 + +/obj/effect/temp_visual/dir_setting/firing_effect + icon = 'icons/effects/effects.dmi' + icon_state = "firing_effect" + duration = 2 + +/obj/effect/temp_visual/dir_setting/firing_effect/setDir(newdir) + switch(newdir) + if(NORTH) + layer = BELOW_MOB_LAYER + pixel_x = rand(-3,3) + pixel_y = rand(4,6) + if(SOUTH) + pixel_x = rand(-3,3) + pixel_y = rand(-1,1) + else + pixel_x = rand(-1,1) + pixel_y = rand(-1,1) + ..() + +/obj/effect/temp_visual/dir_setting/firing_effect/energy + icon_state = "firing_effect_energy" + duration = 3 + +/obj/effect/temp_visual/dir_setting/firing_effect/magic + icon_state = "shieldsparkles" + duration = 3 \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm index bb6cca92644..23b1aaa0d2e 100644 --- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm +++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm @@ -1,16 +1,23 @@ //temporary visual effects /obj/effect/temp_visual - anchored = 1 + icon_state = "nothing" + anchored = TRUE layer = ABOVE_MOB_LAYER mouse_opacity = MOUSE_OPACITY_TRANSPARENT - var/duration = 10 + var/duration = 10 //in deciseconds var/randomdir = TRUE + var/timerid -/obj/effect/temp_visual/New() +/obj/effect/temp_visual/Initialize(mapload) + . = ..() if(randomdir) setDir(pick(cardinal)) - QDEL_IN(src, duration) + timerid = QDEL_IN(src, duration) + +/obj/effect/temp_visual/Destroy() + . = ..() + deltimer(timerid) /obj/effect/temp_visual/singularity_act() return @@ -24,7 +31,7 @@ /obj/effect/temp_visual/dir_setting randomdir = FALSE -/obj/effect/temp_visual/dir_setting/New(loc, set_dir) +/obj/effect/temp_visual/dir_setting/Initialize(mapload, set_dir) if(set_dir) setDir(set_dir) - ..() \ No newline at end of file + . = ..() diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 1e026e90e02..cec5b6e1fc8 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -5,8 +5,8 @@ epicenter = get_turf(epicenter.loc) if(log) - message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])": ] [ADMIN_COORDJMP(epicenter)]") - log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [COORD(epicenter)]") + message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])": ""] [ADMIN_COORDJMP(epicenter)]") + log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ""] [COORD(epicenter)]") if(heavy_range > 1) new/obj/effect/temp_visual/emp/pulse(epicenter) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 9c457e43b6a..87f489513d2 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -1,6 +1,6 @@ //TODO: Flash range does nothing currently -/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1, cause = null, breach = TRUE) +/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0, silent = 0, smoke = 1, cause = null, breach = TRUE) src = null //so we don't abort once src is deleted epicenter = get_turf(epicenter) @@ -25,8 +25,8 @@ var/list/cached_exp_block = list() if(adminlog) - message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [ADMIN_COORDJMP(epicenter)] ") - log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [COORD(epicenter)] ") + message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ""] [ADMIN_COORDJMP(epicenter)] ") + log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ""] [COORD(epicenter)] ") // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. // Stereo users will also hear the direction of the explosion! diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 3d8548ad11c..9dbb02553ca 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -16,6 +16,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/inhand_y_dimension = 32 can_be_hit = FALSE + suicidal_hands = TRUE var/r_speed = 1.0 var/health = null @@ -88,7 +89,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/list/sprite_sheets = null var/icon_override = null //Used to override hardcoded clothing dmis in human clothing proc. var/sprite_sheets_obj = null //Used to override hardcoded clothing inventory object dmis in human clothing proc. - var/list/species_fit = null //This object has a different appearance when worn by these species var/trip_verb = TV_TRIP var/trip_chance = 0 @@ -99,6 +99,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/trip_walksafe = TRUE var/trip_tiles = 0 + //Tooltip vars + var/in_inventory = FALSE //is this item equipped into an inventory slot or hand of a mob? + var/tip_timer = 0 + /obj/item/New() ..() for(var/path in actions_types) @@ -145,15 +149,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/blob_act() qdel(src) -//user: The mob that is suiciding -//damagetype: The type of damage the item will inflict on the user -//BRUTELOSS = 1 -//FIRELOSS = 2 -//TOXLOSS = 4 -//OXYLOSS = 8 -//Output a creative message and then return the damagetype done -/obj/item/proc/suicide_act(mob/user) - return +/obj/item/water_act(volume, temperature, source, method = TOUCH) + . = ..() + extinguish() /obj/item/verb/move_to_top() set name = "Move To Top" @@ -258,7 +256,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d add_fingerprint(user) if(pickup(user)) // Pickup succeeded user.put_in_active_hand(src) - + return 1 /obj/item/attack_alien(mob/user as mob) @@ -349,11 +347,13 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d A.Remove(user) if(flags & DROPDEL) qdel(src) + in_inventory = FALSE SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user) // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user) + in_inventory = TRUE return TRUE // called when this item is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. @@ -383,6 +383,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/datum/action/A = X if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot. A.Grant(user) + in_inventory = TRUE /obj/item/proc/item_action_slot_check(slot, mob/user) return 1 @@ -541,6 +542,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d if(callback) //call the original callback . = callback.Invoke() throw_speed = initial(throw_speed) //explosions change this. + in_inventory = FALSE /obj/item/proc/pwr_drain() return 0 // Process Kill @@ -576,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 @@ -589,9 +591,46 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/attack_hulk(mob/living/carbon/human/user) return FALSE -/obj/item/proc/check_martial_counter(mob/living/carbon/human/target, mob/living/carbon/human/user) //handles block for CQC - if(target.check_block()) - target.visible_message("[target.name] blocks [src] and twists [user]'s arm behind [user.p_their()] back!", - "You block the attack!") - user.Stun(2) - return TRUE +/obj/item/proc/openTip(location, control, params, user) + openToolTip(user, src, params, title = name, content = "[desc]", theme = "") + +/obj/item/MouseEntered(location, control, params) + if(in_inventory) + var/timedelay = 8 + var/user = usr + tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, user), timedelay, TIMER_STOPPABLE) + +/obj/item/MouseExited() + deltimer(tip_timer) //delete any in-progress timer if the mouse is moved off the item before it finishes + closeToolTip(usr) + +/obj/item/proc/update_slot_icon() + if(!ismob(loc)) + return + var/mob/owner = loc + var/flags = slot_flags + if(flags & SLOT_OCLOTHING) + owner.update_inv_wear_suit() + if(flags & SLOT_ICLOTHING) + owner.update_inv_w_uniform() + if(flags & SLOT_GLOVES) + owner.update_inv_gloves() + if(flags & SLOT_EYES) + owner.update_inv_glasses() + if(flags & SLOT_EARS) + owner.update_inv_ears() + if(flags & SLOT_MASK) + owner.update_inv_wear_mask() + if(flags & SLOT_HEAD) + owner.update_inv_head() + if(flags & SLOT_FEET) + owner.update_inv_shoes() + if(flags & SLOT_ID) + owner.update_inv_wear_id() + if(flags & SLOT_BELT) + owner.update_inv_belt() + if(flags & SLOT_BACK) + owner.update_inv_back() + if(flags & SLOT_PDA) + owner.update_inv_wear_pda() + diff --git a/code/game/objects/items/ashtray.dm b/code/game/objects/items/ashtray.dm index b32176cb155..8e85709ef97 100644 --- a/code/game/objects/items/ashtray.dm +++ b/code/game/objects/items/ashtray.dm @@ -28,7 +28,6 @@ var/obj/item/clothing/mask/cigarette/cig = W if(cig.lit == 1) src.visible_message("[user] crushes [cig] in [src], putting it out.") - processing_objects.Remove(cig) var/obj/item/butt = new cig.type_butt(src) cig.transfer_fingerprints_to(butt) qdel(cig) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 3ce114bde9b..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 @@ -174,14 +174,10 @@ var/list/SPECIALS = list( /area/shuttle, /area/admin, - /area/arrival, /area/centcom, /area/asteroid, /area/tdome, - /area/syndicate_station, - /area/wizard_station, - /area/prison - // /area/derelict //commented out, all hail derelict-rebuilders! + /area/wizard_station ) for(var/type in SPECIALS) if( istype(A,type) ) @@ -190,43 +186,43 @@ /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 - //var/ma - //ma = A.master ? "[A.master]" : "(null)" -// to_chat(world, "DEBUG: create_area:
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]") - A.power_equip = 0 - A.power_light = 0 - A.power_environ = 0 - A.always_unpowered = 0 - move_turfs_to_area(turfs, A) + A.power_equip = FALSE + A.power_light = FALSE + A.power_environ = FALSE + A.always_unpowered = FALSE + A.set_dynamic_lighting() + + for(var/i in 1 to turfs.len) + var/turf/thing = turfs[i] + var/area/old_area = thing.loc + A.contents += thing + thing.change_area(old_area, A) interact() - return - - -/obj/item/areaeditor/proc/move_turfs_to_area(var/list/turf/turfs, var/area/A) - A.contents.Add(turfs) - + area_created = TRUE + return area_created /obj/item/areaeditor/proc/edit_area() var/area/A = get_area() diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 85780484264..5ea13308de5 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -18,7 +18,7 @@ light(show_message = 0) /obj/item/candle/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/candle/update_icon() @@ -62,7 +62,7 @@ if(show_message) usr.visible_message(show_message) set_light(CANDLE_LUM) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) update_icon() diff --git a/code/game/objects/items/contraband.dm b/code/game/objects/items/contraband.dm index 7ce7b07193d..77aef9bb71d 100644 --- a/code/game/objects/items/contraband.dm +++ b/code/game/objects/items/contraband.dm @@ -4,6 +4,7 @@ /obj/item/storage/pill_bottle/happy name = "Happy pills" desc = "Highly illegal drug. When you want to see the rainbow." + wrapper_color = COLOR_PINK /obj/item/storage/pill_bottle/happy/New() ..() @@ -18,6 +19,7 @@ /obj/item/storage/pill_bottle/zoom name = "Zoom pills" desc = "Highly illegal drug. Trade brain for speed." + wrapper_color = COLOR_BLUE /obj/item/storage/pill_bottle/zoom/New() ..() @@ -49,15 +51,12 @@ adulterants-- reagents.add_reagent(pick_list("chemistry_tools.json", "CYBERPUNK_drug_adulterants"), 3) - - /obj/item/storage/pill_bottle/random_drug_bottle name = "pill bottle (???)" desc = "Huh." + allow_wrap = FALSE /obj/item/storage/pill_bottle/random_drug_bottle/New() ..() for(var/i in 1 to 5) new /obj/item/reagent_containers/food/pill/random_drugs(src) - - diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index 05d9d4389ad..a80352c01ba 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -50,6 +50,7 @@ to_chat(user, "[D]'s ID scan is disabled!") return if(D.check_access(src.ID)) + D.add_hiddenprint(user) switch(mode) if(WAND_OPEN) if(D.density) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index b4dd66e3be5..926da3d28cb 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -23,7 +23,7 @@ /obj/item/toy/crayon/suicide_act(mob/user) user.visible_message("[user] is jamming the [name] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide.") - return (BRUTELOSS|OXYLOSS) + return BRUTELOSS|OXYLOSS /obj/item/toy/crayon/New() ..() diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 3125c24837a..fb59b24aeda 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -22,6 +22,10 @@ owned = 0 return ..() +/obj/item/toy/carpplushie/dehy_carp/water_act(volume, temperature, source, method = TOUCH) + . = ..() + if(volume >= 1) + Swell() /obj/item/toy/carpplushie/dehy_carp/afterattack(obj/O, mob/user,proximity) if(!proximity) return @@ -37,7 +41,7 @@ visible_message("[src] swells up!") // Animation - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/carp.dmi' flick("carp_swell", src) // Wait for animation to end sleep(6) diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 575ce0cb6d6..7bf80244072 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -32,7 +32,7 @@ /obj/item/camera_bug/New() ..() - processing_objects += src + START_PROCESSING(SSobj, src) /obj/item/camera_bug/Destroy() get_cameras() diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 27132b75346..5fa2bd692e0 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -227,7 +227,7 @@ return PROCESS_KILL /obj/item/borg_chameleon/proc/activate(mob/living/silicon/robot/syndicate/saboteur/user) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) S = user user.base_icon = disguise user.icon_state = disguise @@ -236,7 +236,7 @@ user.update_icons() /obj/item/borg_chameleon/proc/deactivate(mob/living/silicon/robot/syndicate/saboteur/user) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) S = user user.base_icon = initial(user.base_icon) user.icon_state = initial(user.icon_state) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index d0b8637b280..a618383a819 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -155,14 +155,14 @@ /obj/item/flash/proc/terrible_conversion_proc(mob/M, mob/user) if(ishuman(M) && ishuman(user) && M.stat != DEAD) - if(user.mind && (user.mind in ticker.mode.head_revolutionaries)) + if(user.mind && (user.mind in SSticker.mode.head_revolutionaries)) if(M.client) if(M.stat == CONSCIOUS) M.mind_initialize() //give them a mind datum if they don't have one. var/resisted if(!ismindshielded(M)) - if(user.mind in ticker.mode.head_revolutionaries) - if(ticker.mode.add_revolutionary(M.mind)) + if(user.mind in SSticker.mode.head_revolutionaries) + if(SSticker.mode.add_revolutionary(M.mind)) times_used -- //Flashes less likely to burn out for headrevs when used for conversion else resisted = 1 @@ -207,10 +207,10 @@ /obj/item/flash/cameraflash/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/flash/cameraflash/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/flash/cameraflash/process() //this and the two parts above are part of the charge system. diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 24c8cbcd3b7..74f98a9384a 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -51,7 +51,7 @@ if(((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly return ..() //just hit them in the head - if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") //don't have dexterity + if(!(istype(user, /mob/living/carbon/human) || SSticker) && SSticker.mode.name != "monkey") //don't have dexterity to_chat(user, "You don't have the dexterity to do this!") return @@ -76,7 +76,7 @@ var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes) if(M.stat == DEAD || !eyes || M.disabilities & BLIND) //mob is dead or fully blind to_chat(user, "[M]'s pupils are unresponsive to the light!") - else if((XRAY in M.mutations) || eyes.get_dark_view() >= 8) //The mob's either got the X-RAY vision or has a tapetum lucidum (extreme nightvision, i.e. Vulp/Tajara with COLOURBLIND & their monkey forms). + else if((XRAY in M.mutations) || eyes.see_in_dark >= 8) //The mob's either got the X-RAY vision or has a tapetum lucidum (extreme nightvision, i.e. Vulp/Tajara with COLOURBLIND & their monkey forms). to_chat(user, "[M]'s pupils glow eerily!") else //they're okay! if(M.flash_eyes(visual = 1)) @@ -183,10 +183,10 @@ turn_off() if(!fuel) src.icon_state = "[initial(icon_state)]-empty" - processing_objects -= src + STOP_PROCESSING(SSobj, src) /obj/item/flashlight/flare/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/flashlight/flare/proc/turn_off() @@ -222,7 +222,7 @@ user.visible_message("[user] activates [src].", "You activate [src].") src.force = on_damage src.damtype = "fire" - processing_objects += src + START_PROCESSING(SSobj, src) // GLOWSTICKS @@ -292,10 +292,10 @@ color = null /obj/item/flashlight/flare/glowstick/random/Initialize() - ..() + . = ..() var/T = pick(typesof(/obj/item/flashlight/flare/glowstick) - /obj/item/flashlight/flare/glowstick/random - /obj/item/flashlight/flare/glowstick/emergency) new T(loc) - return INITIALIZE_HINT_QDEL + qdel(src) // return INITIALIZE_HINT_QDEL <-- Doesn't work /obj/item/flashlight/flare/extinguish_light() visible_message("[src] dims slightly before scattering the shadows around it.") @@ -307,6 +307,9 @@ brightness_on = 7 icon_state = "torch" item_state = "torch" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + light_color = LIGHT_COLOR_ORANGE on_damage = 10 /obj/item/flashlight/slime @@ -344,10 +347,10 @@ /obj/item/flashlight/emp/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/flashlight/emp/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/flashlight/emp/process() diff --git a/code/game/objects/items/devices/handheld_defib.dm b/code/game/objects/items/devices/handheld_defib.dm new file mode 100644 index 00000000000..199aaf43737 --- /dev/null +++ b/code/game/objects/items/devices/handheld_defib.dm @@ -0,0 +1,91 @@ +/obj/item/handheld_defibrillator + name = "handheld defibrillator" + desc = "Used to restart stopped hearts." + icon = 'icons/goonstation/objects/objects.dmi' + lefthand_file = 'icons/goonstation/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/goonstation/mob/inhands/items_righthand.dmi' + icon_state = "defib-on" + item_state = "defib" + + var/icon_base = "defib" + var/cooldown = FALSE + var/charge_time = 100 + var/emagged = FALSE + +/obj/item/handheld_defibrillator/emag_act(mob/user) + if(!emagged) + emagged = TRUE + desc += " The screen only shows the word KILL flashing over and over." + if(user) + to_chat(user, "you short out the safeties on [src]") + else + emagged = FALSE + desc = "Used to restart stopped hearts." + if(user) + to_chat(user, "You restore the safeties on [src]") + +/obj/item/handheld_defibrillator/emp_act(severity) + if(emagged) + emagged = FALSE + desc = "Used to restart stopped hearts." + visible_message("[src] beeps: Safety protocols enabled!") + playsound(get_turf(src), 'sound/machines/defib_saftyon.ogg', 50, 0) + else + emagged = TRUE + desc += " The screen only shows the word KILL flashing over and over." + visible_message("[src] beeps: Safety protocols disabled!") + playsound(get_turf(src), 'sound/machines/defib_saftyoff.ogg', 50, 0) + +/obj/item/handheld_defibrillator/attack(mob/living/carbon/human/H, mob/user) + if(!istype(H)) + return ..() + + if(cooldown) + to_chat(user, "[src] is still charging!") + return + + if(emagged || (H.health <= HEALTH_THRESHOLD_CRIT) || (H.undergoing_cardiac_arrest())) + user.visible_message("[user] shocks [H] with [src].", "You shock [H] with [src].") + add_attack_logs(user, H, "defibrillated with [src]") + playsound(user.loc, "sound/weapons/Egloves.ogg", 75, 1) + + if(H.stat == DEAD) + to_chat(user, "[H] doesn't respond at all!") + else + H.set_heartattack(FALSE) + var/total_damage = H.getBruteLoss() + H.getFireLoss() + H.getToxLoss() + if(H.health <= HEALTH_THRESHOLD_CRIT) + if(total_damage >= 90) + to_chat(user, "[H] looks horribly injured. Resuscitation alone may not help revive them.") + if(prob(66)) + to_chat(user, "[H] inhales deeply!") + H.adjustOxyLoss(-50) + else + to_chat(user, "[H] doesn't respond!") + + H.AdjustParalysis(3) + H.AdjustStunned(5) + H.AdjustWeakened(5) + H.AdjustStuttering(10) + to_chat(H, "You feel a powerful jolt!") + H.shock_internal_organs(100) + + if(emagged && prob(10)) + to_chat(user, "[src]'s on board scanner indicates that the target is undergoing a cardiac arrest!") + H.set_heartattack(TRUE) + + cooldown = TRUE + icon_state = "[icon_base]-shock" + addtimer(CALLBACK(src, .proc/short_charge), 10) + addtimer(CALLBACK(src, .proc/recharge), charge_time) + + else + to_chat(user, "[src]'s on board medical scanner indicates that no shock is required.") + +/obj/item/handheld_defibrillator/proc/short_charge() + icon_state = "[icon_base]-off" + +/obj/item/handheld_defibrillator/proc/recharge() + cooldown = FALSE + icon_state = "[icon_base]-on" + playsound(loc, "sound/weapons/flash.ogg", 75, 1) \ No newline at end of file diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm index 840d5e64395..6d3a1c2b49d 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/game/objects/items/devices/instruments.dm @@ -19,7 +19,7 @@ /obj/item/instrument/suicide_act(mob/user) user.visible_message("[user] begins to play 'Gloomy Sunday'! It looks like [user.p_theyre()] trying to commit suicide!") - return (BRUTELOSS) + return BRUTELOSS /obj/item/instrument/Initialize(mapload) song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 32b548c38aa..43b22eb4979 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -167,7 +167,7 @@ if(energy <= max_energy) if(!recharging) recharging = 1 - processing_objects.Add(src) + START_PROCESSING(SSobj, src) if(energy <= 0) to_chat(user, "You've overused the battery of [src], now it needs time to recharge!") recharge_locked = 1 diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 59a7a650383..941e90a31ef 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -35,7 +35,7 @@ return if(H.mind) span = H.mind.speech_span - if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice) || istype(H.get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown)) + if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice)) span = "sans" if(spamcheck) to_chat(user, "\The [src] needs to recharge!") diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index d142136ed23..62fc36863fc 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -47,10 +47,10 @@ /obj/item/multitool/ai_detect/New() ..() - processing_objects += src + START_PROCESSING(SSobj, src) /obj/item/multitool/ai_detect/Destroy() - processing_objects -= src + STOP_PROCESSING(SSobj, src) return ..() /obj/item/multitool/ai_detect/process() diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 0d0475df8ee..562800c2ce0 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -1,3 +1,7 @@ +#define DISCONNECTED 0 +#define CLAMPED_OFF 1 +#define OPERATING 2 + // Powersink - used to drain station power /obj/item/powersink @@ -13,28 +17,55 @@ throw_range = 2 materials = list(MAT_METAL=750) origin_tech = "powerstorage=5;syndicate=5" - var/drain_rate = 1600000 // amount of power to drain per tick - var/apc_drain_rate = 50 // Max. amount drained from single APC. In Watts. - var/dissipation_rate = 20000 // Passive dissipation of drained power. In Watts. - var/power_drained = 0 // Amount of power drained. - var/max_power = 1e10 // Detonation point. - var/mode = 0 // 0 = off, 1=clamped (off), 2=operating - var/drained_this_tick = 0 // This is unfortunately necessary to ensure we process powersinks BEFORE other machinery such as APCs. - var/admins_warned = 0 // stop spam, only warn the admins once that we are about to go boom + var/drain_rate = 2000000 // amount of power to drain per tick + var/power_drained = 0 // has drained this much power + var/max_power = 6e8 // maximum power that can be drained before exploding + var/mode = 0 // 0 = off, 1=clamped (off), 2=operating + var/admins_warned = FALSE // stop spam, only warn the admins once that we are about to boom - var/datum/powernet/PN // Our powernet var/obj/structure/cable/attached // the attached cable /obj/item/powersink/Destroy() - processing_objects.Remove(src) - GLOB.processing_power_items.Remove(src) - PN = null + STOP_PROCESSING(SSobj, src) attached = null return ..() -/obj/item/powersink/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/screwdriver)) - if(mode == 0) +/obj/item/powersink/update_icon() + icon_state = "powersink[mode == OPERATING]" + +/obj/item/powersink/proc/set_mode(value) + if(value == mode) + return + switch(value) + if(DISCONNECTED) + attached = null + if(mode == OPERATING) + STOP_PROCESSING(SSobj, src) + anchored = FALSE + density = FALSE + + if(CLAMPED_OFF) + if(!attached) + return + if(mode == OPERATING) + STOP_PROCESSING(SSobj, src) + anchored = TRUE + density = TRUE + + if(OPERATING) + if(!attached) + return + START_PROCESSING(SSobj, src) + anchored = TRUE + density = TRUE + + mode = value + update_icon() + set_light(0) + +/obj/item/powersink/attackby(obj/item/I, mob/user) + if(isscrewdriver(I)) + if(mode == DISCONNECTED) var/turf/T = loc if(isturf(T) && !T.intact) attached = locate() in T @@ -42,98 +73,81 @@ to_chat(user, "No exposed cable here to attach to.") return else - anchored = 1 - mode = 1 - src.visible_message("[user] attaches [src] to the cable!") + set_mode(CLAMPED_OFF) + visible_message("[user] attaches [src] to the cable!") message_admins("Power sink activated by [key_name_admin(user)] at ([x],[y],[z] - JMP)") log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])") - return else to_chat(user, "Device must be placed over an exposed cable to attach to it.") - return else - if(mode == 2) - processing_objects.Remove(src) // Now the power sink actually stops draining the station's power if you unhook it. --NeoFite - GLOB.processing_power_items.Remove(src) - anchored = 0 - mode = 0 + set_mode(DISCONNECTED) src.visible_message("[user] detaches [src] from the cable!") - set_light(0) - icon_state = "powersink0" - - return else - ..() + return ..() /obj/item/powersink/attack_ai() return /obj/item/powersink/attack_hand(var/mob/user) switch(mode) - if(0) + if(DISCONNECTED) ..() - if(1) - src.visible_message("[user] activates [src]!") - mode = 2 - icon_state = "powersink1" - processing_objects.Add(src) - GLOB.processing_power_items.Add(src) - if(2) //This switch option wasn't originally included. It exists now. --NeoFite - src.visible_message("[user] deactivates [src]!") - mode = 1 - set_light(0) - icon_state = "powersink0" - processing_objects.Remove(src) - GLOB.processing_power_items.Remove(src) - -/obj/item/powersink/pwr_drain() - if(!attached) - return 0 - - if(drained_this_tick) - return 1 - drained_this_tick = 1 - - var/drained = 0 - - if(!PN) - return 1 - - set_light(12) - PN.trigger_warning() - // found a powernet, so drain up to max power from it - drained = PN.draw_power(drain_rate) - // if tried to drain more than available on powernet - // now look for APCs and drain their cells - if(drained < drain_rate) - for(var/obj/machinery/power/terminal/T in PN.nodes) - // Enough power drained this tick, no need to torture more APCs - if(drained >= drain_rate) - break - if(istype(T.master, /obj/machinery/power/apc)) - var/obj/machinery/power/apc/A = T.master - if(A.operating && A.cell) - A.cell.charge = max(0, A.cell.charge - apc_drain_rate) - drained += apc_drain_rate - if(A.charging == 2) // If the cell was full - A.charging = 1 // It's no longer full - power_drained += drained - return 1 + if(CLAMPED_OFF) + user.visible_message( \ + "[user] activates \the [src]!", \ + "You activate \the [src].", + "You hear a click.") + message_admins("Power sink activated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_VERBOSEJMP(src)]") + log_game("Power sink activated by [key_name(user)] at [AREACOORD(src)]") + set_mode(OPERATING) + if(OPERATING) + user.visible_message( \ + "[user] deactivates \the [src]!", \ + "You deactivate \the [src].", + "You hear a click.") + set_mode(CLAMPED_OFF) /obj/item/powersink/process() - drained_this_tick = 0 - power_drained -= min(dissipation_rate, power_drained) + if(!attached) + set_mode(DISCONNECTED) + return + + var/datum/powernet/PN = attached.powernet + if(PN) + set_light(5) + + // found a powernet, so drain up to max power from it + + var/drained = min (drain_rate, attached.newavail()) + attached.add_delayedload(drained) + power_drained += drained + + // if tried to drain more than available on powernet + // now look for APCs and drain their cells + if(drained < drain_rate) + for(var/obj/machinery/power/terminal/T in PN.nodes) + if(istype(T.master, /obj/machinery/power/apc)) + var/obj/machinery/power/apc/A = T.master + if(A.operating && A.cell) + A.cell.charge = max(0, A.cell.charge - 50) + power_drained += 50 + if(A.charging == 2) // If the cell was full + A.charging = 1 // It's no longer full + if(drained >= drain_rate) + break + if(power_drained > max_power * 0.98) - if(!admins_warned) - admins_warned = 1 + if (!admins_warned) + admins_warned = TRUE message_admins("Power sink at ([x],[y],[z] - JMP) is 95% full. Explosion imminent.") playsound(src, 'sound/effects/screech.ogg', 100, 1, 1) + if(power_drained >= max_power) + STOP_PROCESSING(SSobj, src) explosion(src.loc, 4,8,16,32) qdel(src) - return - if(attached && attached.powernet) - PN = attached.powernet - else - PN = null + +#undef DISCONNECTED +#undef CLAMPED_OFF +#undef OPERATING \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index b98e6d9acfc..610c257b03f 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -315,7 +315,7 @@ if(keyslot1 || keyslot2) for(var/ch_name in channels) - radio_controller.remove_object(src, radiochannels[ch_name]) + SSradio.remove_object(src, SSradio.radiochannels[ch_name]) secure_radio_connections[ch_name] = null if(keyslot1) @@ -392,11 +392,11 @@ for(var/ch_name in channels) - if(!radio_controller) + if(!SSradio) name = "broken radio headset" return - secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT) + secure_radio_connections[ch_name] = SSradio.add_object(src, SSradio.radiochannels[ch_name], RADIO_CHAT) if(setDescription) setupRadioDescription() diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 287c7b44c30..3064b0ae3c8 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -49,7 +49,7 @@ ..() buildstage = building if(buildstage) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else if(ndir) pixel_x = (ndir & EAST|WEST) ? (ndir == EAST ? 28 : -28) : 0 @@ -105,7 +105,7 @@ ) /obj/item/radio/intercom/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) GLOB.global_intercoms.Remove(src) return ..() @@ -128,7 +128,7 @@ // TODO: Integrate radio with the space manager if(isnull(position) || !(position.z in level)) return -1 - if(freq in ANTAG_FREQS) + if(freq in SSradio.ANTAG_FREQS) if(!(syndiekey)) return -1//Prevents broadcast of messages over devices lacking the encryption @@ -150,7 +150,7 @@ b_stat = 1 buildstage = 1 update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return 1 else return ..() if(2) @@ -163,7 +163,7 @@ buildstage = 3 to_chat(user, "You secure the electronics!") update_icon() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) for(var/i, i<= 5, i++) wires.UpdateCut(i,1) return 1 diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index e01b1a2a61a..00efc83668b 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -59,9 +59,9 @@ var/global/list/default_medbay_channels = list( /obj/item/radio/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) + radio_connection = SSradio.add_object(src, frequency, RADIO_CHAT) /obj/item/radio/New() @@ -73,10 +73,10 @@ var/global/list/default_medbay_channels = list( /obj/item/radio/Destroy() QDEL_NULL(wires) - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) for(var/ch_name in channels) - radio_controller.remove_object(src, radiochannels[ch_name]) + SSradio.remove_object(src, SSradio.radiochannels[ch_name]) radio_connection = null GLOB.global_radios -= src follow_target = null @@ -90,7 +90,7 @@ var/global/list/default_medbay_channels = list( set_frequency(frequency) for(var/ch_name in channels) - secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT) + secure_radio_connections[ch_name] = SSradio.add_object(src, SSradio.radiochannels[ch_name], RADIO_CHAT) /obj/item/radio/attack_ghost(mob/user) return interact(user) @@ -147,7 +147,7 @@ var/global/list/default_medbay_channels = list( var/chan_stat = channels[ch_name] var/listening = !!(chan_stat & FREQ_LISTENING) != 0 - dat.Add(list(list("chan" = ch_name, "display_name" = ch_name, "secure_channel" = 1, "sec_channel_listen" = !listening, "chan_span" = frequency_span_class(radiochannels[ch_name])))) + dat.Add(list(list("chan" = ch_name, "display_name" = ch_name, "secure_channel" = 1, "sec_channel_listen" = !listening, "chan_span" = SSradio.frequency_span_class(SSradio.radiochannels[ch_name])))) return dat @@ -155,7 +155,7 @@ var/global/list/default_medbay_channels = list( var/dat[0] for(var/internal_chan in internal_channels) if(has_channel_access(user, internal_chan)) - dat.Add(list(list("chan" = internal_chan, "display_name" = get_frequency_name(text2num(internal_chan)), "chan_span" = frequency_span_class(text2num(internal_chan))))) + dat.Add(list(list("chan" = internal_chan, "display_name" = get_frequency_name(text2num(internal_chan)), "chan_span" = SSradio.frequency_span_class(text2num(internal_chan))))) return dat @@ -397,7 +397,6 @@ var/global/list/default_medbay_channels = list( var/mob/living/carbon/human/H = M displayname = H.voice if(H.voice != real_name) - jobname = "Unknown" voicemask = TRUE if(syndiekey && syndiekey.change_voice && connection.frequency == SYND_FREQ) @@ -555,7 +554,7 @@ var/global/list/default_medbay_channels = list( var/turf/position = get_turf(src) if(!position || !(position.z in level)) return -1 - if(freq in ANTAG_FREQS) + if(freq in SSradio.ANTAG_FREQS) if(!(syndiekey))//Checks to see if it's allowed on that frequency, based on the encryption keys return -1 if(!freq) //recieved on main frequency @@ -699,7 +698,7 @@ var/global/list/default_medbay_channels = list( for(var/ch_name in channels) - radio_controller.remove_object(src, radiochannels[ch_name]) + SSradio.remove_object(src, SSradio.radiochannels[ch_name]) secure_radio_connections[ch_name] = null @@ -752,13 +751,13 @@ var/global/list/default_medbay_channels = list( for(var/ch_name in channels) - if(!radio_controller) - sleep(30) // Waiting for the radio_controller to be created. - if(!radio_controller) + if(!SSradio) + sleep(30) // Waiting for SSradio to be created. + if(!SSradio) name = "broken radio" return - secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT) + secure_radio_connections[ch_name] = SSradio.add_object(src, SSradio.radiochannels[ch_name], RADIO_CHAT) return @@ -829,14 +828,14 @@ var/global/list/default_medbay_channels = list( return data /obj/item/radio/proc/config(op) - if(radio_controller) + if(SSradio) for(var/ch_name in channels) - radio_controller.remove_object(src, radiochannels[ch_name]) + SSradio.remove_object(src, SSradio.radiochannels[ch_name]) secure_radio_connections = new channels = op - if(radio_controller) + if(SSradio) for(var/ch_name in op) - secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT) + secure_radio_connections[ch_name] = SSradio.add_object(src, SSradio.radiochannels[ch_name], RADIO_CHAT) return /obj/item/radio/off diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 8ad7fae6d2d..cad4ae25ac8 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -34,7 +34,7 @@ REAGENT SCANNER /obj/item/t_scanner/Destroy() if(on) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/t_scanner/attack_self(mob/user) @@ -43,12 +43,12 @@ REAGENT SCANNER icon_state = copytext(icon_state, 1, length(icon_state))+"[on]" if(on) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/t_scanner/process() if(!on) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return null scan() @@ -125,8 +125,8 @@ REAGENT SCANNER var/mode = 1; -/obj/item/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob) - if(( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) +/obj/item/healthanalyzer/attack(mob/living/M, mob/living/user) + if(((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) to_chat(user, text("You try to analyze the floor's vitals!")) for(var/mob/O in viewers(M, null)) O.show_message(text("[user] has analyzed the floor's vitals!"), 1) @@ -137,7 +137,7 @@ REAGENT SCANNER return user.visible_message("[user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.") - if(!istype(M,/mob/living/carbon/human) || M.isSynthetic()) + if(!ishuman(M) || M.isSynthetic()) //these sensors are designed for organic life user.show_message("Analyzing Results for ERROR:\n\t Overall Status: ERROR") user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1) @@ -147,122 +147,132 @@ REAGENT SCANNER user.show_message("Subject's pulse: -- bpm.") return - var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss()))) - var/OX = M.getOxyLoss() > 50 ? "[M.getOxyLoss()]" : M.getOxyLoss() - var/TX = M.getToxLoss() > 50 ? "[M.getToxLoss()]" : M.getToxLoss() - var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() - var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() - if(M.status_flags & FAKEDEATH) + var/mob/living/carbon/human/H = M + var/fake_oxy = max(rand(1,40), H.getOxyLoss(), (300 - (H.getToxLoss() + H.getFireLoss() + H.getBruteLoss()))) + var/OX = H.getOxyLoss() > 50 ? "[H.getOxyLoss()]" : H.getOxyLoss() + var/TX = H.getToxLoss() > 50 ? "[H.getToxLoss()]" : H.getToxLoss() + var/BU = H.getFireLoss() > 50 ? "[H.getFireLoss()]" : H.getFireLoss() + var/BR = H.getBruteLoss() > 50 ? "[H.getBruteLoss()]" : H.getBruteLoss() + if(H.status_flags & FAKEDEATH) OX = fake_oxy > 50 ? "[fake_oxy]" : fake_oxy - user.show_message("Analyzing Results for [M]:\n\t Overall Status: dead") + user.show_message("Analyzing Results for [H]:\n\t Overall Status: dead") else - user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[M.health]% healthy"]") + user.show_message("Analyzing Results for [H]:\n\t Overall Status: [H.stat > 1 ? "dead" : "[H.health]% healthy"]") user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message("\t Damage Specifics: [OX] - [TX] - [BU] - [BR]") - user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) - if(M.timeofdeath && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) - user.show_message("Time of Death: [station_time_timestamp("hh:mm:ss", M.timeofdeath)]") - var/tdelta = round(world.time - M.timeofdeath) + user.show_message("Body Temperature: [H.bodytemperature-T0C]°C ([H.bodytemperature*1.8-459.67]°F)", 1) + if(H.timeofdeath && (H.stat == DEAD || (H.status_flags & FAKEDEATH))) + user.show_message("Time of Death: [station_time_timestamp("hh:mm:ss", H.timeofdeath)]") + var/tdelta = round(world.time - H.timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) user.show_message("Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!") - if(istype(M, /mob/living/carbon/human) && mode == 1) - var/mob/living/carbon/human/H = M + if(mode == 1) var/list/damaged = H.get_damaged_organs(1,1) user.show_message("Localized Damage, Brute/Burn:",1) if(length(damaged) > 0) for(var/obj/item/organ/external/org in damaged) user.show_message("\t\t[capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]-[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]") - OX = M.getOxyLoss() > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" - TX = M.getToxLoss() > 50 ? "Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal" - BU = M.getFireLoss() > 50 ? "Severe burn damage detected" : "Subject burn injury status O.K" - BR = M.getBruteLoss() > 50 ? "Severe anatomical damage detected" : "Subject brute-force injury status O.K" - if(M.status_flags & FAKEDEATH) + OX = H.getOxyLoss() > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" + TX = H.getToxLoss() > 50 ? "Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal" + BU = H.getFireLoss() > 50 ? "Severe burn damage detected" : "Subject burn injury status O.K" + BR = H.getBruteLoss() > 50 ? "Severe anatomical damage detected" : "Subject brute-force injury status O.K" + if(H.status_flags & FAKEDEATH) OX = fake_oxy > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" user.show_message("[OX] | [TX] | [BU] | [BR]") - if(istype(M, /mob/living/carbon)) - if(upgraded) - chemscan(user, M) - for(var/thing in M.viruses) - var/datum/disease/D = thing - if(!(D.visibility_flags & HIDDEN_SCANNER)) - user.show_message("Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") - if(M.getStaminaLoss()) + + if(upgraded) + chemscan(user, H) + for(var/thing in H.viruses) + var/datum/disease/D = thing + if(!(D.visibility_flags & HIDDEN_SCANNER)) + user.show_message("Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") + if(H.undergoing_cardiac_arrest()) + var/obj/item/organ/internal/heart/heart = H.get_int_organ(/obj/item/organ/internal/heart) + if(heart && !(heart.status & ORGAN_DEAD)) + user.show_message("Warning: Medical Emergency detected\nName: Cardiac Arrest.\nType: The patient's heart has stopped.\nStage: 1/1.\nPossible Cure: Electric Shock") + else if(heart && (heart.status & ORGAN_DEAD)) + user.show_message("Subject's heart is necrotic.") + else if(!heart) + user.show_message("Subject has no heart.") + + if(H.getStaminaLoss()) user.show_message("Subject appears to be suffering from fatigue.") - if(M.getCloneLoss()) - user.show_message("Subject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.") - if(M.has_brain_worms()) + if(H.getCloneLoss()) + user.show_message("Subject appears to have [H.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.") + if(H.has_brain_worms()) user.show_message("Subject suffering from aberrant brain activity. Recommend further scanning.") - else if(M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && !M.get_int_organ(/obj/item/organ/internal/brain)) - user.show_message("Subject is brain dead.") - else if(M.getBrainLoss() >= 60) - user.show_message("Severe brain damage detected. Subject likely to have mental retardation.") - else if(M.getBrainLoss() >= 10) - user.show_message("Significant brain damage detected. Subject may have had a concussion.") - if(ishuman(M)) - var/mob/living/carbon/human/H = M - for(var/name in H.bodyparts_by_name) - var/obj/item/organ/external/e = H.bodyparts_by_name[name] - if(!e) - continue - var/limb = e.name - if(e.status & ORGAN_BROKEN) - if((e.limb_name in list("l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot")) && !(e.status & ORGAN_SPLINTED)) - user.show_message("Unsecured fracture in subject [limb]. Splinting recommended for transport.") - if(e.has_infected_wound()) - user.show_message("Infected wound detected in subject [limb]. Disinfection recommended.") - for(var/name in H.bodyparts_by_name) - var/obj/item/organ/external/e = H.bodyparts_by_name[name] - if(!e) - continue - if(e.status & ORGAN_BROKEN) - user.show_message(text("Bone fractures detected. Advanced scanner required for location."), 1) - break - for(var/obj/item/organ/external/e in H.bodyparts) - if(e.internal_bleeding) - user.show_message(text("Internal bleeding detected. Advanced scanner required for location."), 1) - break - var/blood_id = H.get_blood_id() - if(blood_id) - if(H.bleed_rate) - user.show_message("Subject is bleeding!") - var/blood_percent = round((H.blood_volume / BLOOD_VOLUME_NORMAL)*100) - var/blood_type = H.b_type - if(blood_id != "blood")//special blood substance - var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] - if(R) - blood_type = R.name - else - blood_type = blood_id - if(H.blood_volume <= BLOOD_VOLUME_SAFE && H.blood_volume > BLOOD_VOLUME_OKAY) - user.show_message("LOW blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") - else if(H.blood_volume <= BLOOD_VOLUME_OKAY) - user.show_message("CRITICAL blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") + if(H.get_int_organ(/obj/item/organ/internal/brain)) + if(H.getBrainLoss() >= 100) + user.show_message("Subject is brain dead.") + else if(H.getBrainLoss() >= 60) + user.show_message("Severe brain damage detected. Subject likely to have mental retardation.") + else if(H.getBrainLoss() >= 10) + user.show_message("Significant brain damage detected. Subject may have had a concussion.") + else + user.show_message("Subject has no brain.") + + for(var/name in H.bodyparts_by_name) + var/obj/item/organ/external/e = H.bodyparts_by_name[name] + if(!e) + continue + var/limb = e.name + if(e.status & ORGAN_BROKEN) + if((e.limb_name in list("l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot")) && !(e.status & ORGAN_SPLINTED)) + user.show_message("Unsecured fracture in subject [limb]. Splinting recommended for transport.") + if(e.has_infected_wound()) + user.show_message("Infected wound detected in subject [limb]. Disinfection recommended.") + + for(var/name in H.bodyparts_by_name) + var/obj/item/organ/external/e = H.bodyparts_by_name[name] + if(!e) + continue + if(e.status & ORGAN_BROKEN) + user.show_message(text("Bone fractures detected. Advanced scanner required for location."), 1) + break + for(var/obj/item/organ/external/e in H.bodyparts) + if(e.internal_bleeding) + user.show_message(text("Internal bleeding detected. Advanced scanner required for location."), 1) + break + var/blood_id = H.get_blood_id() + if(blood_id) + if(H.bleed_rate) + user.show_message("Subject is bleeding!") + var/blood_percent = round((H.blood_volume / BLOOD_VOLUME_NORMAL)*100) + var/blood_type = H.b_type + if(blood_id != "blood")//special blood substance + var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] + if(R) + blood_type = R.name else - user.show_message("Blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") - - if(H.undergoing_cardiac_arrest() && H.stat != DEAD) - user.show_message("Subject suffering from heart attack: Apply defibrillator immediately.") - user.show_message("Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.") - var/implant_detect - for(var/obj/item/organ/internal/cyberimp/CI in H.internal_organs) - if(CI.is_robotic()) - implant_detect += "[H.name] is modified with a [CI.name].
" - if(implant_detect) - user.show_message("Detected cybernetic modifications:") - user.show_message("[implant_detect]") - if(H.gene_stability < 40) - user.show_message("Subject's genes are quickly breaking down!") - else if(H.gene_stability < 70) - user.show_message("Subject's genes are showing signs of spontaneous breakdown.") - else if(H.gene_stability < 85) - user.show_message("Subject's genes are showing minor signs of instability.") + blood_type = blood_id + if(H.blood_volume <= BLOOD_VOLUME_SAFE && H.blood_volume > BLOOD_VOLUME_OKAY) + user.show_message("LOW blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") + else if(H.blood_volume <= BLOOD_VOLUME_OKAY) + user.show_message("CRITICAL blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") else - user.show_message("Subject's genes are stable.") - src.add_fingerprint(user) - return + user.show_message("Blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") + + user.show_message("Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.") + var/implant_detect + for(var/obj/item/organ/internal/cyberimp/CI in H.internal_organs) + if(CI.is_robotic()) + implant_detect += "[H.name] is modified with a [CI.name].
" + if(implant_detect) + user.show_message("Detected cybernetic modifications:") + user.show_message("[implant_detect]") + if(H.gene_stability < 40) + user.show_message("Subject's genes are quickly breaking down!") + else if(H.gene_stability < 70) + user.show_message("Subject's genes are showing signs of spontaneous breakdown.") + else if(H.gene_stability < 85) + user.show_message("Subject's genes are showing minor signs of instability.") + else + user.show_message("Subject's genes are stable.") + add_fingerprint(user) + /obj/item/healthanalyzer/verb/toggle_mode() set name = "Switch Verbosity" @@ -275,19 +285,21 @@ REAGENT SCANNER if(0) to_chat(usr, "The scanner no longer shows limb damage.") -/obj/item/healthanalyzer/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/healthupgrade)) +/obj/item/healthanalyzer/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/healthupgrade)) if(upgraded) to_chat(user, "You have already installed an upgraded in the [src].") else to_chat(user, "You install the upgrade in the [src].") overlays += "advanced" - playsound(loc, W.usesound, 50, 1) - upgraded = 1 - qdel(W) + playsound(loc, I.usesound, 50, 1) + upgraded = TRUE + qdel(I) + return + return ..() /obj/item/healthanalyzer/advanced - upgraded = 1 + upgraded = TRUE /obj/item/healthanalyzer/advanced/New() overlays += "advanced" @@ -579,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 @@ -834,4 +849,4 @@ REAGENT SCANNER if(target.disabilities & NEARSIGHTED) dat += "Retinal misalignment detected.
" - return dat + return dat \ No newline at end of file diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 247b5fb1a0d..c6cfe03a151 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -23,7 +23,6 @@ var/list/world_uplinks = list() var/used_TC = 0 var/job = null - var/show_descriptions = 0 var/temp_category var/uplink_type = "traitor" @@ -32,8 +31,8 @@ var/list/world_uplinks = list() /obj/item/uplink/New() ..() - welcome = ticker.mode.uplink_welcome - uses = ticker.mode.uplink_uses + welcome = SSticker.mode.uplink_welcome + uses = SSticker.mode.uplink_uses uplink_items = get_uplink_items() world_uplinks += src @@ -72,7 +71,10 @@ var/list/world_uplinks = list() if(I.job && I.job.len) if(!(I.job.Find(job))) continue - dat += "[I.name] ([I.cost])
" + dat += "[I.name] ([I.cost])" + if(I.hijack_only) + dat += " (HIJACK ONLY)" + dat += "
" category_items++ dat += "Random Item (??)
" @@ -95,7 +97,7 @@ var/list/world_uplinks = list() if(I.job && I.job.len) if(!(I.job.Find(job))) continue - nano[nano.len]["items"] += list(list("Name" = sanitize(I.name), "Description" = sanitize(I.description()),"Cost" = I.cost, "obj_path" = I.reference)) + nano[nano.len]["items"] += list(list("Name" = sanitize(I.name), "Description" = sanitize(I.description()),"Cost" = I.cost, "hijack_only" = I.hijack_only, "obj_path" = I.reference)) reference[I.reference] = I var/datum/nano_item_lists/result = new @@ -231,7 +233,6 @@ var/list/world_uplinks = list() data["welcome"] = welcome data["crystals"] = uses data["menu"] = nanoui_menu - data["descriptions"] = show_descriptions if(!nanoui_items) generate_items(user) data["nano_items"] = nanoui_items @@ -266,12 +267,6 @@ var/list/world_uplinks = list() if(href_list["menu"]) nanoui_menu = text2num(href_list["menu"]) update_nano_data(href_list["id"]) - if(href_list["menu"]) - nanoui_menu = text2num(href_list["menu"]) - update_nano_data(href_list["id"]) - if(href_list["descriptions"]) - show_descriptions = !show_descriptions - update_nano_data() if(href_list["category"]) temp_category = href_list["category"] update_nano_data() diff --git a/code/game/objects/items/devices/voice.dm b/code/game/objects/items/devices/voice.dm new file mode 100644 index 00000000000..38bcd16f01e --- /dev/null +++ b/code/game/objects/items/devices/voice.dm @@ -0,0 +1,44 @@ +/obj/item/voice_changer + name = "voice changer" + desc = "A voice scrambling module." + icon = 'icons/obj/device.dmi' + icon_state = "voice_changer_off" + + actions_types = list(/datum/action/item_action/voice_changer/toggle, /datum/action/item_action/voice_changer/voice) + + var/obj/item/parent + + var/voice + var/active + +/obj/item/voice_changer/New() + . = ..() + + if(isitem(loc)) + parent = loc + parent.actions |= actions + +/obj/item/voice_changer/Destroy() + if(isitem(parent)) + parent.actions -= actions + + return ..() + +/obj/item/voice_changer/attack_self(mob/user) + active = !active + icon_state = "voice_changer_[active ? "on" : "off"]" + to_chat(user, "You toggle [src] [active ? "on" : "off"].") + + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/voice_changer/proc/set_voice(mob/user) + var/chosen_voice = clean_input("What voice would you like to mimic? Leave this empty to use the voice on your ID card.", "Set Voice Changer", voice, user) + if(!chosen_voice) + voice = null + to_chat(user, "You are now mimicking the voice on your ID card.") + return + + voice = sanitize(copytext(chosen_voice, 1, MAX_MESSAGE_LEN)) + to_chat(user, "You are now mimicking [voice].") \ No newline at end of file diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm index eeb3355c50c..8c4144f7c68 100644 --- a/code/game/objects/items/documents.dm +++ b/code/game/objects/items/documents.dm @@ -39,6 +39,9 @@ var/poison_dose = 20 var/poison_total = 60 +/obj/item/documents/syndicate/mining + desc = "\"Top Secret\" documents detailing Syndicate plasma mining operations." + /obj/item/documents/syndicate/yellow/trapped/pickup(user) if(ishuman(user) && poison_total > 0) var/mob/living/carbon/human/H = user diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm index 3ba466b7eec..121b0214b5a 100644 --- a/code/game/objects/items/flag.dm +++ b/code/game/objects/items/flag.dm @@ -64,11 +64,6 @@ desc = "The banner of the glorious revolutionary forces fighting the oppressors on Clown Planet." icon_state = "mimeflag" -/obj/item/flag/pony - name = "Equestria flag" - desc = "The flag of the independent, sovereign nation of Equestria, whatever the fuck that is." - icon_state = "ponyflag" - /obj/item/flag/ian name = "Ian flag" desc = "The banner of Ian, because SQUEEEEE." @@ -170,8 +165,8 @@ icon_state = "atmosflag" /obj/item/flag/command - name = "Commandzikstan flag" - desc = "The flag of the independent, sovereign nation of Commandzikstan." + name = "Command flag" + desc = "The flag of the independent, sovereign nation of Command." icon_state = "ntflag" //Antags diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm index 587b1d27d14..e51bac10005 100644 --- a/code/game/objects/items/random_items.dm +++ b/code/game/objects/items/random_items.dm @@ -123,6 +123,7 @@ /obj/item/storage/pill_bottle/random_meds name = "unlabelled pillbottle" desc = "The sheer recklessness of this bottle's existence astounds you." + allow_wrap = FALSE var/labelled = FALSE /obj/item/storage/pill_bottle/random_meds/New() diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 65f504b4ae0..6ce10294940 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -245,7 +245,7 @@ to_chat(user, "Sticking a dead [M] into the frame would sort of defeat the purpose.") return - if(M.brainmob.mind in ticker.mode.head_revolutionaries) + if(M.brainmob.mind in SSticker.mode.head_revolutionaries) to_chat(user, "The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [M].") return @@ -306,7 +306,6 @@ O.Namepick() feedback_inc("cyborg_birth",1) - callHook("borgify", list(O)) forceMove(O) O.robot_suit = src diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 064b66b78f4..a13bce6fb61 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -31,31 +31,9 @@ if(..()) return - R.notify_ai(2) + R.reset_module() - R.uneq_all() - R.sight_mode = null - R.hands.icon_state = "nomod" - R.icon_state = "robot" - R.module.remove_subsystems_and_actions(R) - QDEL_NULL(R.module) - - R.camera.network.Remove(list("Engineering", "Medical", "Mining Outpost")) - R.rename_character(R.real_name, R.get_default_name("Default")) - R.languages = list() - R.speech_synthesizer_langs = list() - - R.update_icons() - R.update_headlamp() - - R.speed = 0 // Remove upgrades. - R.ionpulse = 0 - R.magpulse = 0 - R.add_language("Robot Talk", 1) - - R.status_flags |= CANPUSH - - return 1 + return TRUE /obj/item/borg/upgrade/rename name = "cyborg reclassification board" @@ -256,7 +234,7 @@ /obj/item/borg/upgrade/selfrepair/Destroy() cyborg = null - processing_objects -= src + STOP_PROCESSING(SSobj, src) on = 0 return ..() @@ -264,10 +242,10 @@ on = !on if(on) to_chat(cyborg, "You activate the self-repair module.") - processing_objects |= src + START_PROCESSING(SSobj, src) else to_chat(cyborg, "You deactivate the self-repair module.") - processing_objects -= src + STOP_PROCESSING(SSobj, src) update_icon() /obj/item/borg/upgrade/selfrepair/update_icon() @@ -280,7 +258,7 @@ icon_state = "cyborg_upgrade5" /obj/item/borg/upgrade/selfrepair/proc/deactivate() - processing_objects -= src + STOP_PROCESSING(SSobj, src) on = 0 update_icon() 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/rods.dm b/code/game/objects/items/stacks/rods.dm index 176efe55c7c..f3716459f18 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -25,6 +25,15 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \ /obj/item/stack/rods/cyborg materials = list() +/obj/item/stack/rods/ten + amount = 10 + +/obj/item/stack/rods/twentyfive + amount = 25 + +/obj/item/stack/rods/fifty + amount = 50 + /obj/item/stack/rods/New(loc, amount=null) ..() recipes = rod_recipes 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/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index bed2f200633..db7c08b1863 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -125,6 +125,55 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ flags = NOBLUDGEON w_class = WEIGHT_CLASS_NORMAL layer = MOB_LAYER + var/static/list/can_strengthen_clothing + +/obj/item/stack/sheet/animalhide/goliath_hide/Initialize(mapload) + . = ..() + if(!can_strengthen_clothing) + can_strengthen_clothing = typecacheof(list( + /obj/item/clothing/suit/space/hardsuit/mining, + /obj/item/clothing/head/helmet/space/hardsuit/mining, + /obj/item/clothing/suit/space/eva/plasmaman/miner, + /obj/item/clothing/head/helmet/space/eva/plasmaman/miner, + /obj/item/clothing/suit/hooded/explorer, + /obj/item/clothing/head/hooded/explorer, + /obj/item/clothing/suit/space/eva/plasmaman/explorer, + /obj/item/clothing/head/helmet/space/eva/plasmaman/explorer + )) + +/obj/item/stack/sheet/animalhide/goliath_hide/afterattack(atom/target, mob/user, proximity_flag) + if(proximity_flag) + if(is_type_in_typecache(target, can_strengthen_clothing)) + var/obj/item/clothing/C = target + var/current_armor = C.armor + if(current_armor["melee"] < 60) + current_armor["melee"] = min(current_armor["melee"] + 10, 60) + to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") + use(1) + else + to_chat(user, "You can't improve [C] any further.") + return + if(istype(target, /obj/mecha/working/ripley)) + var/obj/mecha/D = target + if(D.icon_state != "ripley-open") + to_chat(user, "You can't add armour onto the mech while someone is inside!") + return + var/list/damage_absorption = D.damage_absorption + if(damage_absorption["brute"] > 0.3) + damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3) + damage_absorption["bullet"] = damage_absorption["bullet"] - 0.05 + damage_absorption["fire"] = damage_absorption["fire"] - 0.05 + damage_absorption["laser"] = damage_absorption["laser"] - 0.025 + to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") + use(1) + D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open") + D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." + if(damage_absorption["brute"] == 0.3) + D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") + D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." + else + to_chat(user, "You can't improve [D] any further!") + return /obj/item/stack/sheet/animalhide/ashdrake name = "ash drake hide" @@ -156,7 +205,12 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ else ..() -//Step two - washing..... it's actually in washing machine code. +//Step two - washing (also handled by water reagent code and washing machine code) +/obj/item/stack/sheet/hairlesshide/water_act(volume, temperature, source, method = TOUCH) + . = ..() + if(volume >= 10) + new /obj/item/stack/sheet/wetleather(get_turf(src), amount) + qdel(src) //Step three - drying /obj/item/stack/sheet/wetleather/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index c7a27b5650e..8c60bcefa11 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -108,6 +108,11 @@ var/global/list/datum/stack_recipe/adamantine_recipes = list( new /datum/stack_recipe("incomplete servant golem shell", /obj/item/golem_shell/servant, req_amount = 1, res_amount = 1), \ ) +var/global/list/datum/stack_recipe/snow_recipes = list( + new/datum/stack_recipe("snowman", /obj/structure/snowman, 5, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("Snowball", /obj/item/snowball, 1) + ) + /obj/item/stack/sheet/mineral force = 5 throwforce = 5 @@ -139,6 +144,7 @@ var/global/list/datum/stack_recipe/adamantine_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() ..() @@ -151,6 +157,7 @@ var/global/list/datum/stack_recipe/adamantine_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() ..() @@ -165,6 +172,7 @@ var/global/list/datum/stack_recipe/adamantine_recipes = list( materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT) burn_state = FLAMMABLE burntime = 5 + point_value = 20 /obj/item/stack/sheet/mineral/plasma/New() ..() @@ -191,6 +199,7 @@ var/global/list/datum/stack_recipe/adamantine_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() ..() @@ -203,6 +212,7 @@ var/global/list/datum/stack_recipe/adamantine_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() ..() @@ -215,6 +225,7 @@ var/global/list/datum/stack_recipe/adamantine_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) ..() @@ -228,6 +239,7 @@ var/global/list/datum/stack_recipe/adamantine_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) ..() @@ -248,6 +260,7 @@ var/global/list/datum/stack_recipe/adamantine_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), @@ -277,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), @@ -321,3 +335,19 @@ var/global/list/datum/stack_recipe/plastitanium_recipes = list ( /obj/item/stack/sheet/mineral/adamantine/New(loc, amount = null) recipes = adamantine_recipes ..() + +/* + * Snow + */ +/obj/item/stack/sheet/mineral/snow + name = "snow" + icon_state = "sheet-snow" + item_state = "sheet-snow" + singular_name = "snow block" + force = 1 + throwforce = 2 + merge_type = /obj/item/stack/sheet/mineral/snow + +/obj/item/stack/sheet/mineral/snow/New(loc, amount = null) + recipes = snow_recipes + ..() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index abc328a8bf1..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 @@ -240,6 +245,7 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \ var/global/list/datum/stack_recipe/cardboard_recipes = list ( new /datum/stack_recipe("box", /obj/item/storage/box), new /datum/stack_recipe("large box", /obj/item/storage/box/large, 4), + new /datum/stack_recipe("patch pack", /obj/item/storage/pill_bottle/patch_pack, 2), new /datum/stack_recipe("light tubes", /obj/item/storage/box/lights/tubes), new /datum/stack_recipe("light bulbs", /obj/item/storage/box/lights/bulbs), new /datum/stack_recipe("mouse traps", /obj/item/storage/box/mousetraps), @@ -332,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), \ ) @@ -384,8 +393,8 @@ var/global/list/datum/stack_recipe/brass_recipes = list (\ GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = 1, on_floor = 1, time = 40), \ new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2), \ - new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/food/drinks/waterbottle/empty), \ - new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/food/drinks/waterbottle/large/empty,3), \ + new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \ + new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \ new /datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1), \ new /datum/stack_recipe("plastic ashtray", /obj/item/ashtray/plastic, 2, one_per_turf = 1, on_floor = 1), \ new /datum/stack_recipe("plastic fork", /obj/item/kitchen/utensil/pfork, 1, on_floor = 1), \ 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 5cab26e062b..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) @@ -54,7 +54,7 @@ to_chat(user, "There are [amount] [singular_name]\s in the stack.") else to_chat(user, "There are [amount] [name]\s in the stack.") - to_chat(user,"Ctrl-Shift-click to take a custom amount.") + to_chat(user,"Alt-click to take a custom amount.") /obj/item/stack/proc/add(newamount) amount += newamount @@ -111,16 +111,11 @@ if(istype(E, /datum/stack_recipe)) var/datum/stack_recipe/R = E - var/max_multiplier = round(src.amount / R.req_amount) + var/max_multiplier = round(amount / R.req_amount) var/title var/can_build = 1 can_build = can_build && (max_multiplier > 0) - /* - if(R.one_per_turf) - can_build = can_build && !(locate(R.result_type) in usr.loc) - if(R.on_floor) - can_build = can_build && istype(usr.loc, /turf/simulated/floor) - */ + if(R.res_amount > 1) title += "[R.res_amount]x [R.title]\s" else @@ -131,12 +126,13 @@ else t1 += "[title]" continue - if(R.max_res_amount>1 && max_multiplier>1) + if(R.max_res_amount > 1 && max_multiplier > 1) max_multiplier = min(max_multiplier, round(R.max_res_amount / R.res_amount)) t1 += " |" - var/list/multipliers = list(5,10,25) + + var/list/multipliers = list(5, 10, 25) for(var/n in multipliers) - if(max_multiplier>=n) + if(max_multiplier >= n) t1 += " [n * R.res_amount]x" if(!(max_multiplier in multipliers)) t1 += " [max_multiplier * R.res_amount]x" @@ -165,7 +161,7 @@ var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])] var/multiplier = text2num(href_list["multiplier"]) - if(!multiplier) + if(!multiplier || multiplier <= 0 || multiplier > 50) // Href exploit checks multiplier = 1 if(amount < R.req_amount * multiplier) @@ -263,7 +259,7 @@ else ..() -/obj/item/stack/CtrlShiftClick(mob/living/user) +/obj/item/stack/AltClick(mob/living/user) if(!istype(user) || user.incapacitated()) to_chat(user, "You can't do that right now!") return @@ -276,7 +272,7 @@ //get amount from user var/min = 0 var/max = get_amount() - var/stackmaterial = round(input(user, "How many sheets do you wish to take out of this stack? (Maximum: [max])") as num) + var/stackmaterial = round(input(user, "How many sheets do you wish to take out of this stack? (Maximum: [max])") as null|num) if(stackmaterial == null || stackmaterial <= min || stackmaterial > get_amount()) return change_stack(user,stackmaterial) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index aa3f23f99b7..fcbb277edd5 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -170,6 +170,20 @@ icon_state = "tile_pod" turf_type = /turf/simulated/floor/pod +/obj/item/stack/tile/pod/light + name = "light pod floor tile" + singular_name = "light pod floor tile" + desc = "A lightly colored grooved floor tile." + icon_state = "tile_podlight" + turf_type = /turf/simulated/floor/pod + +/obj/item/stack/tile/pod/dark + name = "dark pod floor tile" + singular_name = "dark pod floor tile" + desc = "A darkly colored grooved floor tile." + icon_state = "tile_poddark" + turf_type = /turf/simulated/floor/pod/dark + /obj/item/stack/tile/arcade_carpet name = "arcade carpet" singular_name = "arcade carpet" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index d4d5f4aa213..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 @@ -231,7 +232,7 @@ /obj/item/toy/katana/suicide_act(mob/user) var/dmsg = pick("[user] tries to stab \the [src] into [user.p_their()] abdomen, but it shatters! [user.p_they(TRUE)] look[user.p_s()] as if [user.p_they()] might die from the shame.","[user] tries to stab \the [src] into [user.p_their()] abdomen, but \the [src] bends and breaks in half! [user.p_they(TRUE)] look[user.p_s()] as if [user.p_they()] might die from the shame.","[user] tries to slice [user.p_their()] own throat, but the plastic blade has no sharpness, causing [user.p_them()] to lose [user.p_their()] balance, slip over, and break [user.p_their()] neck with a loud snap!") user.visible_message("[dmsg] It looks like [user.p_theyre()] trying to commit suicide.") - return (BRUTELOSS) + return BRUTELOSS /* @@ -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) @@ -1066,6 +1067,32 @@ obj/item/toy/cards/deck/syndicate/black name = "tuxedo cat plushie" icon_state = "tuxedocat" +//New generation TG plushies + +/obj/item/toy/plushie/lizardplushie + name = "lizard plushie" + desc = "An adorable stuffed toy that resembles a lizardperson." + icon_state = "plushie_lizard" + item_state = "plushie_lizard" + +/obj/item/toy/plushie/snakeplushie + name = "snake plushie" + desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." + icon_state = "plushie_snake" + item_state = "plushie_snake" + +/obj/item/toy/plushie/nukeplushie + name = "operative plushie" + desc = "An stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious." + icon_state = "plushie_nuke" + item_state = "plushie_nuke" + +/obj/item/toy/plushie/slimeplushie + name = "slime plushie" + desc = "An adorable stuffed toy that resembles a slime. It is practically just a hacky sack." + icon_state = "plushie_slime" + item_state = "plushie_slime" + /* * Foam Armblade */ @@ -1372,54 +1399,84 @@ obj/item/toy/cards/deck/syndicate/black force = 5 origin_tech = "combat=1" attack_verb = list("struck", "hit", "bashed") - var/bullet_position = 1 + var/bullets_left = 0 + var/max_shots = 6 /obj/item/toy/russian_revolver/suicide_act(mob/user) user.visible_message("[user] quickly loads six bullets into [src]'s cylinder and points it at [user.p_their()] head before pulling the trigger! It looks like [user.p_theyre()] trying to commit suicide.") playsound(loc, 'sound/weapons/gunshots/gunshot_strong.ogg', 50, 1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/toy/russian_revolver/New() - spin_cylinder() ..() - + spin_cylinder() /obj/item/toy/russian_revolver/attack_self(mob/user) - if(!bullet_position) - user.visible_message("[user] loads a bullet into [src]'s cylinder.") - bullet_position = 1 - else + if(!bullets_left) + user.visible_message("[user] loads a bullet into [src]'s cylinder before spinning it.") spin_cylinder() - user.visible_message("[user] spins the cylinder on [src]!") - -/obj/item/toy/russian_revolver/attack(mob/living/carbon/human/M, mob/living/carbon/human/user) - if(M != user) //can't use this on other people - return ..() - if(!bullet_position) - to_chat(user, "[src] is empty.") - return - if(!(user.has_organ("head"))) //For sanity - to_chat(user, "Playing this game without a head would be classed as cheating.") - return - user.visible_message("[user] points [src] at [user.p_their()] head, ready to pull the trigger!") - if(do_after(user, 30, target = user)) - if(bullet_position > 1) - user.visible_message("*click*") - playsound(src, 'sound/weapons/empty.ogg', 100, 1) - bullet_position-- - return - else - bullet_position = null - playsound(src, 'sound/weapons/gunshots/gunshot_strong.ogg', 50, 1) - user.visible_message("[src] goes off!") - user.apply_damage(200, BRUTE, "head", sharp = 1, used_weapon = "Self-inflicted gunshot wound to the head.") - user.death() else - user.visible_message("[user] lowers [src] from [user.p_their()] head.") + user.visible_message("[user] spins the cylinder on [src]!") + spin_cylinder() + +/obj/item/toy/russian_revolver/attack(mob/M, mob/living/user) + return + +/obj/item/toy/russian_revolver/afterattack(atom/target, mob/user, flag, params) + if(flag) + if(target in user.contents) + return + if(!ismob(target)) + return + shoot_gun(user) /obj/item/toy/russian_revolver/proc/spin_cylinder() - bullet_position = rand(1,6) + bullets_left = rand(1, max_shots) +/obj/item/toy/russian_revolver/proc/post_shot(mob/user) + return + +/obj/item/toy/russian_revolver/proc/shoot_gun(mob/living/carbon/human/user) + if(bullets_left > 1) + bullets_left-- + user.visible_message("*click*") + playsound(src, 'sound/weapons/empty.ogg', 100, 1) + return FALSE + if(bullets_left == 1) + bullets_left = 0 + var/zone = "head" + if(!(user.has_organ(zone))) // If they somehow don't have a head. + zone = "chest" + playsound(src, 'sound/weapons/gunshots/gunshot_strong.ogg', 50, 1) + user.visible_message("[src] goes off!") + post_shot(user) + user.apply_damage(300, BRUTE, zone, sharp = TRUE, used_weapon = "Self-inflicted gunshot wound to the [zone].") + user.bleed(BLOOD_VOLUME_NORMAL) + user.death() // Just in case + return TRUE + else + to_chat(user, "[src] needs to be reloaded.") + return FALSE + +/obj/item/toy/russian_revolver/trick_revolver + name = "\improper .357 revolver" + desc = "A suspicious revolver. Uses .357 ammo." + icon_state = "revolver" + max_shots = 1 + var/fake_bullets = 0 + +/obj/item/toy/russian_revolver/trick_revolver/New() + ..() + fake_bullets = rand(2, 7) + +/obj/item/toy/russian_revolver/trick_revolver/examine(mob/user) //Sneaky sneaky + ..() + to_chat(user, "Has [fake_bullets] round\s remaining.") + to_chat(user, "[fake_bullets] of those are live rounds.") + +/obj/item/toy/russian_revolver/trick_revolver/post_shot(user) + to_chat(user, "[src] did look pretty dodgey!") + SEND_SOUND(user, 'sound/misc/sadtrombone.ogg') //HONK /* * Rubber Chainsaw */ @@ -1440,6 +1497,18 @@ obj/item/toy/cards/deck/syndicate/black else icon_state = "chainsaw0" +/* + * Cat Toy + */ +/obj/item/toy/cattoy + name = "toy mouse" + desc = "A colorful toy mouse!" + icon = 'icons/obj/toy.dmi' + icon_state = "toy_mouse" + w_class = WEIGHT_CLASS_SMALL + resistance_flags = FLAMMABLE + var/cooldown = 0 + /* * Action Figures */ diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 109697c3520..ec916a4a228 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -333,7 +333,7 @@ GLOBAL_LIST_INIT(rcd_door_types, list( return FALSE playsound(loc, usesound, 50, 1) var/turf/AT = A - AT.ChangeTurf(/turf/space) + AT.ChangeTurf(AT.baseturf) return TRUE return FALSE to_chat(user, "ERROR! Not enough matter in unit to deconstruct this floor!") diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 150b21692f2..917bf7f032c 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -98,6 +98,8 @@ //alt titles are handled a bit weirdly in order to unobtrusively integrate into existing ID system var/assignment = null //can be alt title or the actual job var/rank = null //actual job + var/owner_uid + var/owner_ckey var/dorm = 0 // determines if this ID has claimed a dorm already var/sex @@ -195,6 +197,19 @@ jobnamedata += " (" + assignment + ")" return jobnamedata +/obj/item/card/id/proc/getPlayer() + if(owner_uid) + var/mob/living/carbon/human/H = locateUID(owner_uid) + if(istype(H) && H.ckey == owner_ckey) + return H + owner_uid = null + if(owner_ckey) + for(var/mob/M in GLOB.player_list) + if(M.ckey && M.ckey == owner_ckey) + owner_uid = M.UID() + return M + owner_ckey = null + /obj/item/card/id/proc/is_untrackable() return untrackable @@ -310,6 +325,10 @@ origin_tech = "syndicate=1" var/registered_user = null untrackable = 1 + var/anyone = FALSE //Can anyone forge the ID or just syndicate? + +/obj/item/card/id/syndicate/anyone + anyone = TRUE /obj/item/card/id/syndicate/New() access = initial_access.Copy() @@ -329,7 +348,7 @@ if(istype(O, /obj/item/card/id)) var/obj/item/card/id/I = O if(istype(user, /mob/living) && user.mind) - if(user.mind.special_role) + if(user.mind.special_role || anyone) to_chat(usr, "The card's microscanners activate as you pass it over \the [I], copying its access.") src.access |= I.access //Don't copy access if user isn't an antag -- to prevent metagaming diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm index a4599a2e79f..b1b573f77ad 100644 --- a/code/game/objects/items/weapons/caution.dm +++ b/code/game/objects/items/weapons/caution.dm @@ -26,7 +26,7 @@ return timing = !timing if(timing) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else armed = 0 timepassed = 0 @@ -34,7 +34,7 @@ /obj/item/caution/proximity_sign/process() if(!timing) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) timepassed++ if(timepassed >= 15 && !armed) armed = 1 diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index 58c2dd2594f..7e7f1642e3a 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -177,7 +177,7 @@ update_icon() desc = initial(desc) + "
It appears to contain [target.name]." - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/effect/chrono_field/Destroy() if(gun && gun.field_check(src)) diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 1378b5c004d..fa4b90e0e37 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -31,7 +31,6 @@ LIGHTERS ARE IN LIGHTERS.DM var/lastHolder = null var/smoketime = 300 var/chem_volume = 30 - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -48,7 +47,7 @@ LIGHTERS ARE IN LIGHTERS.DM /obj/item/clothing/mask/cigarette/Destroy() QDEL_NULL(reagents) - processing_objects -= src + STOP_PROCESSING(SSobj, src) return ..() /obj/item/clothing/mask/cigarette/attack(mob/living/M, mob/living/user, def_zone) @@ -161,7 +160,7 @@ LIGHTERS ARE IN LIGHTERS.DM var/turf/T = get_turf(src) T.visible_message(flavor_text) set_light(2, 0.25, "#E38F46") - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/clothing/mask/cigarette/process() @@ -213,7 +212,7 @@ LIGHTERS ARE IN LIGHTERS.DM var/mob/living/M = loc to_chat(M, "Your [name] goes out.") M.unEquip(src, 1) //Force the un-equip so the overlays update - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) qdel(src) @@ -341,7 +340,7 @@ LIGHTERS ARE IN LIGHTERS.DM if(flavor_text) var/turf/T = get_turf(src) T.visible_message(flavor_text) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/clothing/mask/cigarette/pipe/process() var/turf/location = get_turf(src) @@ -355,7 +354,7 @@ LIGHTERS ARE IN LIGHTERS.DM icon_state = icon_off item_state = icon_off M.update_inv_wear_mask(0) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return smoke() return @@ -366,7 +365,7 @@ LIGHTERS ARE IN LIGHTERS.DM lit = 0 icon_state = icon_off item_state = icon_off - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return if(smoketime <= 0) to_chat(user, "You refill the pipe with tobacco.") diff --git a/code/game/objects/items/weapons/courtroom.dm b/code/game/objects/items/weapons/courtroom.dm index d25b6f54d29..72bb3fceb11 100644 --- a/code/game/objects/items/weapons/courtroom.dm +++ b/code/game/objects/items/weapons/courtroom.dm @@ -16,7 +16,7 @@ /obj/item/gavelhammer/suicide_act(mob/user) user.visible_message("[user] has sentenced [user.p_them()]self to death with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/gavelblock name = "gavel block" diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 758e30947b0..fbdc403d758 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -11,7 +11,6 @@ w_class = WEIGHT_CLASS_BULKY origin_tech = "biotech=4" actions_types = list(/datum/action/item_action/toggle_paddles) - species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/back.dmi' ) @@ -23,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() @@ -283,7 +285,7 @@ user.visible_message("[user] is putting the live paddles on [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide.") defib.deductcharge(revivecost) playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - return (OXYLOSS) + return OXYLOSS /obj/item/twohanded/shockpaddles/dropped(mob/user as mob) if(user) @@ -313,7 +315,7 @@ /obj/item/twohanded/shockpaddles/attack(mob/M, mob/user) var/tobehealed - var/threshold = -config.health_threshold_dead + var/threshold = -HEALTH_THRESHOLD_DEAD var/mob/living/carbon/human/H = M if(busy) @@ -472,7 +474,7 @@ /obj/item/borg_defib/attack(mob/M, mob/user) var/tobehealed - var/threshold = -config.health_threshold_dead + var/threshold = -HEALTH_THRESHOLD_DEAD var/mob/living/carbon/human/H = M if(busy) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 666c14801d8..736ba1cc767 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/dice.dmi' icon_state = "dicebag" can_hold = list(/obj/item/dice) + allow_wrap = FALSE /obj/item/storage/pill_bottle/dice/New() ..() @@ -25,20 +26,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!" @@ -112,17 +127,24 @@ /obj/item/dice/attack_self(mob/user as mob) diceroll(user) -/obj/item/dice/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) - if(!..()) - return - diceroll(thrower) +/obj/item/dice/throw_impact(atom/target) + diceroll(thrownby) + . = ..() /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() @@ -131,16 +153,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() @@ -167,7 +191,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/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index d2f2ed2c54d..c7627688b5e 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -668,4 +668,27 @@ /obj/item/dnainjector/m2h/Initialize() block = MONKEYBLOCK + ..() + + +/obj/item/dnainjector/comic + name = "DNA-Injector (Comic)" + desc = "Honk!" + datatype = DNA2_BUF_SE + value = 0xFFF + forcedmutation = TRUE + +/obj/item/dnainjector/comic/Initialize() + block = COMICBLOCK + ..() + +/obj/item/dnainjector/anticomic + name = "DNA-Injector (Ant-Comic)" + desc = "Honk...?" + datatype = DNA2_BUF_SE + value = 0x001 + forcedmutation = TRUE + +/obj/item/dnainjector/anticomic/Initialize() + block = COMICBLOCK ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index be490d29065..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) @@ -116,6 +116,7 @@ sleep(10) prime() user.gib() + return OBLITERATION /obj/item/grenade/plastic/update_icon() if(nadeassembly) diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 75d29c7c6be..dd67d7c67a4 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -33,7 +33,7 @@ /obj/item/flamethrower/process() if(!lit) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return null var/turf/location = loc if(istype(location, /mob/)) @@ -141,7 +141,7 @@ if(!status) return lit = !lit if(lit) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) if(href_list["remove"]) if(!ptank) return usr.put_in_hands(ptank) diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm index 03125313656..4bddaf551ea 100644 --- a/code/game/objects/items/weapons/garrote.dm +++ b/code/game/objects/items/weapons/garrote.dm @@ -44,7 +44,7 @@ strangling = null update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) else ..() @@ -97,7 +97,7 @@ M.AdjustSilence(1) garrote_time = world.time + 10 - processing_objects.Add(src) + START_PROCESSING(SSobj, src) strangling = M update_icon() @@ -113,14 +113,14 @@ if(!strangling) // Our mark got gibbed or similar update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return if(!istype(loc, /mob/living/carbon/human)) strangling = null update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return var/mob/living/carbon/human/user = loc @@ -138,7 +138,7 @@ strangling = null update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return @@ -148,7 +148,7 @@ strangling = null update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return @@ -168,4 +168,4 @@ /obj/item/twohanded/garrote/suicide_act(mob/user) user.visible_message("[user] is wrapping the [src] around [user.p_their()] neck and pulling the handles! It looks like [user.p_theyre()] trying to commit suicide.") playsound(src.loc, 'sound/weapons/cablecuff.ogg', 15, 1, -1) - return (OXYLOSS) + return OXYLOSS diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 7da978a35d1..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) @@ -446,6 +446,23 @@ update_icon() +/obj/item/grenade/chem_grenade/firefighting + payload_name = "fire fighting grenade" + desc = "Can help to put out dangerous fires from a distance." + stage = READY + +/obj/item/grenade/chem_grenade/firefighting/New() + ..() + var/obj/item/reagent_containers/glass/beaker/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/B2 = new(src) + + B1.reagents.add_reagent("firefighting_foam", 30) + B2.reagents.add_reagent("firefighting_foam", 30) + + beakers += B1 + beakers += B2 + update_icon() + /obj/item/grenade/chem_grenade/incendiary payload_name = "incendiary" desc = "Used for clearing rooms of living things." diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 2e7bacd4426..b0f89c6215b 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -6,6 +6,7 @@ light_power = 10 light_color = LIGHT_COLOR_WHITE var/light_time = 2 + var/range = 7 /obj/item/grenade/flashbang/prime() update_mob() @@ -15,60 +16,65 @@ set_light(7) - for(var/mob/living/M in hearers(7, flashbang_turf)) - bang(get_turf(M), M) + do_sparks(rand(5, 9), FALSE, src) + playsound(flashbang_turf, 'sound/effects/bang.ogg', 25, 1) + bang(flashbang_turf, src, range) - for(var/obj/structure/blob/B in hear(8,flashbang_turf)) //Blob damage here - var/damage = round(30/(get_dist(B,get_turf(src))+1)) + for(var/obj/structure/blob/B in hear(8, flashbang_turf)) //Blob damage here + var/damage = round(30 / (get_dist(B, get_turf(src)) + 1)) B.health -= damage B.update_icon() spawn(light_time) qdel(src) -/obj/item/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/M) - M.show_message("BANG", 2) - playsound(loc, 'sound/effects/bang.ogg', 25, 1) +/proc/bang(turf/T, atom/A, range = 7, flash = TRUE, bang = TRUE) + for(var/mob/living/M in hearers(range, T)) + if(M.stat == DEAD) + continue + M.show_message("BANG", 2) -//Checking for protections - var/ear_safety = M.check_ear_prot() - var/distance = max(1,get_dist(src,T)) + //Checking for protections + var/ear_safety = M.check_ear_prot() + var/distance = max(1, get_dist(get_turf(A), get_turf(M))) -//Flash - if(M.weakeyes) - M.visible_message("[M] screams and collapses!") - to_chat(M, "AAAAGH!") - M.Weaken(15) //hella stunned - M.Stun(15) - if(ishuman(M)) - M.emote("scream") - var/mob/living/carbon/human/H = M - var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) - if(E) - E.receive_damage(8, 1) + //Flash + if(flash) + if(M.weakeyes) + M.visible_message("[M] screams and collapses!") + to_chat(M, "AAAAGH!") + M.Weaken(15) //hella stunned + M.Stun(15) + if(ishuman(M)) + M.emote("scream") + var/mob/living/carbon/human/H = M + var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) + if(E) + E.receive_damage(8, 1) - if(M.flash_eyes(affect_silicon = 1)) - M.Stun(max(10/distance, 3)) - M.Weaken(max(10/distance, 3)) + if(M.flash_eyes(affect_silicon = TRUE)) + M.Stun(max(10 / distance, 3)) + M.Weaken(max(10 / distance, 3)) -//Bang - if(get_turf(M) == get_turf(src))//Holding on person or being exactly where lies is significantly more dangerous and voids protection - M.Stun(10) - M.Weaken(10) - if(!ear_safety) - M.Stun(max(10/distance, 3)) - M.Weaken(max(10/distance, 3)) - M.AdjustEarDamage(rand(0, 5), 15) - if(iscarbon(M)) - var/mob/living/carbon/C = M - var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) - if(istype(ears)) - if(ears.ear_damage >= 15) - to_chat(M, "Your ears start to ring badly!") - if(prob(ears.ear_damage - 5)) - to_chat(M, "You can't hear anything!") - M.BecomeDeaf() - else - if(ears.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") + //Bang + if(bang) + if(!distance || A.loc == M || A.loc == M.loc) //Holding on person or being exactly where lies is significantly more dangerous and voids protection + M.Stun(10) + M.Weaken(10) + if(!ear_safety) + M.Stun(max(10 / distance, 3)) + M.Weaken(max(10 / distance, 3)) + M.AdjustEarDamage(rand(0, 5), 15) + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears)) + if(ears.ear_damage >= 15) + to_chat(M, "Your ears start to ring badly!") + if(prob(ears.ear_damage - 5)) + to_chat(M, "You can't hear anything!") + M.BecomeDeaf() + else + if(ears.ear_damage >= 5) + to_chat(M, "Your ears start to ring!") \ No newline at end of file diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 7c26e5c405e..28e73f29317 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -24,13 +24,21 @@ if(!istype(C)) return + if(flags & NODROP) + to_chat(user, "[src] is stuck to your hand!") + return + if((CLUMSY in user.mutations) && prob(50) && (!ignoresClumsy)) to_chat(user, "Uh... how do those things work?!") - apply_cuffs(user,user) - + apply_cuffs(user, user) + return + + cuff(C, user) + +/obj/item/restraints/handcuffs/proc/cuff(mob/living/carbon/C, mob/user, remove_src = TRUE) if(ishuman(C)) var/mob/living/carbon/human/H = C - if(!H.has_left_hand() || !H.has_right_hand()) + if(!(H.has_left_hand() || H.has_right_hand())) to_chat(user, "How do you suggest handcuffing someone with no hands?") return @@ -40,26 +48,31 @@ playsound(loc, cuffsound, 30, 1, -2) if(do_mob(user, C, 30)) - apply_cuffs(C,user) + apply_cuffs(C, user, remove_src) to_chat(user, "You handcuff [C].") if(istype(src, /obj/item/restraints/handcuffs/cable)) - feedback_add_details("handcuffs","C") + feedback_add_details("handcuffs", "C") else - feedback_add_details("handcuffs","H") + feedback_add_details("handcuffs", "H") add_attack_logs(user, C, "Handcuffed ([src])") else to_chat(user, "You fail to handcuff [C].") -/obj/item/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user) +/obj/item/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user, remove_src = TRUE) if(!target.handcuffed) - user.drop_item() + if(remove_src) + user.drop_item() if(trashtype) target.handcuffed = new trashtype(target) - qdel(src) + if(remove_src) + qdel(src) else - loc = target - target.handcuffed = src + if(remove_src) + loc = target + target.handcuffed = src + else + target.handcuffed = new type(loc) target.update_handcuffed() return @@ -170,23 +183,7 @@ /obj/item/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user) if(isrobot(user)) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(!(H.get_organ("l_hand") || H.get_organ("r_hand"))) - to_chat(user, "How do you suggest handcuffing someone with no hands?") - return - if(!C.handcuffed) - playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) - C.visible_message("[user] is trying to put zipties on [C]!", \ - "[user] is trying to put zipties on [C]!") - if(do_mob(user, C, 30)) - if(!C.handcuffed) - C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C) - C.update_handcuffed() - to_chat(user, "You handcuff [C].") - add_attack_logs(user, C, "Handcuffed (ziptie-cuffed)") - else - to_chat(user, "You fail to handcuff [C].") + cuff(C, user, FALSE) /obj/item/restraints/handcuffs/cable/zipties/used desc = "A pair of broken zipties." diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 73ff4e5064d..68e731b8c44 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -15,7 +15,7 @@ /obj/item/nullrod/suicide_act(mob/user) user.visible_message("[user] is killing [user.p_them()]self with \the [src.name]! It looks like [user.p_theyre()] trying to get closer to god!") - return (BRUTELOSS|FIRELOSS) + return BRUTELOSS|FIRELOSS /obj/item/nullrod/attack(mob/M, mob/living/carbon/user) ..() @@ -402,10 +402,10 @@ /obj/item/nullrod/tribal_knife/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/nullrod/tribal_knife/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/nullrod/tribal_knife/process() @@ -432,10 +432,10 @@ /obj/item/nullrod/rosary/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/nullrod/rosary/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/nullrod/rosary/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) @@ -443,15 +443,15 @@ return ..() if(!user.mind || !user.mind.isholy) - to_chat(user, "You are not close enough with [ticker.Bible_deity_name] to use [src].") + to_chat(user, "You are not close enough with [SSticker.Bible_deity_name] to use [src].") return if(praying) to_chat(user, "You are already using [src].") return - user.visible_message("[user] kneels[M == user ? null : " next to [M]"] and begins to utter a prayer to [ticker.Bible_deity_name].", \ - "You kneel[M == user ? null : " next to [M]"] and begin a prayer to [ticker.Bible_deity_name].") + user.visible_message("[user] kneels[M == user ? null : " next to [M]"] and begins to utter a prayer to [SSticker.Bible_deity_name].", \ + "You kneel[M == user ? null : " next to [M]"] and begin a prayer to [SSticker.Bible_deity_name].") praying = 1 if(do_after(user, 150, target = M)) @@ -460,18 +460,18 @@ if(target.mind) if(iscultist(target)) - ticker.mode.remove_cultist(target.mind) // This proc will handle message generation. + SSticker.mode.remove_cultist(target.mind) // This proc will handle message generation. praying = 0 return if(target.mind.vampire && !target.mind.vampire.get_ability(/datum/vampire_passive/full)) // Getting a full prayer off on a vampire will interrupt their powers for a large duration. target.mind.vampire.nullified = max(120, target.mind.vampire.nullified + 120) - to_chat(target, "[user]'s prayer to [ticker.Bible_deity_name] has interfered with your power!") + to_chat(target, "[user]'s prayer to [SSticker.Bible_deity_name] has interfered with your power!") praying = 0 return if(prob(25)) - to_chat(target, "[user]'s prayer to [ticker.Bible_deity_name] has eased your pain!") + to_chat(target, "[user]'s prayer to [SSticker.Bible_deity_name] has eased your pain!") target.adjustToxLoss(-5) target.adjustOxyLoss(-5) target.adjustBruteLoss(-5) @@ -480,7 +480,7 @@ praying = 0 else - to_chat(user, "Your prayer to [ticker.Bible_deity_name] was interrupted.") + to_chat(user, "Your prayer to [SSticker.Bible_deity_name] was interrupted.") praying = 0 /obj/item/nullrod/rosary/process() @@ -506,13 +506,13 @@ /obj/item/nullrod/salt/attack_self(mob/user) if(!user.mind || !user.mind.isholy) - to_chat(user, "You are not close enough with [ticker.Bible_deity_name] to use [src].") + to_chat(user, "You are not close enough with [SSticker.Bible_deity_name] to use [src].") return if(!(ghostcall_CD > world.time)) ghostcall_CD = world.time + 3000 //deciseconds..5 minutes - user.visible_message("[user] kneels and begins to utter a prayer to [ticker.Bible_deity_name] while drawing a circle with salt!", \ - "You kneel and begin a prayer to [ticker.Bible_deity_name] while drawing a circle!") + user.visible_message("[user] kneels and begins to utter a prayer to [SSticker.Bible_deity_name] while drawing a circle with salt!", \ + "You kneel and begin a prayer to [SSticker.Bible_deity_name] while drawing a circle!") notify_ghosts("The Chaplain is calling ghosts to [get_area(src)] with [name]!", source = src) else to_chat(user, "You need to wait before using [src] again.") diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 9a7c3f0e27c..88dc4ed6542 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -14,7 +14,7 @@ flags = DROPDEL -/obj/item/implant/proc/trigger(emote, mob/source) +/obj/item/implant/proc/trigger(emote, mob/source, force) return /obj/item/implant/proc/activate() diff --git a/code/game/objects/items/weapons/implants/implant_abductor.dm b/code/game/objects/items/weapons/implants/implant_abductor.dm index a86545f8722..64bb7345f7a 100644 --- a/code/game/objects/items/weapons/implants/implant_abductor.dm +++ b/code/game/objects/items/weapons/implants/implant_abductor.dm @@ -13,7 +13,7 @@ if(cooldown == total_cooldown) home.Retrieve(imp_in,1) cooldown = 0 - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else to_chat(imp_in, "You must wait [(total_cooldown - cooldown)*2] seconds to use [src] again!") @@ -21,7 +21,7 @@ if(cooldown < total_cooldown) cooldown++ if(cooldown == total_cooldown) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/item/implant/abductor/implant(mob/source, mob/user) if(..()) diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm index 5f0fea79da9..f1c4dd4126b 100644 --- a/code/game/objects/items/weapons/implants/implant_chem.dm +++ b/code/game/objects/items/weapons/implants/implant_chem.dm @@ -33,8 +33,8 @@ -/obj/item/implant/chem/trigger(emote, mob/source) - if(emote == "deathgasp") +/obj/item/implant/chem/trigger(emote, mob/source, force) + if(force && emote == "deathgasp") activate(reagents.total_volume) /obj/item/implant/chem/activate(cause) diff --git a/code/game/objects/items/weapons/implants/implant_death_alarm.dm b/code/game/objects/items/weapons/implants/implant_death_alarm.dm index dea34b2ba91..d27d6dd5f7e 100644 --- a/code/game/objects/items/weapons/implants/implant_death_alarm.dm +++ b/code/game/objects/items/weapons/implants/implant_death_alarm.dm @@ -3,7 +3,7 @@ desc = "An alarm which monitors host vital signs and transmits a radio message upon death." var/mobname = "Will Robinson" activated = 0 - var/static/list/stealth_areas = typecacheof(list(/area/syndicate_station, /area/syndicate_mothership, /area/shuttle/syndicate_elite)) + var/static/list/stealth_areas = typecacheof(list(/area/syndicate_mothership, /area/shuttle/syndicate_elite)) /obj/item/implant/death_alarm/get_data() var/dat = {"Implant Specifications:
@@ -18,7 +18,7 @@ return dat /obj/item/implant/death_alarm/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/implant/death_alarm/process() @@ -61,12 +61,12 @@ /obj/item/implant/death_alarm/implant(mob/target) if(..()) mobname = target.real_name - processing_objects.Add(src) + START_PROCESSING(SSobj, src) return 1 return 0 /obj/item/implant/death_alarm/removed(mob/target) if(..()) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return 1 return 0 diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm index 30113ea4e96..f37e148bee6 100644 --- a/code/game/objects/items/weapons/implants/implant_explosive.dm +++ b/code/game/objects/items/weapons/implants/implant_explosive.dm @@ -20,8 +20,8 @@ "} return dat -/obj/item/implant/explosive/trigger(emote, mob/source) - if(emote == "deathgasp") +/obj/item/implant/explosive/trigger(emote, mob/source, force) + if(force && emote == "deathgasp") activate("death") /obj/item/implant/explosive/activate(cause) @@ -148,8 +148,8 @@ "} return dat -/obj/item/implant/dust/trigger(emote, mob/source) - if(emote == "deathgasp") +/obj/item/implant/dust/trigger(emote, mob/source, force) + if(force && emote == "deathgasp") activate("death") /obj/item/implant/dust/activate(cause) diff --git a/code/game/objects/items/weapons/implants/implant_mindshield.dm b/code/game/objects/items/weapons/implants/implant_mindshield.dm index 739fe2827e4..bc942b73d81 100644 --- a/code/game/objects/items/weapons/implants/implant_mindshield.dm +++ b/code/game/objects/items/weapons/implants/implant_mindshield.dm @@ -19,14 +19,14 @@ /obj/item/implant/mindshield/implant(mob/target) if(..()) - if(target.mind in ticker.mode.head_revolutionaries || is_shadow_or_thrall(target)) + if(target.mind in SSticker.mode.head_revolutionaries || is_shadow_or_thrall(target)) target.visible_message("[target] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!") removed(target, 1) qdel(src) return -1 - if(target.mind in ticker.mode.revolutionaries) - ticker.mode.remove_revolutionary(target.mind) - if(target.mind in ticker.mode.cult) + if(target.mind in SSticker.mode.revolutionaries) + SSticker.mode.remove_revolutionary(target.mind) + if(target.mind in SSticker.mode.cult) to_chat(target, "You feel the corporate tendrils of Nanotrasen try to invade your mind!") else to_chat(target, "Your mind feels hardened - more resistant to brainwashing.") diff --git a/code/game/objects/items/weapons/implants/implant_traitor.dm b/code/game/objects/items/weapons/implants/implant_traitor.dm index 58f78a7be4e..16d8943567d 100644 --- a/code/game/objects/items/weapons/implants/implant_traitor.dm +++ b/code/game/objects/items/weapons/implants/implant_traitor.dm @@ -45,15 +45,15 @@ return -1 H.implanting = 1 to_chat(H, "You feel completely loyal to [user.name].") - if(!(user.mind in ticker.mode.implanter)) - ticker.mode.implanter[ref] = list() - implanters = ticker.mode.implanter[ref] + if(!(user.mind in SSticker.mode.implanter)) + SSticker.mode.implanter[ref] = list() + implanters = SSticker.mode.implanter[ref] implanters.Add(H.mind) - ticker.mode.implanted.Add(H.mind) - ticker.mode.implanted[H.mind] = user.mind - //ticker.mode.implanter[user.mind] += H.mind - ticker.mode.implanter[ref] = implanters - ticker.mode.traitors += H.mind + SSticker.mode.implanted.Add(H.mind) + SSticker.mode.implanted[H.mind] = user.mind + //SSticker.mode.implanter[user.mind] += H.mind + SSticker.mode.implanter[ref] = implanters + SSticker.mode.traitors += H.mind H.mind.special_role = SPECIAL_ROLE_TRAITOR to_chat(H, "You're now completely loyal to [user.name]! You now must lay down your life to protect [user.p_them()] and assist in [user.p_their()] goals at any cost.") var/datum/objective/protect/mindslave/MS = new @@ -64,8 +64,8 @@ for(var/datum/objective/objective in H.mind.objectives) to_chat(H, "Objective #1: [objective.explanation_text]") - ticker.mode.update_traitor_icons_added(user.mind) - ticker.mode.update_traitor_icons_added(H.mind)//handles datahuds/observerhuds + SSticker.mode.update_traitor_icons_added(user.mind) + SSticker.mode.update_traitor_icons_added(H.mind)//handles datahuds/observerhuds if(user.mind.som)//do not add if not a traitor..and you just picked up an implanter in the hall... var/datum/mindslaves/slaved = user.mind.som @@ -77,12 +77,12 @@ log_admin("[key_name(user)] has mind-slaved [key_name(H)].") activated = 1 if(jobban_isbanned(M, ROLE_SYNDICATE)) - ticker.mode.replace_jobbanned_player(M, ROLE_SYNDICATE) + SSticker.mode.replace_jobbanned_player(M, ROLE_SYNDICATE) return 1 return 0 /obj/item/implant/traitor/removed(mob/target) if(..()) - ticker.mode.remove_traitor_mind(target.mind) + SSticker.mode.remove_traitor_mind(target.mind) return 1 return 0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index a0810a0b96c..4f94a6b8a1b 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -121,7 +121,7 @@ user.visible_message(pick("[user] is slitting [user.p_their()] wrists with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.", \ "[user] is slitting [user.p_their()] throat with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.", \ "[user] is slitting [user.p_their()] stomach open with the [name]! It looks like [user.p_theyre()] trying to commit seppuku.")) - return (BRUTELOSS) + return BRUTELOSS /obj/item/kitchen/knife/plastic name = "plastic knife" @@ -165,6 +165,22 @@ origin_tech = "materials=3;combat=4" attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut") +/obj/item/kitchen/knife/combat/survival + name = "survival knife" + icon_state = "survivalknife" + desc = "A hunting grade survival knife." + force = 15 + throwforce = 15 + +/obj/item/kitchen/knife/combat/survival/bone + name = "bone dagger" + item_state = "bone_dagger" + icon_state = "bone_dagger" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + desc = "A sharpened bone. The bare minimum in survival." + materials = list() + /obj/item/kitchen/knife/combat/cyborg name = "cyborg knife" icon = 'icons/obj/items_cyborg.dmi' diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 3391687f20a..77ae8fc73bb 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -35,7 +35,7 @@ /obj/item/restraints/legcuffs/beartrap/suicide_act(mob/user) user.visible_message("[user] is sticking [user.p_their()] head in the [name]! It looks like [user.p_theyre()] trying to commit suicide.") playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/restraints/legcuffs/beartrap/attack_self(mob/user) ..() @@ -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 @@ -152,8 +152,14 @@ breakouttime = 35//easy to apply, easy to break out of gender = NEUTER origin_tech = "engineering=3;combat=1" + hitsound = 'sound/effects/snap.ogg' var/weaken = 0 +/obj/item/restraints/legcuffs/bola/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) + playsound(loc,'sound/weapons/bolathrow.ogg', 50, TRUE) + if(!..()) + return + /obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom) if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed, return//abort @@ -166,6 +172,7 @@ feedback_add_details("handcuffs","B") to_chat(C, "[src] ensnares you!") C.Weaken(weaken) + playsound(loc, hitsound, 50, TRUE) /obj/item/restraints/legcuffs/bola/tactical //traitor variant name = "reinforced bola" @@ -186,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/lighters.dm b/code/game/objects/items/weapons/lighters.dm index a2d8b03da84..ab946de5f0f 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -58,7 +58,7 @@ user.visible_message("After a few attempts, [user] manages to light the [src], [user.p_they()] however burn[user.p_s()] [user.p_their()] finger in the process.") set_light(2) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else lit = 0 w_class = WEIGHT_CLASS_TINY @@ -74,7 +74,7 @@ user.visible_message("[user] quietly shuts off the [src].") set_light(0) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) else return ..() return @@ -181,7 +181,7 @@ name = "lit match" desc = "A match. This one is lit." attack_verb = list("burnt","singed") - processing_objects.Add(src) + START_PROCESSING(SSobj, src) update_icon() return TRUE @@ -196,7 +196,7 @@ name = "burnt match" desc = "A match. This one has seen better days." attack_verb = list("flicked") - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return TRUE /obj/item/match/dropped(mob/user) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 8ad283a77da..5e8d170f50b 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -2,6 +2,8 @@ var/active = 0 var/force_on = 30 //force when active var/throwforce_on = 20 + var/faction_bonus_force = 0 //Bonus force dealt against certain factions + var/list/nemesis_factions //Any mob with a faction that exists in this list will take bonus damage/effects w_class = WEIGHT_CLASS_SMALL var/w_class_on = WEIGHT_CLASS_BULKY var/icon_state_on = "axe1" @@ -13,10 +15,23 @@ 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) +/obj/item/melee/energy/attack(mob/living/target, mob/living/carbon/human/user) + var/nemesis_faction = FALSE + if(LAZYLEN(nemesis_factions)) + for(var/F in target.faction) + if(F in nemesis_factions) + nemesis_faction = TRUE + force += faction_bonus_force + nemesis_effects(user, target) + break + . = ..() + if(nemesis_faction) + force -= faction_bonus_force + /obj/item/melee/energy/suicide_act(mob/user) user.visible_message(pick("[user] is slitting [user.p_their()] stomach open with the [name]! It looks like [user.p_theyre()] trying to commit seppuku.", \ "[user] is falling on the [name]! It looks like [user.p_theyre()] trying to commit suicide.")) - return (BRUTELOSS|FIRELOSS) + return BRUTELOSS|FIRELOSS /obj/item/melee/energy/attack_self(mob/living/carbon/user) if(user.disabilities & CLUMSY && prob(50)) @@ -81,7 +96,7 @@ /obj/item/melee/energy/axe/suicide_act(mob/user) user.visible_message("[user] swings the [name] towards [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide.") - return (BRUTELOSS|FIRELOSS) + return BRUTELOSS|FIRELOSS /obj/item/melee/energy/sword name = "energy sword" @@ -225,3 +240,127 @@ desc = "An extremely sharp blade made out of hard light. Packs quite a punch." icon_state = "lightblade" item_state = "lightblade" + +/obj/item/melee/energy/proc/nemesis_effects(mob/living/user, mob/living/target) + return + +/obj/item/melee/energy/cleaving_saw + name = "cleaving saw" + desc = "This saw, effective at drawing the blood of beasts, transforms into a long cleaver that makes use of centrifugal force." + force = 12 + force_on = 20 //force when active + throwforce = 20 + throwforce_on = 20 + icon = 'icons/obj/lavaland/artefacts.dmi' + lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' + righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' + inhand_x_dimension = 64 + inhand_y_dimension = 64 + icon_state = "cleaving_saw" + icon_state_on = "cleaving_saw_open" + slot_flags = SLOT_BELT + var/attack_verb_off = list("attacked", "sawed", "sliced", "torn", "ripped", "diced", "cut") + attack_verb_on = list("cleaved", "swiped", "slashed", "chopped") + hitsound = 'sound/weapons/bladeslice.ogg' + w_class = WEIGHT_CLASS_BULKY + sharp = TRUE + faction_bonus_force = 30 + nemesis_factions = list("mining", "boss") + var/transform_cooldown + var/swiping = FALSE + +/obj/item/melee/energy/cleaving_saw/nemesis_effects(mob/living/user, mob/living/target) + var/datum/status_effect/saw_bleed/B = target.has_status_effect(STATUS_EFFECT_SAWBLEED) + if(!B) + if(!active) //This isn't in the above if-check so that the else doesn't care about active + target.apply_status_effect(STATUS_EFFECT_SAWBLEED) + else + B.add_bleed(B.bleed_buildup) + +/obj/item/melee/energy/cleaving_saw/attack_self(mob/living/carbon/user) + transform_weapon(user) + +/obj/item/melee/energy/cleaving_saw/proc/transform_weapon(mob/living/user, supress_message_text) + if(transform_cooldown > world.time) + return FALSE + + transform_cooldown = world.time + (CLICK_CD_MELEE * 0.5) + user.changeNext_move(CLICK_CD_MELEE * 0.25) + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.disabilities & CLUMSY && prob(50)) + to_chat(H, "You accidentally cut yourself with [src], like a doofus!") + H.take_organ_damage(10,10) + active = !active + if(active) + force = force_on + throwforce = throwforce_on + hitsound = 'sound/weapons/bladeslice.ogg' + throw_speed = 4 + if(attack_verb_on.len) + attack_verb = attack_verb_on + if(!item_color) + icon_state = icon_state_on + set_light(brightness_on) + else + icon_state = "sword[item_color]" + set_light(brightness_on, l_color=colormap[item_color]) + w_class = w_class_on + playsound(user, 'sound/magic/fellowship_armory.ogg', 35, TRUE, frequency = 90000 - (active * 30000)) + to_chat(user, "You open [src]. It will now cleave enemies in a wide arc and deal additional damage to fauna.") + else + force = initial(force) + throwforce = initial(throwforce) + hitsound = initial(hitsound) + throw_speed = initial(throw_speed) + if(attack_verb_on.len) + attack_verb = list() + icon_state = initial(icon_state) + w_class = initial(w_class) + playsound(user, 'sound/magic/fellowship_armory.ogg', 35, 1) //changed it from 50% volume to 35% because deafness + set_light(0) + to_chat(user, "You close [src]. It will now attack rapidly and cause fauna to bleed.") + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.update_inv_l_hand() + H.update_inv_r_hand() + + add_fingerprint(user) + +/obj/item/melee/energy/cleaving_saw/examine(mob/user) + ..() + to_chat(user, "It is [active ? "open, will cleave enemies in a wide arc and deal additional damage to fauna":"closed, and can be used for rapid consecutive attacks that cause fauna to bleed"].
\ + Both modes will build up existing bleed effects, doing a burst of high damage if the bleed is built up high enough.
\ + Transforming it immediately after an attack causes the next attack to come out faster.
") + +/obj/item/melee/energy/cleaving_saw/suicide_act(mob/user) + user.visible_message("[user] is [active ? "closing [src] on [user.p_their()] neck" : "opening [src] into [user.p_their()] chest"]! It looks like [user.p_theyre()] trying to commit suicide!") + transform_cooldown = 0 + transform_weapon(user, TRUE) + return BRUTELOSS + +/obj/item/melee/energy/cleaving_saw/melee_attack_chain(mob/user, atom/target, params) + ..() + if(!active) + user.changeNext_move(CLICK_CD_MELEE * 0.5) //when closed, it attacks very rapidly + +/obj/item/melee/energy/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user) + if(!active || swiping || !target.density || get_turf(target) == get_turf(user)) + if(!active) + faction_bonus_force = 0 + ..() + if(!active) + faction_bonus_force = initial(faction_bonus_force) + else + var/turf/user_turf = get_turf(user) + var/dir_to_target = get_dir(user_turf, get_turf(target)) + swiping = TRUE + var/static/list/cleaving_saw_cleave_angles = list(0, -45, 45) //so that the animation animates towards the target clicked and not towards a side target + for(var/i in cleaving_saw_cleave_angles) + var/turf/T = get_step(user_turf, turn(dir_to_target, i)) + for(var/mob/living/L in T) + if(user.Adjacent(L) && L.density) + melee_attack_chain(user, L) + swiping = FALSE \ No newline at end of file diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index a19df11e790..943d20e9699 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -1,6 +1,13 @@ /obj/item/melee needs_permit = 1 +/obj/item/melee/proc/check_martial_counter(mob/living/carbon/human/target, mob/living/carbon/human/user) + if(target.check_block()) + target.visible_message("[target.name] blocks [src] and twists [user]'s arm behind [user.p_their()] back!", + "You block the attack!") + user.Stun(2) + return TRUE + /obj/item/melee/chainofcommand name = "chain of command" desc = "A tool used by great men to placate the frothing masses." @@ -17,8 +24,8 @@ /obj/item/melee/chainofcommand/suicide_act(mob/user) - to_chat(viewers(user), "[user] is strangling [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") - return (OXYLOSS) + to_chat(viewers(user), "[user] is strangling [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") + return OXYLOSS /obj/item/melee/rapier name = "captain's rapier" @@ -60,4 +67,38 @@ force = 10 throwforce = 7 w_class = WEIGHT_CLASS_NORMAL - attack_verb = list("slashed", "stabbed", "sliced", "caned") \ No newline at end of file + attack_verb = list("slashed", "stabbed", "sliced", "caned") + +/obj/item/melee/flyswatter + name = "flyswatter" + desc = "Useful for killing insects of all sizes." + icon_state = "flyswatter" + item_state = "flyswatter" + force = 1 + throwforce = 1 + attack_verb = list("swatted", "smacked") + hitsound = 'sound/effects/snap.ogg' + w_class = WEIGHT_CLASS_SMALL + //Things in this list will be instantly splatted. Flyman weakness is handled in the flyman species weakness proc. + var/list/strong_against + +/obj/item/melee/flyswatter/Initialize(mapload) + . = ..() + strong_against = typecacheof(list( + /mob/living/simple_animal/hostile/poison/bees/, + /mob/living/simple_animal/butterfly, + /mob/living/simple_animal/cockroach, + /obj/item/queen_bee + )) + +/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, proximity_flag) + . = ..() + if(proximity_flag) + if(is_type_in_typecache(target, strong_against)) + new /obj/effect/decal/cleanable/insectguts(target.drop_location()) + to_chat(user, "You easily splat the [target].") + if(istype(target, /mob/living/)) + var/mob/living/bug = target + bug.death(1) + else + qdel(target) \ No newline at end of file diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index e642e3b994a..7c5c6f9421f 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -89,14 +89,14 @@ /obj/item/mop/advanced/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/mop/advanced/attack_self(mob/user) refill_enabled = !refill_enabled if(refill_enabled) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) to_chat(user, "You set the condenser switch to the '[refill_enabled ? "ON" : "OFF"]' position.") playsound(user, 'sound/machines/click.ogg', 30, 1) @@ -111,7 +111,7 @@ /obj/item/mop/advanced/Destroy() if(refill_enabled) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() 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/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 8f6ffc96e1c..ccee6c18feb 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -47,7 +47,11 @@ var/A - A = input(user, "Area to jump to", "BOOYEA", A) in teleportlocs + A = input(user, "Area to jump to", "BOOYEA", A) as null|anything in teleportlocs + + if(!A) + return + var/area/thearea = teleportlocs[A] if(user.stat || user.restrained()) diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 88de9de1b11..4c8697da247 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -18,7 +18,7 @@ /obj/item/shard/suicide_act(mob/user) to_chat(viewers(user), pick("[user] is slitting [user.p_their()] wrists with [src]! It looks like [user.p_theyre()] trying to commit suicide.", "[user] is slitting [user.p_their()] throat with [src]! It looks like [user.p_theyre()] trying to commit suicide.")) - return (BRUTELOSS) + return BRUTELOSS /obj/item/shard/New() ..() @@ -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/soap.dm b/code/game/objects/items/weapons/soap.dm index 742f5b3d0c0..912212d19c7 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -4,6 +4,8 @@ gender = PLURAL icon = 'icons/obj/items.dmi' icon_state = "soap" + lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' w_class = WEIGHT_CLASS_TINY throwforce = 0 throw_speed = 4 diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index 54ef5f06f85..15b0b914391 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -27,7 +27,7 @@ if(user) user.update_inv_l_hand() user.update_inv_r_hand() - if(user.mind in ticker.mode.wizards) + if(user.mind in SSticker.mode.wizards) user.flying = wielded ? 1 : 0 if(wielded) to_chat(user, "You hold \the [src] between your legs.") diff --git a/code/game/objects/items/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm index 4293c0a6167..0d8613cce4a 100644 --- a/code/game/objects/items/weapons/storage/artistic_toolbox.dm +++ b/code/game/objects/items/weapons/storage/artistic_toolbox.dm @@ -176,10 +176,6 @@ affected_mob.SetSleeping(0) affected_mob.SetSlowed(0) affected_mob.SetConfused(0) - if(ishuman(affected_mob)) - var/mob/living/carbon/human/H = affected_mob - if(H.traumatic_shock < 100) - H.shock_stage = 0 stage = 1 switch(progenitor.hunger) if(10 to 60) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 8df4b17251d..3f638d44918 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -17,7 +17,6 @@ storage_slots = 21 burn_state = FLAMMABLE burntime = 20 - species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/back.dmi' ) @@ -52,6 +51,7 @@ desc = "A backpack that opens into a localized pocket of Blue Space." origin_tech = "bluespace=5;materials=4;engineering=4;plasmatech=5" icon_state = "holdingpack" + item_state = "holdingpack" max_w_class = WEIGHT_CLASS_HUGE max_combined_w_class = 35 burn_state = FIRE_PROOF @@ -112,7 +112,7 @@ ..() new /obj/item/clothing/under/rank/clown(src) new /obj/item/clothing/shoes/magboots/clown(src) - new /obj/item/clothing/mask/gas/voice/clown(src) + new /obj/item/clothing/mask/chameleon(src) new /obj/item/radio/headset/headset_service(src) new /obj/item/pda/clown(src) new /obj/item/storage/box/survival(src) @@ -124,6 +124,7 @@ new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(src) new /obj/item/instrument/bikehorn(src) new /obj/item/bikehorn(src) + new /obj/item/dnainjector/comic(src) /obj/item/storage/backpack/mime name = "Parcel Parceaux" @@ -157,6 +158,12 @@ item_state = "engiepack" burn_state = FIRE_PROOF +/obj/item/storage/backpack/explorer + name = "explorer bag" + desc = "A robust backpack for stashing your loot." + icon_state = "explorerpack" + item_state = "explorerpack" + /obj/item/storage/backpack/botany name = "botany backpack" desc = "It's a backpack made of all-natural fibers." @@ -234,6 +241,12 @@ icon_state = "satchel-eng" burn_state = FIRE_PROOF +/obj/item/storage/backpack/satchel/explorer + name = "explorer satchel" + desc = "A robust satchel for stashing your loot." + icon_state = "satchel-explorer" + item_state = "securitypack" + /obj/item/storage/backpack/satchel_med name = "medical satchel" desc = "A sterile satchel used in medical departments." @@ -315,7 +328,7 @@ /obj/item/storage/backpack/duffel/syndie name = "suspicious looking duffelbag" desc = "A large duffelbag for holding extra tactical supplies." - icon_state = "duffel-syndi" + icon_state = "duffel-syndie" item_state = "duffel-syndimed" origin_tech = "syndicate=1" silent = 1 @@ -333,21 +346,79 @@ icon_state = "duffel-syndiammo" item_state = "duffel-syndiammo" -/obj/item/storage/backpack/duffel/syndie/ammo/loaded +/obj/item/storage/backpack/duffel/syndie/ammo/shotgun desc = "A large duffelbag, packed to the brim with Bulldog shotgun ammo." -/obj/item/storage/backpack/duffel/syndie/ammo/loaded/New() +/obj/item/storage/backpack/duffel/syndie/ammo/shotgun/New() ..() - new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g(src) + for(var/i in 1 to 6) + new /obj/item/ammo_box/magazine/m12g(src) + new /obj/item/ammo_box/magazine/m12g/buckshot(src) new /obj/item/ammo_box/magazine/m12g/buckshot(src) - new /obj/item/ammo_box/magazine/m12g/stun(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." + +/obj/item/storage/backpack/duffel/syndie/ammo/smg/New() + ..() + for(var/i in 1 to 10) + new /obj/item/ammo_box/magazine/smgm45(src) + +/obj/item/storage/backpack/duffel/syndie/c20rbundle + desc = "A large duffel bag containing a C-20r, some magazines, and a cheap looking suppressor." + +/obj/item/storage/backpack/duffel/syndie/c20rbundle/New() + ..() + new /obj/item/ammo_box/magazine/smgm45(src) + new /obj/item/ammo_box/magazine/smgm45(src) + new /obj/item/gun/projectile/automatic/c20r(src) + new /obj/item/suppressor/specialoffer(src) + +/obj/item/storage/backpack/duffel/syndie/bulldogbundle + desc = "A large duffel bag containing a Bulldog, some drums, and a pair of thermal imaging glasses." + +/obj/item/storage/backpack/duffel/syndie/bulldogbundle/New() + ..() + new /obj/item/gun/projectile/automatic/shotgun/bulldog(src) + new /obj/item/ammo_box/magazine/m12g(src) + new /obj/item/ammo_box/magazine/m12g(src) + new /obj/item/clothing/glasses/chameleon/thermal(src) + +/obj/item/storage/backpack/duffel/syndie/med/medicalbundle + desc = "A large duffel bag containing a tactical medkit, a Donksoft machine gun and a big jumbo box of riot darts." + +/obj/item/storage/backpack/duffel/syndie/med/medicalbundle/New() + ..() + new /obj/item/storage/firstaid/tactical(src) + new /obj/item/gun/projectile/automatic/l6_saw/toy(src) + new /obj/item/ammo_box/foambox/riot(src) + +/obj/item/storage/backpack/duffel/syndie/c4/New() + ..() + for(var/i in 1 to 10) + new /obj/item/grenade/plastic/c4(src) + +/obj/item/storage/backpack/duffel/syndie/x4/New() + ..() + for(var/i in 1 to 3) + new /obj/item/grenade/plastic/x4(src) + /obj/item/storage/backpack/duffel/syndie/surgery name = "surgery duffelbag" desc = "A suspicious looking duffelbag for holding surgery tools." diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 2fd7d774113..e8a181a197b 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -42,7 +42,7 @@ /obj/item/storage/bag/trash/suicide_act(mob/user) user.visible_message("[user] puts the [name] over [user.p_their()] head and starts chomping at the insides! Disgusting!") playsound(loc, 'sound/items/eatfood.ogg', 50, 1, -1) - return (TOXLOSS) + return TOXLOSS /obj/item/storage/bag/trash/update_icon() if(contents.len == 0) @@ -107,7 +107,7 @@ /obj/item/storage/bag/plasticbag/equipped(var/mob/user, var/slot) if(slot==slot_head) storage_slots = 0 - processing_objects.Add(src) + START_PROCESSING(SSobj, src) return /obj/item/storage/bag/plasticbag/process() @@ -120,7 +120,7 @@ H.AdjustLoseBreath(1) else storage_slots = 7 - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return // ----------------------------- diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index c52d4db7e5b..7a66c250e94 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -4,23 +4,22 @@ icon = 'icons/obj/clothing/belts.dmi' icon_state = "utilitybelt" item_state = "utility" + lefthand_file = 'icons/mob/inhands/equipment/belt_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/belt_righthand.dmi' slot_flags = SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined") var/use_item_overlays = 0 // Do we have overlays for items held inside the belt? - /obj/item/storage/belt/update_icon() if(use_item_overlays) overlays.Cut() for(var/obj/item/I in contents) overlays += "[I.name]" - ..() /obj/item/storage/belt/proc/can_use() return is_equipped() - /obj/item/storage/belt/MouseDrop(obj/over_object as obj, src_location, over_location) var/mob/M = usr if(!istype(over_object, /obj/screen)) @@ -68,7 +67,7 @@ new /obj/item/weldingtool(src) new /obj/item/crowbar(src) new /obj/item/wirecutters(src) - new /obj/item/stack/cable_coil(src, 30, pick(COLOR_RED, COLOR_YELLOW, COLOR_ORANGE)) + new /obj/item/stack/cable_coil/random(src, 30) update_icon() /obj/item/storage/belt/utility/full/multitool/New() @@ -99,7 +98,7 @@ new /obj/item/crowbar/power(src) new /obj/item/weldingtool/experimental(src)//This can be changed if this is too much new /obj/item/multitool(src) - new /obj/item/stack/cable_coil(src, 30, pick(COLOR_RED, COLOR_YELLOW, COLOR_ORANGE)) + new /obj/item/stack/cable_coil/random(src, 30) new /obj/item/extinguisher/mini(src) new /obj/item/analyzer(src) update_icon() @@ -112,6 +111,7 @@ icon_state = "medicalbelt" item_state = "medical" use_item_overlays = 1 + max_w_class = WEIGHT_CLASS_NORMAL can_hold = list( /obj/item/healthanalyzer, /obj/item/dnainjector, @@ -133,6 +133,7 @@ /obj/item/rad_laser, /obj/item/sensor_device, /obj/item/wrench/medical, + /obj/item/handheld_defibrillator ) /obj/item/storage/belt/medical/surgery @@ -182,7 +183,6 @@ new /obj/item/reagent_containers/food/pill/salicylic(src) update_icon() - /obj/item/storage/belt/botany name = "botanist belt" desc = "Can hold various botanical supplies." @@ -205,7 +205,6 @@ /obj/item/wrench, ) - /obj/item/storage/belt/security name = "security belt" desc = "Can hold security gear like handcuffs and flashes." @@ -386,7 +385,8 @@ /obj/item/flashlight, /obj/item/reagent_containers/spray, /obj/item/soap, - /obj/item/holosign_creator + /obj/item/holosign_creator, + /obj/item/melee/flyswatter, ) /obj/item/storage/belt/janitor/full/New() @@ -397,6 +397,7 @@ new /obj/item/soap(src) new /obj/item/grenade/chem_grenade/cleaner(src) new /obj/item/grenade/chem_grenade/cleaner(src) + new /obj/item/melee/flyswatter(src) update_icon() /obj/item/storage/belt/lazarus @@ -470,7 +471,6 @@ ..() update_icon() - /obj/item/storage/belt/holster name = "shoulder holster" desc = "A holster to conceal a carried handgun. WARNING: Badasses only." @@ -508,7 +508,6 @@ W.charges = W.max_charges update_icon() - /obj/item/storage/belt/fannypack name = "fannypack" desc = "A dorky fannypack for keeping small items in." @@ -597,7 +596,6 @@ // Bluespace Belt // ------------------------------------- - /obj/item/storage/belt/bluespace name = "Belt of Holding" desc = "The greatest in pants-supporting technology." @@ -630,8 +628,6 @@ var/bolacount = 0 var/cooldown = 0 - - /obj/item/storage/belt/bluespace/owlman/New() ..() new /obj/item/grenade/smokebomb(src) @@ -640,9 +636,13 @@ new /obj/item/grenade/smokebomb(src) new /obj/item/restraints/legcuffs/bola(src) new /obj/item/restraints/legcuffs/bola(src) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) cooldown = world.time +/obj/item/storage/belt/bluespace/owlman/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + /obj/item/storage/belt/bluespace/owlman/process() if(cooldown < world.time - 600) smokecount = 0 @@ -725,3 +725,52 @@ new /obj/item/analyzer(src) new /obj/item/healthanalyzer(src) + +/obj/item/storage/belt/mining + name = "explorer's webbing" + desc = "A versatile chest rig, cherished by miners and hunters alike." + icon_state = "explorer1" + item_state = "explorer1" + storage_slots = 6 + max_w_class = WEIGHT_CLASS_BULKY + use_item_overlays = 0 + can_hold = list( + /obj/item/crowbar, + /obj/item/screwdriver, + /obj/item/weldingtool, + /obj/item/wirecutters, + /obj/item/wrench, + /obj/item/multitool, + /obj/item/flashlight, + /obj/item/stack/cable_coil, + /obj/item/analyzer, + /obj/item/extinguisher/mini, + /obj/item/radio, + /obj/item/clothing/gloves, + /obj/item/resonator, + /obj/item/mining_scanner, + /obj/item/pickaxe, + /obj/item/stack/sheet/animalhide, + /obj/item/stack/sheet/sinew, + /obj/item/stack/sheet/bone, + /obj/item/lighter, + /obj/item/storage/fancy/cigarettes, + /obj/item/reagent_containers/food/drinks/bottle, + /obj/item/stack/medical, + /obj/item/kitchen/knife, + /obj/item/reagent_containers/hypospray, + /obj/item/gps, + /obj/item/storage/bag/ore, + /obj/item/survivalcapsule, + /obj/item/t_scanner/adv_mining_scanner, + /obj/item/reagent_containers/food/pill, + /obj/item/stack/ore, + /obj/item/reagent_containers/food/drinks, + /obj/item/organ/internal/hivelord_core, + /obj/item/wormhole_jaunter, + /obj/item/storage/bag/plants, + /obj/item/stack/marker_beacon) + +/obj/item/storage/belt/mining/New() + ..() + new /obj/item/survivalcapsule(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 16ecd7cc72c..eb778b6a280 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -9,9 +9,10 @@ var/mob/affecting = null var/deity_name = "Christ" - suicide_act(mob/user) - to_chat(viewers(user), "[user] stares into [src.name] and attempts to trascend understanding of the universe!") - return (user.dust()) +/obj/item/storage/bible/suicide_act(mob/user) + to_chat(viewers(user), "[user] stares into [src.name] and attempts to transcend understanding of the universe!") + user.dust() + return OBLITERATION /obj/item/storage/bible/booze @@ -44,7 +45,7 @@ else M.LAssailant = user - if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") + if(!(istype(user, /mob/living/carbon/human) || SSticker) && SSticker.mode.name != "monkey") to_chat(user, "You don't have the dexterity to do this!") return if(!user.mind || !user.mind.isholy) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index afe4bc1ce13..e7342774619 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -191,6 +191,15 @@ new /obj/item/reagent_containers/glass/beaker( src ) new /obj/item/reagent_containers/glass/beaker( src ) +/obj/item/storage/box/beakers/bluespace + name = "box of bluespace beakers" + icon_state = "beaker" + +/obj/item/storage/box/beakers/bluespace/New() + ..() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/glass/beaker/bluespace(src) + /obj/item/storage/box/iv_bags name = "IV Bags" desc = "A box full of empty IV bags." @@ -536,6 +545,10 @@ for(var/i in 1 to 5) new monkey_cube_type(src) +/obj/item/storage/box/monkeycubes/syndicate + desc = "Waffle Co. brand monkey cubes. Just add water and a dash of subterfuge!" + monkey_cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/syndicate + /obj/item/storage/box/monkeycubes/farwacubes name = "farwa cube box" desc = "Drymate brand farwa cubes. Just add water!" @@ -1044,6 +1057,56 @@ new /obj/item/circuitboard/circuit_imprinter(src) new /obj/item/circuitboard/rdconsole/public(src) +/obj/item/storage/box/stockparts/basic //for ruins where it's a bad idea to give access to an autolathe/protolathe, but still want to make stock parts accessible + name = "box of stock parts" + desc = "Contains a variety of basic stock parts." + +/obj/item/storage/box/stockparts/basic/New() + ..() + for(var/i in 1 to 3) + new /obj/item/stock_parts/capacitor(src) + new /obj/item/stock_parts/scanning_module(src) + new /obj/item/stock_parts/manipulator(src) + new /obj/item/stock_parts/micro_laser(src) + new /obj/item/stock_parts/matter_bin(src) + +/obj/item/storage/box/stockparts/deluxe + name = "box of deluxe stock parts" + desc = "Contains a variety of deluxe stock parts." + +/obj/item/storage/box/stockparts/deluxe/New() + for(var/i in 1 to 3) + new /obj/item/stock_parts/capacitor/quadratic(src) + new /obj/item/stock_parts/scanning_module/triphasic(src) + new /obj/item/stock_parts/manipulator/femto(src) + new /obj/item/stock_parts/micro_laser/quadultra(src) + new /obj/item/stock_parts/matter_bin/bluespace(src) + +/obj/item/storage/box/mininghardsuit + name = "Boxed Mining Hardsuit" + desc = "Contains a mining hardsuit and helmet. For mining." + +/obj/item/storage/box/mininghardsuit/New() + ..() + new /obj/item/clothing/suit/space/hardsuit/mining(src) + new /obj/item/clothing/head/helmet/space/hardsuit/mining(src) + +/obj/item/storage/box/hug + name = "box of hugs" + desc = "A special box for sensitive people." + icon_state = "hugbox" + foldable = null + +/obj/item/storage/box/hug/suicide_act(mob/user) + user.visible_message("[user] clamps the box of hugs on [user.p_their()] jugular! Guess it wasn't such a hugbox after all..") + return (BRUTELOSS) + +/obj/item/storage/box/hug/attack_self(mob/user) + ..() + user.changeNext_move(CLICK_CD_MELEE) + playsound(loc, "rustle", 50, 1, -5) + user.visible_message("[user] hugs \the [src].","You hug \the [src].") + #undef NODESIGN #undef NANOTRASEN #undef SYNDI diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm index b2637a9688e..2450648cded 100644 --- a/code/game/objects/items/weapons/storage/briefcase.dm +++ b/code/game/objects/items/weapons/storage/briefcase.dm @@ -15,5 +15,15 @@ burn_state = FLAMMABLE burntime = 20 -/obj/item/storage/briefcase/New() - ..() +/obj/item/storage/briefcase/sniperbundle + desc = "Its label reads \"genuine hardened Captain leather\", but suspiciously has no other tags or branding. Smells like L'Air du Temps." + force = 10 + +/obj/item/storage/briefcase/sniperbundle/New() + ..() + new /obj/item/gun/projectile/automatic/sniper_rifle/syndicate(src) + new /obj/item/clothing/accessory/red(src) + new /obj/item/clothing/under/syndicate/sniper(src) + new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) + new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) + new /obj/item/suppressor/specialoffer(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 03b5ac86870..603a86b072b 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -62,6 +62,7 @@ /obj/item/storage/fancy/egg_box icon_state = "eggbox" icon_type = "egg" + item_state = "eggbox" name = "egg box" storage_slots = 12 can_hold = list(/obj/item/reagent_containers/food/snacks/egg) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 5e81c320041..8d8cb77e597 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -254,10 +254,21 @@ var/applying_meds = FALSE //To Prevent spam clicking and generating runtimes from apply a deleting pill multiple times. var/rapid_intake_message = "unscrews the cap on the pill bottle and begins dumping the entire contents down their throat!" var/rapid_post_instake_message = "downs the entire bottle of pills in one go!" + var/allow_wrap = TRUE + var/wrapper_color = null /obj/item/storage/pill_bottle/New() ..() base_name = name + if(allow_wrap) + apply_wrap() + +/obj/item/storage/pill_bottle/proc/apply_wrap() + if(wrapper_color) + overlays.Cut() + var/image/I = image(icon, "pillbottle_wrap") + I.color = wrapper_color + overlays += I /obj/item/storage/pill_bottle/attack(mob/M, mob/user) if(iscarbon(M) && contents.len) @@ -274,6 +285,9 @@ else return ..() +/obj/item/storage/pill_bottle/ert + wrapper_color = COLOR_MAROON + /obj/item/storage/pill_bottle/ert/New() ..() new /obj/item/reagent_containers/food/pill/salicylic(src) @@ -295,11 +309,11 @@ for(var/obj/item/reagent_containers/food/pill/P in contents) P.attack(C, C) C.visible_message("[C] [rapid_post_instake_message]") - return + return return ..() -/obj/item/storage/pill_bottle/attackby(var/obj/item/I, mob/user as mob, params) +/obj/item/storage/pill_bottle/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/pen) || istype(I, /obj/item/flashlight/pen)) var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text)) if(length(tmp_label) > MAX_NAME_LEN) @@ -319,15 +333,18 @@ /obj/item/storage/pill_bottle/patch_pack name = "Patch Pack" + desc = "It's a container for storing medical patches." icon_state = "patch_pack" can_hold = list(/obj/item/reagent_containers/food/pill/patch) cant_hold = list() rapid_intake_message = "flips the lid of the Patch Pack open and begins rapidly stamping patches on themselves!" rapid_post_instake_message = "stamps the entire contents of the Patch Pack all over their entire body!" + allow_wrap = FALSE /obj/item/storage/pill_bottle/charcoal name = "Pill bottle (Charcoal)" desc = "Contains pills used to counter toxins." + wrapper_color = COLOR_GREEN New() ..() @@ -342,6 +359,7 @@ /obj/item/storage/pill_bottle/painkillers name = "Pill Bottle (Salicylic Acid)" desc = "Contains various pills for minor pain relief." + wrapper_color = COLOR_RED /obj/item/storage/pill_bottle/painkillers/New() ..() @@ -354,8 +372,11 @@ new /obj/item/reagent_containers/food/pill/salicylic(src) new /obj/item/reagent_containers/food/pill/salicylic(src) +/obj/item/storage/pill_bottle/fakedeath + allow_wrap = FALSE + /obj/item/storage/pill_bottle/fakedeath/New() ..() new /obj/item/reagent_containers/food/pill/fakedeath(src) new /obj/item/reagent_containers/food/pill/fakedeath(src) - new /obj/item/reagent_containers/food/pill/fakedeath(src) \ No newline at end of file + new /obj/item/reagent_containers/food/pill/fakedeath(src) diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 9cd4178aaf2..edccca3ff4a 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -116,15 +116,10 @@ /obj/item/storage/lockbox/medal/New() ..() - new /obj/item/clothing/accessory/medal/gold/heroism(src) - new /obj/item/clothing/accessory/medal/silver/security(src) - new /obj/item/clothing/accessory/medal/silver/valor(src) - new /obj/item/clothing/accessory/medal/nobel_science(src) - new /obj/item/clothing/accessory/medal/bronze_heart(src) - new /obj/item/clothing/accessory/medal/conduct(src) - new /obj/item/clothing/accessory/medal/conduct(src) - new /obj/item/clothing/accessory/medal/conduct(src) new /obj/item/clothing/accessory/medal/gold/captain(src) + new /obj/item/clothing/accessory/medal/silver/leadership(src) + new /obj/item/clothing/accessory/medal/silver/valor(src) + new /obj/item/clothing/accessory/medal/heart(src) /obj/item/storage/lockbox/t4 name = "lockbox (T4)" diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 507d6fdb9f3..53f93775cad 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -151,8 +151,8 @@ src.boxes.screen_loc = "[tx]:,[ty] to [mx],[my]" for(var/obj/O in src.contents) O.screen_loc = "[cx],[cy]" - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE cx++ if(cx > mx) cx = tx @@ -171,8 +171,8 @@ ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE ND.sample_object.screen_loc = "[cx]:16,[cy]:16" ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" - ND.sample_object.layer = 20 - ND.sample_object.plane = HUD_PLANE + ND.sample_object.layer = ABOVE_HUD_LAYER + ND.sample_object.plane = ABOVE_HUD_PLANE cx++ if(cx > (4+cols)) cx = 4 @@ -182,8 +182,8 @@ O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" O.screen_loc = "[cx]:16,[cy]:16" O.maptext = "" - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE cx++ if(cx > (4+cols)) cx = 4 @@ -312,6 +312,7 @@ if(usr.s_active) usr.s_active.show_to(usr) W.mouse_opacity = MOUSE_OPACITY_OPAQUE //So you can click on the area around the item to equip it, instead of having to pixel hunt + W.in_inventory = TRUE update_icon() return 1 @@ -332,8 +333,8 @@ if(ismob(loc)) W.dropped(usr) if(ismob(new_location)) - W.layer = 20 - W.plane = HUD_PLANE + W.layer = ABOVE_HUD_LAYER + W.plane = ABOVE_HUD_PLANE else W.layer = initial(W.layer) W.plane = initial(W.plane) @@ -447,17 +448,18 @@ else verbs -= /obj/item/storage/verb/toggle_gathering_mode - src.boxes = new /obj/screen/storage( ) - src.boxes.name = "storage" - src.boxes.master = src - src.boxes.icon_state = "block" - src.boxes.screen_loc = "7,7 to 10,8" - src.boxes.layer = 19 - src.closer = new /obj/screen/close( ) - src.closer.master = src - src.closer.icon_state = "x" - src.closer.layer = 20 - src.closer.plane = HUD_PLANE + boxes = new /obj/screen/storage( ) + boxes.name = "storage" + boxes.master = src + boxes.icon_state = "block" + boxes.screen_loc = "7,7 to 10,8" + boxes.layer = HUD_LAYER + boxes.plane = HUD_PLANE + closer = new /obj/screen/close( ) + closer.master = src + closer.icon_state = "x" + closer.layer = ABOVE_HUD_LAYER + closer.plane = ABOVE_HUD_PLANE orient2hud() /obj/item/storage/Destroy() @@ -469,7 +471,7 @@ return ..() /obj/item/storage/emp_act(severity) - if(!istype(src.loc, /mob/living)) + if(!istype(loc, /mob/living)) for(var/obj/O in contents) O.emp_act(severity) ..() diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index cac42bfced7..3736d93f3f6 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -1,112 +1,120 @@ -/obj/item/storage/box/syndicate/ - New() - ..() - switch(pickweight(list("bloodyspai" = 1, "thief" = 1, "bond" = 1, "sabotage" = 1, "payday" = 1, "implant" = 1, "hacker" = 1, "darklord" = 1, "gadgets" = 1, "professional" = 1))) - if("bloodyspai") // 28TC - new /obj/item/twohanded/garrote(src) - new /obj/item/pinpointer/advpinpointer(src) - new /obj/item/clothing/mask/gas/voice(src) - new /obj/item/clothing/under/chameleon(src) - new /obj/item/card/id/syndicate(src) - new /obj/item/flashlight/emp(src) - new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) - new /obj/item/clothing/glasses/hud/security/chameleon(src) - new /obj/item/camera_bug(src) - return +/obj/item/storage/box/syndicate/New() + ..() + switch(pickweight(list("bloodyspai" = 1, "thief" = 1, "bond" = 1, "sabotage" = 1, "payday" = 1, "implant" = 1, "hacker" = 1, "darklord" = 1, "professional" = 1))) + if("bloodyspai") // 35TC + one 0TC + new /obj/item/clothing/under/chameleon(src) // 2TC + new /obj/item/clothing/mask/chameleon(src) // 0TC + new /obj/item/card/id/syndicate(src) // 2TC + new /obj/item/clothing/shoes/chameleon/noslip(src) // 2TC + new /obj/item/camera_bug(src) // 1TC + new /obj/item/multitool/ai_detect(src) // 1TC + new /obj/item/encryptionkey/syndicate(src) // 2TC + new /obj/item/twohanded/garrote(src) // 10TC + new /obj/item/pinpointer/advpinpointer(src) // 4TC + new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) // 2TC + new /obj/item/flashlight/emp(src) // 2TC + new /obj/item/clothing/glasses/hud/security/chameleon(src) // 2TC + new /obj/item/chameleon(src) // 8TC + return - if("thief") // 30TC - new /obj/item/gun/energy/kinetic_accelerator/crossbow(src) - new /obj/item/chameleon(src) - new /obj/item/clothing/gloves/color/black/thief(src) - new /obj/item/card/id/syndicate(src) - new /obj/item/clothing/shoes/syndigaloshes(src) - new /obj/item/storage/box/syndie_kit/safecracking(src) - return + if("thief") // 40TC + new /obj/item/gun/energy/kinetic_accelerator/crossbow(src) // 12TC + new /obj/item/chameleon(src) // 8TC + new /obj/item/clothing/glasses/chameleon/thermal(src) // 6TC + new /obj/item/clothing/gloves/color/black/thief(src) // 6TC + new /obj/item/card/id/syndicate(src) // 2TC + new /obj/item/clothing/shoes/chameleon/noslip(src) // 2TC + new /obj/item/storage/backpack/satchel_flat(src) // 2TC + new /obj/item/encryptionkey/syndicate(src) // 2TC + return - if("bond") // 29TC + Healing Cocktail + armored suit jacket - new /obj/item/gun/projectile/automatic/pistol(src) - new /obj/item/suppressor(src) - new /obj/item/ammo_box/magazine/m10mm/hp(src) - new /obj/item/ammo_box/magazine/m10mm/ap(src) - new /obj/item/encryptionkey/syndicate(src) - new /obj/item/reagent_containers/food/drinks/drinkingglass/alliescocktail(src) // This drink heals now - new /obj/item/card/id/syndicate(src) - new /obj/item/dnascrambler(src) - new /obj/item/storage/box/syndie_kit/emp(src) - new /obj/item/CQC_manual(src) - new /obj/item/clothing/under/suit_jacket/really_black(src) - new /obj/item/clothing/suit/storage/lawyer/blackjacket/armored(src) - return + if("bond") // 33TC + three 0TC + new /obj/item/gun/projectile/automatic/pistol(src) // 4TC + new /obj/item/suppressor(src) // 1TC + new /obj/item/ammo_box/magazine/m10mm/hp(src) // 3TC + new /obj/item/ammo_box/magazine/m10mm/ap(src) // 2TC + new /obj/item/clothing/under/suit_jacket/really_black(src) // 0TC + new /obj/item/card/id/syndicate(src) // 2TC + new /obj/item/clothing/suit/storage/lawyer/blackjacket/armored(src) // 0TC + new /obj/item/encryptionkey/syndicate(src) // 2TC + new /obj/item/reagent_containers/food/drinks/drinkingglass/alliescocktail(src) // 0TC + new /obj/item/dnascrambler(src) // 4TC + new /obj/item/storage/box/syndie_kit/emp(src) // 2TC + new /obj/item/CQC_manual(src) // 13TC + return - if("sabotage") // 31TC + RCD + Insuls - new /obj/item/powersink(src) - new /obj/item/grenade/syndieminibomb(src) - new /obj/item/card/emag(src) - new /obj/item/grenade/clusterbuster/n2o(src) - new /obj/item/clothing/gloves/color/yellow(src) - new /obj/item/rcd/preloaded(src) - new /obj/item/storage/box/syndie_kit/space(src) - return + if("sabotage") // 47TC + three 0TC + new /obj/item/grenade/plastic/c4(src) // 1TC + new /obj/item/grenade/plastic/c4(src) // 1TC + new /obj/item/camera_bug(src) // 1TC + new /obj/item/powersink(src) // 10TC + new /obj/item/cartridge/syndicate(src) // 6TC + new /obj/item/rcd/preloaded(src) // 0TC + new /obj/item/card/emag(src) // 6TC + new /obj/item/clothing/gloves/color/yellow(src) // 0TC + new /obj/item/grenade/syndieminibomb(src) // 6TC + new /obj/item/grenade/clusterbuster/n2o(src) // 0TC + new /obj/item/storage/box/syndie_kit/space(src) // 4TC + new /obj/item/encryptionkey/syndicate(src) // 2TC + return - if("payday") // 31TC + armored suit jacket - new /obj/item/gun/projectile/revolver(src) - new /obj/item/ammo_box/a357(src) - new /obj/item/ammo_box/a357(src) - new /obj/item/card/emag(src) - new /obj/item/grenade/plastic/c4(src) - new /obj/item/card/id/syndicate(src) - new /obj/item/clothing/under/suit_jacket/really_black(src) - new /obj/item/clothing/suit/storage/lawyer/blackjacket/armored(src) - new /obj/item/clothing/gloves/color/latex/nitrile(src) - new /obj/item/clothing/mask/gas/clown_hat(src) - new /obj/item/thermal_drill(src) - return + if("payday") // 33TC + four 0TC + new /obj/item/gun/projectile/revolver(src) // 13TC + new /obj/item/ammo_box/a357(src) // 3TC + new /obj/item/ammo_box/a357(src) // 3TC + new /obj/item/card/emag(src) // 6TC + new /obj/item/grenade/plastic/c4(src) // 1TC + new /obj/item/card/id/syndicate(src) // 2TC + new /obj/item/clothing/under/suit_jacket/really_black(src) //0TC + new /obj/item/clothing/suit/storage/lawyer/blackjacket/armored(src) //0TC + new /obj/item/clothing/gloves/color/latex/nitrile(src) //0 TC + new /obj/item/clothing/mask/gas/clown_hat(src) // 0TC + new /obj/item/thermal_drill(src) // 3TC + new /obj/item/encryptionkey/syndicate(src) // 2TC + return - if("implant") // 35TC - new /obj/item/implanter/uplink(src) - new /obj/item/implanter/adrenalin(src) - new /obj/item/implanter/storage(src) - new /obj/item/implanter/freedom(src) - return + if("implant") // 39TC + ten free TC + new /obj/item/implanter/freedom(src) // 5TC + new /obj/item/implanter/uplink(src) // 14TC (ten free TC) + new /obj/item/implanter/emp(src) // 0TC + new /obj/item/implanter/adrenalin(src) // 8TC + new /obj/item/implanter/explosive(src) // 2TC + new /obj/item/implanter/storage(src) // 8TC + new /obj/item/encryptionkey/syndicate(src) // 2TC + return - if("hacker") // 22TC + Ion law uploader - new /obj/item/aiModule/syndicate(src) - new /obj/item/encryptionkey/binary(src) - new /obj/item/encryptionkey/syndicate(src) - new /obj/item/aiModule/toyAI(src) - new /obj/item/card/emag(src) - return + if("hacker") // 30TC + one 0TC + new /obj/item/aiModule/syndicate(src) // 12TC + new /obj/item/card/emag(src) // 6TC + new /obj/item/encryptionkey/syndicate(src) // 2TC + new /obj/item/encryptionkey/binary(src) // 5TC + new /obj/item/aiModule/toyAI(src) // 0TC + new /obj/item/multitool/ai_detect(src) // 1TC + new /obj/item/storage/box/syndie_kit/c4 // 4TC + return - if("darklord") // 23TC + TK implant - new /obj/item/melee/energy/sword/saber/red(src) - new /obj/item/melee/energy/sword/saber/red(src) - new /obj/item/dnainjector/telemut/darkbundle(src) - new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) - new /obj/item/card/id/syndicate(src) - new /obj/item/clothing/shoes/syndigaloshes(src) - new /obj/item/clothing/mask/gas/voice(src) - return + if("darklord") // 22TC + two 0TC + new /obj/item/melee/energy/sword/saber/red(src) // 8TC + new /obj/item/melee/energy/sword/saber/red(src) // 8TC + new /obj/item/dnainjector/telemut/darkbundle(src) // 0TC + new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) // 0TC + new /obj/item/card/id/syndicate(src) // 2TC + new /obj/item/clothing/shoes/chameleon/noslip(src) // 2TC + new /obj/item/clothing/mask/chameleon(src) // 2TC + new /obj/item/encryptionkey/syndicate(src) // 2TC + return - if("gadgets") // 30TC - new /obj/item/clothing/gloves/color/yellow/power(src) - new /obj/item/pen/sleepy(src) - new /obj/item/clothing/shoes/syndigaloshes(src) - new /obj/item/clothing/glasses/thermal/syndi(src) - new /obj/item/flashlight/emp(src) - new /obj/item/stamp/chameleon(src) - new /obj/item/multitool/ai_detect(src) - return - - if("professional") // 29TC + armored suit jacket + insulated combat gloves - new /obj/item/gun/projectile/automatic/sniper_rifle/soporific(src) // Unique version that starts with soporific rounds loaded and cannot be suppressed - new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) - new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) - new /obj/item/pen/edagger(src) - new /obj/item/clothing/glasses/thermal/syndi/sunglasses(src) - new /obj/item/clothing/under/suit_jacket/really_black(src) - new /obj/item/clothing/suit/storage/lawyer/blackjacket/armored(src) - new /obj/item/clothing/gloves/combat(src) - return + if("professional") // 32 TC + two 0TC + new /obj/item/gun/projectile/automatic/sniper_rifle/syndicate/penetrator(src) // 16TC + new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src) // 5TC + new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) // 3TC + new /obj/item/clothing/glasses/chameleon/thermal(src) // 6TC + new /obj/item/clothing/gloves/combat(src) // 0 TC + new /obj/item/clothing/under/suit_jacket/really_black(src) // 0 TC + new /obj/item/clothing/suit/storage/lawyer/blackjacket/armored(src) // 0TC + new /obj/item/pen/edagger(src) // 2TC + new /obj/item/encryptionkey/syndicate(src) // 2TC + return /obj/item/storage/box/syndie_kit name = "Box" @@ -254,6 +262,13 @@ new /obj/item/ammo_casing/shotgun/assassination(src) new /obj/item/gun/projectile/revolver/doublebarrel/improvised/cane(src) +/obj/item/storage/box/syndie_kit/fake_revolver + name = "trick revolver kit" + +/obj/item/storage/box/syndie_kit/fake_revolver/New() + ..() + new /obj/item/toy/russian_revolver/trick_revolver(src) + /obj/item/storage/box/syndie_kit/mimery name = "advanced mimery kit" @@ -262,13 +277,24 @@ new /obj/item/spellbook/oneuse/mime/greaterwall(src) new /obj/item/spellbook/oneuse/mime/fingergun(src) -/obj/item/storage/box/syndie_kit/atmosgasgrenades - name = "Atmos Grenades" -/obj/item/storage/box/syndie_kit/atmosgasgrenades/New() +/obj/item/storage/box/syndie_kit/atmosn2ogrenades + name = "Atmos N2O Grenades" + +/obj/item/storage/box/syndie_kit/atmosn2ogrenades/New() + ..() + new /obj/item/grenade/clusterbuster/n2o(src) + new /obj/item/grenade/clusterbuster/n2o(src) + + +/obj/item/storage/box/syndie_kit/atmosfiregrenades + name = "Plasma Fire Grenades" + +/obj/item/storage/box/syndie_kit/atmosfiregrenades/New() ..() new /obj/item/grenade/clusterbuster/plasma(src) - new /obj/item/grenade/clusterbuster/n2o(src) + new /obj/item/grenade/clusterbuster/plasma(src) + /obj/item/storage/box/syndie_kit/missionary_set name = "Missionary Starter Kit" @@ -322,4 +348,21 @@ To apply, hold the injector a short distance away from the outer thigh before ap new /obj/item/clothing/gloves/color/latex/nitrile(src) new /obj/item/clothing/mask/balaclava(src) new /obj/item/clothing/accessory/stethoscope(src) - new /obj/item/book/manual/engineering_hacking(src) \ No newline at end of file + new /obj/item/book/manual/engineering_hacking(src) + +/obj/item/storage/box/syndie_kit/chameleon + name = "chameleon kit" + +/obj/item/storage/box/syndie_kit/chameleon/New() + ..() + new /obj/item/clothing/under/chameleon(src) + new /obj/item/clothing/suit/chameleon(src) + new /obj/item/clothing/gloves/chameleon(src) + new /obj/item/clothing/shoes/chameleon(src) + new /obj/item/clothing/glasses/chameleon(src) + new /obj/item/clothing/head/chameleon(src) + new /obj/item/clothing/mask/chameleon(src) + new /obj/item/storage/backpack/chameleon(src) + new /obj/item/radio/headset/chameleon(src) + new /obj/item/stamp/chameleon(src) + new /obj/item/pda/chameleon(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index f33fc7240d2..526340daea5 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -18,7 +18,10 @@ /obj/item/melee/baton/suicide_act(mob/user) 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) + return FIRELOSS + +/obj/item/melee/baton/get_cell() + return bcell /obj/item/melee/baton/New() ..() @@ -141,6 +144,12 @@ if(isrobot(M)) ..() return + + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(check_martial_counter(H, user)) + return + if(!isliving(M)) return @@ -166,8 +175,6 @@ if(ishuman(L)) var/mob/living/carbon/human/H = L - if(check_martial_counter(L, user)) - return if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) //No message; check_shields() handles that playsound(L, 'sound/weapons/genhit.ogg', 50, 1) return diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 3fc4b4b7717..d0526ebbcb8 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -52,7 +52,9 @@ if(ishuman(target)) var/mob/living/carbon/human/H = target if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) - return 0 + return + if(check_martial_counter(H, user)) + return playsound(get_turf(src), 'sound/effects/woodhit.ogg', 75, 1, -1) target.Weaken(3) add_attack_logs(user, target, "Stunned with [src]") diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index d533a7e595b..c44264c6529 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -27,13 +27,13 @@ air_contents.volume = volume //liters air_contents.temperature = T20C - processing_objects.Add(src) + START_PROCESSING(SSobj, src) return /obj/item/tank/Destroy() QDEL_NULL(air_contents) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 5eb7a5b30ff..7afb1885ea2 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -32,7 +32,7 @@ /obj/item/wrench/suicide_act(mob/user) user.visible_message("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!") playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/wrench/cyborg name = "automatic wrench" @@ -76,7 +76,7 @@ /obj/item/wrench/power/suicide_act(mob/user) user.visible_message("[user] is pressing [src] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!") - return (BRUTELOSS) + return BRUTELOSS /obj/item/wrench/medical name = "medical wrench" @@ -113,7 +113,7 @@ return user.dust() - return OXYLOSS + return OBLITERATION //Screwdriver /obj/item/screwdriver @@ -143,7 +143,7 @@ /obj/item/screwdriver/suicide_act(mob/user) user.visible_message("[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!") - return(BRUTELOSS) + return BRUTELOSS /obj/item/screwdriver/New(loc, var/param_color = null) ..() @@ -199,7 +199,7 @@ /obj/item/screwdriver/power/suicide_act(mob/user) user.visible_message("[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!") - return(BRUTELOSS) + return BRUTELOSS /obj/item/screwdriver/power/attack_self(mob/user) playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, 1) @@ -256,7 +256,7 @@ /obj/item/wirecutters/suicide_act(mob/user) user.visible_message("[user] is cutting at [user.p_their()] arteries with [src]! It looks like [user.p_theyre()] trying to commit suicide!") playsound(loc, usesound, 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/wirecutters/brass name = "brass wirecutters" @@ -299,7 +299,7 @@ if(head) head.droplimb(0, DROPLIMB_BLUNT, FALSE, TRUE) playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/wirecutters/power/attack_self(mob/user) playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) @@ -349,7 +349,7 @@ /obj/item/weldingtool/suicide_act(mob/user) user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!") - return (FIRELOSS) + return FIRELOSS /obj/item/weldingtool/proc/update_torch() overlays.Cut() @@ -377,7 +377,7 @@ damtype = "brute" update_icon() if(!can_off_process) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return //Welders left on now use up fuel, but lets not have them run out quite that fast if(1) @@ -539,7 +539,7 @@ damtype = "fire" hitsound = 'sound/items/welder.ogg' update_icon() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else to_chat(user, "You need more fuel!") switched_off(user) @@ -738,7 +738,7 @@ obj/item/weldingtool/experimental/process() /obj/item/crowbar/power/suicide_act(mob/user) user.visible_message("[user] is putting [user.p_their()] head in [src]. It looks like [user.p_theyre()] trying to commit suicide!") playsound(loc, 'sound/items/jaws_pry.ogg', 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/crowbar/power/attack_self(mob/user) playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index de219626d31..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) @@ -192,6 +197,15 @@ var/obj/structure/grille/G = A G.take_damage(40, BRUTE, "melee", 0) +/obj/item/twohanded/fireaxe/boneaxe // Blatant imitation of the fireaxe, but made out of bone. + icon_state = "bone_axe0" + name = "bone axe" + desc = "A large, vicious axe crafted out of several sharpened bone plates and crudely tied together. Made of monsters, by killing monsters, for killing monsters." + force_wielded = 23 + +/obj/item/twohanded/fireaxe/boneaxe/update_icon() + icon_state = "bone_axe[wielded]" + /* * Double-Bladed Energy Swords - Cheridan */ @@ -215,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) @@ -347,6 +361,19 @@ explosive.prime() qdel(src) +/obj/item/twohanded/spear/bonespear //Blatant imitation of spear, but made out of bone. Not valid for explosive modification. + icon_state = "bone_spear0" + name = "bone spear" + desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology." + force = 11 + force_unwielded = 11 + force_wielded = 20 //I have no idea how to balance + throwforce = 22 + armour_penetration = 15 //Enhanced armor piercing + +/obj/item/twohanded/spear/bonespear/update_icon() + icon_state = "bone_spear[wielded]" + //GREY TIDE /obj/item/twohanded/spear/grey_tide icon_state = "spearglass0" @@ -557,10 +584,10 @@ /obj/item/twohanded/singularityhammer/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/twohanded/singularityhammer/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/twohanded/singularityhammer/process() @@ -664,10 +691,10 @@ /obj/item/twohanded/knighthammer/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/twohanded/knighthammer/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/twohanded/knighthammer/process() @@ -797,7 +824,7 @@ /obj/item/twohanded/pitchfork/suicide_act(mob/user) user.visible_message("[user] impales \himself in \his abdomen with [src]! It looks like \he's trying to commit suicide...") - return (BRUTELOSS) + return BRUTELOSS /obj/item/twohanded/pitchfork/demonic/pickup(mob/user) . = ..() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index cd295befb83..b759139dba6 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -12,8 +12,8 @@ /obj/item/banhammer/suicide_act(mob/user) - to_chat(viewers(user), "[user] is hitting [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to ban [user.p_them()]self from life.") - return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS) + to_chat(viewers(user), "[user] is hitting [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to ban [user.p_them()]self from life.") + return BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS /obj/item/sord name = "\improper SORD" @@ -49,7 +49,7 @@ /obj/item/claymore/suicide_act(mob/user) user.visible_message("[user] is falling on the [name]! It looks like [user.p_theyre()] trying to commit suicide.") - return(BRUTELOSS) + return BRUTELOSS /obj/item/claymore/ceremonial name = "ceremonial claymore" @@ -76,7 +76,7 @@ /obj/item/katana/suicide_act(mob/user) user.visible_message("[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku.") - return(BRUTELOSS) + return BRUTELOSS /obj/item/harpoon name = "harpoon" diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm index fcc3e05bf14..f74f8d28f57 100644 --- a/code/game/objects/items/weapons/whetstone.dm +++ b/code/game/objects/items/weapons/whetstone.dm @@ -10,7 +10,7 @@ var/max = 30 var/prefix = "sharpened" var/requires_sharpness = 1 - var/claw_damage_increase = 1 + var/claw_damage_increase = 2 /obj/item/whetstone/attackby(obj/item/I, mob/user, params) @@ -58,13 +58,18 @@ var/mob/living/carbon/human/H = user var/datum/unarmed_attack/attack = H.dna.species.unarmed if(istype(attack, /datum/unarmed_attack/claws)) - attack.damage += claw_damage_increase - H.visible_message("[H] sharpens [H.p_their()] claws on [src]!", "You sharpen your claws on [src].") - playsound(get_turf(H), usesound, 50, 1) - name = "worn out [name]" - desc = "[desc] At least, it used to." - used = TRUE - update_icon() + var/datum/unarmed_attack/claws/C = attack + if(!C.has_been_sharpened) + C.has_been_sharpened = TRUE + attack.damage += claw_damage_increase + H.visible_message("[H] sharpens [H.p_their()] claws on [src]!", "You sharpen your claws on [src].") + playsound(get_turf(H), usesound, 50, 1) + name = "worn out [name]" + desc = "[desc] At least, it used to." + used = TRUE + update_icon() + else + to_chat(user, "You can not sharpen your claws any further!") /obj/item/whetstone/super name = "super whetstone block" diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 246fc5df75d..572495b503f 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -49,13 +49,9 @@ tforce = O.throwforce take_damage(tforce, BRUTE, "melee", 1, get_dir(src, AM)) -/obj/ex_act(severity, target) +/obj/ex_act(severity) if(resistance_flags & INDESTRUCTIBLE) return - if(target == src) - obj_integrity = 0 - qdel(src) - return switch(severity) if(1) obj_integrity = 0 @@ -69,7 +65,8 @@ . = ..() playsound(src, P.hitsound, 50, 1) visible_message("[src] is hit by \a [P]!") - take_damage(P.damage, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration) + if(!QDELETED(src)) //Bullet on_hit effect might have already destroyed this object + take_damage(P.damage, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration) /obj/proc/hulk_damage() return 150 //the damage hulks do on punches to this object, is affected by melee armor diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index d9358c3a694..c2428dd8d97 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -29,6 +29,7 @@ var/on_blueprints = FALSE //Are we visible on the station blueprints at roundstart? var/force_blueprints = FALSE //forces the obj to be on the blueprints, regardless of when it was created. + var/suicidal_hands = FALSE // Does it requires you to hold it to commit suicide with it? /obj/New() ..() @@ -65,16 +66,26 @@ // Nada /obj/Destroy() - GLOB.machines -= src - processing_objects -= src - GLOB.fast_processing -= src + if(!ismachinery(src)) + if(!speed_process) + STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists + else + STOP_PROCESSING(SSfastprocess, src) SSnanoui.close_uis(src) return ..() -/obj/proc/process() - set waitfor = 0 - processing_objects.Remove(src) - return 0 +//user: The mob that is suiciding +//damagetype: The type of damage the item will inflict on the user +//BRUTELOSS = 1 +//FIRELOSS = 2 +//TOXLOSS = 4 +//OXYLOSS = 8 +//SHAME = 16 +//OBLITERATION = 32 + +//Output a creative message and then return the damagetype done +/obj/proc/suicide_act(mob/user) + return FALSE /obj/assume_air(datum/gas_mixture/giver) if(loc) @@ -286,15 +297,15 @@ a { if(speed_process) return speed_process = TRUE - processing_objects.Remove(src) - GLOB.fast_processing.Add(src) + STOP_PROCESSING(SSobj, src) + START_PROCESSING(SSfastprocess, src) /obj/proc/makeNormalProcess() if(!speed_process) return speed_process = FALSE - processing_objects.Add(src) - GLOB.fast_processing.Remove(src) + START_PROCESSING(SSobj, src) + STOP_PROCESSING(SSfastprocess, src) /obj/vv_get_dropdown() . = ..() diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index faf86394dba..58a2d0464fc 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -31,17 +31,17 @@ /obj/structure/New() ..() if(smooth) - if(ticker && ticker.current_state == GAME_STATE_PLAYING) + if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) queue_smooth(src) queue_smooth_neighbors(src) icon_state = "" if(climbable) verbs += /obj/structure/proc/climb_on - if(ticker) + if(SSticker) cameranet.updateVisibility(src) /obj/structure/Destroy() - if(ticker) + if(SSticker) cameranet.updateVisibility(src) if(smooth) var/turf/T = get_turf(src) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 90e32882087..bf13a05f691 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -113,6 +113,7 @@ anchored = TRUE density = FALSE layer = TURF_LAYER + plane = FLOOR_PLANE icon_state = "weeds" max_integrity = 15 var/obj/structure/alien/weeds/node/linked_node = null @@ -234,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/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 8c4f40a7b62..43f45647985 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -87,6 +87,12 @@ LINEN BINS dream_messages = list("yellow") nightmare_messages = list("locker full of banana peels") +/obj/item/bedsheet/black + icon_state = "sheetblack" + item_color = "sheetblack" + dream_messages = list("black") + nightmare_messages = list("the void of space") + /obj/item/bedsheet/mime name = "mime's blanket" desc = "A very soothing striped blanket. All the noise just seems to fade out when you're under the covers in this." diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 5be8c938f3e..2037293d734 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -278,9 +278,11 @@ if(src == user.loc) to_chat(user, "You can not [welded?"unweld":"weld"] the locker from inside.") return - if(!WT.remove_fuel(0,user)) + if(!WT.remove_fuel(0, user)) to_chat(user, "You need more welding fuel to complete this task.") return + if(!do_after_once(user, 15, target = src)) + return welded = !welded update_icon() for(var/mob/M in viewers(src)) @@ -450,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/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 9ae35b7d4f1..f1053ec917b 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -76,6 +76,7 @@ new /obj/item/radio/headset/headset_service(src) new /obj/item/cartridge/janitor(src) new /obj/item/flashlight(src) + new /obj/item/melee/flyswatter(src) new /obj/item/clothing/shoes/galoshes(src) new /obj/item/soap(src) new /obj/item/caution(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 7b07e003bca..0cd6e541398 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -20,6 +20,7 @@ new /obj/item/storage/box/permits(src) new /obj/item/clothing/under/rank/chief_engineer(src) new /obj/item/clothing/under/rank/chief_engineer/skirt(src) + new /obj/item/clothing/suit/mantle/chief_engineer(src) new /obj/item/clothing/head/hardhat/white(src) new /obj/item/clothing/glasses/welding/superior(src) new /obj/item/clothing/gloves/color/yellow(src) @@ -37,6 +38,7 @@ new /obj/item/rpd(src) new /obj/item/reagent_containers/food/drinks/mug/ce(src) new /obj/item/organ/internal/cyberimp/eyes/meson(src) + new /obj/item/clothing/accessory/medal/engineering(src) /obj/structure/closet/secure_closet/engineering_electrical diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 4f2356872c5..9e030a29187 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -28,17 +28,30 @@ name = "kitchen cabinet" req_access = list(access_kitchen) - New() - ..() - for(var/i in 1 to 3) - new /obj/item/reagent_containers/food/condiment/flour(src) - new /obj/item/reagent_containers/food/condiment/rice(src) - new /obj/item/reagent_containers/food/condiment/sugar(src) +/obj/structure/closet/secure_closet/freezer/kitchen/New() + ..() + for(var/i in 1 to 3) + new /obj/item/reagent_containers/food/condiment/flour(src) + new /obj/item/reagent_containers/food/condiment/rice(src) + new /obj/item/reagent_containers/food/condiment/sugar(src) /obj/structure/closet/secure_closet/freezer/kitchen/mining req_access = list() +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance + name = "maintenance refrigerator" + desc = "This refrigerator looks quite dusty, is there anything edible still inside?" + req_access = list() + +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance/New() + ..() + for(var/i = 0, i < 5, i++) + new /obj/item/reagent_containers/food/condiment/milk(src) + for(var/i = 0, i < 5, i++) + new /obj/item/reagent_containers/food/condiment/soymilk(src) + for(var/i = 0, i < 2, i++) + new /obj/item/storage/fancy/egg_box(src) /obj/structure/closet/secure_closet/freezer/meat name = "meat fridge" @@ -54,6 +67,9 @@ for(var/i in 1 to 4) new /obj/item/reagent_containers/food/snacks/meat/monkey(src) +/obj/structure/closet/secure_closet/freezer/meat/open + req_access = null + locked = FALSE /obj/structure/closet/secure_closet/freezer/fridge name = "refrigerator" @@ -72,6 +88,9 @@ for(var/i in 1 to 2) new /obj/item/storage/fancy/egg_box(src) +/obj/structure/closet/secure_closet/freezer/fridge/open + req_access = null + locked = FALSE /obj/structure/closet/secure_closet/freezer/money name = "freezer" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 9cbd43bf098..189cbc5893d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -70,6 +70,7 @@ new /obj/item/radio/headset/headset_med(src) new /obj/item/clothing/gloves/color/latex/nitrile(src) new /obj/item/defibrillator/loaded(src) + new /obj/item/handheld_defibrillator(src) new /obj/item/storage/belt/medical(src) new /obj/item/clothing/glasses/hud/health(src) new /obj/item/clothing/shoes/sandal/white(src) @@ -109,6 +110,7 @@ /obj/item/storage/pill_bottle/psychiatrist name = "psychiatrist's pill bottle" desc = "Contains various pills to calm or sedate patients." + wrapper_color = COLOR_PALE_BTL_GREEN /obj/item/storage/pill_bottle/psychiatrist/New() ..() @@ -180,16 +182,19 @@ new /obj/item/clothing/head/surgery/purple(src) new /obj/item/clothing/suit/storage/labcoat/cmo(src) new /obj/item/clothing/under/rank/chief_medical_officer(src) + new /obj/item/clothing/suit/mantle/labcoat/chief_medical_officer(src) new /obj/item/clothing/shoes/brown (src) new /obj/item/radio/headset/heads/cmo(src) new /obj/item/clothing/gloves/color/latex/nitrile(src) new /obj/item/defibrillator/compact/loaded(src) + new /obj/item/handheld_defibrillator(src) new /obj/item/storage/belt/medical(src) new /obj/item/flash(src) new /obj/item/reagent_containers/hypospray/CMO(src) new /obj/item/organ/internal/cyberimp/eyes/hud/medical(src) new /obj/item/door_remote/chief_medical_officer(src) new /obj/item/reagent_containers/food/drinks/mug/cmo(src) + new /obj/item/clothing/accessory/medal/medical(src) /obj/structure/closet/secure_closet/animal diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index ca673d40ec1..4d688f65dac 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -13,6 +13,7 @@ new /obj/item/storage/backpack/science(src) new /obj/item/storage/backpack/satchel_tox(src) new /obj/item/clothing/under/rank/scientist(src) + new /obj/item/clothing/under/rank/scientist/skirt(src) //new /obj/item/clothing/suit/labcoat/science(src) new /obj/item/clothing/suit/storage/labcoat/science(src) new /obj/item/clothing/shoes/white(src) @@ -63,6 +64,7 @@ new /obj/item/clothing/head/bio_hood/scientist(src) new /obj/item/clothing/under/rank/research_director(src) new /obj/item/clothing/suit/storage/labcoat(src) + new /obj/item/clothing/suit/mantle/labcoat(src) new /obj/item/cartridge/rd(src) new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/gloves/color/latex(src) @@ -75,7 +77,7 @@ new /obj/item/door_remote/research_director(src) new /obj/item/reagent_containers/food/drinks/mug/rd(src) new /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic(src) - + new /obj/item/clothing/accessory/medal/science(src) /obj/structure/closet/secure_closet/research_reagents name = "research chemical storage closet" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 6925c495309..fe6b0082207 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -18,6 +18,7 @@ new /obj/item/storage/backpack/duffel/captain(src) new /obj/item/clothing/suit/captunic(src) new /obj/item/clothing/suit/captunic/capjacket(src) + new /obj/item/clothing/suit/mantle/armor/captain(src) new /obj/item/clothing/under/captainparade(src) new /obj/item/clothing/head/caphat/parade(src) new /obj/item/clothing/under/rank/captain(src) @@ -59,7 +60,7 @@ new /obj/item/clothing/accessory/petcollar(src) new /obj/item/door_remote/civillian(src) new /obj/item/reagent_containers/food/drinks/mug/hop(src) - + new /obj/item/clothing/accessory/medal/service(src) /obj/structure/closet/secure_closet/hop2 name = "head of personnel's attire" @@ -74,6 +75,7 @@ /obj/structure/closet/secure_closet/hop2/New() ..() new /obj/item/clothing/under/rank/head_of_personnel(src) + new /obj/item/clothing/suit/mantle/armor/head_of_personnel(src) new /obj/item/clothing/under/dress/dress_hop(src) new /obj/item/clothing/under/dress/dress_hr(src) new /obj/item/clothing/under/lawyer/female(src) @@ -113,6 +115,7 @@ new /obj/item/clothing/suit/armor/hos/alt(src) new /obj/item/clothing/head/HoS(src) new /obj/item/clothing/head/HoS/beret(src) + new /obj/item/clothing/suit/mantle/armor(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/storage/lockbox/mindshield(src) new /obj/item/storage/box/flashbangs(src) @@ -125,7 +128,7 @@ new /obj/item/door_remote/head_of_security(src) new /obj/item/reagent_containers/food/drinks/mug/hos(src) new /obj/item/organ/internal/cyberimp/eyes/hud/security(src) - + new /obj/item/clothing/accessory/medal/security(src) /obj/structure/closet/secure_closet/warden name = "warden's locker" @@ -461,4 +464,5 @@ new /obj/item/clothing/head/powdered_wig(src) new /obj/item/gavelblock(src) new /obj/item/gavelhammer(src) - new /obj/item/clothing/head/justice_wig(src) \ No newline at end of file + new /obj/item/clothing/head/justice_wig(src) + new /obj/item/clothing/accessory/medal/legal(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 0692c90ec6d..909ee79e1ab 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -41,7 +41,7 @@ qdel(src) return - processing_objects.Add(src) + START_PROCESSING(SSobj, src) ..() /obj/structure/closet/statue/process() @@ -53,7 +53,7 @@ M.setOxyLoss(intialOxy) if(timer <= 0) dump_contents() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) qdel(src) /obj/structure/closet/statue/dump_contents() diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index f88dcbba954..a89bce34396 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -19,6 +19,9 @@ icon_closed = "emergency" icon_opened = "emergencyopen" +/obj/structure/closet/emcloset/anchored + anchored = TRUE + /obj/structure/closet/emcloset/New() ..() diff --git a/code/game/objects/structures/crates_lockers/crittercrate.dm b/code/game/objects/structures/crates_lockers/crittercrate.dm index ffaff75288d..50d9b056e96 100644 --- a/code/game/objects/structures/crates_lockers/crittercrate.dm +++ b/code/game/objects/structures/crates_lockers/crittercrate.dm @@ -44,6 +44,10 @@ name = "cow crate" content_mob = /mob/living/simple_animal/cow +/obj/structure/closet/critter/pig + name = "pig crate" + content_mob = /mob/living/simple_animal/pig + /obj/structure/closet/critter/goat name = "goat crate" content_mob = /mob/living/simple_animal/hostile/retaliate/goat diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm index b286749f908..a3dc4ac7007 100644 --- a/code/game/objects/structures/depot.dm +++ b/code/game/objects/structures/depot.dm @@ -87,7 +87,7 @@ /obj/effect/overload/New() . = ..() // Do not attempt to put the code below into Initialize() or even LateInitialize() with a "return INITIALIZE_HINT_LATELOAD". It won't work! - processing_objects.Add(src) + START_PROCESSING(SSobj, src) depotarea = areaMaster if(istype(depotarea)) if(!depotarea.used_self_destruct) @@ -122,6 +122,6 @@ for(var/obj/mecha/E in range(30, T)) E.Destroy() explosion(get_turf(src), 25, 35, 45, 55, 1, 1, 60, 0, 0) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) qdel(src) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 543ebd7af91..c03b9694cfa 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -2,17 +2,15 @@ #define DISPLAYCASE_FRAME_SCREWDRIVER 1 // List and hook used to set up the captain's print on their display case -var/global/list/captain_display_cases = list() +GLOBAL_LIST_INIT(captain_display_cases, list()) -/hook/captain_spawned/proc/displaycase(mob/living/carbon/human/captain) - if(!captain_display_cases.len) - return 1 +/proc/updateDisplaycase(mob/living/carbon/human/captain) + if(!GLOB.captain_display_cases.len) + return var/fingerprint = captain.get_full_print() - for(var/obj/structure/displaycase/D in captain_display_cases) - if(istype(D)) - D.ue = fingerprint - - return 1 + for(var/item in GLOB.captain_display_cases) + var/obj/structure/displaycase/CASE = item + CASE.ue = fingerprint /obj/structure/displaycase_frame name = "display case frame" @@ -95,14 +93,14 @@ var/global/list/captain_display_cases = list() icon = 'icons/obj/stationobjs.dmi' icon_state = "glassbox20" desc = "A display case for prized possessions. It taunts you to kick it." - density = 1 - anchored = 1 - unacidable = 1 //Dissolving the case would also delete the contents. + density = TRUE + anchored = TRUE + unacidable = TRUE //Dissolving the case would also delete the contents. var/health = 30 var/obj/item/occupant = null - var/destroyed = 0 - var/locked = 0 - var/burglar_alarm = 0 + var/destroyed = FALSE + var/locked = FALSE + var/burglar_alarm = FALSE var/ue = null var/image/occupant_overlay = null var/obj/item/airlock_electronics/circuit @@ -118,11 +116,15 @@ var/global/list/captain_display_cases = list() /obj/structure/displaycase/captains_laser name = "captain's display case" desc = "A display case for the captain's antique laser gun. Hooked up with an anti-theft system." - burglar_alarm = 1 - locked = 1 + burglar_alarm = TRUE + locked = TRUE req_access = list(access_captain) start_showpiece_type = /obj/item/gun/energy/laser/captain +/obj/structure/displaycase/captains_laser/Initialize(mapload) + . = ..() + GLOB.captain_display_cases += src + /obj/structure/displaycase/stechkin name = "officer's display case" desc = "A display case containing a humble stechkin pistol. Never forget your roots." @@ -136,7 +138,7 @@ var/global/list/captain_display_cases = list() return ..() /obj/structure/displaycase/captains_laser/Destroy() - captain_display_cases -= src + GLOB.captain_display_cases -= src return ..() /obj/structure/displaycase/examine(mob/user) @@ -203,7 +205,7 @@ var/global/list/captain_display_cases = list() return /obj/structure/displaycase/proc/burglar_alarm() - if(burglar_alarm) + if(burglar_alarm && is_station_contact(z)) var/area/alarmed = get_area(src) alarmed.burglaralert(src) visible_message("The burglar alarm goes off!") @@ -213,10 +215,10 @@ var/global/list/captain_display_cases = list() sleep(74) // 7.4 seconds long /obj/structure/displaycase/update_icon() - if(src.destroyed) - src.icon_state = "glassbox2b" + if(destroyed) + icon_state = "glassbox2b" else - src.icon_state = "glassbox2[locked]" + icon_state = "glassbox2[locked]" overlays = 0 if(occupant) var/icon/occupant_icon=getFlatIcon(occupant) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index eca9d524730..b21754cae96 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -226,6 +226,7 @@ door = new airlock_type(loc) door.setDir(dir) door.electronics = electronics + door.unres_sides = electronics.unres_sides door.heat_proof = heat_proof_finished if(electronics.one_access) door.req_access = null diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 568fb0ededc..303862ff66f 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -28,6 +28,22 @@ else has_extinguisher = new/obj/item/extinguisher +/obj/structure/extinguisher_cabinet/examine(mob/user) + ..() + to_chat(user, "Alt-click to [opened ? "close":"open"] it.") + +/obj/structure/extinguisher_cabinet/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user)) + return + if(!iscarbon(usr)) + return + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) + opened = !opened + update_icon() + /obj/structure/extinguisher_cabinet/Destroy() QDEL_NULL(has_extinguisher) return ..() @@ -37,11 +53,16 @@ return if(istype(O, /obj/item/extinguisher)) if(!has_extinguisher && opened) + if(!user.drop_item()) + return user.drop_item(O) contents += O has_extinguisher = O + update_icon() to_chat(user, "You place [O] in [src].") + return TRUE else + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened else if(istype(O, /obj/item/weldingtool)) if(has_extinguisher) @@ -65,6 +86,7 @@ new material_drop(T) qdel(src) else + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened update_icon() @@ -81,21 +103,27 @@ to_chat(user, "You try to move your [temp.name], but cannot!") return if(has_extinguisher) + if(icon_state == "extinguisher_closed") + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) user.put_in_hands(has_extinguisher) to_chat(user, "You take [has_extinguisher] from [src].") has_extinguisher = null opened = 1 else + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened update_icon() /obj/structure/extinguisher_cabinet/attack_tk(mob/user) if(has_extinguisher) + if(icon_state == "extinguisher_closed") + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) has_extinguisher.loc = loc to_chat(user, "You telekinetically remove [has_extinguisher] from [src].") has_extinguisher = null opened = 1 else + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened update_icon() 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 new file mode 100644 index 00000000000..a6a4f699314 --- /dev/null +++ b/code/game/objects/structures/fluff.dm @@ -0,0 +1,81 @@ +//Fluff structures serve no purpose and exist only for enriching the environment. They can be destroyed with a wrench. + +/obj/structure/fluff + name = "fluff structure" + desc = "Fluffier than a sheep. This shouldn't exist." + icon = 'icons/obj/stationobjs.dmi' + icon_state = "minibar" + anchored = TRUE + density = FALSE + opacity = 0 + var/deconstructible = TRUE + +/obj/structure/fluff/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/wrench) && deconstructible) + user.visible_message("[user] starts disassembling [src]...", "You start disassembling [src]...") + playsound(loc, I.usesound, 50, 1) + if(do_after(src, 50 * I.toolspeed, target = src)) + user.visible_message("[user] disassembles [src]!", "You break down [src] into scrap metal.") + playsound(user, 'sound/items/deconstruct.ogg', 50, 1) + new/obj/item/stack/sheet/metal(drop_location()) + qdel(src) + return + ..() + +/obj/structure/fluff/empty_terrarium //Empty terrariums are created when a preserved terrarium in a lavaland seed vault is activated. + name = "empty terrarium" + desc = "An ancient machine that seems to be used for storing plant matter. Its hatch is ajar." + icon = 'icons/obj/lavaland/spawners.dmi' + icon_state = "terrarium_open" + density = TRUE + +/obj/structure/fluff/empty_sleeper //Empty sleepers are created by a good few ghost roles in lavaland. + name = "empty sleeper" + desc = "An open sleeper. It looks as though it would be awaiting another patient, were it not broken." + icon = 'icons/obj/cryogenic2.dmi' + icon_state = "sleeper-open" + +/obj/structure/fluff/empty_sleeper/nanotrasen + name = "broken hypersleep chamber" + desc = "A Nanotrasen hypersleep chamber - this one appears broken. \ + There are exposed bolts for easy disassembly using a wrench." + icon_state = "sleeper-o" + +/obj/structure/fluff/empty_sleeper/syndicate + icon_state = "sleeper_s-open" + +/obj/structure/fluff/empty_cryostasis_sleeper //Empty cryostasis sleepers are created when a malfunctioning cryostasis sleeper in a lavaland shelter is activated + name = "empty cryostasis sleeper" + desc = "Although comfortable, this sleeper won't function as anything but a bed ever again." + icon = 'icons/obj/lavaland/spawners.dmi' + icon_state = "cryostasis_sleeper_open" + +/obj/structure/fluff/drake_statue //Ash drake status spawn on either side of the necropolis gate in lavaland. + name = "drake statue" + desc = "A towering basalt sculpture of a proud and regal drake. Its eyes are six glowing gemstones." + icon = 'icons/effects/64x64.dmi' + icon_state = "drake_statue" + pixel_x = -16 + density = TRUE + deconstructible = FALSE + layer = EDGED_TURF_LAYER + +/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/grille.dm b/code/game/objects/structures/grille.dm index c06e5d82244..1e3cb331cd1 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -245,20 +245,20 @@ /obj/structure/grille/proc/shock(mob/user, prb) if(!anchored || broken) // unanchored/broken grilles are never connected - return 0 + return FALSE if(!prob(prb)) - return 0 + return FALSE if(!in_range(src, user))//To prevent TK and mech users from getting shocked - return 0 + return FALSE var/turf/T = get_turf(src) var/obj/structure/cable/C = T.get_cable_node() if(C) - if(electrocute_mob(user, C, src)) + if(electrocute_mob(user, C, src, 1, TRUE)) do_sparks(3, 1, src) - return 1 + return TRUE else - return 0 - return 0 + return FALSE + return FALSE /obj/structure/grille/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) ..() @@ -273,8 +273,8 @@ var/obj/structure/cable/C = T.get_cable_node() if(C) playsound(loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) - tesla_zap(src, 3, C.powernet.avail * 0.01) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. - C.powernet.load += C.powernet.avail * 0.0375 // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. + tesla_zap(src, 3, C.newavail() * 0.01) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. + C.add_delayedload(C.newavail() * 0.0375) // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. return ..() /obj/structure/grille/broken // Pre-broken grilles for map placement diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index e5c0fc85722..67ee4b6ac00 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -116,9 +116,9 @@ if(.) return if(!shockcd) - if(ismob(user)) + if(isliving(user)) var/mob/living/M = user - M.electrocute_act(15,"Energy Barrier", safety=1) + M.electrocute_act(15, "Energy Barrier", safety = TRUE) shockcd = TRUE addtimer(CALLBACK(src, .proc/cooldown), 5) @@ -130,6 +130,6 @@ return var/mob/living/M = AM - M.electrocute_act(15, "Energy Barrier", safety = 1) + M.electrocute_act(15, "Energy Barrier", safety = TRUE) shockcd = TRUE addtimer(CALLBACK(src, .proc/cooldown), 5) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 936c94f5c4f..c1233aaee0c 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -1,86 +1,132 @@ /obj/structure/lattice - desc = "A lightweight support lattice." name = "lattice" - icon = 'icons/obj/structures.dmi' - icon_state = "latticefull" - density = 0 - anchored = 1.0 + desc = "A lightweight support lattice." + icon = 'icons/obj/smooth_structures/lattice.dmi' + icon_state = "lattice" + density = FALSE + anchored = TRUE armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) - layer = 2.3 //under pipes - // flags = CONDUCT + layer = LATTICE_LAYER //under pipes + plane = FLOOR_PLANE + var/number_of_rods = 1 + canSmoothWith = list(/obj/structure/lattice, + /turf/simulated/floor, + /turf/simulated/wall, + /obj/structure/falsewall) + smooth = SMOOTH_MORE -/obj/structure/lattice/New() - ..() - if(!(istype(src.loc, /turf/space))) - qdel(src) - for(var/obj/structure/lattice/LAT in src.loc) +/obj/structure/lattice/Initialize(mapload) + . = ..() + for(var/obj/structure/lattice/LAT in loc) if(LAT != src) - qdel(LAT) - icon = 'icons/obj/smoothlattice.dmi' - icon_state = "latticeblank" - updateOverlays() - for(var/dir in cardinal) - var/obj/structure/lattice/L - if(locate(/obj/structure/lattice, get_step(src, dir))) - L = locate(/obj/structure/lattice, get_step(src, dir)) - L.updateOverlays() + QDEL_IN(LAT, 0) -/obj/structure/lattice/Destroy() - for(var/dir in cardinal) - var/obj/structure/lattice/L - if(locate(/obj/structure/lattice, get_step(src, dir))) - L = locate(/obj/structure/lattice, get_step(src, dir)) - L.updateOverlays(src.loc) - return ..() +/obj/structure/lattice/examine(mob/user) + ..() + deconstruction_hints(user) + +/obj/structure/lattice/proc/deconstruction_hints(mob/user) + to_chat(user, "The rods look like they could be cut. There's space for more rods or a tile.") + +/obj/structure/lattice/attackby(obj/item/C, mob/user, params) + 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 + var/turf/T = get_turf(src) + return T.attackby(C, user) //hand this off to the turf instead (for building plating, catwalks, etc) + +/obj/structure/lattice/deconstruct(disassembled = TRUE) + new /obj/item/stack/rods(get_turf(src), number_of_rods) + qdel(src) /obj/structure/lattice/blob_act() qdel(src) - return /obj/structure/lattice/ex_act(severity) switch(severity) - if(1.0) + if(1) qdel(src) - return - if(2.0) + if(2) qdel(src) + if(3) return - if(3.0) - return - else - return - -/obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob, params) - if(istype(C, /obj/item/stack/tile/plasteel) || istype(C, /obj/item/stack/rods)) - var/turf/T = get_turf(src) - T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead - return - if(istype(C, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = C - if(WT.remove_fuel(0, user)) - to_chat(user, "Slicing lattice joints...") - new /obj/item/stack/rods(src.loc) - qdel(src) - - -/obj/structure/lattice/proc/updateOverlays() - //if(!(istype(src.loc, /turf/space))) - // qdel(src) - spawn(1) - overlays = list() - - var/dir_sum = 0 - - for(var/direction in cardinal) - if(locate(/obj/structure/lattice, get_step(src, direction))) - dir_sum += direction - else - if(!(istype(get_step(src, direction), /turf/space))) - dir_sum += direction - - icon_state = "lattice[dir_sum]" - return /obj/structure/lattice/singularity_pull(S, current_size) if(current_size >= STAGE_FOUR) - qdel(src) \ No newline at end of file + 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." + icon = 'icons/obj/smooth_structures/catwalk.dmi' + icon_state = "catwalk" + number_of_rods = 2 + smooth = SMOOTH_TRUE + canSmoothWith = null + +/obj/structure/lattice/catwalk/deconstruction_hints(mob/user) + to_chat(user, "The supporting rods look like they could be cut.") + +/obj/structure/lattice/catwalk/Move() + var/turf/T = loc + for(var/obj/structure/cable/C in T) + C.deconstruct() + ..() + +/obj/structure/lattice/catwalk/deconstruct() + var/turf/T = loc + 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 5e6e72929fe..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) @@ -133,7 +133,7 @@ if(istype(W, /obj/item/pickaxe)) var/obj/item/pickaxe/digTool = W to_chat(user, "You start digging \the [src].") - if(do_after(user, digTool.digspeed * hardness, target = src) && src) + if(do_after(user, 40 * digTool.toolspeed * hardness, target = src) && src) to_chat(user, "You finished digging.") deconstruct(TRUE) else if(user.a_intent != INTENT_HARM) 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/misc.dm b/code/game/objects/structures/misc.dm index 6be7bf072d8..01fab63dd57 100644 --- a/code/game/objects/structures/misc.dm +++ b/code/game/objects/structures/misc.dm @@ -92,11 +92,11 @@ last_ghost_alert = world.time attack_atom = src if(active) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/structure/ghost_beacon/Destroy() if(active) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) attack_atom = null return ..() @@ -111,9 +111,9 @@ return to_chat(user, "You [active ? "disable" : "enable"] \the [src].") if(active) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) else - processing_objects.Add(src) + START_PROCESSING(SSobj, src) active = !active /obj/structure/ghost_beacon/process() diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 3001b52f399..2953744a824 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -484,14 +484,4 @@ if(istype(C)) //We found our corpse, is it inside a morgue? morgue = get(C.loc, /obj/structure/morgue) if(morgue) - morgue.update() - -/hook/mob_login/proc/update_morgue(var/client/client, var/mob/mob) - //Update morgues on login - mob.update_morgue() - return 1 - -/hook/mob_logout/proc/update_morgue(var/client/client, var/mob/mob) - //Update morgues on logout - mob.update_morgue() - return 1 + morgue.update() \ No newline at end of file diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index c6e3ab2e5bd..1bb19a81bd2 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -2,8 +2,8 @@ CONTAINS: SAFES FLOOR SAFES -Safe Codes -Safe Internals +SAFE INTERNALS +SAFE CODES */ GLOBAL_LIST_EMPTY(safes) @@ -11,22 +11,26 @@ GLOBAL_LIST_EMPTY(safes) //SAFES /obj/structure/safe name = "\improper Safe" - desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms - 2 tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\"" + desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\"" icon = 'icons/obj/structures.dmi' icon_state = "safe" - anchored = 1 - density = 1 - var/open = FALSE //is the safe open? + + anchored = TRUE + density = TRUE + resistance_flags = LAVA_PROOF | FIRE_PROOF + unacidable = TRUE + + var/open = FALSE var/locked = TRUE - var/tumbler_1_pos //the tumbler position- from 0 to 72 - var/tumbler_1_open //the tumbler position to open at- 0 to 72 - var/tumbler_2_pos - var/tumbler_2_open - var/open_pos - var/dial = 0 //where is the dial pointing? - var/space = 0 //the combined w_class of everything in the safe - var/maxspace = 24 //the maximum combined w_class of stuff in the safe - var/combo_to_open //so admins know the code + var/dial = 0 // The position the dial is pointing to. + + var/number_of_tumblers = 3 // The amount of tumblers that will be generated. + var/list/tumblers = list() // The list of tumbler dial positions that need to be hit. + var/list/current_tumbler_index = 1 // The index in the tumblers list of the tumbler dial position that needs to be hit. + + var/space = 0 // The combined w_class of everything in the safe. + var/maxspace = 24 // The maximum combined w_class of stuff in the safe. + var/obj/item/thermal_drill/drill = null var/drill_timer var/time_to_drill @@ -34,63 +38,81 @@ GLOBAL_LIST_EMPTY(safes) var/drill_start_time var/drill_x_offset = -13 var/drill_y_offset = -3 - var/knownby = list() + var/known_by = list() + var/image/progress_bar + var/image/drill_overlay + +/obj/structure/safe/Initialize(mapload) + . = ..() -/obj/structure/safe/New() GLOB.safes += src - tumbler_2_pos = rand(0, 99) // first value in the combination set first - tumbler_2_open = rand(0, 99) - tumbler_1_pos = rand(0, 99) - do - tumbler_1_open = rand(0, 99) - while(tumbler_1_open > Wrap(tumbler_2_open +48, 0, 100) && tumbler_1_open < Wrap(tumbler_2_open + 53, 0, 100)) // prevents a combination that wont open - do - open_pos = rand(0,99) - while(open_pos > Wrap(tumbler_1_open - 2, 0, 100) && open_pos < Wrap(tumbler_1_open + 2, 0, 100)) // prevents a combination that wont open - var/num1 = tumbler_2_open + 54 - if(num1 > 99) - num1 = num1 - 100 - var/num2 = tumbler_1_open + 98 - if(num2 > 99) - num2 = num2 - 100 + for(var/i in 1 to number_of_tumblers) + tumblers.Add(rand(0, 99)) - combo_to_open = "[num1] - [num2]" - - -/obj/structure/safe/Initialize() - ..() for(var/obj/item/I in loc) if(space >= maxspace) return if(I.w_class + space <= maxspace) space += I.w_class - I.loc = src + I.forceMove(src) +/obj/structure/safe/Destroy() + GLOB.safes -= src + drill?.soundloop?.stop() + drill?.forceMove(loc) + drill = null + + qdel(progress_bar) + qdel(drill_overlay) + return ..() + +/obj/structure/safe/process() + if(drill_timer) + cut_overlay(progress_bar) + progress_bar = image('icons/effects/progessbar.dmi', src, "prog_bar_[round((((world.time - drill_start_time) / time_to_drill) * 100), 5)]", HUD_LAYER) + add_overlay(progress_bar) + if(prob(15)) + drill.spark_system.start() + +/obj/structure/safe/examine(mob/user) + . = ..() + + to_chat(user, "This model appears to have [number_of_tumblers] tumblers.") + if(open) + to_chat(user, "The inside of the the door has numbers written on it: [get_combination()]") + +/obj/structure/safe/blob_act() + return + +/obj/structure/safe/ex_act(severity) + return + +/obj/structure/safe/examine_status(mob/user) + return /obj/structure/safe/proc/check_unlocked() - if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open && dial == open_pos) + if(current_tumbler_index > number_of_tumblers) locked = FALSE + visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!") return TRUE + locked = TRUE return FALSE -/obj/structure/safe/proc/make_noise(turns, turns_total, tum1 = 0, tum2 = 0, mob/user, canhear) - if(user && canhear) - if(turns == 2) - to_chat(user, "The sounds from [src] are too fast and blend together.") - if(tum1 && (turns_total == 1 || prob(10))) // So multi turns dont super spam the chat - to_chat(user, "You hear a [pick("clack", "scrape", "clank")] from [src].") - if(tum2 && (turns_total == 1 || prob(10))) // So multi turns dont super spam the chat - to_chat(user, "You hear a [pick("click", "chink", "clink")] from [src].") - if(tumbler_1_pos == tumbler_1_open && turns_total == 1 && tum1) // You cant hear tumblers if you spin fast! - to_chat(user, "You hear a [pick("tonk", "krunk", "plunk")] from [src].") - if(tumbler_2_pos == tumbler_2_open && turns_total == 1 && tum2) // You cant hear tumblers if you spin fast! - to_chat(user, "You hear a [pick("tink", "krink", "plink")] from [src].") - if(!locked) - if(user) - visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!") +/obj/structure/safe/proc/get_combination() + var/combination = "" + var/looped = 0 + + for(var/tumbler in tumblers) + looped++ + combination += "[tumbler]" + + if(looped < LAZYLEN(tumblers)) + combination += ", " + + return combination /obj/structure/safe/update_icon() if(open) @@ -103,21 +125,32 @@ GLOBAL_LIST_EMPTY(safes) icon_state = "[initial(icon_state)]-broken" else icon_state = initial(icon_state) - overlays.Cut() - if(istype(drill, /obj/item/thermal_drill/diamond_drill)) + + var/list/overlays_to_cut = list(drill_overlay) + if(!drill_timer) + overlays_to_cut += progress_bar + + cut_overlay(overlays_to_cut) + + if(istype(drill, /obj/item/thermal_drill)) + var/drill_icon = istype(drill, /obj/item/thermal_drill/diamond_drill) ? "d" : "h" if(drill_timer) - overlays += image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_d-drill-on", pixel_x = drill_x_offset, pixel_y = drill_y_offset) + drill_overlay = image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_[drill_icon]-drill-on", pixel_x = drill_x_offset, pixel_y = drill_y_offset) else - overlays += image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_d-drill-off", pixel_x = drill_x_offset, pixel_y = drill_y_offset) - else if(istype(drill, /obj/item/thermal_drill)) - if(drill_timer) - overlays += image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_h-drill-on", pixel_x = drill_x_offset, pixel_y = drill_y_offset) - else - overlays += image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_h-drill-off", pixel_x = drill_x_offset, pixel_y = drill_y_offset) + drill_overlay = image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_[drill_icon]-drill-off", pixel_x = drill_x_offset, pixel_y = drill_y_offset) + + add_overlay(drill_overlay) + +/obj/structure/safe/attack_ghost(mob/user) + if(..() || drill) + return TRUE + + ui_interact(user) /obj/structure/safe/attack_hand(mob/user) if(..()) return TRUE + if(drill) switch(alert("What would you like to do?", "Thermal Drill", "Turn [drill_timer ? "Off" : "On"]", "Remove Drill", "Cancel")) if("Turn On") @@ -126,14 +159,14 @@ GLOBAL_LIST_EMPTY(safes) drill_start_time = world.time drill.soundloop.start() update_icon() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) if("Turn Off") if(do_after(user, 2 SECONDS, target = src)) deltimer(drill_timer) drill_timer = null drill.soundloop.stop() update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) if("Remove Drill") if(drill_timer) to_chat(user, "You cant remove the drill while it's running!") @@ -145,7 +178,6 @@ GLOBAL_LIST_EMPTY(safes) return else ui_interact(user) - return /obj/structure/safe/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) @@ -161,30 +193,39 @@ GLOBAL_LIST_EMPTY(safes) for(var/obj/O in contents) contents_names[++contents_names.len] = list("name" = O.name, "index" = contents.Find(O), "sprite" = O.icon_state) user << browse_rsc(icon(O.icon, O.icon_state), "[O.icon_state].png") - else - contents_names = list(list("name" = "you're"), list("name" = "a"), list("name" = "cheater")) data["dial"] = dial data["open"] = open data["locked"] = locked - data["rotation"] = "[-dial*3.6]deg" + data["rotation"] = "[-dial * 3.6]deg" data["contents"] = contents_names return data +/obj/structure/safe/proc/notify_user(user, canhear, sounds, total_ticks, current_tick) + if(!canhear) + return + + if(current_tick == 2) + to_chat(user, "The sounds from [src] are too fast and blend together.") + + if(total_ticks == 1 || prob(10)) + to_chat(user, "You hear a [pick(sounds)] from [src].") /obj/structure/safe/Topic(href, href_list) if(..()) return TRUE - var/canhear = 0 - if(!ishuman(usr)) - to_chat(usr, "You don't have hands to operate the safe!") - return FALSE + var/mob/user = usr + if(!user.IsAdvancedToolUser() && !isobserver(user)) + to_chat(user, "You're not able to operate the safe.") + return - var/mob/living/carbon/human/user = usr - if(istype(user.l_hand, /obj/item/clothing/accessory/stethoscope) || istype(user.r_hand, /obj/item/clothing/accessory/stethoscope)) - canhear = 1 + var/canhear = FALSE + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.can_hear() && H.is_in_hands(/obj/item/clothing/accessory/stethoscope)) + canhear = TRUE if(href_list["open"]) if(check_unlocked() || open || broken) @@ -192,52 +233,65 @@ GLOBAL_LIST_EMPTY(safes) open = !open update_icon() else - to_chat(user, "You can't open [src], the lock is engaged!") - .= TRUE - SSnanoui.update_uis(src) + to_chat(user, "You can't open [src], as its lock is engaged!") - if(href_list["decrement"]) - var/ticks = text2num(href_list["decrement"]) + . = TRUE + + if(href_list["turnright"]) if(open) return + if(broken) - to_chat(user, "The dial will not turn, the mechanism is destroyed.") + to_chat(user, "The dial will not turn, as the mechanism is destroyed.") return - for(var/i=1 to ticks) - if(!check_unlocked()) - dial = Wrap(dial - 1, 0 ,100) - if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 99) - tumbler_1_pos = Wrap(tumbler_1_pos - 1, 0, 100) - make_noise(i, ticks, 1, 0, user, canhear) - if(tumbler_1_pos == tumbler_2_pos + 51 || tumbler_1_pos == tumbler_2_pos - 49) - tumbler_2_pos = Wrap(tumbler_2_pos - 1, 0, 100) - make_noise(0, ticks, 0, 1, user, canhear) + + var/ticks = text2num(href_list["turnright"]) + for(var/i = 1 to ticks) + dial = Wrap(dial - 1, 0, 100) + + var/invalid_turn = current_tumbler_index % 2 == 0 || current_tumbler_index > number_of_tumblers + if(invalid_turn) // The moment you turn the wrong way or go too far, the tumblers reset + current_tumbler_index = 1 + + if(!invalid_turn && dial == tumblers[current_tumbler_index]) + notify_user(user, canhear, list("tink", "krink", "plink"), ticks, i) + current_tumbler_index++ + else + notify_user(user, canhear, list("clack", "scrape", "clank"), ticks, i) + sleep(1) - check_unlocked() + check_unlocked(user, canhear) SSnanoui.update_uis(src) - make_noise(0, 0, 0, 0, user, canhear) - .= TRUE - if(href_list["increment"]) - var/ticks = text2num(href_list["increment"]) + . = TRUE + + if(href_list["turnleft"]) if(open) return + if(broken) - to_chat(user, "The dial will not turn, the mechanism is destroyed.") + to_chat(user, "The dial will not turn, as the mechanism is destroyed.") return - for(var/i=1 to ticks) - check_unlocked() + + var/ticks = text2num(href_list["turnleft"]) + for(var/i = 1 to ticks) dial = Wrap(dial + 1, 0, 100) - if(dial == tumbler_1_pos - 1 || dial == tumbler_1_pos + 99) - tumbler_1_pos = Wrap(tumbler_1_pos + 1, 0, 100) - make_noise(i, ticks, 1, 0, user, canhear) - if(tumbler_1_pos == tumbler_2_pos - 51 || tumbler_1_pos == tumbler_2_pos + 49) - tumbler_2_pos = Wrap(tumbler_2_pos + 1, 0, 100) - make_noise(0, ticks, 0, 1, user, canhear) + + var/invalid_turn = current_tumbler_index % 2 != 0 || current_tumbler_index > number_of_tumblers + if(invalid_turn) // The moment you turn the wrong way or go too far, the tumblers reset + current_tumbler_index = 1 + + if(!invalid_turn && dial == tumblers[current_tumbler_index]) + notify_user(user, canhear, list("tonk", "krunk", "plunk"), ticks, i) + current_tumbler_index++ + else + notify_user(user, canhear, list("click", "chink", "clink"), ticks, i) + sleep(1) + check_unlocked(user, canhear) SSnanoui.update_uis(src) - make_noise(0, 0, 0, 0, user, canhear) - .= TRUE + + . = TRUE if(href_list["retrieve"]) var/index = text2num(href_list["retrieve"]) @@ -247,104 +301,67 @@ GLOBAL_LIST_EMPTY(safes) if(P && in_range(src, user)) user.put_in_hands(P) space -= P.w_class - SSnanoui.update_uis(src) - .= TRUE - - - updateUsrDialog() - return - - -/obj/structure/safe/attackby(obj/item/I, mob/user, params) - if(open) - if(broken && istype(I, /obj/item/safe_internals) && do_after(user, 2 SECONDS, target = src)) - to_chat(user, "You replace the broken mechanism.") - qdel(I) - broken = !broken - update_icon() - return - else if(I.w_class + space <= maxspace) - space += I.w_class - if(!user.drop_item()) - to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the safe!") - return - I.loc = src - to_chat(user, "You put [I] in [src].") - updateUsrDialog() - return - else - to_chat(user, "[I] won't fit in [src].") - return - else - if(istype(I, /obj/item/clothing/accessory/stethoscope)) - to_chat(user, "Hold [I] in one of your hands while you manipulate the dial!") - return - else if(istype(I, /obj/item/thermal_drill)) - if(drill) - to_chat(user, "There is already a drill attached!") - else if(do_after(user, 2 SECONDS, target = src)) - if(!user.drop_item()) - to_chat(user, "[I] is stuck to your hand, you cannot put it in the safe!") - return - I.loc = src - drill = I - time_to_drill = 300 SECONDS * drill.time_multiplier - update_icon() - else - to_chat(user, "You can't put [I] in into the safe while it is closed!") - return + . = TRUE /obj/structure/safe/proc/drill_open() broken = TRUE drill_timer = null drill.soundloop.stop() update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) -/obj/structure/safe/blob_act() - return - -/obj/structure/safe/ex_act(severity) - return - -/obj/structure/safe/examine_status(mob/user) - return - -/obj/structure/safe/Destroy() - GLOB.safes -= src - drill?.soundloop?.stop() - return ..() - -/obj/structure/safe/process() - if(drill_timer) - overlays -= bar - bar = image('icons/effects/progessbar.dmi', src, "prog_bar_[round((((world.time - drill_start_time) / time_to_drill) * 100), 5)]", HUD_LAYER) - overlays += bar - if(prob(15)) - drill.spark_system.start() - -/obj/structure/safe/examine(mob/user) - ..() +/obj/structure/safe/attackby(obj/item/I, mob/user, params) if(open) - to_chat(user, "On the inside of the the door is [combo_to_open]") + if(broken && istype(I, /obj/item/safe_internals) && do_after(user, 2 SECONDS, target = src)) + to_chat(user, "You replace the broken mechanism.") + qdel(I) + broken = !broken + update_icon() + else if(I.w_class + space <= maxspace) + if(!user.drop_item()) + to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the safe!") + return + space += I.w_class + I.forceMove(src) + to_chat(user, "You put [I] in [src].") + else + to_chat(user, "[I] won't fit in [src].") + else + if(istype(I, /obj/item/clothing/accessory/stethoscope)) + to_chat(user, "Hold [I] in one of your hands while you manipulate the dial!") + return + else if(istype(I, /obj/item/thermal_drill)) + if(drill) + to_chat(user, "There is already a drill attached!") + else if(do_after(user, 2 SECONDS, target = src)) + if(!user.drop_item()) + to_chat(user, "[I] is stuck to your hand, you cannot put it in the safe!") + return + I.forceMove(src) + drill = I + time_to_drill = 300 SECONDS * drill.time_multiplier + update_icon() + else + to_chat(user, "You can't put [I] into the safe while it is closed!") + return //FLOOR SAFES /obj/structure/safe/floor name = "floor safe" icon_state = "floorsafe" - density = 0 - level = 1 //underfloor - layer = 2.5 + density = FALSE + level = 1 //Under the floor + layer = LOW_OBJ_LAYER drill_x_offset = -1 drill_y_offset = 20 /obj/structure/safe/floor/Initialize() - ..() + . = ..() var/turf/T = loc hide(T.intact) -/obj/structure/safe/floor/hide(var/intact) - invisibility = intact ? 101 : 0 +/obj/structure/safe/floor/hide(intact) + invisibility = intact ? INVISIBILITY_MAXIMUM : 0 /obj/item/safe_internals name = "safe internals" @@ -356,14 +373,14 @@ GLOBAL_LIST_EMPTY(safes) var/owner info = "

Safe Codes

" -/obj/item/paper/safe_code/New() - ..() - addtimer(CALLBACK(src, .proc/populate_codes), 10) +/obj/item/paper/safe_code/Initialize(mapload) + return INITIALIZE_HINT_LATELOAD -/obj/item/paper/safe_code/proc/populate_codes() +/obj/item/paper/safe_code/LateInitialize(mapload) + . = ..() for(var/safe in GLOB.safes) var/obj/structure/safe/S = safe - if(owner in S.knownby) - info += "
The combination for the safe located in the [get_area(S).name] is: [S.combo_to_open]
" + if(owner in S.known_by) + info += "
The combination for the safe located in the [get_area(S).name] is: [S.get_combination()]
" info_links = info update_icon() \ No newline at end of file diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 6168d637c56..345d35cb4aa 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -106,6 +106,11 @@ desc = "A warning sign which reads 'HARD VACUUM AHEAD'" icon_state = "space" +/obj/structure/sign/vacuum/external + name = "\improper EXTERNAL AIRLOCK" + desc = "A warning sign which reads 'EXTERNAL AIRLOCK'." + layer = MOB_LAYER + /obj/structure/sign/deathsposal name = "\improper DISPOSAL LEADS TO SPACE" desc = "A warning sign which reads 'DISPOSAL LEADS TO SPACE'" @@ -131,6 +136,15 @@ desc = "A warning sign which reads 'NO SMOKING'" icon_state = "nosmoking2" +/obj/structure/sign/radiation + name = "\improper HAZARDOUS RADIATION" + desc = "A warning sign alerting the user of potential radiation hazards." + icon_state = "radiation" + +/obj/structure/sign/radiation/rad_area + name = "\improper RADIOACTIVE AREA" + desc = "A warning sign which reads 'RADIOACTIVE AREA'." + /obj/structure/sign/redcross name = "medbay" desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here.'" @@ -161,21 +175,6 @@ desc = "A dead and stuffed Diona nymph, mounted on a board." icon_state = "kidanplaque" -/obj/structure/sign/science //These 3 have multiple types, just var-edit the icon_state to whatever one you want on the map - name = "\improper SCIENCE!" - desc = "A warning sign which reads 'SCIENCE!'" - icon_state = "science1" - -/obj/structure/sign/chemistry - name = "\improper CHEMISTRY" - desc = "A warning sign which reads 'CHEMISTRY'" - icon_state = "chemistry1" - -/obj/structure/sign/botany - name = "\improper HYDROPONICS" - desc = "A warning sign which reads 'HYDROPONICS'" - icon_state = "hydro1" - /obj/structure/sign/mech name = "\improper mech painting" desc = "A painting of a mech" @@ -211,6 +210,74 @@ desc = "A glowing dragon invites you in." icon_state = "chinese" +/obj/structure/sign/science + name = "\improper SCIENCE!" + desc = "A warning sign which reads 'SCIENCE!'" + icon_state = "science1" + +/obj/structure/sign/chemistry + name = "\improper CHEMISTRY" + desc = "A warning sign which reads 'CHEMISTRY'" + icon_state = "chemistry1" + +/obj/structure/sign/botany + name = "\improper HYDROPONICS" + desc = "A warning sign which reads 'HYDROPONICS'" + icon_state = "hydro1" + +/obj/structure/sign/xenobio + name = "\improper XENOBIOLOGY" + desc = "A sign labelling an area as a place where xenobiological entities are researched." + icon_state = "xenobio" + +/obj/structure/sign/evac + name = "\improper EVACUATION" + desc = "A sign labelling an area where evacuation procedures take place." + icon_state = "evac" + +/obj/structure/sign/drop + name = "\improper DROP PODS" + desc = "A sign labelling an area where drop pod loading procedures take place." + icon_state = "drop" + +/obj/structure/sign/custodian + name = "\improper CUSTODIAN" + desc = "A sign labelling an area where the custodian works." + icon_state = "custodian" + +/obj/structure/sign/engineering + name = "\improper ENGINEERING" + desc = "A sign labelling an area where engineers work." + icon_state = "engine" + +/obj/structure/sign/cargo + name = "\improper CARGO" + desc = "A sign labelling an area where cargo ships dock." + icon_state = "cargo" + +/obj/structure/sign/security + name = "\improper SECURITY" + desc = "A sign labelling an area where the law is law." + icon_state = "security" + +/obj/structure/sign/holy + name = "\improper HOLY" + desc = "A sign labelling a religious area." + icon_state = "holy" + +/obj/structure/sign/restroom + name = "\improper RESTROOM" + desc = "A sign labelling a restroom." + icon_state = "restroom" + +/obj/structure/sign/medbay + name = "\improper MEDBAY" + desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here." + icon_state = "bluecross" + +/obj/structure/sign/medbay/alt + icon_state = "bluecross2" + /obj/structure/sign/directions/science name = "\improper Research Division" desc = "A direction sign, pointing out which way the Research Division is." @@ -235,3 +302,18 @@ name = "\improper Escape Arm" desc = "A direction sign, pointing out which way escape shuttle dock is." icon_state = "direction_evac" + +/obj/structure/sign/directions/cargo + name = "\improper Cargo Department" + desc = "A direction sign, pointing out which way the Cargo department is." + icon_state = "direction_supply" + +/obj/structure/sign/explosives + name = "\improper HIGH EXPLOSIVES" + desc = "A warning sign which reads 'HIGH EXPLOSIVES'." + icon_state = "explosives" + +/obj/structure/sign/explosives/alt + name = "\improper HIGH EXPLOSIVES" + desc = "A warning sign which reads 'HIGH EXPLOSIVES'." + icon_state = "explosives2" \ No newline at end of file diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 88adc9643ba..6f531f5c14c 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -256,18 +256,18 @@ /obj/structure/statue/diamond hardness = 10 material_drop_type = /obj/item/stack/sheet/mineral/diamond - desc = "This is a very expensive diamond statue" + desc = "This is a very expensive diamond statue." /obj/structure/statue/diamond/captain - name = "statue of THE captain." + name = "statue of THE captain" icon_state = "cap" /obj/structure/statue/diamond/ai1 - name = "statue of the AI hologram." + name = "statue of the AI hologram" icon_state = "ai1" /obj/structure/statue/diamond/ai2 - name = "statue of the AI core." + name = "statue of the AI core" icon_state = "ai2" /obj/structure/statue/bananium 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 98da892a00f..15e578ed88f 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() @@ -59,6 +64,12 @@ if(usr.incapacitated()) to_chat(usr, "You can't do that right now!") return + if(!usr.has_right_hand() && !usr.has_left_hand()) + to_chat(usr, "You try to grab the chair, but you are missing both of your hands!") + return + if(usr.get_active_hand() && usr.get_inactive_hand()) + to_chat(usr, "You try to grab the chair, but your hands are already full!") + return if(!ishuman(usr)) return usr.visible_message("[usr] grabs \the [src.name].", "You grab \the [src.name].") @@ -80,7 +91,7 @@ /obj/structure/chair/proc/handle_layer() if(buckled_mob && dir == NORTH) - layer = FLY_LAYER + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER @@ -146,35 +157,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 +223,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 +438,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/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 810659d81bb..04271015f4c 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -19,10 +19,10 @@ /obj/structure/transit_tube/station/New() ..() - processing_objects += src + START_PROCESSING(SSobj, src) /obj/structure/transit_tube/station/Destroy() - processing_objects -= src + STOP_PROCESSING(SSobj, src) return ..() // Stations which will send the tube in the opposite direction after their stop. diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index b48774eb046..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)) @@ -600,7 +600,7 @@ wateract = (W.wash(user, src)) busy = 0 if(wateract) - W.water_act(20,310.15,src) + W.water_act(20, 310.15, src) if("Disconnect") user.visible_message("[user] starts disconnecting [src].", "You begin disconnecting [src]...") if(do_after(user, 40 * O.toolspeed, target = src)) @@ -633,7 +633,7 @@ wateract = (O.wash(user, src)) busy = 0 if(wateract) - O.water_act(20,310.15,src) + O.water_act(20, 310.15, src) /obj/structure/sink/update_icon() ..() diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 72469e2ebfb..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) @@ -269,51 +269,37 @@ obj/structure/windoor_assembly/Destroy() density = TRUE //Shouldn't matter but just incase to_chat(user, "You finish the windoor.") - + var/obj/machinery/door/window/windoor if(secure) - var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(src.loc) + windoor = new /obj/machinery/door/window/brigdoor(src.loc) if(facing == "l") windoor.icon_state = "leftsecureopen" windoor.base_state = "leftsecure" else windoor.icon_state = "rightsecureopen" windoor.base_state = "rightsecure" - windoor.setDir(dir) - windoor.density = FALSE - - if(electronics.one_access) - windoor.req_one_access = electronics.conf_access - else - windoor.req_access = electronics.conf_access - windoor.electronics = src.electronics - electronics.forceMove(windoor) - if(created_name) - windoor.name = created_name - qdel(src) - windoor.close() - - else - var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(loc) + windoor = new /obj/machinery/door/window(loc) if(facing == "l") windoor.icon_state = "leftopen" windoor.base_state = "left" else windoor.icon_state = "rightopen" windoor.base_state = "right" - windoor.setDir(dir) - windoor.density = FALSE + windoor.setDir(dir) + windoor.density = FALSE - if(electronics.one_access) - windoor.req_one_access = electronics.conf_access - else - windoor.req_access = electronics.conf_access - windoor.electronics = src.electronics - electronics.forceMove(windoor) - if(created_name) - windoor.name = created_name - qdel(src) - windoor.close() + if(electronics.one_access) + windoor.req_one_access = electronics.conf_access + else + windoor.req_access = electronics.conf_access + windoor.electronics = src.electronics + electronics.forceMove(windoor) + electronics = null + if(created_name) + windoor.name = created_name + qdel(src) + windoor.close() else return ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index ad655a39b64..16851097844 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -4,7 +4,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f /obj/proc/color_windows(obj/W) var/list/wcBarAreas = list(/area/crew_quarters/bar) - var/list/wcBrigAreas = list(/area/security,/area/prison,/area/shuttle/gamma) + var/list/wcBrigAreas = list(/area/security, /area/shuttle/gamma) var/newcolor var/turf/T = get_turf(W) @@ -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/sound.dm b/code/game/sound.dm index 9e0a28493bd..d27239ae4e7 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -5,6 +5,9 @@ var/turf/turf_source = get_turf(source) + if(!turf_source) + return + //allocate a channel if necessary now so its the same for everyone channel = channel || open_sound_channel() @@ -18,13 +21,17 @@ var/mob/M = P if(!M || !M.client) continue + + var/turf/T = get_turf(M) // These checks need to be changed if z-levels are ever further refactored + if(!T) + continue + if(T.z != turf_source.z) + continue + var/distance = get_dist(M, turf_source) if(distance <= maxdistance) - var/turf/T = get_turf(M) - - if(T && T.z == turf_source.z) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S) + M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S) /mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, channel = 0, pressure_affected = TRUE, sound/S) if(!client || !can_hear()) @@ -101,10 +108,10 @@ SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = chan)) /client/proc/playtitlemusic() - if(!ticker || !ticker.login_music || config.disable_lobby_music) + if(!SSticker || !SSticker.login_music || config.disable_lobby_music) return if(prefs.sound & SOUND_LOBBY) - SEND_SOUND(src, sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = CHANNEL_LOBBYMUSIC)) // MAD JAMS + SEND_SOUND(src, sound(SSticker.login_music, repeat = 0, wait = 0, volume = 85, channel = CHANNEL_LOBBYMUSIC)) // MAD JAMS /proc/get_rand_frequency() return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs. @@ -153,4 +160,4 @@ soundin = pick('sound/effects/bone_break_1.ogg', 'sound/effects/bone_break_2.ogg', 'sound/effects/bone_break_3.ogg', 'sound/effects/bone_break_4.ogg', 'sound/effects/bone_break_5.ogg', 'sound/effects/bone_break_6.ogg') if("honkbot_e") soundin = pick('sound/items/bikehorn.ogg', 'sound/items/AirHorn2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/items/AirHorn.ogg', 'sound/items/WEEOO1.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bcreep.ogg','sound/magic/Fireball.ogg' ,'sound/effects/pray.ogg', 'sound/voice/hiss1.ogg','sound/machines/buzz-sigh.ogg', 'sound/machines/ping.ogg', 'sound/weapons/flashbang.ogg', 'sound/weapons/bladeslice.ogg') - return soundin + return soundin \ No newline at end of file diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 51549c1a563..f54e28defb1 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -10,6 +10,7 @@ var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to var/dirt = 0 var/dirtoverlay = null + var/unacidable = FALSE /turf/simulated/New() ..() @@ -17,8 +18,24 @@ visibilityChanged() /turf/simulated/proc/break_tile() + return /turf/simulated/proc/burn_tile() + return + +/turf/simulated/water_act(volume, temperature, source) + . = ..() + + if(volume >= 3) + MakeSlippery() + + var/hotspot = (locate(/obj/effect/hotspot) in src) + if(hotspot) + var/datum/gas_mixture/lowertemp = remove_air(air.total_moles()) + lowertemp.temperature = max(min(lowertemp.temperature-2000,lowertemp.temperature / 2), 0) + lowertemp.react() + assume_air(lowertemp) + qdel(hotspot) /turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost if(wet >= wet_setting) @@ -35,7 +52,10 @@ else wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") else - wet_overlay = image('icons/effects/water.dmi', src, "wet_static") + if(wet_setting >= TURF_WET_ICE) + wet_overlay = image('icons/effects/water.dmi', src, "ice_floor") + else + wet_overlay = image('icons/effects/water.dmi', src, "wet_static") overlays += wet_overlay spawn(rand(790, 820)) // Purely so for visual effect @@ -74,22 +94,28 @@ switch(src.wet) if(TURF_WET_WATER) - if(!(M.slip("wet floor", 4, 2, tilesSlipped = 0, walkSafely = 1))) + if(!(M.slip("the wet floor", 4, 2, tilesSlipped = 0, walkSafely = 1))) M.inertia_dir = 0 return if(TURF_WET_LUBE) //lube - M.slip("floor", 0, 5, tilesSlipped = 3, walkSafely = 0, slipAny = 1) + M.slip("the floor", 0, 5, tilesSlipped = 3, walkSafely = 0, slipAny = 1) if(TURF_WET_ICE) // Ice - if(!(prob(30) && M.slip("icy floor", 4, 2, tilesSlipped = 1, walkSafely = 1))) + if(M.slip("the icy floor", 4, 2, tilesSlipped = 0, walkSafely = 0)) M.inertia_dir = 0 + if(prob(5)) + var/obj/item/organ/external/affected = M.get_organ("head") + if(affected) + M.apply_damage(5, BRUTE, "head") + M.visible_message("[M] hits their head on the ice!") + playsound(src, 'sound/weapons/genhit1.ogg', 50, 1) if(TURF_WET_PERMAFROST) // Permafrost - M.slip("icy floor", 0, 5, tilesSlipped = 1, walkSafely = 0, slipAny = 1) + M.slip("the frosted floor", 0, 5, tilesSlipped = 1, walkSafely = 0, slipAny = 1) -/turf/simulated/ChangeTurf(var/path) +/turf/simulated/ChangeTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE) . = ..() queue_smooth_neighbors(src) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 6b3dc1e93ff..7166a7fbfc0 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -17,7 +17,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," name = "floor" icon = 'icons/turf/floors.dmi' icon_state = "dont_use_this_floor" - + plane = FLOOR_PLANE var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default var/icon_plating = "plating" thermal_conductivity = 0.040 @@ -31,7 +31,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," var/list/broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5") var/list/burnt_states = list("floorscorched1", "floorscorched2") - /turf/simulated/floor/New() ..() if(icon_state in icons_to_ignore_at_floor_init) //so damaged/burned tiles or plating icons aren't saved as the default @@ -57,26 +56,26 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," return switch(severity) if(1.0) - src.ChangeTurf(/turf/space) + ChangeTurf(baseturf) if(2.0) switch(pick(1,2;75,3)) if(1) spawn(0) - src.ReplaceWithLattice() + ReplaceWithLattice() if(prob(33)) new /obj/item/stack/sheet/metal(src) if(2) - src.ChangeTurf(/turf/space) + ChangeTurf(baseturf) if(3) if(prob(80)) - src.break_tile_to_plating() + break_tile_to_plating() else - src.break_tile() - src.hotspot_expose(1000,CELL_VOLUME) + break_tile() + hotspot_expose(1000,CELL_VOLUME) if(prob(33)) new /obj/item/stack/sheet/metal(src) if(3.0) if(prob(50)) - src.break_tile() - src.hotspot_expose(1000,CELL_VOLUME) + break_tile() + hotspot_expose(1000,CELL_VOLUME) return /turf/simulated/floor/burn_down() @@ -91,8 +90,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," return /turf/simulated/floor/proc/update_icon() - if(air) - update_visuals() + update_visuals() overlays -= current_overlay if(current_overlay) overlays.Add(current_overlay) @@ -122,31 +120,40 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," /turf/simulated/floor/proc/make_plating() return ChangeTurf(/turf/simulated/floor/plating) -/turf/simulated/floor/ChangeTurf(turf/simulated/floor/T, defer_change = FALSE, keep_icon = TRUE) - if(!istype(src,/turf/simulated/floor)) return ..() //fucking turfs switch the fucking src of the fucking running procs - if(!ispath(T,/turf/simulated/floor)) return ..() +/turf/simulated/floor/ChangeTurf(turf/simulated/floor/T, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE) + if(!istype(src, /turf/simulated/floor)) + return ..() //fucking turfs switch the fucking src of the fucking running procs + if(!ispath(T, /turf/simulated/floor)) + return ..() + var/old_icon = icon_regular_floor var/old_plating = icon_plating var/old_dir = dir + var/turf/simulated/floor/W = ..() + if(keep_icon) W.icon_regular_floor = old_icon W.icon_plating = old_plating W.dir = old_dir + W.update_icon() return W - /turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob, params) if(!C || !user) - return 1 + return TRUE + if(..()) - return 1 + return TRUE + if(intact && iscrowbar(C)) pry_tile(C, user) - return 1 + return TRUE + if(intact && istype(C, /obj/item/stack/tile)) try_replace_tile(C, user, params) + if(istype(C, /obj/item/pipe)) var/obj/item/pipe/P = C if(P.pipe_type != -1) // ANY PIPE @@ -155,6 +162,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," "You slide [P] along \the [src].", \ "You hear the scrape of metal against something.") user.drop_item() + if(P.is_bent_pipe()) // bent pipe rotation fix see construction.dm P.dir = 5 if(user.dir == 1) @@ -164,13 +172,14 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," else if(user.dir == 4) P.dir = 10 else - P.dir = user.dir + P.setDir(user.dir) + P.x = src.x P.y = src.y P.z = src.z - P.loc = src - return 1 - return 0 + P.forceMove(src) + return TRUE + return FALSE /turf/simulated/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params) if(T.turf_type == type) diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm new file mode 100644 index 00000000000..5f2ad4b629c --- /dev/null +++ b/code/game/turfs/simulated/floor/asteroid.dm @@ -0,0 +1,330 @@ +/**********************Asteroid**************************/ + +/turf/simulated/floor/plating/asteroid + name = "asteroid sand" + baseturf = /turf/simulated/floor/plating/asteroid + icon_state = "asteroid" + icon_plating = "asteroid" + var/environment_type = "asteroid" + var/turf_type = /turf/simulated/floor/plating/asteroid //Because caves do whacky shit to revert to normal + var/dug = 0 //0 = has not yet been dug, 1 = has already been dug + var/sand_type = /obj/item/stack/ore/glass + var/floor_variance = 20 //probability floor has a different icon state + +/turf/simulated/floor/plating/asteroid/New() + var/proper_name = name + ..() + name = proper_name + if(prob(floor_variance)) + icon_state = "[environment_type][rand(0,12)]" + +/turf/simulated/floor/plating/asteroid/burn_tile() + return + +/turf/simulated/floor/plating/asteroid/MakeSlippery(wet_setting) + return + +/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) + return + if(2) + if(prob(20)) + gets_dug() + if(1) + gets_dug() + +/turf/simulated/floor/plating/asteroid/attackby(obj/item/W, mob/user, params) + //note that this proc does not call ..() + if(!W || !user) + return 0 + + if((istype(W, /obj/item/shovel) || istype(W, /obj/item/pickaxe))) + var/turf/T = get_turf(user) + if(!istype(T)) + return + + if(dug) + to_chat(user, "This area has already been dug!") + return + + to_chat(user, "You start digging...") + playsound(src, W.usesound, 50, 1) + if(do_after(user, 20 * W.toolspeed, target = src)) + to_chat(user, "You dig a hole.") + gets_dug() + return + + else if(istype(W,/obj/item/storage/bag/ore)) + var/obj/item/storage/bag/ore/S = W + if(S.collection_mode == 1) + for(var/obj/item/stack/ore/O in src.contents) + O.attackby(W,user) + return + + else if(istype(W, /obj/item/stack/tile)) + var/obj/item/stack/tile/Z = W + if(!Z.use(1)) + return + if(istype(Z, /obj/item/stack/tile/plasteel)) // Turn asteroid floors into plating by default + ChangeTurf(/turf/simulated/floor/plating, keep_icon = FALSE) + else + ChangeTurf(Z.turf_type, keep_icon = FALSE) + playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) + +/turf/simulated/floor/plating/asteroid/gets_drilled() + if(!dug) + gets_dug() + else + ..() + +/turf/simulated/floor/plating/asteroid/proc/gets_dug() + if(dug) + return + for(var/i in 1 to 5) + new sand_type(src) + dug = 1 + icon_plating = "[environment_type]_dug" + icon_state = "[environment_type]_dug" + slowdown = 0 + return + +/turf/simulated/floor/plating/asteroid/basalt + name = "volcanic floor" + baseturf = /turf/simulated/floor/plating/asteroid/basalt + icon_state = "basalt" + icon_plating = "basalt" + environment_type = "basalt" + sand_type = /obj/item/stack/ore/glass/basalt + floor_variance = 15 + +/turf/simulated/floor/plating/asteroid/basalt/lava //lava underneath + baseturf = /turf/simulated/floor/plating/lava/smooth + +/turf/simulated/floor/plating/asteroid/basalt/airless + temperature = TCMB + oxygen = 0 + nitrogen = 0 + +/turf/simulated/floor/plating/asteroid/basalt/Initialize() + . = ..() + set_basalt_light(src) + +/proc/set_basalt_light(turf/simulated/floor/B) + switch(B.icon_state) + if("basalt1", "basalt2", "basalt3") + B.set_light(2, 0.6, LIGHT_COLOR_LAVA) //more light + if("basalt5", "basalt9") + B.set_light(1.4, 0.6, LIGHT_COLOR_LAVA) //barely anything! + +/turf/simulated/floor/plating/asteroid/basalt/gets_dug() + if(!dug) + set_light(0) + ..() + +///////Surface. The surface is warm, but survivable without a suit. Internals are required. The floors break to chasms, which drop you into the underground. + +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface + +/turf/simulated/floor/plating/asteroid/airless + temperature = TCMB + oxygen = 0 + nitrogen = 0 + turf_type = /turf/simulated/floor/plating/asteroid/airless + +#define SPAWN_MEGAFAUNA "MEGAFAUNA" + +GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = 6)) + +/turf/simulated/floor/plating/asteroid/airless/cave + var/length = 100 + var/list/mob_spawn_list + var/list/megafauna_spawn_list + var/list/flora_spawn_list + var/sanity = 1 + var/forward_cave_dir = 1 + var/backward_cave_dir = 2 + var/going_backwards = TRUE + var/has_data = FALSE + var/data_having_type = /turf/simulated/floor/plating/asteroid/airless/cave/has_data + turf_type = /turf/simulated/floor/plating/asteroid/airless + +/turf/simulated/floor/plating/asteroid/airless/cave/has_data //subtype for producing a tunnel with given data + has_data = TRUE + +/turf/simulated/floor/plating/asteroid/airless/cave/volcanic + mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, \ + /mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 40, /mob/living/simple_animal/hostile/spawner/lavaland = 2, \ + /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 30, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, \ + SPAWN_MEGAFAUNA = 6, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10) + + data_having_type = /turf/simulated/floor/plating/asteroid/airless/cave/volcanic/has_data + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + +/turf/simulated/floor/plating/asteroid/airless/cave/volcanic/has_data //subtype for producing a tunnel with given data + has_data = TRUE + +/turf/simulated/floor/plating/asteroid/airless/cave/New() + if (!mob_spawn_list) + mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 1, /mob/living/simple_animal/hostile/asteroid/goliath = 5, /mob/living/simple_animal/hostile/asteroid/basilisk = 4, /mob/living/simple_animal/hostile/asteroid/hivelord = 3) + if (!megafauna_spawn_list) + megafauna_spawn_list = GLOB.megafauna_spawn_list + if (!flora_spawn_list) + flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2) + + if(!has_data) + produce_tunnel_from_data() + ..() + +/turf/simulated/floor/plating/asteroid/airless/cave/proc/get_cave_data(set_length, exclude_dir = -1) + // If set_length (arg1) isn't defined, get a random length; otherwise assign our length to the length arg. + if(!set_length) + length = rand(25, 50) + else + length = set_length + + // Get our directiosn + forward_cave_dir = pick(alldirs - exclude_dir) + // Get the opposite direction of our facing direction + backward_cave_dir = angle2dir(dir2angle(forward_cave_dir) + 180) + +/turf/simulated/floor/plating/asteroid/airless/cave/proc/produce_tunnel_from_data(tunnel_length, excluded_dir = -1) + get_cave_data(tunnel_length, excluded_dir) + // Make our tunnels + make_tunnel(forward_cave_dir) + if(going_backwards) + make_tunnel(backward_cave_dir) + // Kill ourselves by replacing ourselves with a normal floor. + SpawnFloor(src) + +/turf/simulated/floor/plating/asteroid/airless/cave/proc/make_tunnel(dir) + var/turf/simulated/mineral/tunnel = src + var/next_angle = pick(45, -45) + + for(var/i = 0; i < length; i++) + if(!sanity) + break + + var/list/L = list(45) + if(IsOdd(dir2angle(dir))) // We're going at an angle and we want thick angled tunnels. + L += -45 + + // Expand the edges of our tunnel + for(var/edge_angle in L) + var/turf/simulated/mineral/edge = get_step(tunnel, angle2dir(dir2angle(dir) + edge_angle)) + if(istype(edge)) + SpawnFloor(edge) + + if(!sanity) + break + + // Move our tunnel forward + tunnel = get_step(tunnel, dir) + + if(istype(tunnel)) + // Small chance to have forks in our tunnel; otherwise dig our tunnel. + if(i > 3 && prob(20)) + var/turf/simulated/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type,FALSE,TRUE) + C.going_backwards = FALSE + C.produce_tunnel_from_data(rand(10, 15), dir) + else + SpawnFloor(tunnel) + else //if(!istype(tunnel, src.parent)) // We hit space/normal/wall, stop our tunnel. + break + + // Chance to change our direction left or right. + if(i > 2 && prob(33)) + // We can't go a full loop though + next_angle = -next_angle + setDir(angle2dir(dir2angle(dir) )+ next_angle) + + +/turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnFloor(turf/T) + for(var/S in RANGE_TURFS(1, src)) + var/turf/NT = S + if(!NT || isspaceturf(NT) || istype(NT.loc, /area/mine/explored) || istype(NT.loc, /area/lavaland/surface/outdoors/explored)) + sanity = 0 + break + if(!sanity) + return + SpawnFlora(T) + + SpawnMonster(T) + T.ChangeTurf(turf_type,FALSE,FALSE,TRUE) + +/turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T) + if(prob(30)) + if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored)) + return + var/randumb = pickweight(mob_spawn_list) + while(randumb == SPAWN_MEGAFAUNA) + var/maybe_boss = pickweight(megafauna_spawn_list) + if(megafauna_spawn_list[maybe_boss]) + randumb = maybe_boss + if(ispath(maybe_boss, /mob/living/simple_animal/hostile/megafauna/bubblegum)) //there can be only one bubblegum, so don't waste spawns on it + megafauna_spawn_list.Remove(maybe_boss) + + for(var/mob/living/simple_animal/hostile/H in urange(12,T)) //prevents mob clumps + if((ispath(randumb, /mob/living/simple_animal/hostile/megafauna) || ismegafauna(H)) && get_dist(src, H) <= 7) + return //if there's a megafauna within standard view don't spawn anything at all + if(ispath(randumb, /mob/living/simple_animal/hostile/asteroid) || istype(H, /mob/living/simple_animal/hostile/asteroid)) + return //if the random is a standard mob, avoid spawning if there's another one within 12 tiles + if((ispath(randumb, /mob/living/simple_animal/hostile/spawner/lavaland) || istype(H, /mob/living/simple_animal/hostile/spawner/lavaland)) && get_dist(src, H) <= 2) + return //prevents tendrils spawning in each other's collapse range + + new randumb(T) + return + +#undef SPAWN_MEGAFAUNA + +/turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnFlora(turf/T) + if(prob(12)) + if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored)) + return + var/randumb = pickweight(flora_spawn_list) + for(var/obj/structure/flora/ash/F in range(4, T)) //Allows for growing patches, but not ridiculous stacks of flora + if(!istype(F, randumb)) + return + new randumb(T) + + + +/turf/simulated/floor/plating/asteroid/snow + name = "snow" + desc = "Looks cold." + icon = 'icons/turf/snow.dmi' + baseturf = /turf/simulated/floor/plating/asteroid/snow + icon_state = "snow" + icon_plating = "snow" + temperature = 180 + slowdown = 2 + environment_type = "snow" + sand_type = /obj/item/stack/sheet/mineral/snow + +/turf/simulated/floor/plating/asteroid/snow/airless + temperature = TCMB + oxygen = 0 + nitrogen = 0 + +/turf/simulated/floor/plating/asteroid/snow/temperature + temperature = 255.37 + +/turf/simulated/floor/plating/asteroid/snow/atmosphere + oxygen = 22 + nitrogen = 82 + temperature = 180 \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/chasm.dm b/code/game/turfs/simulated/floor/chasm.dm new file mode 100644 index 00000000000..6a213400d04 --- /dev/null +++ b/code/game/turfs/simulated/floor/chasm.dm @@ -0,0 +1,179 @@ +/turf/simulated/floor/chasm + name = "chasm" + desc = "Watch your step." + baseturf = /turf/simulated/floor/chasm + smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE + icon = 'icons/turf/floors/Chasms.dmi' + icon_state = "smooth" + canSmoothWith = list(/turf/simulated/floor/chasm) + density = TRUE //This will prevent hostile mobs from pathing into chasms, while the canpass override will still let it function like an open turf + var/static/list/falling_atoms = list() //Atoms currently falling into the chasm + var/static/list/forbidden_types = typecacheof(list(/obj/effect/portal, /obj/singularity, /obj/structure/stone_tile, /obj/item/projectile, /obj/effect/temp_visual, /obj/effect/collapse, /obj/effect/collapse)) + var/drop_x = 1 + var/drop_y = 1 + var/drop_z = 1 + +/turf/simulated/floor/chasm/Entered(atom/movable/AM) + ..() + START_PROCESSING(SSprocessing, src) + drop_stuff(AM) + +/turf/simulated/floor/chasm/process() + if(!drop_stuff()) + STOP_PROCESSING(SSprocessing, src) + +/turf/simulated/floor/chasm/attackby(obj/item/C, mob/user, params, area/area_restriction) + ..() + if(istype(C, /obj/item/stack/rods)) + var/obj/item/stack/rods/R = C + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(!L) + if(R.use(1)) + to_chat(user, "You construct a lattice.") + playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + ReplaceWithLattice() + else + to_chat(user, "You need one rod to build a lattice.") + return + if(istype(C, /obj/item/stack/tile/plasteel)) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + var/obj/item/stack/tile/plasteel/S = C + if(S.use(1)) + qdel(L) + playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + to_chat(user, "You build a floor.") + ChangeTurf(/turf/simulated/floor/plating) + else + to_chat(user, "You need one floor tile to build a floor!") + else + to_chat(user, "The plating is going to need some support! Place metal rods first.") + +/turf/simulated/floor/chasm/proc/is_safe() + //if anything matching this typecache is found in the chasm, we don't drop things + var/static/list/chasm_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile)) + var/list/found_safeties = typecache_filter_list(contents, chasm_safeties_typecache) + for(var/obj/structure/stone_tile/S in found_safeties) + if(S.fallen) + LAZYREMOVE(found_safeties, S) + return LAZYLEN(found_safeties) + +/turf/simulated/floor/chasm/proc/drop_stuff(AM) + . = 0 + if(is_safe()) + return FALSE + var/thing_to_check = src + if(AM) + thing_to_check = list(AM) + for(var/thing in thing_to_check) + if(droppable(thing)) + . = 1 + INVOKE_ASYNC(src, .proc/drop, thing) + +/turf/simulated/floor/chasm/proc/droppable(atom/movable/AM) + if(falling_atoms[AM]) + return FALSE + if(!isliving(AM) && !isobj(AM)) + return FALSE + if(!AM.simulated || is_type_in_typecache(AM, forbidden_types) || AM.throwing) + return FALSE + //Flies right over the chasm + if(isliving(AM)) + var/mob/M = AM + if(M.flying) + return FALSE + if(ishuman(AM)) + var/mob/living/carbon/human/H = AM + if(istype(H.belt, /obj/item/wormhole_jaunter)) + var/obj/item/wormhole_jaunter/J = H.belt + //To freak out any bystanders + visible_message("[H] falls into [src]!") + J.chasm_react(H) + return FALSE + return TRUE + +/turf/simulated/floor/chasm/proc/drop(atom/movable/AM) + //Make sure the item is still there after our sleep + if(!AM || QDELETED(AM)) + return + falling_atoms[AM] = TRUE + var/turf/T = locate(drop_x, drop_y, drop_z) + if(T) + AM.visible_message("[AM] falls into [src]!", "GAH! Ah... where are you?") + T.visible_message("[AM] falls from above!") + AM.forceMove(T) + if(isliving(AM)) + var/mob/living/L = AM + L.Weaken(5) + L.adjustBruteLoss(30) + falling_atoms -= AM + +/turf/simulated/floor/chasm/straight_down/Initialize() + . = ..() + drop_x = x + drop_y = y + drop_z = z - 1 + var/turf/T = locate(drop_x, drop_y, drop_z) + if(T) + T.visible_message("The ceiling gives way!") + playsound(T, 'sound/effects/break_stone.ogg', 50, 1) + +/turf/simulated/floor/chasm/straight_down/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + baseturf = /turf/simulated/floor/chasm/straight_down/lava_land_surface + light_range = 1.9 //slightly less range than lava + light_power = 0.65 //less bright, too + light_color = LIGHT_COLOR_LAVA //let's just say you're falling into lava, that makes sense right + +/turf/simulated/floor/chasm/straight_down/lava_land_surface/drop(atom/movable/AM) + //Make sure the item is still there after our sleep + if(!AM || QDELETED(AM)) + return + falling_atoms[AM] = TRUE + AM.visible_message("[AM] falls into [src]!", "You stumble and stare into an abyss before you. It stares back, and you fall \ + into the enveloping dark.") + if(isliving(AM)) + var/mob/living/L = AM + L.notransform = TRUE + L.Stun(200) + L.resting = TRUE + var/oldtransform = AM.transform + var/oldcolor = AM.color + var/oldalpha = AM.alpha + animate(AM, transform = matrix() - matrix(), alpha = 0, color = rgb(0, 0, 0), time = 10) + for(var/i in 1 to 5) + //Make sure the item is still there after our sleep + if(!AM || QDELETED(AM)) + return + AM.pixel_y-- + sleep(2) + + //Make sure the item is still there after our sleep + if(!AM || QDELETED(AM)) + return + + if(isrobot(AM)) + var/mob/living/silicon/robot/S = AM + qdel(S.mmi) + + falling_atoms -= AM + + qdel(AM) + + if(AM && !QDELETED(AM)) //It's indestructible + visible_message("[src] spits out the [AM]!") + AM.alpha = oldalpha + AM.color = oldcolor + AM.transform = oldtransform + AM.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1, 10),rand(1, 10)) + +/turf/simulated/floor/chasm/straight_down/lava_land_surface/normal_air + oxygen = MOLES_O2STANDARD + nitrogen = MOLES_N2STANDARD + temperature = T20C + +/turf/simulated/floor/chasm/CanPass(atom/movable/mover, turf/target) + return 1 \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index e9f8d96e70f..97065cd9711 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -78,31 +78,6 @@ playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) make_plating() -// NEEDS TO BE UPDATED -/turf/simulated/floor/basalt //By your powers combined, I am captain planet - name = "volcanic floor" - icon_state = "basalt0" - oxygen = 14 - nitrogen = 23 - temperature = 300 - -/turf/simulated/floor/basalt/attackby(obj/item/W, mob/user, params) - if(..()) - return - if(istype(W, /obj/item/shovel)) - new /obj/item/stack/ore/glass/basalt(src, 2) - user.visible_message("[user] digs up [src].", "You uproot [src].") - playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) - make_plating() - -/turf/simulated/floor/basalt/New() - ..() - if(prob(15)) - icon_state = "basalt[rand(0, 12)]" - switch(icon_state) - if("basalt1", "basalt2", "basalt3") - set_light(1, 1) - /turf/simulated/floor/carpet name = "carpet" icon = 'icons/turf/floors/carpet.dmi' diff --git a/code/game/turfs/simulated/floor/indestructible.dm b/code/game/turfs/simulated/floor/indestructible.dm new file mode 100644 index 00000000000..6c1679776e6 --- /dev/null +++ b/code/game/turfs/simulated/floor/indestructible.dm @@ -0,0 +1,85 @@ +/turf/simulated/floor/indestructible + unacidable = TRUE + +/turf/simulated/floor/indestructible/ex_act(severity) + return + +/turf/simulated/floor/indestructible/blob_act() + return + +/turf/simulated/floor/indestructible/singularity_act() + return + +/turf/simulated/floor/indestructible/singularity_pull(S, current_size) + return + +/turf/simulated/floor/indestructible/narsie_act() + return + +/turf/simulated/floor/indestructible/ratvar_act(force, ignore_mobs) + return + +/turf/simulated/floor/indestructible/burn_down() + return + +/turf/simulated/floor/indestructible/attackby(obj/item/I, mob/user, params) + return + +/turf/simulated/floor/indestructible/attack_hand(mob/user) + return + +/turf/simulated/floor/indestructible/attack_hulk(mob/user, does_attack_animation = FALSE) + return + +/turf/simulated/floor/indestructible/attack_animal(mob/living/simple_animal/M) + return + +/turf/simulated/floor/indestructible/mech_melee_attack(obj/mecha/M) + return + +/turf/simulated/floor/indestructible/necropolis + name = "necropolis floor" + desc = "It's regarding you suspiciously." + icon = 'icons/turf/floors.dmi' + icon_state = "necro1" + baseturf = /turf/simulated/floor/indestructible/necropolis + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + +/turf/simulated/floor/indestructible/necropolis/Initialize() + . = ..() + if(prob(12)) + icon_state = "necro[rand(2,3)]" + +/turf/simulated/floor/indestructible/necropolis/air + oxygen = 0 + nitrogen = 0 + temperature = T20C + +/turf/simulated/floor/indestructible/boss //you put stone tiles on this and use it as a base + name = "necropolis floor" + icon = 'icons/turf/floors/boss_floors.dmi' + icon_state = "boss" + baseturf = /turf/simulated/floor/indestructible/boss + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + +/turf/simulated/floor/indestructible/boss/air + oxygen = MOLES_O2STANDARD + nitrogen = MOLES_N2STANDARD + temperature = T20C + +/turf/simulated/floor/indestructible/hierophant + icon_state = "hierophant1" + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + desc = "A floor with a square pattern. It's faintly cool to the touch." + +/turf/simulated/floor/indestructible/hierophant/two + icon_state = "hierophant2" diff --git a/code/game/turfs/simulated/floor/lava.dm b/code/game/turfs/simulated/floor/lava.dm new file mode 100644 index 00000000000..0882bb18766 --- /dev/null +++ b/code/game/turfs/simulated/floor/lava.dm @@ -0,0 +1,125 @@ +/turf/simulated/floor/plating/lava + name = "lava" + icon_state = "lava" + gender = PLURAL //"That's some lava." + baseturf = /turf/simulated/floor/plating/lava //lava all the way down + slowdown = 2 + light_range = 2 + light_power = 0.75 + light_color = LIGHT_COLOR_LAVA + +/turf/simulated/floor/plating/lava/New() + ..() + +/turf/simulated/floor/plating/lava/ex_act() + return + +/turf/simulated/floor/plating/lava/airless + temperature = TCMB + +/turf/simulated/floor/plating/lava/Entered(atom/movable/AM) + if(burn_stuff(AM)) + START_PROCESSING(SSprocessing, src) + +/turf/simulated/floor/plating/lava/hitby(atom/movable/AM) + if(burn_stuff(AM)) + START_PROCESSING(SSprocessing, src) + +/turf/simulated/floor/plating/lava/process() + if(!burn_stuff()) + STOP_PROCESSING(SSprocessing, src) + +/turf/simulated/floor/plating/lava/singularity_act() + return + +/turf/simulated/floor/plating/lava/singularity_pull(S, current_size) + return + +/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) + for(var/obj/structure/stone_tile/S in found_safeties) + if(S.fallen) + LAZYREMOVE(found_safeties, S) + return LAZYLEN(found_safeties) + +/turf/simulated/floor/plating/lava/proc/burn_stuff(AM) + . = 0 + + if(is_safe()) + return FALSE + + var/thing_to_check = src + if(AM) + thing_to_check = list(AM) + for(var/thing in thing_to_check) + if(isobj(thing)) + var/obj/O = thing + if(!O.simulated) + continue + if((O.resistance_flags & (LAVA_PROOF|INDESTRUCTIBLE)) || O.throwing) + continue + . = 1 + if((O.resistance_flags & (ON_FIRE))) + continue + if(!(O.resistance_flags & FLAMMABLE)) + O.resistance_flags |= FLAMMABLE //Even fireproof things burn up in lava + if(O.resistance_flags & FIRE_PROOF) + O.resistance_flags &= ~FIRE_PROOF + O.fire_act(10000, 1000) + + else if(isliving(thing)) + . = 1 + var/mob/living/L = thing + if(L.flying) + continue //YOU'RE FLYING OVER IT + if("lava" in L.weather_immunities) + continue + if(L.buckled) + if(isobj(L.buckled)) + var/obj/O = L.buckled + if(O.resistance_flags & LAVA_PROOF) + continue + if(isliving(L.buckled)) //Goliath riding + var/mob/living/live = L.buckled + if("lava" in live.weather_immunities) + continue + + L.adjustFireLoss(20) + if(L) //mobs turning into object corpses could get deleted here. + L.adjust_fire_stacks(20) + L.IgniteMob() + + +/turf/simulated/floor/plating/lava/attackby(obj/item/C, mob/user, params) //Lava isn't a good foundation to build on + return + +/turf/simulated/floor/plating/lava/break_tile() + return + +/turf/simulated/floor/plating/lava/burn_tile() + return + +/turf/simulated/floor/plating/lava/smooth + name = "lava" + baseturf = /turf/simulated/floor/plating/lava/smooth + icon = 'icons/turf/floors/lava.dmi' + icon_state = "unsmooth" + smooth = SMOOTH_MORE | SMOOTH_BORDER + canSmoothWith = list(/turf/simulated/floor/plating/lava/smooth) + +/turf/simulated/floor/plating/lava/smooth/lava_land_surface + temperature = 300 + oxygen = 14 + nitrogen = 23 + planetary_atmos = TRUE + baseturf = /turf/simulated/floor/chasm/straight_down/lava_land_surface + +/turf/simulated/floor/plating/lava/smooth/airless + temperature = TCMB \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm index d201a38d697..a801fd450c5 100644 --- a/code/game/turfs/simulated/floor/mineral.dm +++ b/code/game/turfs/simulated/floor/mineral.dm @@ -80,9 +80,19 @@ //TITANIUM (shuttle) +/turf/simulated/floor/mineral/titanium + name = "shuttle floor" + icon_state = "titanium" + floor_tile = /obj/item/stack/tile/mineral/titanium + broken_states = list("titanium_dam1","titanium_dam2","titanium_dam3","titanium_dam4","titanium_dam5") + +/turf/simulated/floor/mineral/titanium/airless + oxygen = 0.01 + nitrogen = 0.01 + temperature = TCMB + /turf/simulated/floor/mineral/titanium/blue - icon_state = "shuttlefloor" - icons = list("shuttlefloor","shuttlefloor_dam") + icon_state = "titanium_blue" /turf/simulated/floor/mineral/titanium/blue/airless oxygen = 0.01 @@ -90,29 +100,16 @@ temperature = TCMB /turf/simulated/floor/mineral/titanium/yellow - icon_state = "shuttlefloor2" - icons = list("shuttlefloor2","shuttlefloor2_dam") + icon_state = "titanium_yellow" /turf/simulated/floor/mineral/titanium/yellow/airless oxygen = 0.01 nitrogen = 0.01 temperature = TCMB -/turf/simulated/floor/mineral/titanium - name = "shuttle floor" - icon_state = "shuttlefloor3" - floor_tile = /obj/item/stack/tile/mineral/titanium - icons = list("shuttlefloor3","shuttlefloor3_dam") - -/turf/simulated/floor/mineral/titanium/airless - oxygen = 0.01 - nitrogen = 0.01 - temperature = TCMB - /turf/simulated/floor/mineral/titanium/purple - icon_state = "shuttlefloor5" + icon_state = "titanium_purple" floor_tile = /obj/item/stack/tile/mineral/titanium/purple - icons = list("shuttlefloor5","shuttlefloor5_dam") /turf/simulated/floor/mineral/titanium/purple/airless oxygen = 0.01 @@ -122,16 +119,19 @@ //PLASTITANIUM (syndieshuttle) /turf/simulated/floor/mineral/plastitanium name = "shuttle floor" - icon_state = "shuttlefloor4" + icon_state = "plastitanium" floor_tile = /obj/item/stack/tile/mineral/plastitanium - icons = list("shuttlefloor4","shuttlefloor4_dam") + broken_states = list("plastitanium_dam1","plastitanium_dam2","plastitanium_dam3","plastitanium_dam4","plastitanium_dam5") -/turf/simulated/floor/mineral/plastitanium/airless +/turf/simulated/floor/mineral/plastitanium/red + icon_state = "plastitanium_red" + +/turf/simulated/floor/mineral/plastitanium/red/airless oxygen = 0.01 nitrogen = 0.01 temperature = TCMB -/turf/simulated/floor/mineral/plastitanium/brig +/turf/simulated/floor/mineral/plastitanium/red/brig name = "brig floor" //BANANIUM diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 6cfea0cb8f6..5c8f2022189 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -35,10 +35,17 @@ ..() name = "floor" +/turf/simulated/floor/redgrid + icon = 'icons/turf/floors.dmi' + icon_state = "rcircuit" + /turf/simulated/floor/beach name = "beach" icon = 'icons/misc/beach.dmi' +/turf/simulated/floor/beach/pry_tile(obj/item/C, mob/user, silent = FALSE) + return + /turf/simulated/floor/beach/sand name = "sand" icon_state = "sand" @@ -48,19 +55,26 @@ icon = 'icons/misc/beach2.dmi' icon_state = "sandwater" +/turf/simulated/floor/beach/coastline_t + name = "coastline" + desc = "Tide's high tonight. Charge your batons." + icon_state = "sandwater_t" + +/turf/simulated/floor/beach/coastline_b + name = "coastline" + icon_state = "sandwater_b" + /turf/simulated/floor/beach/water // TODO - Refactor water so they share the same parent type - Or alternatively component something like that name = "water" icon_state = "water" mouse_opacity = MOUSE_OPACITY_TRANSPARENT var/obj/machinery/poolcontroller/linkedcontroller = null -/turf/simulated/floor/beach/water/pry_tile(obj/item/C, mob/user, silent = FALSE) - return //cannot pry off tiles of water - - /turf/simulated/floor/beach/water/New() ..() - overlays += image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1) + var/image/overlay_image = image('icons/misc/beach.dmi', icon_state = "water5", layer = ABOVE_MOB_LAYER) + overlay_image.plane = GAME_PLANE + overlays += overlay_image /turf/simulated/floor/beach/water/Entered(atom/movable/AM, atom/OldLoc) . = ..() @@ -97,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) @@ -117,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() @@ -126,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/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index cba841ce823..d36396aaa5f 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -30,4 +30,30 @@ name = "Commemorative Plaque" desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding." -//TODO: Make subtypes for all normal turf icons \ No newline at end of file +//TODO: Make subtypes for all normal turf icons +/turf/simulated/floor/plasteel/white + icon_state = "white" +/turf/simulated/floor/plasteel/white/side + icon_state = "whitehall" +/turf/simulated/floor/plasteel/white/corner + icon_state = "whitecorner" + +/turf/simulated/floor/plasteel/dark + icon_state = "darkfull" + +/turf/simulated/floor/plasteel/freezer + icon_state = "freezerfloor" + +/turf/simulated/floor/plasteel/stairs + icon_state = "stairs" +/turf/simulated/floor/plasteel/stairs/left + icon_state = "stairs-l" +/turf/simulated/floor/plasteel/stairs/medium + icon_state = "stairs-m" +/turf/simulated/floor/plasteel/stairs/right + icon_state = "stairs-r" +/turf/simulated/floor/plasteel/stairs/old + icon_state = "stairs-old" + +/turf/simulated/floor/plasteel/grimy + icon_state = "grimy" diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 22a74ceed46..2ef4602d268 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -2,7 +2,7 @@ name = "plating" icon_state = "plating" icon = 'icons/turf/floors/plating.dmi' - intact = 0 + intact = FALSE floor_tile = null broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5") burnt_states = list("floorscorched1", "floorscorched2") @@ -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 @@ -25,16 +33,16 @@ /turf/simulated/floor/plating/attackby(obj/item/C, mob/user, params) if(..()) - return 1 + return TRUE if(istype(C, /obj/item/stack/rods)) if(broken || burnt) to_chat(user, "Repair the plating first!") - return 1 + return TRUE var/obj/item/stack/rods/R = C if(R.get_amount() < 2) to_chat(user, "You need two rods to make a reinforced floor!") - return 1 + return TRUE else to_chat(user, "You begin reinforcing the floor...") if(do_after(user, 30 * C.toolspeed, target = src)) @@ -43,7 +51,7 @@ playsound(src, C.usesound, 80, 1) R.use(2) to_chat(user, "You reinforce the floor.") - return 1 + return TRUE else if(istype(C, /obj/item/stack/tile)) if(!broken && !burnt) @@ -54,20 +62,39 @@ playsound(src, 'sound/weapons/genhit.ogg', 50, 1) else to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.") - return 1 + 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 current_overlay = null - burnt = 0 - broken = 0 + burnt = FALSE + broken = FALSE update_icon() - return 1 + 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" @@ -87,6 +114,7 @@ var/insulated heat_capacity = 325000 floor_tile = /obj/item/stack/rods + unacidable = TRUE /turf/simulated/floor/engine/break_tile() return //unbreakable @@ -94,11 +122,17 @@ /turf/simulated/floor/engine/burn_tile() return //unburnable -/turf/simulated/floor/engine/make_plating(var/force = 0) +/turf/simulated/floor/engine/make_plating(force = 0) if(force) ..() return //unplateable +/turf/simulated/floor/engine/attack_hand(mob/user as mob) + user.Move_Pulled(src) + +/turf/simulated/floor/engine/pry_tile(obj/item/C, mob/user, silent = FALSE) + return + /turf/simulated/floor/engine/attackby(obj/item/C as obj, mob/user as mob, params) if(!C || !user) return @@ -111,6 +145,7 @@ new /obj/item/stack/rods(src, 2) ChangeTurf(/turf/simulated/floor/plating) return + if(istype(C, /obj/item/stack/sheet/plasteel) && !insulated) //Insulating the floor to_chat(user, "You begin insulating [src]...") if(do_after(user, 40, target = src) && !insulated) //You finish insulating the insulated insulated insulated insulated insulated insulated insulated insulated vacuum floor @@ -122,30 +157,26 @@ name = "insulated " + name return -/turf/simulated/floor/engine/ex_act(severity,target) +/turf/simulated/floor/engine/ex_act(severity) switch(severity) if(1) - if(prob(80)) - ReplaceWithLattice() - else if(prob(50)) - qdel(src) - else - if(builtin_tile) - builtin_tile.loc = src - builtin_tile = null - make_plating(1) + ChangeTurf(baseturf) if(2) if(prob(50)) - make_plating(1) + ChangeTurf(baseturf) +/turf/simulated/floor/engine/blob_act() + if(prob(25)) + ChangeTurf(baseturf) + /turf/simulated/floor/engine/cult name = "engraved floor" icon_state = "cult" /turf/simulated/floor/engine/cult/New() ..() - if(ticker.mode)//only do this if the round is going..otherwise..fucking asteroid.. - icon_state = ticker.cultdat.cult_floor_icon_state + if(SSticker.mode)//only do this if the round is going..otherwise..fucking asteroid.. + icon_state = SSticker.cultdat.cult_floor_icon_state /turf/simulated/floor/engine/cult/narsie_act() return @@ -204,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' @@ -212,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' @@ -220,59 +257,8 @@ /turf/simulated/floor/snow/ex_act(severity) return - -// CATWALKS -// Space and plating, all in one buggy fucking turf! -// These are *so* fucking bad it makes me want to kill myself -/turf/simulated/floor/plating/airless/catwalk - icon = 'icons/turf/catwalks.dmi' - icon_state = "catwalk0" - name = "catwalk" - desc = "Cats really don't like these things." - - temperature = TCMB - thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT - heat_capacity = 700000 - -/turf/simulated/floor/plating/airless/catwalk/New() - ..() - set_light(4) //starlight - name = "catwalk" - update_icon(1) - -/turf/simulated/floor/plating/airless/catwalk/update_icon(var/propogate=1) - underlays.Cut() - underlays += new /icon('icons/turf/space.dmi',SPACE_ICON_STATE) - - var/dirs = 0 - for(var/direction in cardinal) - var/turf/T = get_step(src,direction) - if(istype(T, /turf/simulated/floor/plating/airless/catwalk)) - var/turf/simulated/floor/plating/airless/catwalk/C=T - dirs |= direction - if(propogate) - C.update_icon(0) - icon_state="catwalk[dirs]" - -/turf/simulated/floor/plating/airless/catwalk/attackby(obj/item/C, mob/user, params) - if(istype(C, /obj/item/stack/rods)) - return 1 - else if(istype(C, /obj/item/stack/tile)) - return 1 - - if(..()) - return 1 - - if(!broken && isscrewdriver(C)) - to_chat(user, "You unscrew the catwalk's rods.") - new /obj/item/stack/rods(src, 1) - ReplaceWithLattice() - for(var/direction in cardinal) - var/turf/T = get_step(src,direction) - if(istype(T, /turf/simulated/floor/plating/airless/catwalk)) - var/turf/simulated/floor/plating/airless/catwalk/CW=T - CW.update_icon(0) - playsound(src, C.usesound, 80, 1) +/turf/simulated/floor/snow/pry_tile(obj/item/C, mob/user, silent = FALSE) + return /turf/simulated/floor/plating/metalfoam name = "foamed metal plating" @@ -292,7 +278,8 @@ /turf/simulated/floor/plating/metalfoam/attackby(var/obj/item/C, mob/user, params) if(..()) - return 1 + return TRUE + if(istype(C) && C.force) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) @@ -322,7 +309,7 @@ smash() /turf/simulated/floor/plating/metalfoam/proc/smash() - ChangeTurf(/turf/space) + ChangeTurf(baseturf) /turf/simulated/floor/plating/abductor name = "alien floor" diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm new file mode 100644 index 00000000000..119f0b000d9 --- /dev/null +++ b/code/game/turfs/simulated/minerals.dm @@ -0,0 +1,515 @@ +/**********************Mineral deposits**************************/ + +/turf/simulated/mineral //wall piece + name = "rock" + icon = 'icons/turf/mining.dmi' + icon_state = "rock" + var/smooth_icon = 'icons/turf/smoothrocks.dmi' + smooth = SMOOTH_MORE | SMOOTH_BORDER + canSmoothWith + baseturf = /turf/simulated/floor/plating/asteroid/airless + temperature = 2.7 + opacity = 1 + density = 1 + blocks_air = 1 + layer = EDGED_TURF_LAYER + temperature = TCMB + var/environment_type = "asteroid" + var/turf/simulated/floor/plating/turf_type = /turf/simulated/floor/plating/asteroid/airless + var/mineralType = null + var/mineralAmt = 3 + var/spread = 0 //will the seam spread? + var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles + var/last_act = 0 + var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner + var/defer_change = FALSE + +/turf/simulated/mineral/New() + if (!canSmoothWith) + canSmoothWith = list(/turf/simulated/mineral) + pixel_y = -4 + pixel_x = -4 + icon = smooth_icon + + ..() + GLOB.mineral_turfs += src + + if (mineralType && mineralAmt && spread && spreadChance) + for(var/dir in cardinal) + if(prob(spreadChance)) + var/turf/T = get_step(src, dir) + if(istype(T, /turf/simulated/mineral/random)) + Spread(T) + +/turf/simulated/mineral/Spread(turf/T) + T.ChangeTurf(type) + +/turf/simulated/mineral/shuttleRotate(rotation) + setDir(angle2dir(rotation + dir2angle(dir))) + queue_smooth(src) + +/turf/simulated/mineral/attackby(var/obj/item/pickaxe/P as obj, mob/user as mob, params) + if(!user.IsAdvancedToolUser()) + to_chat(usr, "You don't have the dexterity to do this!") + return + + if(istype(P, /obj/item/pickaxe)) + var/turf/T = user.loc + if(!isturf(T)) + return + + if(last_act + (40 * P.toolspeed) > world.time) // Prevents message spam + return + + last_act = world.time + to_chat(user, "You start picking...") + P.playDigSound() + + if(do_after(user, 40 * P.toolspeed, target = src)) + if(istype(src, /turf/simulated/mineral)) //sanity check against turf being deleted during digspeed delay + to_chat(user, "You finish cutting into the rock.") + P.update_icon() + gets_drilled(user) + feedback_add_details("pick_used_mining","[P.name]") + else + return attack_hand(user) + +/turf/simulated/mineral/proc/gets_drilled() + if(mineralType && (mineralAmt > 0) && (mineralAmt < 11)) + var/i + for(i=0; i < mineralAmt; i++) + new mineralType(src) + feedback_add_details("ore_mined","[mineralType]|[mineralAmt]") + ChangeTurf(turf_type, defer_change) + addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE) + playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction + + if(rand(1, 750) == 1) + visible_message("An old dusty crate was buried within!") + new /obj/structure/closet/crate/secure/loot(src) + + return + +/turf/simulated/mineral/attack_animal(mob/living/simple_animal/user as mob) + if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS)) + gets_drilled() + ..() + +/turf/simulated/mineral/attack_alien(var/mob/living/carbon/alien/M) + to_chat(M, "You start digging into the rock...") + playsound(src, 'sound/effects/break_stone.ogg', 50, 1) + if(do_after(M, 40, target = src)) + to_chat(M, "You tunnel into the rock.") + gets_drilled() + +/turf/simulated/mineral/Bumped(AM as mob|obj) + . = ..() + if(ishuman(AM)) + var/mob/living/carbon/human/H = AM + if((istype(H.l_hand,/obj/item/pickaxe)) && (!H.hand)) + attackby(H.l_hand,H) + else if((istype(H.r_hand,/obj/item/pickaxe)) && H.hand) + attackby(H.r_hand,H) + return + + else if(isrobot(AM)) + var/mob/living/silicon/robot/R = AM + if(istype(R.module_active,/obj/item/pickaxe)) + attackby(R.module_active,R) + + else if(ismecha(AM)) + var/obj/mecha/M = AM + if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/drill)) + M.selected.action(src) + +/turf/simulated/mineral/ex_act(severity, target) + ..() + switch(severity) + if(3) + if (prob(75)) + gets_drilled(null, 1) + if(2) + if (prob(90)) + gets_drilled(null, 1) + if(1) + gets_drilled(null, 1) + +/turf/simulated/mineral/random + var/mineralSpawnChanceList + var/mineralChance = 13 + var/display_icon_state = "rock" + +/turf/simulated/mineral/random/New() + if (!mineralSpawnChanceList) + mineralSpawnChanceList = list( + /turf/simulated/mineral/uranium = 5, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 10, + /turf/simulated/mineral/silver = 12, /turf/simulated/mineral/plasma = 20, /turf/simulated/mineral/iron = 40, /turf/simulated/mineral/titanium = 11, + /turf/simulated/mineral/gibtonite = 4, /turf/simulated/floor/plating/asteroid/airless/cave = 2, /turf/simulated/mineral/bscrystal = 1) + if (display_icon_state) + icon_state = display_icon_state + ..() + if (prob(mineralChance)) + var/path = pickweight(mineralSpawnChanceList) + var/turf/T = ChangeTurf(path,FALSE,TRUE) + + if(T && ismineralturf(T)) + var/turf/simulated/mineral/M = T + M.mineralAmt = rand(1, 5) + M.environment_type = environment_type + M.turf_type = turf_type + M.baseturf = baseturf + src = M + M.levelupdate() + +/turf/simulated/mineral/random/high_chance + icon_state = "rock_highchance" + mineralChance = 25 + mineralSpawnChanceList = list( + /turf/simulated/mineral/uranium = 35, /turf/simulated/mineral/diamond = 30, /turf/simulated/mineral/gold = 45, /turf/simulated/mineral/titanium = 45, + /turf/simulated/mineral/silver = 50, /turf/simulated/mineral/plasma = 50, /turf/simulated/mineral/bscrystal = 20) + +/turf/simulated/mineral/random/high_chance/clown + mineralChance = 40 + mineralSpawnChanceList = list( + /turf/simulated/mineral/uranium = 35, /turf/simulated/mineral/diamond = 2, /turf/simulated/mineral/gold = 5, /turf/simulated/mineral/silver = 5, + /turf/simulated/mineral/iron = 30, /turf/simulated/mineral/clown = 15, /turf/simulated/mineral/mime = 15, /turf/simulated/mineral/bscrystal = 10) + +/turf/simulated/mineral/random/high_chance/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + mineralSpawnChanceList = list( + /turf/simulated/mineral/uranium/volcanic = 35, /turf/simulated/mineral/diamond/volcanic = 30, /turf/simulated/mineral/gold/volcanic = 45, /turf/simulated/mineral/titanium/volcanic = 45, + /turf/simulated/mineral/silver/volcanic = 50, /turf/simulated/mineral/plasma/volcanic = 50, /turf/simulated/mineral/bscrystal/volcanic = 20) + +/turf/simulated/mineral/random/low_chance + icon_state = "rock_lowchance" + mineralChance = 6 + mineralSpawnChanceList = list( + /turf/simulated/mineral/uranium = 2, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 4, /turf/simulated/mineral/titanium = 4, + /turf/simulated/mineral/silver = 6, /turf/simulated/mineral/plasma = 15, /turf/simulated/mineral/iron = 40, + /turf/simulated/mineral/gibtonite = 2, /turf/simulated/mineral/bscrystal = 1) + +/turf/simulated/mineral/random/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + + mineralChance = 10 + mineralSpawnChanceList = list( + /turf/simulated/mineral/uranium/volcanic = 5, /turf/simulated/mineral/diamond/volcanic = 1, /turf/simulated/mineral/gold/volcanic = 10, /turf/simulated/mineral/titanium/volcanic = 11, + /turf/simulated/mineral/silver/volcanic = 12, /turf/simulated/mineral/plasma/volcanic = 20, /turf/simulated/mineral/iron/volcanic = 40, + /turf/simulated/mineral/gibtonite/volcanic = 4, /turf/simulated/floor/plating/asteroid/airless/cave/volcanic = 1, /turf/simulated/mineral/bscrystal/volcanic = 1) + +/turf/simulated/mineral/random/labormineral + mineralSpawnChanceList = list( + /turf/simulated/mineral/uranium = 2, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 3, /turf/simulated/mineral/titanium = 4, + /turf/simulated/mineral/silver = 6, /turf/simulated/mineral/plasma = 15, /turf/simulated/mineral/iron = 80, + /turf/simulated/mineral/gibtonite = 3) + icon_state = "rock_labor" + +/turf/simulated/mineral/random/labormineral/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + mineralSpawnChanceList = list( + /turf/simulated/mineral/uranium/volcanic = 2, /turf/simulated/mineral/diamond/volcanic = 1, /turf/simulated/mineral/gold/volcanic = 3, /turf/simulated/mineral/titanium/volcanic = 4, + /turf/simulated/mineral/silver/volcanic = 6, /turf/simulated/mineral/plasma/volcanic = 15, /turf/simulated/mineral/iron/volcanic = 80, + /turf/simulated/mineral/gibtonite/volcanic = 3) + +// Actual minerals +/turf/simulated/mineral/iron + mineralType = /obj/item/stack/ore/iron + spreadChance = 20 + spread = 1 + scan_state = "rock_Iron" + +/turf/simulated/mineral/iron/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + +/turf/simulated/mineral/uranium + mineralType = /obj/item/stack/ore/uranium + spreadChance = 5 + spread = 1 + scan_state = "rock_Uranium" + +/turf/simulated/mineral/uranium/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + +/turf/simulated/mineral/diamond + mineralType = /obj/item/stack/ore/diamond + spreadChance = 0 + spread = 1 + scan_state = "rock_Diamond" + +/turf/simulated/mineral/diamond/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + +/turf/simulated/mineral/gold + mineralType = /obj/item/stack/ore/gold + spreadChance = 5 + spread = 1 + scan_state = "rock_Gold" + +/turf/simulated/mineral/gold/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + +/turf/simulated/mineral/silver + mineralType = /obj/item/stack/ore/silver + spreadChance = 5 + spread = 1 + scan_state = "rock_Silver" + +/turf/simulated/mineral/silver/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + +/turf/simulated/mineral/titanium + mineralType = /obj/item/stack/ore/titanium + spreadChance = 5 + spread = 1 + scan_state = "rock_Titanium" + +/turf/simulated/mineral/titanium/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + +/turf/simulated/mineral/plasma + mineralType = /obj/item/stack/ore/plasma + spreadChance = 8 + spread = 1 + scan_state = "rock_Plasma" + +/turf/simulated/mineral/plasma/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + +/turf/simulated/mineral/clown + mineralType = /obj/item/stack/ore/bananium + mineralAmt = 3 + spreadChance = 0 + spread = 0 + scan_state = "rock_Clown" + +/turf/simulated/mineral/clown/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + +/turf/simulated/mineral/mime + mineralType = /obj/item/stack/ore/tranquillite + mineralAmt = 3 + spreadChance = 0 + spread = 0 + +/turf/simulated/mineral/mime/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + +/turf/simulated/mineral/bscrystal + mineralType = /obj/item/stack/ore/bluespace_crystal + mineralAmt = 1 + spreadChance = 0 + spread = 0 + scan_state = "rock_BScrystal" + +/turf/simulated/mineral/bscrystal/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + +/turf/simulated/mineral/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt + baseturf = /turf/simulated/floor/plating/asteroid/basalt + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + +/turf/simulated/mineral/volcanic/lava_land_surface + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface + defer_change = 1 + +// Gibtonite +/turf/simulated/mineral/gibtonite + mineralAmt = 1 + spreadChance = 0 + spread = 0 + scan_state = "rock_Gibtonite" + var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it + var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction + var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes + var/activated_name = null + var/activated_image = null + +/turf/simulated/mineral/gibtonite/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + planetary_atmos = TRUE + defer_change = 1 + +/turf/simulated/mineral/gibtonite/New() + det_time = rand(8,10) //So you don't know exactly when the hot potato will explode + ..() + +/turf/simulated/mineral/gibtonite/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner) && stage == 1) + user.visible_message("You use [I] to locate where to cut off the chain reaction and attempt to stop it...") + defuse() + ..() + +/turf/simulated/mineral/gibtonite/proc/explosive_reaction(var/mob/user = null, triggered_by_explosion = 0) + if(stage == 0) + var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = ON_EDGED_TURF_LAYER) + add_overlay(I) + activated_image = I + name = "gibtonite deposit" + desc = "An active gibtonite reserve. Run!" + stage = 1 + visible_message("There was gibtonite inside! It's going to explode!") + var/turf/bombturf = get_turf(src) + var/area/A = get_area(bombturf) + + var/notify_admins = 0 + if(z != 5) + notify_admins = 1 + if(!triggered_by_explosion) + message_admins("[key_name_admin(user)] has triggered a gibtonite deposit reaction at [A.name] (JMP).") + else + message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] (JMP).") + + if(!triggered_by_explosion) + log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] ([A.x], [A.y], [A.z]).") + else + log_game("An explosion has triggered a gibtonite deposit reaction at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") + + countdown(notify_admins) + +/turf/simulated/mineral/gibtonite/proc/countdown(notify_admins = 0) + set waitfor = 0 + while(istype(src, /turf/simulated/mineral/gibtonite) && stage == 1 && det_time > 0 && mineralAmt >= 1) + det_time-- + sleep(5) + if(istype(src, /turf/simulated/mineral/gibtonite)) + if(stage == 1 && det_time <= 0 && mineralAmt >= 1) + var/turf/bombturf = get_turf(src) + mineralAmt = 0 + stage = 3 + explosion(bombturf,1,3,5, adminlog = notify_admins) + +/turf/simulated/mineral/gibtonite/proc/defuse() + if(stage == 1) + overlays -= activated_image + var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = ON_EDGED_TURF_LAYER) + add_overlay(I) + desc = "An inactive gibtonite reserve. The ore can be extracted." + stage = 2 + if(det_time < 0) + det_time = 0 + visible_message("The chain reaction was stopped! The gibtonite had [src.det_time] reactions left till the explosion!") + +/turf/simulated/mineral/gibtonite/gets_drilled(var/mob/user, triggered_by_explosion = 0) + if(stage == 0 && mineralAmt >= 1) //Gibtonite deposit is activated + playsound(src, 'sound/effects/hit_on_shattered_glass.ogg',50,1) + explosive_reaction(user, triggered_by_explosion) + return + if(stage == 1 && mineralAmt >= 1) //Gibtonite deposit goes kaboom + var/turf/bombturf = get_turf(src) + mineralAmt = 0 + stage = 3 + explosion(bombturf, 1, 2, 5, adminlog = 0) + if(stage == 2) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore. + var/obj/item/twohanded/required/gibtonite/G = new /obj/item/twohanded/required/gibtonite/(src) + if(det_time <= 0) + G.quality = 3 + G.icon_state = "Gibtonite ore 3" + if(det_time >= 1 && det_time <= 2) + G.quality = 2 + G.icon_state = "Gibtonite ore 2" + + ChangeTurf(turf_type, defer_change) + addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE) diff --git a/code/game/turfs/simulated/river.dm b/code/game/turfs/simulated/river.dm new file mode 100644 index 00000000000..ed13f127019 --- /dev/null +++ b/code/game/turfs/simulated/river.dm @@ -0,0 +1,108 @@ +#define RANDOM_UPPER_X 200 +#define RANDOM_UPPER_Y 200 + +#define RANDOM_LOWER_X 50 +#define RANDOM_LOWER_Y 50 + +/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/simulated/floor/plating/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors/unexplored, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y) + var/list/river_nodes = list() + var/num_spawned = 0 + var/list/possible_locs = block(locate(min_x, min_y, target_z), locate(max_x, max_y, target_z)) + while(num_spawned < nodes && possible_locs.len) + var/turf/T = pick(possible_locs) + var/area/A = get_area(T) + if(!istype(A, whitelist_area) || (T.flags & NO_LAVA_GEN)) + possible_locs -= T + else + river_nodes += new /obj/effect/landmark/river_waypoint(T) + num_spawned++ + + //make some randomly pathing rivers + for(var/A in river_nodes) + var/obj/effect/landmark/river_waypoint/W = A + if (W.z != target_z || W.connected) + continue + W.connected = 1 + var/turf/cur_turf = get_turf(W) + cur_turf.ChangeTurf(turf_type, ignore_air = TRUE) + var/turf/target_turf = get_turf(pick(river_nodes - W)) + if(!target_turf) + break + var/detouring = 0 + var/cur_dir = get_dir(cur_turf, target_turf) + while(cur_turf != target_turf) + + if(detouring) //randomly snake around a bit + if(prob(20)) + detouring = 0 + cur_dir = get_dir(cur_turf, target_turf) + else if(prob(20)) + detouring = 1 + if(prob(50)) + cur_dir = turn(cur_dir, 45) + else + cur_dir = turn(cur_dir, -45) + else + cur_dir = get_dir(cur_turf, target_turf) + + cur_turf = get_step(cur_turf, cur_dir) + var/area/new_area = get_area(cur_turf) + if(!istype(new_area, whitelist_area) || (cur_turf.flags & NO_LAVA_GEN)) //Rivers will skip ruins + detouring = 0 + cur_dir = get_dir(cur_turf, target_turf) + cur_turf = get_step(cur_turf, cur_dir) + continue + else + var/turf/river_turf = cur_turf.ChangeTurf(turf_type, ignore_air = TRUE) + river_turf.Spread(25, 11, whitelist_area) + + for(var/WP in river_nodes) + qdel(WP) + + +/obj/effect/landmark/river_waypoint + name = "river waypoint" + var/connected = 0 + invisibility = INVISIBILITY_ABSTRACT + + +/turf/proc/Spread(probability = 30, prob_loss = 25, whitelisted_area) + if(probability <= 0) + return + var/list/cardinal_turfs = list() + var/list/diagonal_turfs = list() + var/logged_turf_type + for(var/F in RANGE_TURFS(1, src) - src) + var/turf/T = F + var/area/new_area = get_area(T) + if(!T || (T.density && !ismineralturf(T)) || istype(T, /turf/unsimulated) || (whitelisted_area && !istype(new_area, whitelisted_area)) || (T.flags & NO_LAVA_GEN) ) + continue + + if(!logged_turf_type && ismineralturf(T)) + var/turf/simulated/mineral/M = T + logged_turf_type = M.turf_type + + if(get_dir(src, F) in cardinal) + cardinal_turfs += F + else + diagonal_turfs += F + + for(var/F in cardinal_turfs) //cardinal turfs are always changed but don't always spread + var/turf/T = F + if(!istype(T, logged_turf_type) && T.ChangeTurf(type, ignore_air = TRUE) && prob(probability)) + T.Spread(probability - prob_loss, prob_loss, whitelisted_area) + + for(var/F in diagonal_turfs) //diagonal turfs only sometimes change, but will always spread if changed + var/turf/T = F + if(!istype(T, logged_turf_type) && prob(probability) && T.ChangeTurf(type, ignore_air = TRUE)) + T.Spread(probability - prob_loss, prob_loss, whitelisted_area) + else if(ismineralturf(T)) + var/turf/simulated/mineral/M = T + M.ChangeTurf(M.turf_type, ignore_air = TRUE) + + +#undef RANDOM_UPPER_X +#undef RANDOM_UPPER_Y + +#undef RANDOM_LOWER_X +#undef RANDOM_LOWER_Y diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 6fddc40dfa9..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 @@ -49,7 +50,6 @@ qdel(WR) . = ..() - //Appearance /turf/simulated/wall/examine(mob/user) . = ..(user) @@ -137,7 +137,7 @@ var/obj/structure/sign/poster/P = O P.roll_and_drop(src) else - O.loc = src + O.forceMove(src) ChangeTurf(/turf/simulated/floor/plating) @@ -152,7 +152,7 @@ /turf/simulated/wall/ex_act(severity) switch(severity) if(1.0) - src.ChangeTurf(/turf/space) + ChangeTurf(baseturf) return if(2.0) if(prob(50)) @@ -253,6 +253,7 @@ /turf/simulated/wall/attack_hulk(mob/user, does_attack_animation = FALSE) ..(user, TRUE) + if(prob(hardness) || rotting) playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) @@ -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 new file mode 100644 index 00000000000..e25992a2555 --- /dev/null +++ b/code/game/turfs/simulated/walls_indestructible.dm @@ -0,0 +1,76 @@ +/turf/simulated/wall/indestructible + unacidable = TRUE + +/turf/simulated/wall/indestructible/dismantle_wall(devastated = 0, explode = 0) + return + +/turf/simulated/wall/indestructible/take_damage(dam) + return + +/turf/simulated/wall/indestructible/ex_act(severity) + return + +/turf/simulated/wall/indestructible/blob_act() + return + +/turf/simulated/wall/indestructible/singularity_act() + return + +/turf/simulated/wall/indestructible/singularity_pull(S, current_size) + return + +/turf/simulated/wall/indestructible/narsie_act() + return + +/turf/simulated/wall/indestructible/ratvar_act(force, ignore_mobs) + return + +/turf/simulated/wall/indestructible/burn_down() + return + +/turf/simulated/wall/indestructible/attackby(obj/item/I, mob/user, params) + return + +/turf/simulated/wall/indestructible/attack_hand(mob/user) + return + +/turf/simulated/wall/indestructible/attack_hulk(mob/user, does_attack_animation = FALSE) + return + +/turf/simulated/wall/indestructible/attack_animal(mob/living/simple_animal/M) + return + +/turf/simulated/wall/indestructible/mech_melee_attack(obj/mecha/M) + return + +/turf/simulated/wall/indestructible/necropolis + name = "necropolis wall" + desc = "A seemingly impenetrable wall." + icon = 'icons/turf/walls.dmi' + icon_state = "necro" + explosion_block = 50 + baseturf = /turf/simulated/wall/indestructible/necropolis + +/turf/simulated/wall/indestructible/boss + name = "necropolis wall" + desc = "A thick, seemingly indestructible stone wall." + icon = 'icons/turf/walls/boss_wall.dmi' + icon_state = "wall" + canSmoothWith = list(/turf/simulated/wall/indestructible/boss, /turf/simulated/wall/indestructible/boss/see_through) + explosion_block = 50 + baseturf = /turf/simulated/floor/plating/asteroid/basalt + smooth = SMOOTH_TRUE + +/turf/simulated/wall/indestructible/boss/see_through + opacity = FALSE + +/turf/simulated/wall/indestructible/hierophant + name = "wall" + desc = "A wall made out of smooth, cold stone." + icon = 'icons/turf/walls/hierophant_wall.dmi' + icon_state = "hierophant" + smooth = SMOOTH_TRUE + +/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_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index a0b3eb3f554..74d0e216614 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -275,6 +275,36 @@ icon_state = "map-overspace" fixed_underlay = list("space"=1) +/turf/simulated/wall/mineral/plastitanium/coated + name = "coated wall" + max_temperature = INFINITY + icon_state = "map-shuttle_nd" + smooth = SMOOTH_MORE + +/turf/simulated/wall/mineral/plastitanium/coated/Initialize(mapload) + . = ..() + desc += " It seems to have additional plating to protect against heat." + +/turf/simulated/wall/mineral/plastitanium/explosive + var/explosive_wall_group = EXPLOSIVE_WALL_GROUP_SYNDICATE_BASE + icon_state = "map-shuttle_nd" + smooth = SMOOTH_MORE + +/turf/simulated/wall/mineral/plastitanium/explosive/Initialize(mapload) + . = ..() + GLOB.explosive_walls += src + +/turf/simulated/wall/mineral/plastitanium/explosive/Destroy() + GLOB.explosive_walls -= src + return ..() + +/turf/simulated/wall/mineral/plastitanium/explosive/proc/self_destruct() + var/obj/item/bombcore/large/explosive_wall/bombcore = new(get_turf(src)) + bombcore.detonate() + +/turf/simulated/wall/mineral/plastitanium/explosive/ex_act(severity) + return + //have to copypaste this code /turf/simulated/wall/mineral/plastitanium/interior/copyTurf(turf/T) if(T.type != type) diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index 18492da2d00..b2d6b40c123 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -12,9 +12,9 @@ /turf/simulated/wall/cult/New() ..() - if(ticker.mode)//game hasn't started offically don't do shit.. + if(SSticker.mode)//game hasn't started offically don't do shit.. new /obj/effect/temp_visual/cult/turf(src) - icon_state = ticker.cultdat.cult_wall_icon_state + icon_state = SSticker.cultdat.cult_wall_icon_state /turf/simulated/wall/cult/artificer name = "runed stone wall" @@ -49,4 +49,101 @@ name = "coated reinforced wall" 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 \ No newline at end of file + 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/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index f1837173d6d..45abe2e155c 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -12,6 +12,7 @@ sheet_type = /obj/item/stack/sheet/plasteel sheet_amount = 1 girder_type = /obj/structure/girder/reinforced + unacidable = TRUE var/d_state = RWALL_INTACT var/can_be_reinforced = 1 diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 42f19fb2f7f..0d6428b10a2 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -2,26 +2,36 @@ icon = 'icons/turf/space.dmi' name = "\proper space" icon_state = "0" - dynamic_lighting = 0 - luminosity = 1 temperature = TCMB thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT - heat_capacity = 700000 + heat_capacity = HEAT_CAPACITY_VACUUM + + plane = PLANE_SPACE + layer = SPACE_LAYER + light_power = 0.25 + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + intact = FALSE var/destination_z var/destination_x var/destination_y -/turf/space/New() - . = ..() - +/turf/space/Initialize(mapload) if(!istype(src, /turf/space/transit)) icon_state = SPACE_ICON_STATE - if(update_starlight() && is_station_level(z)) - // before you ask: Yes, this is fucking stupid, but looping through turf/space in world is how you make the server freeze - // so I don't see a better way of doing this - LAZYADD(GLOB.station_level_space_turfs, src) + + var/area/A = loc + if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) + add_overlay(/obj/effect/fullbright) + + if (light_power && light_range) + update_light() + + if (opacity) + has_opaque_atom = TRUE + + return INITIALIZE_HINT_NORMAL /turf/space/Destroy(force) if(force) @@ -29,7 +39,6 @@ else return QDEL_HINT_LETMELIVE - /turf/space/BeforeChange() ..() var/datum/space_level/S = space_manager.get_zlev(z) @@ -44,26 +53,29 @@ S.apply_transition(src) /turf/space/proc/update_starlight() - if(!config.starlight) - return FALSE - if(locate(/turf/simulated) in orange(src,1)) - set_light(config.starlight) - return TRUE - else + if(config.starlight) + for(var/t in RANGE_TURFS(1,src)) //RANGE_TURFS is in code\__HELPERS\game.dm + if(isspaceturf(t)) + //let's NOT update this that much pls + continue + set_light(2) + return set_light(0) - return FALSE /turf/space/attackby(obj/item/C as obj, mob/user as mob, params) ..() if(istype(C, /obj/item/stack/rods)) var/obj/item/stack/rods/R = C var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + var/obj/structure/lattice/catwalk/W = locate(/obj/structure/lattice/catwalk, src) + if(W) + to_chat(user, "There is already a catwalk here!") + return if(L) if(R.use(1)) - to_chat(user, "You begin constructing catwalk...") + to_chat(user, "You construct a catwalk.") playsound(src, 'sound/weapons/genhit.ogg', 50, 1) - qdel(L) - ChangeTurf(/turf/simulated/floor/plating/airless/catwalk) + new/obj/structure/lattice/catwalk(src) else to_chat(user, "You need two rods to build a catwalk!") return @@ -91,17 +103,17 @@ /turf/space/Entered(atom/movable/A as mob|obj, atom/OL, ignoreRest = 0) ..() + if((!(A) || !(src in A.locs))) + return - if(destination_z && A && (src in A.locs)) - A.x = destination_x - A.y = destination_y - A.z = destination_z + if(destination_z && destination_x && destination_y) + A.forceMove(locate(destination_x, destination_y, destination_z)) if(isliving(A)) var/mob/living/L = A if(L.pulling) var/turf/T = get_step(L.loc,turn(A.dir, 180)) - L.pulling.loc = T + L.pulling.forceMove(T) //now we're on the new z_level, proceed the space drifting sleep(0)//Let a diagonal move finish, if necessary @@ -220,6 +232,8 @@ return /turf/space/can_have_cabling() + if(locate(/obj/structure/lattice/catwalk, src)) + return 1 return 0 /turf/space/proc/set_transition_north(dest_z) @@ -244,3 +258,8 @@ /turf/space/proc/remove_transitions() destination_z = initial(destination_z) + +/turf/space/attack_ghost(mob/dead/observer/user) + if(destination_z) + var/turf/T = locate(destination_x, destination_y, destination_z) + user.forceMove(T) \ No newline at end of file diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index c08189e4d93..79bf171ce1f 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -88,7 +88,7 @@ /turf/space/transit/Entered(atom/movable/AM, atom/OldLoc, ignoreRest = 0) if(!AM) return - if(istype(AM, /obj/docking_port) || !AM.simulated) + if(!AM.simulated || istype(AM, /obj/docking_port)) return //this was fucking hilarious, the docking ports were getting thrown to random Z-levels var/max = world.maxx-TRANSITIONEDGE var/min = 1+TRANSITIONEDGE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 677357cf170..e315ad26ad0 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -38,9 +38,22 @@ ..() for(var/atom/movable/AM in src) Entered(AM) - if(smooth && ticker && ticker.current_state == GAME_STATE_PLAYING) + if(smooth && SSticker && SSticker.current_state == GAME_STATE_PLAYING) queue_smooth(src) +/turf/Initialize(mapload) + . = ..() + + var/area/A = loc + if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) + add_overlay(/obj/effect/fullbright) + + if(light_power && light_range) + update_light() + + if (opacity) + has_opaque_atom = TRUE + /hook/startup/proc/smooth_world() var/watch = start_watch() log_startup_progress("Smoothing atoms...") @@ -167,17 +180,21 @@ if(L) qdel(L) +/turf/proc/TerraformTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE) + return ChangeTurf(path, defer_change, keep_icon, ignore_air) + //Creates a new turf -/turf/proc/ChangeTurf(path, defer_change = FALSE, keep_icon = TRUE) +/turf/proc/ChangeTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE) if(!path) return if(!use_preloader && path == type) // Don't no-op if the map loader requires it to be reconstructed return src + set_light(0) var/old_opacity = opacity var/old_dynamic_lighting = dynamic_lighting var/old_affecting_lights = affecting_lights - var/old_lighting_overlay = lighting_overlay + var/old_lighting_object = lighting_object var/old_blueprint_data = blueprint_data var/old_obscured = obscured var/old_corners = corners @@ -185,29 +202,35 @@ BeforeChange() if(SSair) SSair.remove_from_active(src) + + var/old_baseturf = baseturf var/turf/W = new path(src) + W.baseturf = old_baseturf + if(!defer_change) - W.AfterChange() - + W.AfterChange(ignore_air) W.blueprint_data = old_blueprint_data - for(var/turf/space/S in range(W,1)) - S.update_starlight() - recalc_atom_opacity() - if(lighting_overlays_initialised) - lighting_overlay = old_lighting_overlay + if(SSlighting.initialized) + recalc_atom_opacity() + lighting_object = old_lighting_object + affecting_lights = old_affecting_lights corners = old_corners - if((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting)) + if(old_opacity != opacity || dynamic_lighting != old_dynamic_lighting) reconsider_lights() + if(dynamic_lighting != old_dynamic_lighting) - if(dynamic_lighting) + if(IS_DYNAMIC_LIGHTING(src)) lighting_build_overlay() else lighting_clear_overlay() + for(var/turf/space/S in RANGE_TURFS(1, src)) //RANGE_TURFS is in code\__HELPERS\game.dm + S.update_starlight() + obscured = old_obscured return W @@ -266,8 +289,8 @@ SSair.add_to_active(src) /turf/proc/ReplaceWithLattice() - src.ChangeTurf(/turf/space) - new /obj/structure/lattice( locate(src.x, src.y, src.z) ) + ChangeTurf(baseturf) + new /obj/structure/lattice(locate(x, y, z)) /turf/proc/kill_creatures(mob/U = null)//Will kill people/creatures and damage mechs./N //Useful to batch-add creatures to the list. @@ -282,6 +305,10 @@ /turf/proc/Bless() flags |= NOJAUNT +/turf/get_spooked() + for(var/atom/movable/AM in contents) + AM.get_spooked() + /turf/proc/burn_down() return @@ -399,11 +426,11 @@ continue if(O.invisibility == 101) O.singularity_act() - ChangeTurf(/turf/space) + ChangeTurf(baseturf) return(2) /turf/proc/visibilityChanged() - if(ticker) + if(SSticker) cameranet.updateVisibility(src) /turf/attackby(obj/item/I, mob/user, params) @@ -456,7 +483,7 @@ blueprint_data += I /turf/proc/add_blueprints_preround(atom/movable/AM) - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) add_blueprints(AM) /turf/proc/empty(turf_type=/turf/space) @@ -464,14 +491,14 @@ var/turf/T0 = src for(var/X in T0.GetAllContents()) var/atom/A = X + if(!A.simulated) + continue if(istype(A, /mob/dead)) continue if(istype(A, /obj/effect/landmark)) continue if(istype(A, /obj/docking_port)) continue - if(!A.simulated) - continue qdel(A, force=TRUE) T0.ChangeTurf(turf_type) @@ -482,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/turfs/unsimulated.dm b/code/game/turfs/unsimulated.dm index 35b6c2056e3..8ae608a0af6 100644 --- a/code/game/turfs/unsimulated.dm +++ b/code/game/turfs/unsimulated.dm @@ -37,12 +37,6 @@ nitrogen = 0 temperature = TCMB - New() - ..() - name = "plating" - -/turf/unsimulated/floor/plating/airless/catwalk - icon = 'icons/turf/catwalks.dmi' - icon_state = "catwalk0" - name = "catwalk" - desc = "Cats really don't like these things." \ No newline at end of file +/turf/unsimulated/floor/plating/airless/New() + ..() + name = "plating" diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm index b7c76359c46..15650c1f00e 100644 --- a/code/game/turfs/unsimulated/beach.dm +++ b/code/game/turfs/unsimulated/beach.dm @@ -7,7 +7,9 @@ /turf/unsimulated/beach/New() ..() if(water_overlay_image) - overlays += image("icon"='icons/misc/beach.dmi',"icon_state"= water_overlay_image,"layer"=MOB_LAYER+0.1) + var/image/overlay_image = image('icons/misc/beach.dmi', icon_state = water_overlay_image, layer = ABOVE_MOB_LAYER) + overlay_image.plane = GAME_PLANE + overlays += overlay_image /turf/unsimulated/beach/sand name = "Sand" diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index 8df18294f04..c71404dc0d7 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -16,46 +16,6 @@ icon = 'icons/turf/snow.dmi' icon_state = "snow" -/turf/unsimulated/floor/chasm - name = "chasm" - desc = "It's difficult to see the bottom." - density = 0 - icon = 'icons/turf/floors/Chasms.dmi' - icon_state = "Fill" - smooth = SMOOTH_MORE - canSmoothWith = list(/turf/unsimulated/floor/chasm) - -/turf/unsimulated/floor/chasm/Entered(mob/living/M, atom/OL, ignoreRest = 0) - // "fall" south - if(istype(M)) - spawn(1) - if(step(M, SOUTH)) - M.emote("scream") - -/turf/unsimulated/floor/chasm/dense - density = 1 - -/turf/unsimulated/floor/lava - name = "lava" - desc = "That looks... a bit dangerous" - icon = 'icons/turf/floors/lava.dmi' - icon_state = "smooth" - smooth = SMOOTH_MORE - canSmoothWith = list(/turf/unsimulated/floor/lava) - var/lava_damage = 250 - var/lava_fire = 20 - light_range = 2 - light_color = "#FFC040" - -/turf/unsimulated/floor/lava/Entered(mob/living/M, atom/OL, ignoreRest = 0) - if(istype(M)) - M.apply_damage(lava_damage, BURN) - M.adjust_fire_stacks(lava_fire) - M.IgniteMob() - -/turf/unsimulated/floor/lava/dense - density = 1 - /turf/unsimulated/floor/abductor name = "alien floor" icon_state = "alienpod1" @@ -88,3 +48,24 @@ "human" = list('sound/effects/footstep/wood_all.ogg'), //@RonaldVanWonderen of Freesound.org "xeno" = list('sound/effects/footstep/wood_all.ogg') //@RonaldVanWonderen of Freesound.org ) + +/turf/unsimulated/floor/lava + name = "lava" + desc = "That looks... a bit dangerous" + icon = 'icons/turf/floors/lava.dmi' + icon_state = "smooth" + smooth = SMOOTH_MORE + canSmoothWith = list(/turf/unsimulated/floor/lava) + var/lava_damage = 250 + var/lava_fire = 20 + light_range = 2 + light_color = "#FFC040" + +/turf/unsimulated/floor/lava/Entered(mob/living/M, atom/OL, ignoreRest = 0) + if(istype(M)) + M.apply_damage(lava_damage, BURN) + M.adjust_fire_stacks(lava_fire) + M.IgniteMob() + +/turf/unsimulated/floor/lava/dense + density = 1 diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm index 4bcc4e90b2f..c7b192366d4 100644 --- a/code/game/turfs/unsimulated/walls.dm +++ b/code/game/turfs/unsimulated/walls.dm @@ -32,4 +32,4 @@ /turf/unsimulated/wall/abductor icon_state = "alien1" - explosion_block = 50 \ No newline at end of file + explosion_block = 50 diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index a35047bb9ad..5a2807e8379 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -4,7 +4,11 @@ var/global/mentor_ooc_colour = "#0099cc" var/global/moderator_ooc_colour = "#184880" var/global/admin_ooc_colour = "#b82e00" -/client/verb/ooc(msg as text) +//Checks if the client already has a text input open +/client/proc/checkTyping() + return (prefs.toggles & TYPING_ONCE && typing) + +/client/verb/ooc(msg = "" as text) set name = "OOC" set category = "OOC" @@ -14,6 +18,20 @@ var/global/admin_ooc_colour = "#b82e00" to_chat(src, "Guests may not use OOC.") return + if(!check_rights(R_ADMIN|R_MOD, 0)) + if(!config.ooc_allowed) + to_chat(src, "OOC is globally muted.") + return + if(!config.dooc_allowed && (mob.stat == DEAD)) + to_chat(usr, "OOC for dead mobs has been turned off.") + return + if(prefs.muted & MUTE_OOC) + to_chat(src, "You cannot use OOC (muted).") + return + + if(!msg) + msg = typing_input(src.mob, "", "ooc \"text\"") + msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) if(!msg) return @@ -23,15 +41,6 @@ var/global/admin_ooc_colour = "#b82e00" return if(!check_rights(R_ADMIN|R_MOD,0)) - if(!config.ooc_allowed) - to_chat(src, "OOC is globally muted.") - return - if(!config.dooc_allowed && (mob.stat == DEAD)) - to_chat(usr, "OOC for dead mobs has been turned off.") - return - if(prefs.muted & MUTE_OOC) - to_chat(src, "You cannot use OOC (muted).") - return if(handle_spam_prevention(msg, MUTE_OOC, OOC_COOLDOWN)) return if(findtext(msg, "byond://")) @@ -67,7 +76,7 @@ var/global/admin_ooc_colour = "#b82e00" var/icon/byond = icon('icons/member_content.dmi', "blag") display_name = "[bicon(byond)][display_name]" - if(donator_level >= DONATOR_LEVEL_ONE) + if(donator_level > 0) if((prefs.toggles & DONATOR_PUBLIC)) var/icon/donator = icon('icons/ooc_tag_16x.dmi', "donator") display_name = "[bicon(donator)][display_name]" @@ -150,7 +159,7 @@ var/global/admin_ooc_colour = "#b82e00" feedback_add_details("admin_verb","ROC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/verb/looc(msg as text) +/client/verb/looc(msg = "" as text) set name = "LOOC" set desc = "Local OOC, seen only by those in view." set category = "OOC" @@ -161,14 +170,6 @@ var/global/admin_ooc_colour = "#b82e00" to_chat(src, "Guests may not use OOC.") return - msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) - if(!msg) - return - - if(!(prefs.toggles & CHAT_LOOC)) - to_chat(src, "You have LOOC muted.") - return - if(!check_rights(R_ADMIN|R_MOD,0)) if(!config.looc_allowed) to_chat(src, "LOOC is globally muted.") @@ -179,6 +180,19 @@ var/global/admin_ooc_colour = "#b82e00" if(prefs.muted & MUTE_OOC) to_chat(src, "You cannot use LOOC (muted).") return + + if(!msg) + msg = typing_input(src.mob, "Local OOC, seen only by those in view.", "looc \"text\"") + + msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) + if(!msg) + return + + if(!(prefs.toggles & CHAT_LOOC)) + to_chat(src, "You have LOOC muted.") + return + + if(!check_rights(R_ADMIN|R_MOD,0)) if(handle_spam_prevention(msg, MUTE_OOC, OOC_COOLDOWN)) return if(findtext(msg, "byond://")) diff --git a/code/game/verbs/randomtip.dm b/code/game/verbs/randomtip.dm new file mode 100644 index 00000000000..25cc996c8fe --- /dev/null +++ b/code/game/verbs/randomtip.dm @@ -0,0 +1,16 @@ +/client/verb/randomtip() + set category = "OOC" + set name = "Give Random Tip" + set desc = "Shows you a random tip" + + var/m + + var/list/randomtips = file2list("strings/tips.txt") + var/list/memetips = file2list("strings/sillytips.txt") + if(randomtips.len && prob(95)) + m = pick(randomtips) + else if(memetips.len) + m = pick(memetips) + + if(m) + to_chat(src, "Tip: [html_encode(m)]") diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 06b168da042..0b171dac199 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -1,7 +1,7 @@ /mob/var/suiciding = 0 /mob/living/carbon/human/proc/do_suicide(damagetype, byitem) - var/threshold = (config.health_threshold_crit + config.health_threshold_dead) / 2 + var/threshold = check_death_method() ? ((HEALTH_THRESHOLD_CRIT + HEALTH_THRESHOLD_DEAD) / 2) : (HEALTH_THRESHOLD_DEAD - 50) var/dmgamt = maxHealth - threshold var/damage_mod = 1 @@ -52,11 +52,14 @@ /mob/living/carbon/human/verb/suicide() set hidden = 1 + be_suicidal() + +/mob/living/carbon/human/proc/be_suicidal(forced = FALSE) if(stat == DEAD) to_chat(src, "You're already dead!") return - if(!ticker) + if(!SSticker) to_chat(src, "You can't commit suicide before the game starts!") return @@ -69,20 +72,39 @@ to_chat(src, "You're already committing suicide! Be patient!") return - var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") - if(confirm == "Yes") - suiciding = 1 + var/confirm = null + if(!forced) + confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") + + if(forced || (confirm == "Yes")) + suiciding = TRUE var/obj/item/held_item = get_active_hand() if(held_item) var/damagetype = held_item.suicide_act(src) if(damagetype) if(damagetype & SHAME) adjustStaminaLoss(200) - suiciding = 0 + suiciding = FALSE + return + if(damagetype & OBLITERATION) // Does it gib or something? Don't deal damage return do_suicide(damagetype, held_item) return + else + for(var/obj/O in orange(1, src)) + if(O.suicidal_hands) + continue + var/damagetype = O.suicide_act(src) + if(damagetype) + if(damagetype & SHAME) + adjustStaminaLoss(200) + suiciding = FALSE + return + if(damagetype & OBLITERATION) + return + do_suicide(damagetype, O) + return to_chat(viewers(src), "[src] [replacetext(pick(dna.species.suicide_messages), "their", p_their())] It looks like [p_theyre()] trying to commit suicide.") do_suicide(0) @@ -94,7 +116,7 @@ to_chat(src, "You're already dead!") return - if(!ticker) + if(!SSticker) to_chat(src, "You can't commit suicide before the game starts!") return @@ -207,3 +229,19 @@ setCloneLoss(100, FALSE) updatehealth() + +/mob/living/simple_animal/mouse/verb/suicide() + set hidden = 1 + if(stat == DEAD) + to_chat(src, "You're already dead!") + return + if(suiciding) + to_chat(src, "You're already committing suicide! Be patient!") + return + + var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") + + if(confirm == "Yes") + suiciding = TRUE + visible_message("[src] is playing dead permanently! It looks like [p_theyre()] trying to commit suicide.") + adjustOxyLoss(max(100 - getBruteLoss(100), 0)) \ No newline at end of file diff --git a/code/game/world.dm b/code/game/world.dm index 52f12a10c4e..a74870413d3 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -30,25 +30,6 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG Master.Initialize(10, FALSE) - processScheduler = new - master_controller = new /datum/controller/game_controller() - spawn(1) - processScheduler.deferSetupFor(/datum/controller/process/ticker) - processScheduler.setup() - - master_controller.setup() - - if(using_map && using_map.name) - map_name = "[using_map.name]" - else - map_name = "Unknown" - - - if(config && config.server_name) - name = "[config.server_name]: [station_name()]" - else - name = station_name() - #undef RECOMMENDED_VERSION @@ -117,13 +98,13 @@ var/world_topic_spam_protect_time = world.timeofday player_count++ s["players"] = player_count s["admins"] = admin_count - s["map_name"] = map_name ? map_name : "Unknown" + s["map_name"] = GLOB.map_name ? GLOB.map_name : "Unknown" if(key_valid) - if(ticker && ticker.mode) - s["real_mode"] = ticker.mode.name + if(SSticker && SSticker.mode) + s["real_mode"] = SSticker.mode.name s["security_level"] = get_security_level() - s["ticker_state"] = ticker.current_state + s["ticker_state"] = SSticker.current_state if(SSshuttle && SSshuttle.emergency) // Shuttle status, see /__DEFINES/stat.dm @@ -299,8 +280,8 @@ var/world_topic_spam_protect_time = world.timeofday if(!isnull(time)) delay = max(0,time) else - delay = ticker.restart_timeout - if(ticker.delay_end) + delay = SSticker.restart_timeout + if(SSticker.delay_end) to_chat(world, "An admin has delayed the round end.") return to_chat(world, "Rebooting world in [delay/10] [delay > 10 ? "seconds" : "second"]. [reason]") @@ -309,19 +290,19 @@ var/world_topic_spam_protect_time = world.timeofday var/sound_length = GLOB.round_end_sounds[round_end_sound] if(delay > sound_length) // If there's time, play the round-end sound before rebooting spawn(delay - sound_length) - if(!ticker.delay_end) + if(!SSticker.delay_end) world << round_end_sound sleep(delay) if(blackbox) blackbox.save_all_data_to_sql() - if(ticker.delay_end) + if(SSticker.delay_end) to_chat(world, "Reboot was cancelled by an admin.") return feedback_set_details("[feedback_c]","[feedback_r]") log_game("Rebooting world. [reason]") //kick_clients_in_lobby("The round came to an end with you in the lobby.", 1) - processScheduler.stop() + Master.Shutdown() //run SS shutdowns shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. for(var/client/C in GLOB.clients) @@ -371,66 +352,50 @@ var/world_topic_spam_protect_time = world.timeofday // apply some settings from config.. /world/proc/update_status() + status = get_status_text() + +/proc/get_world_status_text() + return world.get_status_text() + +/world/proc/get_status_text() var/s = "" if(config && config.server_name) s += "[config.server_name] — " + s += "[station_name()] " + if(config && config.githuburl) + s+= "([game_version])" - s += "[station_name()]"; - s += " (" - s += "" //Change this to wherever you want the hub to link to. - s += "[game_version]" - s += "" - s += ")" - s += "
The Perfect Mix of RP & Action
" + if(config && config.server_tag_line) + s += "
[config.server_tag_line]" - - - - var/list/features = list() - - if(ticker) - if(master_mode) - features += master_mode + if(SSticker && ROUND_TIME > 0) + s += "
[round(ROUND_TIME / 36000)]:[add_zero(num2text(ROUND_TIME / 600 % 60), 2)], " + capitalize(get_security_level()) else - features += "STARTING" + s += "
STARTING" + + s += "
" + var/list/features = list() if(!enter_allowed) features += "closed" - features += abandon_allowed ? "respawn" : "no respawn" + if(config && config.server_extra_features) + features += config.server_extra_features if(config && config.allow_vote_mode) features += "vote" - if(config && config.allow_ai) - features += "AI allowed" + if(config && config.wikiurl) + features += "Wiki" - var/n = 0 - for(var/mob/M in GLOB.player_list) - if(M.client) - n++ - - if(n > 1) - features += "~[n] players" - else if(n > 0) - features += "~[n] player" - - /* - is there a reason for this? the byond site shows 'hosted by X' when there is a proper host already. - if(host) - features += "hosted by [host]" - */ - -// if(!host && config && config.hostedby) -// features += "hosted by [config.hostedby]" + if(abandon_allowed) + features += "respawn" if(features) - s += ": [jointext(features, ", ")]" + s += "[jointext(features, ", ")]" - /* does this help? I do not know */ - if(src.status != s) - src.status = s + return s #define FAILED_DB_CONNECTION_CUTOFF 5 var/failed_db_connections = 0 diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index dd46725ff26..1ce6c2b90f0 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -70,6 +70,11 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = if(banned_mob.client) computerid = banned_mob.client.computer_id ip = banned_mob.client.address + else + if(banned_mob.lastKnownIP) + ip = banned_mob.lastKnownIP + if(banned_mob.computer_id) + computerid = banned_mob.computer_id else if(banckey) ckey = ckey(banckey) computerid = bancid @@ -145,6 +150,8 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = if(isjobban) jobban_client_fullban(ckey, job) + else + flag_account_for_forum_sync(ckey) datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") @@ -223,6 +230,8 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") DB_ban_unban_by_id(ban_id) if(isjobban) jobban_unban_client(ckey, job) + else + flag_account_for_forum_sync(ckey) datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) @@ -328,6 +337,8 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) var/DBQuery/query_update = dbcon.NewQuery(sql_update) query_update.Execute() + flag_account_for_forum_sync(pckey) + /client/proc/DB_ban_panel() set category = "Admin" @@ -561,4 +572,12 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) output += "
[jtext]
" - usr << browse(output,"window=lookupbans;size=900x700") \ No newline at end of file + usr << browse(output,"window=lookupbans;size=900x700") + +/proc/flag_account_for_forum_sync(ckey) + if(!dbcon) + return + var/skey = sanitizeSQL(ckey) + var/sql = "UPDATE [format_table_name("player")] SET fupdate = 1 WHERE ckey = '[skey]'" + var/DBQuery/adm_query = dbcon.NewQuery(sql) + adm_query.Execute() diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index ec9fa9af05e..045819c365b 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -1,5 +1,12 @@ //Blocks an attempt to connect before even creating our client datum thing. -world/IsBanned(key,address,computer_id) +world/IsBanned(key, address, computer_id, check_ipintel = TRUE) + + if(!config.ban_legacy_system) + if(address) + address = sanitizeSQL(address) + if(computer_id) + computer_id = sanitizeSQL(computer_id) + if(!key || !address || !computer_id) log_adminwarn("Failed Login (invalid data): [key] [address]-[computer_id]") return list("reason"="invalid login data", "desc"="Error: Could not check ban status, please try again. Error message: Your computer provided invalid or blank information to the server on connection (BYOND Username, IP, and Computer ID). Provided information for reference: Username: '[key]' IP: '[address]' Computer ID: '[computer_id]'. If you continue to get this error, please restart byond or contact byond support.") @@ -31,6 +38,14 @@ world/IsBanned(key,address,computer_id) mistakemessage = "\nIf you believe this is a mistake, please request help at [config.banappeals]." return list("reason"="using Tor", "desc"="\nReason: The network you are using to connect has been banned.[mistakemessage]") + //check if the IP address is a known proxy/vpn, and the user is not whitelisted + if(check_ipintel && config.ipintel_email && config.ipintel_whitelist && ipintel_is_banned(key, address)) + log_adminwarn("Failed Login: [key] [computer_id] [address] - Proxy/VPN") + var/mistakemessage = "" + if(config.banappeals) + mistakemessage = "\nIf you have to use one, request whitelisting at: [config.banappeals]" + return list("reason"="using proxy or vpn", "desc"="\nReason: Proxies/VPNs are not allowed here. [mistakemessage]") + if(config.ban_legacy_system) //Ban Checking @@ -93,7 +108,7 @@ world/IsBanned(key,address,computer_id) 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 ce76dc4e282..a6f186dad73 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -21,13 +21,21 @@ var/global/nologevent = 0 to_chat(C, msg) -/proc/message_adminTicket(var/msg) - msg = "ADMIN TICKET: [msg]" +/proc/message_adminTicket(var/msg, var/alt = FALSE) + if(alt) + msg = "ADMIN TICKET: [msg]" + else + msg = "ADMIN TICKET: [msg]" for(var/client/C in GLOB.admins) if(R_ADMIN & C.holder.rights) if(C.prefs && !(C.prefs.toggles & CHAT_NO_TICKETLOGS)) to_chat(C, msg) +/proc/message_mentorTicket(var/msg) + for(var/client/C in GLOB.admins) + if(check_rights(R_ADMIN | R_MENTOR | R_MOD, 0, C.mob)) + if(C.prefs && !(C.prefs.toggles & CHAT_NO_MENTORTICKETLOGS)) + to_chat(C, msg) /proc/admin_ban_mobsearch(var/mob/M, var/ckey_to_find, var/mob/admin_to_notify) if(!M || !M.ckey) @@ -73,7 +81,7 @@ var/global/nologevent = 0 body += "VV - " body += "[ADMIN_TP(M,"TP")] - " if(M.client) - body += "PM - " + body += "PM - " body += "[ADMIN_SM(M,"SM")] - " if(ishuman(M) && M.mind) body += "HM -" @@ -159,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 | @@ -268,6 +275,15 @@ var/global/nologevent = 0 show_note(key) +/datum/admins/proc/vpn_whitelist() + set category = "Admin" + set name = "VPN Ckey Whitelist" + if(!check_rights(R_ADMIN)) + return + var/key = stripped_input(usr, "Enter ckey to add/remove, or leave blank to cancel:", "VPN Whitelist add/remove", max_length=32) + if(key) + vpn_whitelist_panel(key) + /datum/admins/proc/access_news_network() //MARKER set category = "Event" set name = "Access Newscaster Network" @@ -316,7 +332,7 @@ var/global/nologevent = 0 if(CHANNEL.is_admin_channel) dat+="[CHANNEL.channel_name]
" else - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ""]
" dat+={"

Refresh
Back "} @@ -400,7 +416,7 @@ var/global/nologevent = 0 dat+="No feed channels found active...
" else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ""]
" dat+="
Cancel" if(11) dat+={" @@ -413,7 +429,7 @@ var/global/nologevent = 0 dat+="No feed channels found active...
" else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ""]
" dat+="
Back" if(12) @@ -567,7 +583,7 @@ var/global/nologevent = 0 delay = delay * 10 message_admins("[key_name_admin(usr)] has initiated a server restart with a delay of [delay/10] seconds") log_admin("[key_name(usr)] has initiated a server restart with a delay of [delay/10] seconds") - ticker.delay_end = 0 + SSticker.delay_end = 0 feedback_add_details("admin_verb","R") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", delay) @@ -667,20 +683,26 @@ var/global/nologevent = 0 if(!check_rights(R_SERVER)) return - if(!ticker) + if(!SSticker) alert("Unable to start the game as it is not set up.") return - if(ticker.current_state == GAME_STATE_PREGAME) - if(alert(usr, "Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes") + + if(config.start_now_confirmation) + if(alert(usr, "This is a live server. Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes") return - ticker.current_state = GAME_STATE_SETTING_UP - log_admin("[key_name(usr)] has started the game.") - message_admins("[key_name_admin(usr)] has started the game.") + + if(SSticker.current_state == GAME_STATE_PREGAME || SSticker.current_state == GAME_STATE_STARTUP) + SSticker.force_start = TRUE + log_admin("[usr.key] has started the game.") + var/msg = "" + if(SSticker.current_state == GAME_STATE_STARTUP) + msg = " (The server is still setting up, but the round will be started as soon as possible.)" + message_admins("[usr.key] has started the game.[msg]") feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return 1 else to_chat(usr, "Error: Start Now: Game has already started.") - return 0 + return /datum/admins/proc/toggleenter() set category = "Server" @@ -757,10 +779,10 @@ var/global/nologevent = 0 if(!check_rights(R_SERVER)) return - if(!ticker || ticker.current_state != GAME_STATE_PREGAME) - ticker.delay_end = !ticker.delay_end - log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") - message_admins("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + if(!SSticker || SSticker.current_state != GAME_STATE_PREGAME) + SSticker.delay_end = !SSticker.delay_end + log_admin("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].") + message_admins("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) return //alert("Round end delayed", null, null, null, null, null) going = !( going ) if(!( going )) @@ -774,32 +796,32 @@ var/global/nologevent = 0 ////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS /proc/is_special_character(mob/M as mob) // returns 1 for specail characters and 2 for heroes of gamemode - if(!ticker || !ticker.mode) + if(!SSticker || !SSticker.mode) return 0 if(!istype(M)) return 0 - if((M.mind in ticker.mode.head_revolutionaries) || (M.mind in ticker.mode.revolutionaries)) - if(ticker.mode.config_tag == "revolution") + if((M.mind in SSticker.mode.head_revolutionaries) || (M.mind in SSticker.mode.revolutionaries)) + if(SSticker.mode.config_tag == "revolution") return 2 return 1 - if(M.mind in ticker.mode.cult) - if(ticker.mode.config_tag == "cult") + if(M.mind in SSticker.mode.cult) + if(SSticker.mode.config_tag == "cult") return 2 return 1 - if(M.mind in ticker.mode.syndicates) - if(ticker.mode.config_tag == "nuclear") + if(M.mind in SSticker.mode.syndicates) + if(SSticker.mode.config_tag == "nuclear") return 2 return 1 - if(M.mind in ticker.mode.wizards) - if(ticker.mode.config_tag == "wizard") + if(M.mind in SSticker.mode.wizards) + if(SSticker.mode.config_tag == "wizard") return 2 return 1 - if(M.mind in ticker.mode.changelings) - if(ticker.mode.config_tag == "changeling") + if(M.mind in SSticker.mode.changelings) + if(SSticker.mode.config_tag == "changeling") return 2 return 1 - if(M.mind in ticker.mode.abductors) - if(ticker.mode.config_tag == "abduction") + if(M.mind in SSticker.mode.abductors) + if(SSticker.mode.config_tag == "abduction") return 2 return 1 if(isrobot(M)) @@ -944,9 +966,6 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space for(var/obj/machinery/mech_bay_recharge_port/P in toArea) P.update_recharge_turf() - for(var/obj/machinery/power/apc/A in toArea) - A.init() - if(gamma_ship_location) gamma_ship_location = 0 else @@ -1090,7 +1109,7 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space dat += "" + id + "" dat += "" + ckey + "" dat += "Unlink" - + dat += "" usr << browse(dat, "window=duplicates;size=500x480") \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 0c4dd38ef5f..1176e733dde 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -53,6 +53,7 @@ var/list/admin_verbs_admin = list( /datum/admins/proc/PlayerNotes, /client/proc/cmd_mentor_say, /datum/admins/proc/show_player_notes, + /datum/admins/proc/vpn_whitelist, /client/proc/free_slot, /*frees slot for chosen job*/ /client/proc/toggleattacklogs, /client/proc/toggleadminlogs, @@ -72,14 +73,15 @@ var/list/admin_verbs_admin = list( /client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */ /client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */ /client/proc/debug_variables, - /client/proc/show_snpc_verbs, /client/proc/reset_all_tcs, /*resets all telecomms scripts*/ /client/proc/toggle_mentor_chat, /client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/ /client/proc/list_ssds, + /client/proc/list_afks, /client/proc/cmd_admin_headset_message, /client/proc/spawn_floor_cluwne, - /client/proc/show_discord_duplicates, + /client/proc/show_discord_duplicates, // This needs removing at some point, ingame discord linking got removed in #11359 + /client/proc/toggle_panic_bunker ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, @@ -107,6 +109,7 @@ var/list/admin_verbs_event = list( /client/proc/toggle_random_events, /client/proc/toggle_random_events, /client/proc/toggle_ert_calling, + /client/proc/show_tip, /client/proc/cmd_admin_change_custom_event, /client/proc/cmd_admin_custom_event_info, /client/proc/cmd_view_custom_event_info, @@ -205,6 +208,8 @@ var/list/admin_verbs_mentor = list( /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/ /client/proc/cmd_admin_pm_panel, /*admin-pm list*/ /client/proc/cmd_admin_pm_by_key_panel, /*admin-pm list by key*/ + /client/proc/openMentorTicketUI, + /client/proc/toggleMentorTicketLogs, /client/proc/cmd_mentor_say /* mentor say*/ // cmd_mentor_say is added/removed by the toggle_mentor_chat verb ) @@ -213,16 +218,13 @@ var/list/admin_verbs_proccall = list( /client/proc/callproc_datum, /client/proc/SDQL2_query ) -var/list/admin_verbs_snpc = list( - /client/proc/resetSNPC, - /client/proc/customiseSNPC, - /client/proc/hide_snpc_verbs -) var/list/admin_verbs_ticket = list( - /client/proc/openTicketUI, + /client/proc/openAdminTicketUI, /client/proc/toggleticketlogs, - /client/proc/resolveAllTickets, - /client/proc/openUserUI + /client/proc/openMentorTicketUI, + /client/proc/toggleMentorTicketLogs, + /client/proc/resolveAllAdminTickets, + /client/proc/resolveAllMentorTickets ) /client/proc/on_holder_add() @@ -286,8 +288,6 @@ var/list/admin_verbs_ticket = list( admin_verbs_proccall, admin_verbs_show_debug_verbs, /client/proc/readmin, - admin_verbs_snpc, - /client/proc/hide_snpc_verbs, admin_verbs_ticket ) @@ -477,7 +477,7 @@ var/list/admin_verbs_ticket = list( if(holder.fakekey) holder.fakekey = null else - var/new_key = ckeyEx(input("Enter your desired display name.", "Fake Key", key) as text|null) + var/new_key = ckeyEx(clean_input("Enter your desired display name.", "Fake Key", key)) if(!new_key) return if(length(new_key) >= 26) new_key = copytext(new_key, 1, 26) @@ -499,7 +499,7 @@ var/list/admin_verbs_ticket = list( holder.fakekey = null holder.big_brother = 0 else - var/new_key = ckeyEx(input("Enter your desired display name. Unlike normal stealth mode, this will not appear in Who at all, except for other heads.", "Fake Key", key) as text|null) + var/new_key = ckeyEx(clean_input("Enter your desired display name. Unlike normal stealth mode, this will not appear in Who at all, except for other heads.", "Fake Key", key)) if(!new_key) return if(length(new_key) >= 26) @@ -640,11 +640,11 @@ var/list/admin_verbs_ticket = list( return if(O) - var/message = input("What do you want the message to be?", "Make Sound") as text|null + var/message = clean_input("What do you want the message to be?", "Make Sound") if(!message) return for(var/mob/V in hearers(O)) - V.show_message(message, 2) + V.show_message(admin_pencode_to_html(message), 2) log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] make a sound") message_admins("[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z] make a sound") feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -678,24 +678,6 @@ var/list/admin_verbs_ticket = list( feedback_add_details("admin_verb","OT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/kill_air() // -- TLE - set category = "Debug" - set name = "Kill Air" - set desc = "Toggle Air Processing" - - if(!check_rights(R_DEBUG)) - return - - if(air_processing_killed) - air_processing_killed = 0 - to_chat(usr, "Enabled air processing.") - else - air_processing_killed = 1 - to_chat(usr, "Disabled air processing.") - feedback_add_details("admin_verb","KA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] used 'kill air'.") - message_admins("[key_name_admin(usr)] used 'kill air'.", 1) - /client/proc/deadmin_self() set name = "De-admin self" set category = "Admin" @@ -885,7 +867,7 @@ var/list/admin_verbs_ticket = list( return var/list/jobs = list() - for(var/datum/job/J in job_master.occupations) + for(var/datum/job/J in SSjobs.occupations) if(J.current_positions >= J.total_positions && J.total_positions != -1) jobs += J.title if(!jobs.len) @@ -893,7 +875,7 @@ var/list/admin_verbs_ticket = list( return var/job = input("Please select job slot to free", "Free Job Slot") as null|anything in jobs if(job) - job_master.FreeRole(job) + SSjobs.FreeRole(job) log_admin("[key_name(usr)] has freed a job slot for [job].") message_admins("[key_name_admin(usr)] has freed a job slot for [job].") @@ -909,7 +891,7 @@ var/list/admin_verbs_ticket = list( to_chat(usr, "Your attack logs preference is now: show ALMOST ALL attack logs (notable exceptions: NPCs attacking other NPCs, vampire bites, equipping/stripping, people pushing each other over)") else if(prefs.atklog == ATKLOG_ALMOSTALL) prefs.atklog = ATKLOG_MOST - to_chat(usr, "Your attack logs preference is now: show MOST attack logs (like ALMOST ALL, except that it also hides attacks by players on NPCs)") + to_chat(usr, "Your attack logs preference is now: show MOST attack logs (like ALMOST ALL, except that it also hides player v. NPC combat, and certain areas like lavaland syndie base and thunderdome)") else if(prefs.atklog == ATKLOG_MOST) prefs.atklog = ATKLOG_FEW to_chat(usr, "Your attack logs preference is now: show FEW attack logs (only the most important stuff: attacks on SSDs, use of explosives, messing with the engine, gibbing, AI wiping, forcefeeding, acid sprays, and organ extraction)") @@ -940,6 +922,20 @@ var/list/admin_verbs_ticket = list( else to_chat(usr, "You now will get admin log messages.") +/client/proc/toggleMentorTicketLogs() + set name = "Toggle Mentor Ticket Messages" + set category = "Preferences" + + if(!check_rights(R_MENTOR|R_ADMIN)) + return + + prefs.toggles ^= CHAT_NO_MENTORTICKETLOGS + prefs.save_preferences(src) + if(prefs.toggles & CHAT_NO_MENTORTICKETLOGS) + to_chat(usr, "You now won't get mentor ticket messages.") + else + to_chat(usr, "You now will get mentor ticket messages.") + /client/proc/toggleticketlogs() set name = "Toggle Admin Ticket Messgaes" set category = "Preferences" @@ -1012,28 +1008,6 @@ var/list/admin_verbs_ticket = list( log_admin("[key_name(usr)] told everyone to man up and deal with it.") message_admins("[key_name_admin(usr)] told everyone to man up and deal with it.") -/client/proc/show_snpc_verbs() - set name = "Show SNPC Verbs" - set category = "Admin" - - if(!check_rights(R_ADMIN)) - return - - verbs += admin_verbs_snpc - verbs -= /client/proc/show_snpc_verbs - to_chat(src, "SNPC verbs have been toggled on.") - -/client/proc/hide_snpc_verbs() - set name = "Hide SNPC Verbs" - set category = "Admin" - - if(!check_rights(R_ADMIN)) - return - - verbs -= admin_verbs_snpc - verbs += /client/proc/show_snpc_verbs - to_chat(src, "SNPC verbs have been toggled off.") - /client/proc/toggle_advanced_interaction() set name = "Toggle Advanced Admin Interaction" set category = "Admin" @@ -1054,4 +1028,17 @@ var/list/admin_verbs_ticket = list( if(!check_rights(R_ADMIN)) return - holder.discord_duplicates() \ No newline at end of file + holder.discord_duplicates() + +/client/proc/toggle_panic_bunker() + set name = "Toggle Panic Bunker" + set category = "Admin" + set desc = "Disables new players connecting." + + if(!check_rights(R_ADMIN)) + return + + GLOB.panic_bunker_enabled = !GLOB.panic_bunker_enabled + + log_admin("[key_name(usr)] has [GLOB.panic_bunker_enabled ? "activated" : "deactivated"] the panic bunker.") + message_admins("[key_name_admin(usr)] has [GLOB.panic_bunker_enabled ? "activated" : "deactivated"] the panic bunker.") diff --git a/code/modules/admin/ipintel.dm b/code/modules/admin/ipintel.dm new file mode 100644 index 00000000000..75f2422681a --- /dev/null +++ b/code/modules/admin/ipintel.dm @@ -0,0 +1,228 @@ +/datum/ipintel + var/ip + var/intel = 0 + var/cache = FALSE + var/cacheminutesago = 0 + var/cachedate = "" + var/cacherealtime = 0 + +/datum/ipintel/New() + cachedate = SQLtime() + cacherealtime = world.realtime + +/datum/ipintel/proc/is_valid() + . = FALSE + if(intel < 0) + return + if(intel <= config.ipintel_rating_bad) + if(world.realtime < cacherealtime + (config.ipintel_save_good HOURS)) + return TRUE + else + if(world.realtime < cacherealtime + (config.ipintel_save_bad HOURS)) + return TRUE + +/proc/get_ip_intel(ip, bypasscache = FALSE, updatecache = TRUE) + var/datum/ipintel/res = new() + ip = sanitizeSQL(ip) + res.ip = ip + . = res + if(!ip || !config.ipintel_email || !SSipintel.enabled) + return + if(!bypasscache) + var/datum/ipintel/cachedintel = SSipintel.cache[ip] + if(cachedintel && cachedintel.is_valid()) + cachedintel.cache = TRUE + return cachedintel + + if(dbcon.IsConnected()) + var/rating_bad = config.ipintel_rating_bad + var/DBQuery/query_get_ip_intel = dbcon.NewQuery({" + SELECT date, intel, TIMESTAMPDIFF(MINUTE,date,NOW()) + FROM [format_table_name("ipintel")] + WHERE + ip = INET_ATON('[ip]') + AND (( + intel < [rating_bad] + AND + date + INTERVAL [config.ipintel_save_good] HOUR > NOW() + ) OR ( + intel >= [rating_bad] + AND + date + INTERVAL [config.ipintel_save_bad] HOUR > NOW() + )) + "}) + if(!query_get_ip_intel.Execute()) + qdel(query_get_ip_intel) + return + if(query_get_ip_intel.NextRow()) + res.cache = TRUE + res.cachedate = query_get_ip_intel.item[1] + res.intel = text2num(query_get_ip_intel.item[2]) + res.cacheminutesago = text2num(query_get_ip_intel.item[3]) + res.cacherealtime = world.realtime - (text2num(query_get_ip_intel.item[3])*10*60) + SSipintel.cache[ip] = res + qdel(query_get_ip_intel) + return + qdel(query_get_ip_intel) + res.intel = ip_intel_query(ip) + if(updatecache && res.intel >= 0) + SSipintel.cache[ip] = res + if(dbcon.IsConnected()) + var/DBQuery/query_add_ip_intel = dbcon.NewQuery("INSERT INTO [format_table_name("ipintel")] (ip, intel) VALUES (INET_ATON('[ip]'), [res.intel]) ON DUPLICATE KEY UPDATE intel = VALUES(intel), date = NOW()") + query_add_ip_intel.Execute() + qdel(query_add_ip_intel) + + +/proc/ip_intel_query(ip, var/retryed=0) + . = -1 //default + if(!ip) + return + if(SSipintel.throttle > world.timeofday) + return + if(!SSipintel.enabled) + return + + var/list/http[] = world.Export("http://[config.ipintel_domain]/check.php?ip=[ip]&contact=[config.ipintel_email]&format=json&flags=b") + + if(http) + var/status = text2num(http["STATUS"]) + + if(status == 200) + var/response = json_decode(file2text(http["CONTENT"])) + if(response) + if(response["status"] == "success") + var/intelnum = text2num(response["result"]) + if(isnum(intelnum)) + return text2num(response["result"]) + else + ipintel_handle_error("Bad intel from server: [response["result"]].", ip, retryed) + if(!retryed) + sleep(25) + return .(ip, 1) + else + ipintel_handle_error("Bad response from server: [response["status"]].", ip, retryed) + if(!retryed) + sleep(25) + return .(ip, 1) + + else if(status == 429) + ipintel_handle_error("Error #429: We have exceeded the rate limit.", ip, 1) + return + else + ipintel_handle_error("Unknown status code: [status].", ip, retryed) + if(!retryed) + sleep(25) + return .(ip, 1) + else + ipintel_handle_error("Unable to connect to API.", ip, retryed) + if(!retryed) + sleep(25) + return .(ip, 1) + + +/proc/ipintel_handle_error(error, ip, retryed) + if(retryed) + SSipintel.errors++ + error += " Could not check [ip]. Disabling IPINTEL for [SSipintel.errors] minute[( SSipintel.errors == 1 ? "" : "s" )]" + SSipintel.throttle = world.timeofday + (2 * SSipintel.errors MINUTES) + else + error += " Attempting retry on [ip]." + log_ipintel(error) + +/proc/log_ipintel(text) + log_game("IPINTEL: [text]") + log_debug("IPINTEL: [text]") + + +/proc/ipintel_is_banned(t_ckey, t_ip) + if(!config.ipintel_email) + return FALSE + if(!config.ipintel_whitelist) + return FALSE + if(!dbcon.IsConnected()) + return FALSE + if(!ipintel_badip_check(t_ip)) + return FALSE + if(vpn_whitelist_check(t_ckey)) + return FALSE + return TRUE + +/proc/ipintel_badip_check(target_ip) + var/rating_bad = config.ipintel_rating_bad + if(!rating_bad) + log_debug("ipintel_badip_check reports misconfigured rating_bad directive") + return FALSE + var/valid_hours = config.ipintel_save_bad + if(!valid_hours) + log_debug("ipintel_badip_check reports misconfigured ipintel_save_bad directive") + return FALSE + target_ip = sanitizeSQL(target_ip) + rating_bad = sanitizeSQL(rating_bad) + valid_hours = sanitizeSQL(valid_hours) + var/check_sql = {"SELECT * FROM [format_table_name("ipintel")] WHERE ip = INET_ATON('[target_ip]') AND intel >= [rating_bad] AND (date + INTERVAL [valid_hours] HOUR) > NOW()"} + var/DBQuery/query_get_ip_intel = dbcon.NewQuery(check_sql) + if(!query_get_ip_intel.Execute()) + log_debug("ipintel_badip_check reports failed query execution") + qdel(query_get_ip_intel) + return FALSE + if(!query_get_ip_intel.NextRow()) + qdel(query_get_ip_intel) + return FALSE + qdel(query_get_ip_intel) + return TRUE + +/proc/vpn_whitelist_check(target_ckey) + if(!config.ipintel_whitelist) + return FALSE + var/target_sql_ckey = ckey(target_ckey) + var/DBQuery/query_whitelist_check = dbcon.NewQuery("SELECT * FROM [format_table_name("vpn_whitelist")] WHERE ckey = '[target_sql_ckey]'") + if(!query_whitelist_check.Execute()) + var/err = query_whitelist_check.ErrorMsg() + log_debug("SQL ERROR on proc/vpn_whitelist_check for ckey '[target_sql_ckey]'. Error : \[[err]\]\n") + return FALSE + if(query_whitelist_check.NextRow()) + return TRUE // At least one row in the whitelist names their ckey. That means they are whitelisted. + return FALSE + +/proc/vpn_whitelist_add(target_ckey) + var/target_sql_ckey = ckey(target_ckey) + var/reason_string = input(usr, "Enter link to the URL of their whitelist request on the forum.","Reason required") as message|null + if(!reason_string) + return FALSE + reason_string = sanitizeSQL(reason_string) + var/DBQuery/query_whitelist_add = dbcon.NewQuery("INSERT INTO [format_table_name("vpn_whitelist")] (ckey,reason) VALUES ('[target_sql_ckey]','[reason_string]')") + if(!query_whitelist_add.Execute()) + var/err = query_whitelist_add.ErrorMsg() + log_debug("SQL ERROR on proc/vpn_whitelist_add for ckey '[target_sql_ckey]'. Error : \[[err]\]\n") + return FALSE + return TRUE + +/proc/vpn_whitelist_remove(target_ckey) + var/target_sql_ckey = ckey(target_ckey) + var/DBQuery/query_whitelist_remove = dbcon.NewQuery("DELETE FROM [format_table_name("vpn_whitelist")] WHERE ckey = '[target_sql_ckey]'") + if(!query_whitelist_remove.Execute()) + var/err = query_whitelist_remove.ErrorMsg() + log_debug("SQL ERROR on proc/vpn_whitelist_remove for ckey '[target_sql_ckey]'. Error : \[[err]\]\n") + return FALSE + return TRUE + +/proc/vpn_whitelist_panel(target_ckey as text) + if(!check_rights(R_ADMIN)) + return + if(!target_ckey) + return + var/is_already_whitelisted = vpn_whitelist_check(target_ckey) + if(is_already_whitelisted) + var/confirm = alert("[target_ckey] is already whitelisted. Remove them?", "Confirm Removal", "No", "Yes") + if(!confirm || confirm != "Yes") + to_chat(usr, "VPN whitelist alteration cancelled.") + return + else if(vpn_whitelist_remove(target_ckey)) + to_chat(usr, "[target_ckey] was removed from the VPN whitelist.") + else + to_chat(usr, "VPN whitelist unchanged.") + else + if(vpn_whitelist_add(target_ckey)) + to_chat(usr, "[target_ckey] was added to the VPN whitelist.") + else + to_chat(usr, "VPN whitelist unchanged.") \ No newline at end of file diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 0a943e6a170..9203477c7f9 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -61,7 +61,7 @@ } - function expand(id,job,name,real_name,image,key,ip,antagonist,UID,eyeUID){ + function expand(id,job,name,real_name,image,key,ip,antagonist,mobUID,clientUID,eyeUID){ clearAll(); @@ -75,13 +75,13 @@ body += ""; - body += "PP - " + body += "PP - " body += "N - " - body += "VV - " - body += "TP - " - body += "PM - " - body += "SM - " - body += "FLW" + body += "VV - " + body += "TP - " + body += "PM - " + body += "SM - " + body += "FLW" if(eyeUID) body += "|EYE" body += "
" @@ -293,6 +293,7 @@ var/mob/living/silicon/ai/A = M if(A.client && A.eyeobj) // No point following clientless AI eyes M_eyeUID = "[A.eyeobj.UID()]" + var/clientUID = M.client ? M.client.UID() : null //output for each mob dat += {" @@ -300,7 +301,7 @@ [M_name] - [M_rname] - [M_key] ([M_job]) @@ -371,7 +372,7 @@ dat += {"[(M.client ? "[M.client]" : "No client")] X - PM + PM "} switch(is_special_character(M)) if(0) @@ -389,22 +390,19 @@ /datum/admins/proc/check_antagonists_line(mob/M, caption = "", close = 1) var/logout_status - if(istype(M, /mob/living/carbon/human/interactive)) - logout_status = " (snpc)" - else - logout_status = M.client ? "" : " (logged out)" + logout_status = M.client ? "" : " (logged out)" var/dname = M.real_name if(!dname) dname = M return {"[dname][caption][logout_status][M.stat == 2 ? " (DEAD)" : ""] - PM[close ? "" : ""]"} + PM[close ? "" : ""]"} /datum/admins/proc/check_antagonists() if(!check_rights(R_ADMIN)) return - if(ticker && ticker.current_state >= GAME_STATE_PLAYING) + if(SSticker && SSticker.current_state >= GAME_STATE_PLAYING) var/dat = "Round Status

Round Status

" - dat += "Current Game Mode: [ticker.mode.name]
" + dat += "Current Game Mode: [SSticker.mode.name]
" dat += "Round Duration: [round(ROUND_TIME / 36000)]:[add_zero(num2text(ROUND_TIME / 600 % 60), 2)]:[add_zero(num2text(ROUND_TIME / 10 % 60), 2)]
" dat += "Emergency shuttle
" if(SSshuttle.emergency.mode < SHUTTLE_CALL) @@ -417,10 +415,10 @@ else dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
" - dat += "[ticker.delay_end ? "End Round Normally" : "Delay Round End"]
" - if(ticker.mode.syndicates.len) + dat += "[SSticker.delay_end ? "End Round Normally" : "Delay Round End"]
" + if(SSticker.mode.syndicates.len) dat += "
" - for(var/datum/mind/N in ticker.mode.syndicates) + for(var/datum/mind/N in SSticker.mode.syndicates) var/mob/M = N.current if(M) dat += check_antagonists_line(M) @@ -441,20 +439,20 @@ dat += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z])" dat += "
Syndicates
" - if(ticker.mode.head_revolutionaries.len || ticker.mode.revolutionaries.len) + if(SSticker.mode.head_revolutionaries.len || SSticker.mode.revolutionaries.len) dat += "
" - for(var/datum/mind/N in ticker.mode.head_revolutionaries) + for(var/datum/mind/N in SSticker.mode.head_revolutionaries) var/mob/M = N.current if(!M) dat += "" else dat += check_antagonists_line(M, "(leader)") - for(var/datum/mind/N in ticker.mode.revolutionaries) + for(var/datum/mind/N in SSticker.mode.revolutionaries) var/mob/M = N.current if(M) dat += check_antagonists_line(M) dat += "
Revolutionaries
Head Revolutionary not found!
" - for(var/datum/mind/N in ticker.mode.get_living_heads()) + for(var/datum/mind/N in SSticker.mode.get_living_heads()) var/mob/M = N.current if(M) dat += check_antagonists_line(M) @@ -465,7 +463,7 @@ dat += "
Target(s)Location
" if(GAMEMODE_IS_BLOB) - var/datum/game_mode/blob/mode = ticker.mode + var/datum/game_mode/blob/mode = SSticker.mode dat += "
" dat += "" @@ -473,69 +471,72 @@ var/mob/M = blob.current if(M) dat += "" - dat += "" + dat += "" else dat += "" dat += "
Blob
Progress: [blobs.len]/[mode.blobwincount]
[ADMIN_PP(M,"[M.real_name]")][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]PMPM
Blob not found!
" + + if(SSticker.mode.blob_overminds.len) + dat += check_role_table("Blob Overminds", SSticker.mode.blob_overminds) - if(ticker.mode.changelings.len) - dat += check_role_table("Changelings", ticker.mode.changelings) + if(SSticker.mode.changelings.len) + dat += check_role_table("Changelings", SSticker.mode.changelings) - if(ticker.mode.wizards.len) - dat += check_role_table("Wizards", ticker.mode.wizards) + if(SSticker.mode.wizards.len) + dat += check_role_table("Wizards", SSticker.mode.wizards) - if(ticker.mode.raiders.len) - dat += check_role_table("Raiders", ticker.mode.raiders) + if(SSticker.mode.raiders.len) + dat += check_role_table("Raiders", SSticker.mode.raiders) /*if(ticker.mode.ninjas.len) dat += check_role_table("Ninjas", ticker.mode.ninjas)*/ - if(ticker.mode.cult.len) - dat += check_role_table("Cultists", ticker.mode.cult, 0) + if(SSticker.mode.cult.len) + dat += check_role_table("Cultists", SSticker.mode.cult, 0) dat += "
use Cult Mindspeak" if(GAMEMODE_IS_CULT) - var/datum/game_mode/cult/cult_round = ticker.mode + var/datum/game_mode/cult/cult_round = SSticker.mode if(!cult_round.narsie_condition_cleared) dat += "
complete objective (debug)" - if(ticker.mode.traitors.len) - dat += check_role_table("Traitors", ticker.mode.traitors) + if(SSticker.mode.traitors.len) + dat += check_role_table("Traitors", SSticker.mode.traitors) - if(ticker.mode.shadows.len) - dat += check_role_table("Shadowlings", ticker.mode.shadows) + if(SSticker.mode.shadows.len) + dat += check_role_table("Shadowlings", SSticker.mode.shadows) - if(ticker.mode.shadowling_thralls.len) - dat += check_role_table("Shadowling Thralls", ticker.mode.shadowling_thralls) + if(SSticker.mode.shadowling_thralls.len) + dat += check_role_table("Shadowling Thralls", SSticker.mode.shadowling_thralls) - if(ticker.mode.abductors.len) - dat += check_role_table("Abductors", ticker.mode.abductors) + if(SSticker.mode.abductors.len) + dat += check_role_table("Abductors", SSticker.mode.abductors) - if(ticker.mode.abductees.len) - dat += check_role_table("Abductees", ticker.mode.abductees) + if(SSticker.mode.abductees.len) + dat += check_role_table("Abductees", SSticker.mode.abductees) - if(ticker.mode.vampires.len) - dat += check_role_table("Vampires", ticker.mode.vampires) + if(SSticker.mode.vampires.len) + dat += check_role_table("Vampires", SSticker.mode.vampires) - if(ticker.mode.vampire_enthralled.len) - dat += check_role_table("Vampire Thralls", ticker.mode.vampire_enthralled) + if(SSticker.mode.vampire_enthralled.len) + dat += check_role_table("Vampire Thralls", SSticker.mode.vampire_enthralled) - if(ticker.mode.devils.len) - dat += check_role_table("Devils", ticker.mode.devils) + if(SSticker.mode.devils.len) + dat += check_role_table("Devils", SSticker.mode.devils) - if(ticker.mode.xenos.len) - dat += check_role_table("Xenos", ticker.mode.xenos) + if(SSticker.mode.xenos.len) + dat += check_role_table("Xenos", SSticker.mode.xenos) - if(ticker.mode.superheroes.len) - dat += check_role_table("Superheroes", ticker.mode.superheroes) + if(SSticker.mode.superheroes.len) + dat += check_role_table("Superheroes", SSticker.mode.superheroes) - if(ticker.mode.supervillains.len) - dat += check_role_table("Supervillains", ticker.mode.supervillains) + if(SSticker.mode.supervillains.len) + dat += check_role_table("Supervillains", SSticker.mode.supervillains) - if(ticker.mode.greyshirts.len) - dat += check_role_table("Greyshirts", ticker.mode.greyshirts) + if(SSticker.mode.greyshirts.len) + dat += check_role_table("Greyshirts", SSticker.mode.greyshirts) - if(ticker.mode.eventmiscs.len) - dat += check_role_table("Event Roles", ticker.mode.eventmiscs) + if(SSticker.mode.eventmiscs.len) + dat += check_role_table("Event Roles", SSticker.mode.eventmiscs) if(ts_spiderlist.len) var/list/spider_minds = list() @@ -545,8 +546,18 @@ if(spider_minds.len) dat += check_role_table("Terror Spiders", spider_minds) - if(ticker.mode.ert.len) - dat += check_role_table("ERT", ticker.mode.ert) + var/count_eggs = 0 + var/count_spiderlings = 0 + for(var/obj/structure/spider/eggcluster/terror_eggcluster/E in ts_egg_list) + if(is_station_level(E.z)) + count_eggs += E.spiderling_number + for(var/obj/structure/spider/spiderling/terror_spiderling/L in ts_spiderling_list) + if(!L.stillborn && is_station_level(L.z)) + count_spiderlings += 1 + dat += "
Growing TS on-station: [count_eggs] egg[count_eggs != 1 ? "s" : ""], [count_spiderlings] spiderling[count_spiderlings != 1 ? "s" : ""].
" + + if(SSticker.mode.ert.len) + dat += check_role_table("ERT", SSticker.mode.ert) dat += "" usr << browse(dat, "window=roundstatus;size=400x500") diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index fe487ae6431..cec31ffc2ac 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -113,7 +113,9 @@ Japanese Animes Mode   Egalitarian Station Mode
Summon Guns   - Summon Magic + Summon Magic   + Summon Revolver Duel   + Summon Suicidal Revolver Duel
Roll the Dice

diff --git a/code/modules/admin/sql_notes.dm b/code/modules/admin/sql_notes.dm index 9024959b943..18112f584c2 100644 --- a/code/modules/admin/sql_notes.dm +++ b/code/modules/admin/sql_notes.dm @@ -5,7 +5,7 @@ to_chat(usr, "Failed to establish database connection.") return if(!target_ckey) - var/new_ckey = ckey(input(usr,"Who would you like to add a note for?","Enter a ckey",null) as text|null) + var/new_ckey = ckey(clean_input("Who would you like to add a note for?","Enter a ckey",null)) if(!new_ckey) return new_ckey = ckey(new_ckey) diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index bddebcff602..61759f2e36d 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -16,7 +16,7 @@ if(data["ckey"]) ckey = ckey(data["ckey"]) else - ckey = input(usr,"Ckey","Ckey","") as text|null + ckey = clean_input("Ckey","Ckey","") if(!ckey) return ckey = ckey(ckey) @@ -26,7 +26,7 @@ if(data["reason"]) ban["message"] = data["reason"] else - var/reason = input(usr,"Reason","Reason","Ban Evasion") as text|null + var/reason = clean_input("Reason","Reason","Ban Evasion") if(!reason) return ban["message"] = "[reason]" @@ -112,7 +112,7 @@ to_chat(usr, "Error: No sticky ban for [ckey] found!") return var/oldreason = ban["message"] - var/reason = input(usr,"Reason","Reason","[ban["message"]]") as text|null + var/reason = clean_input("Reason","Reason","[ban["message"]]") if(!reason || reason == oldreason) return //we have to do this again incase something changed while we waited for input diff --git a/code/modules/admin/tickets/adminticketsverbs.dm b/code/modules/admin/tickets/adminticketsverbs.dm index f203ef501e8..9ad1f722b08 100644 --- a/code/modules/admin/tickets/adminticketsverbs.dm +++ b/code/modules/admin/tickets/adminticketsverbs.dm @@ -1,8 +1,8 @@ //Verbs -/client/proc/openTicketUI() +/client/proc/openAdminTicketUI() - set name = "Open Ticket Interface" + set name = "Open Admin Ticket Interface" set category = "Admin" if(!holder || !check_rights(R_ADMIN)) @@ -10,8 +10,8 @@ SStickets.showUI(usr) -/client/proc/resolveAllTickets() - set name = "Resolve All Open Tickets" +/client/proc/resolveAllAdminTickets() + set name = "Resolve All Open Admin Tickets" set category = "Admin" if(!holder || !check_rights(R_ADMIN)) @@ -22,12 +22,7 @@ SStickets.resolveAllOpenTickets() -/client/proc/openUserUI() - - set name = "My Tickets" +/client/verb/openAdminUserUI() + set name = "My Admin Tickets" set category = "Admin" - - if(!holder || !check_rights(R_ADMIN)) - return - SStickets.userDetailUI(usr) diff --git a/code/modules/admin/tickets/mentorticketsverbs.dm b/code/modules/admin/tickets/mentorticketsverbs.dm new file mode 100644 index 00000000000..1122b770107 --- /dev/null +++ b/code/modules/admin/tickets/mentorticketsverbs.dm @@ -0,0 +1,28 @@ +//Verbs + +/client/proc/openMentorTicketUI() + + set name = "Open Mentor Ticket Interface" + set category = "Admin" + + if(!holder || !check_rights(R_MENTOR|R_ADMIN)) + return + + SSmentor_tickets.showUI(usr) + +/client/proc/resolveAllMentorTickets() + set name = "Resolve All Open Mentor Tickets" + set category = "Admin" + + if(!holder || !check_rights(R_ADMIN)) + return + + if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes") + return + + SSmentor_tickets.resolveAllOpenTickets() + +/client/verb/openMentorUserUI() + set name = "My Mentor Tickets" + set category = "Admin" + SSmentor_tickets.userDetailUI(usr) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 03d2940b32d..be136204739 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -6,7 +6,7 @@ message_admins("[key_name_admin(usr)] has attempted to override the admin panel!") return - if(ticker.mode && ticker.mode.check_antagonists_topic(href, href_list)) + if(SSticker.mode && SSticker.mode.check_antagonists_topic(href, href_list)) check_antagonists() return @@ -32,6 +32,12 @@ var/ticketID = text2num(href_list["openadminticket"]) SStickets.showDetailUI(usr, ticketID) + if(href_list["openmentorticket"]) + if(!check_rights(R_MENTOR|R_MOD|R_ADMIN)) + return + var/ticketID = text2num(href_list["openmentorticket"]) + SSmentor_tickets.showDetailUI(usr, ticketID) + if(href_list["stickyban"]) stickyban(href_list["stickyban"],href_list) @@ -163,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"]) @@ -175,7 +189,7 @@ var/task = href_list["editrights"] if(task == "add") - var/new_ckey = ckey(input(usr,"New admin's ckey","Admin ckey", null) as text|null) + var/new_ckey = ckey(clean_input("New admin's ckey","Admin ckey", null)) if(!new_ckey) return if(new_ckey in admin_datums) to_chat(usr, "Error: Topic 'editrights': [new_ckey] is already an admin") @@ -309,9 +323,9 @@ else if(href_list["delay_round_end"]) if(!check_rights(R_SERVER)) return - ticker.delay_end = !ticker.delay_end - log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") - message_admins("[key_name_admin(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + SSticker.delay_end = !SSticker.delay_end + log_admin("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].") + message_admins("[key_name_admin(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) href_list["secretsadmin"] = "check_antagonist" else if(href_list["simplemake"]) @@ -485,8 +499,8 @@ if(!M.ckey) //sanity to_chat(usr, "This mob has no ckey") return - if(!job_master) - to_chat(usr, "Job Master has not been setup!") + if(!SSjobs) + to_chat(usr, "SSjobs has not been setup!") return var/dat = "" @@ -506,7 +520,7 @@ jobs += "Command Positions" for(var/jobPos in command_positions) if(!jobPos) continue - var/datum/job/job = job_master.GetJob(jobPos) + var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) @@ -527,7 +541,7 @@ jobs += "Security Positions" for(var/jobPos in security_positions) if(!jobPos) continue - var/datum/job/job = job_master.GetJob(jobPos) + var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) @@ -548,7 +562,7 @@ jobs += "Engineering Positions" for(var/jobPos in engineering_positions) if(!jobPos) continue - var/datum/job/job = job_master.GetJob(jobPos) + var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) @@ -569,7 +583,7 @@ jobs += "Medical Positions" for(var/jobPos in medical_positions) if(!jobPos) continue - var/datum/job/job = job_master.GetJob(jobPos) + var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) @@ -590,7 +604,7 @@ jobs += "Science Positions" for(var/jobPos in science_positions) if(!jobPos) continue - var/datum/job/job = job_master.GetJob(jobPos) + var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) @@ -611,7 +625,7 @@ jobs += "Support Positions" for(var/jobPos in support_positions) if(!jobPos) continue - var/datum/job/job = job_master.GetJob(jobPos) + var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) @@ -632,7 +646,7 @@ jobs += "Non-human Positions" for(var/jobPos in nonhuman_positions) if(!jobPos) continue - var/datum/job/job = job_master.GetJob(jobPos) + var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) @@ -701,7 +715,7 @@ jobs += "Whitelisted Positions" for(var/jobPos in whitelisted_positions) if(!jobPos) continue - var/datum/job/job = job_master.GetJob(jobPos) + var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) @@ -737,8 +751,8 @@ var/ban_ckey_param = href_list["dbbanaddckey"] - if(!job_master) - to_chat(usr, "Job Master has not been setup!") + if(!SSjobs) + to_chat(usr, "SSjobs has not been setup!") return //get jobs for department if specified, otherwise just returnt he one job in a list. @@ -747,50 +761,50 @@ if("commanddept") for(var/jobPos in command_positions) if(!jobPos) continue - var/datum/job/temp = job_master.GetJob(jobPos) + var/datum/job/temp = SSjobs.GetJob(jobPos) if(!temp) continue joblist += temp.title if("securitydept") for(var/jobPos in security_positions) if(!jobPos) continue - var/datum/job/temp = job_master.GetJob(jobPos) + var/datum/job/temp = SSjobs.GetJob(jobPos) if(!temp) continue joblist += temp.title if("engineeringdept") for(var/jobPos in engineering_positions) if(!jobPos) continue - var/datum/job/temp = job_master.GetJob(jobPos) + var/datum/job/temp = SSjobs.GetJob(jobPos) if(!temp) continue joblist += temp.title if("medicaldept") for(var/jobPos in medical_positions) if(!jobPos) continue - var/datum/job/temp = job_master.GetJob(jobPos) + var/datum/job/temp = SSjobs.GetJob(jobPos) if(!temp) continue joblist += temp.title if("sciencedept") for(var/jobPos in science_positions) if(!jobPos) continue - var/datum/job/temp = job_master.GetJob(jobPos) + var/datum/job/temp = SSjobs.GetJob(jobPos) if(!temp) continue joblist += temp.title if("supportdept") for(var/jobPos in support_positions) if(!jobPos) continue - var/datum/job/temp = job_master.GetJob(jobPos) + var/datum/job/temp = SSjobs.GetJob(jobPos) if(!temp) continue joblist += temp.title if("nonhumandept") joblist += "pAI" for(var/jobPos in nonhuman_positions) if(!jobPos) continue - var/datum/job/temp = job_master.GetJob(jobPos) + var/datum/job/temp = SSjobs.GetJob(jobPos) if(!temp) continue joblist += temp.title if("whitelistdept") for(var/jobPos in whitelisted_positions) if(!jobPos) continue - var/datum/job/temp = job_master.GetJob(jobPos) + var/datum/job/temp = SSjobs.GetJob(jobPos) if(!temp) continue joblist += temp.title else @@ -999,24 +1013,16 @@ var/reason = input(usr,"Please state the reason","Reason") as message|null if(!reason) return - switch(alert(usr,"IP ban?",,"Yes","No","Cancel")) - if("Cancel") - return - if("Yes") - M = admin_ban_mobsearch(M, ban_ckey_param, usr) - AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0, M.lastKnownIP) - if("No") - M = admin_ban_mobsearch(M, ban_ckey_param, usr) - AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0) + 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) @@ -1087,7 +1093,7 @@ else if(href_list["c_mode"]) if(!check_rights(R_ADMIN)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) var/dat = {"What mode do you wish to play?
"} for(var/mode in config.modes) @@ -1100,7 +1106,7 @@ else if(href_list["f_secret"]) if(!check_rights(R_ADMIN)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) if(master_mode != "secret") return alert(usr, "The game mode has to be secret!", null, null, null, null) @@ -1114,7 +1120,7 @@ else if(href_list["c_mode2"]) if(!check_rights(R_ADMIN|R_SERVER)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) master_mode = href_list["c_mode2"] log_admin("[key_name(usr)] set the mode as [master_mode].") @@ -1127,7 +1133,7 @@ else if(href_list["f_secret2"]) if(!check_rights(R_ADMIN|R_SERVER)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) if(master_mode != "secret") return alert(usr, "The game mode has to be secret!", null, null, null, null) @@ -1546,21 +1552,12 @@ check_antagonists() else if(href_list["take_question"]) - var/mob/M = locateUID(href_list["take_question"]) - var/is_mhelp = href_list["is_mhelp"] - if(ismob(M)) - var/helptype = "ADMINHELP" - if(is_mhelp) - helptype = "MENTORHELP" - var/take_msg = "[helptype]: [key_name_hidden(usr.client)] is attending to [key_name(M)]'s question." - for(var/client/X in GLOB.admins) - if(check_rights(R_ADMIN, 0, X.mob)) - to_chat(X, take_msg) - else if(is_mhelp && check_rights(R_MOD|R_MENTOR, 0, X.mob)) - to_chat(X, take_msg) - to_chat(M, "Your question is being attended to by [key_name_hidden(usr.client, null, 0)]. Thanks for your patience!") - else - to_chat(usr, "Unable to locate mob.") + var/index = text2num(href_list["take_question"]) + + if(href_list["is_mhelp"]) + SSmentor_tickets.takeTicket(index) + else //Ahelp + SStickets.takeTicket(index) else if(href_list["cult_nextobj"]) if(alert(usr, "Validate the current Cult objective and unlock the next one?", "Cult Cheat Code", "Yes", "No") != "Yes") @@ -1570,25 +1567,25 @@ alert("Couldn't locate cult mode datum! This shouldn't ever happen, tell a coder!") return - var/datum/game_mode/cult/cult_round = ticker.mode + var/datum/game_mode/cult/cult_round = SSticker.mode cult_round.bypass_phase() message_admins("Admin [key_name_admin(usr)] has unlocked the Cult's next objective.") log_admin("Admin [key_name_admin(usr)] has unlocked the Cult's next objective.") else if(href_list["cult_mindspeak"]) - var/input = stripped_input(usr, "Communicate to all the cultists with the voice of [ticker.cultdat.entity_name]", "Voice of [ticker.cultdat.entity_name]", "") + var/input = stripped_input(usr, "Communicate to all the cultists with the voice of [SSticker.cultdat.entity_name]", "Voice of [SSticker.cultdat.entity_name]", "") if(!input) return - for(var/datum/mind/H in ticker.mode.cult) + for(var/datum/mind/H in SSticker.mode.cult) if (H.current) - to_chat(H.current, "[ticker.cultdat.entity_name] murmurs, [input]
") + to_chat(H.current, "[SSticker.cultdat.entity_name] murmurs, [input]
") for(var/mob/dead/observer/O in GLOB.player_list) - to_chat(O, "[ticker.cultdat.entity_name] murmurs, [input]") + to_chat(O, "[SSticker.cultdat.entity_name] murmurs, [input]") - message_admins("Admin [key_name_admin(usr)] has talked with the Voice of [ticker.cultdat.entity_name].") - log_admin("[key_name(usr)] Voice of [ticker.cultdat.entity_name]: [input]") + message_admins("Admin [key_name_admin(usr)] has talked with the Voice of [SSticker.cultdat.entity_name].") + log_admin("[key_name(usr)] Voice of [SSticker.cultdat.entity_name]: [input]") else if(href_list["adminplayerobservecoodjump"]) if(!check_rights(R_ADMIN)) return @@ -1703,7 +1700,7 @@ var/eviltype = input(src.owner, "Which type of evil fax do you wish to send [H]?","Its good to be baaaad...", "") as null|anything in etypes if(!(eviltype in etypes)) return - var/customname = input(src.owner, "Pick a title for the evil fax.", "Fax Title") as text|null + var/customname = clean_input("Pick a title for the evil fax.", "Fax Title", , owner) if(!customname) customname = "paper" var/obj/item/paper/evilfax/P = new /obj/item/paper/evilfax(null) @@ -1889,7 +1886,7 @@ var/logmsg = null switch(punishment) if("Lightning bolt") - M.electrocute_act(5, "Lightning Bolt", safety=1) + M.electrocute_act(5, "Lightning Bolt", safety = TRUE, override = TRUE) playsound(get_turf(M), 'sound/magic/lightningshock.ogg', 50, 1, -1) M.adjustFireLoss(75) M.Weaken(5) @@ -1969,8 +1966,8 @@ kill_objective.target = H.mind kill_objective.explanation_text = "Assassinate [H.real_name], the [H.mind.assigned_role]." newtraitormind.objectives += kill_objective - ticker.mode.equip_traitor(newtraitor) - ticker.mode.traitors |= newtraitor.mind + SSticker.mode.equip_traitor(newtraitor) + SSticker.mode.traitors |= newtraitor.mind to_chat(newtraitor, "ATTENTION: It is time to pay your debt to the Syndicate...") to_chat(newtraitor, "You are now a traitor.") to_chat(newtraitor, "Goal: KILL [H.real_name], currently in [get_area(H.loc)]"); @@ -2004,7 +2001,7 @@ if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return - if(!isLivingSSD(H)) + if(!href_list["cryoafk"] && !isLivingSSD(H)) to_chat(usr, "This can only be used on living, SSD players.") return if(istype(H.loc, /obj/machinery/cryopod)) @@ -2015,6 +2012,11 @@ else if(cryo_ssd(H)) log_admin("[key_name(usr)] sent [H.job] [H] to cryo.") message_admins("[key_name_admin(usr)] sent [H.job] [H] to cryo.") + if(href_list["cryoafk"]) // Warn them if they are send to storage and are AFK + to_chat(H, "The admins have moved you to cryo storage for being AFK. Please eject yourself (right click, eject) out of the cryostorage if you want to avoid being despawned.") + SEND_SOUND(H, 'sound/effects/adminhelp.ogg') + if(H.client) + window_flash(H.client) else if(href_list["FaxReplyTemplate"]) if(!check_rights(R_ADMIN)) return @@ -2184,9 +2186,9 @@ if(!input) qdel(P) return - input = P.parsepencode(input) // Encode everything from pencode to html + input = admin_pencode_to_html(html_encode(input)) // Encode everything from pencode to html - var/customname = input(src.owner, "Pick a title for the fax.", "Fax Title") as text|null + var/customname = clean_input("Pick a title for the fax.", "Fax Title", , owner) if(!customname) customname = "paper" @@ -2219,14 +2221,14 @@ if("clown") stampvalue = "clown" else if(stamptype == "text") - stampvalue = input(src.owner, "What should the stamp say?", "Stamp Text") as text|null + stampvalue = clean_input("What should the stamp say?", "Stamp Text", , owner) else if(stamptype == "none") stamptype = "" else qdel(P) return - sendername = input(src.owner, "What organization does the fax come from? This determines the prefix of the paper (i.e. Central Command- Title). This is optional.", "Organization") as text|null + sendername = clean_input("What organization does the fax come from? This determines the prefix of the paper (i.e. Central Command- Title). This is optional.", "Organization", , owner) if(sender) notify = alert(src.owner, "Would you like to inform the original sender that a fax has arrived?","Notify Sender","Yes","No") @@ -2352,7 +2354,7 @@ else if(href_list["traitor"]) if(!check_rights(R_ADMIN|R_MOD)) return - if(!ticker || !ticker.mode) + if(!SSticker || !SSticker.mode) alert("The game hasn't started yet!") return @@ -2495,7 +2497,7 @@ else if(href_list["kick_all_from_lobby"]) if(!check_rights(R_ADMIN)) return - if(ticker && ticker.current_state == GAME_STATE_PLAYING) + if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) var/afkonly = text2num(href_list["afkonly"]) if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby?","Confirmation","Yes","Cancel") != "Yes") return @@ -2584,7 +2586,7 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","TriAI") if("gravity") - if(!(ticker && ticker.mode)) + if(!(SSticker && SSticker.mode)) to_chat(usr, "Please wait until the game starts! Not sure how it will work otherwise.") return gravity_is_on = !gravity_is_on @@ -2620,7 +2622,7 @@ message_admins("[key_name_admin(usr)] made all SMESs powered", 1) power_restore_quick() if("prisonwarp") - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!", null, null, null, null, null) return feedback_inc("admin_secrets_fun_used",1) @@ -2662,7 +2664,7 @@ H.loc = pick(prisonsecuritywarp) prisonwarped += H if("traitor_all") - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return var/objective = sanitize(copytext(input("Enter an objective"),1,MAX_MESSAGE_LEN)) @@ -2674,24 +2676,24 @@ if(H.stat == 2 || !H.client || !H.mind) continue if(is_special_character(H)) continue //traitorize(H, objective, 0) - ticker.mode.traitors += H.mind + SSticker.mode.traitors += H.mind H.mind.special_role = SPECIAL_ROLE_TRAITOR var/datum/objective/new_objective = new new_objective.owner = H new_objective.explanation_text = objective H.mind.objectives += new_objective - ticker.mode.greet_traitor(H.mind) + SSticker.mode.greet_traitor(H.mind) //ticker.mode.forge_traitor_objectives(H.mind) - ticker.mode.finalize_traitor(H.mind) + SSticker.mode.finalize_traitor(H.mind) for(var/mob/living/silicon/A in GLOB.player_list) - ticker.mode.traitors += A.mind + SSticker.mode.traitors += A.mind A.mind.special_role = SPECIAL_ROLE_TRAITOR var/datum/objective/new_objective = new new_objective.owner = A new_objective.explanation_text = objective A.mind.objectives += new_objective - ticker.mode.greet_traitor(A.mind) - ticker.mode.finalize_traitor(A.mind) + SSticker.mode.greet_traitor(A.mind) + SSticker.mode.finalize_traitor(A.mind) message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]", 1) log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]") @@ -2787,7 +2789,7 @@ if(sure == "No") return SSweather.run_weather(/datum/weather/ash_storm) - message_admins("[key_name_admin(usr)] spawned an ash storm on the mining asteroid") + message_admins("[key_name_admin(usr)] spawned an ash storm on the mining level") if("retardify") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","RET") @@ -2843,11 +2845,19 @@ if("guns") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SG") - usr.rightandwrong(0) + usr.rightandwrong(FALSE) if("magic") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SM") - usr.rightandwrong(1) + usr.rightandwrong(TRUE) + if("revolver") + feedback_inc("admin_secrets_fun_used", 1) + feedback_add_details("admin_secrets_fun_used", "SRD") + usr.rightandwrong(FALSE, revolver_fight = TRUE) + if("fakerevolver") + feedback_inc("admin_secrets_fun_used", 1) + feedback_add_details("admin_secrets_fun_used", "SFD") + usr.rightandwrong(FALSE, fake_revolver_fight = TRUE) if("tdomereset") var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel") if(delete_mobs == "Cancel") @@ -2938,21 +2948,21 @@ usr << browse(dat, "window=lawchanges;size=800x500") if("list_job_debug") var/dat = "Job Debug info.
" - if(job_master) - for(var/line in job_master.job_debug) + if(SSjobs) + for(var/line in SSjobs.job_debug) dat += "[line]
" dat+= "*******

" - for(var/datum/job/job in job_master.occupations) + for(var/datum/job/job in SSjobs.occupations) if(!job) continue dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions]
" usr << browse(dat, "window=jobdebug;size=600x500") if("showailaws") output_ai_laws() if("showgm") - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") - else if(ticker.mode) - alert("The game mode is [ticker.mode.name]") + else if(SSticker.mode) + alert("The game mode is [SSticker.mode.name]") else alert("For some reason there's a ticker, but not a game mode") if("manifest") var/dat = "Showing Crew Manifest.
" @@ -3032,7 +3042,7 @@ M.req_one_access = list(access_brig,access_engine) message_admins("[key_name_admin(usr)] made all maint doors engineering and brig access-only.") if("infinite_sec") - var/datum/job/J = job_master.GetJob("Security Officer") + var/datum/job/J = SSjobs.GetJob("Security Officer") if(!J) return J.total_positions = -1 J.spawn_positions = -1 @@ -3278,7 +3288,7 @@ return var/datum/station_goal/G = new picked() if(picked == /datum/station_goal) - var/newname = input("Enter goal name:") as text|null + var/newname = clean_input("Enter goal name:") if(!newname) return G.name = newname @@ -3287,7 +3297,7 @@ return G.report_message = description message_admins("[key_name_admin(usr)] created \"[G.name]\" station goal.") - ticker.mode.station_goals += G + SSticker.mode.station_goals += G modify_goals() else if(href_list["showdetails"]) @@ -3411,7 +3421,7 @@ protect_objective.target = H.mind protect_objective.explanation_text = "Protect [H.real_name], the [H.mind.assigned_role]." hunter_mind.objectives += protect_objective - ticker.mode.traitors |= hunter_mob.mind + SSticker.mode.traitors |= hunter_mob.mind to_chat(hunter_mob, "ATTENTION: You are now on a mission!") to_chat(hunter_mob, "Goal: [killthem ? "MURDER" : "PROTECT"] [H.real_name], currently in [get_area(H.loc)]. "); if(killthem) 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 1baf6bf0ee8..853b367e15b 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -18,7 +18,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," var/list/type = list("Mentorhelp","Adminhelp") var/selected_type = input("Pick a category.", "Admin Help", null, null) as null|anything in type if(selected_type) - msg = input("Please enter your message.", "Admin Help", null, null) as text|null + msg = clean_input("Please enter your message.", "Admin Help", null) //clean the input msg if(!msg) @@ -27,7 +27,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(handle_spam_prevention(msg, MUTE_ADMINHELP, OOC_COOLDOWN)) return - msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) + msg = sanitize_simple(copytext(msg,1,MAX_MESSAGE_LEN)) if(!msg) return var/original_msg = msg @@ -103,31 +103,46 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(check_rights(R_MENTOR, 0, X.mob)) mentorholders += X continue + var/ticketNum // Holder for the ticket number + var/prunedmsg ="[src]: [msg]" // Message without links + var/datum/ticket/T + var/isMhelp = selected_type == "Mentorhelp" + var/span + if(isMhelp) + span = "" + if(SSmentor_tickets.checkForOpenTicket(src)) // If user already has an open ticket + T = SSmentor_tickets.checkForOpenTicket(src) + else + ticketNum = SSmentor_tickets.getTicketCounter() // ticketNum is the ticket ready to be assigned. + else //Ahelp + span = "" + if(SStickets.checkForOpenTicket(src)) // If user already has an open ticket + T = SStickets.checkForOpenTicket(src) // Make T equal to the ticket they have open + else + ticketNum = SStickets.getTicketCounter() // ticketNum is the ticket ready to be assigned. + + if(T) + ticketNum = T.ticketNum // ticketNum is the number of their ticket. + T.addResponse(src, msg) + + msg = "[span][selected_type]: [key_name(src, TRUE, selected_type)] ([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_SM(mob,"SM")]) ([admin_jump_link(mob)]) (CA) (TICKET) [ai_found ? "(CL)" : ""] (TAKE) : [span][msg]" + if(isMhelp) + //Open a new adminticket and inform the user. + SSmentor_tickets.newTicket(src, prunedmsg, msg) + for(var/client/X in mentorholders + modholders + adminholders) + if(X.prefs.sound & SOUND_MENTORHELP) + X << 'sound/effects/adminhelp.ogg' + to_chat(X, msg) + else //Ahelp + //Open a new adminticket and inform the user. + SStickets.newTicket(src, prunedmsg, msg) + for(var/client/X in modholders + adminholders) + if(X.prefs.sound & SOUND_ADMINHELP) + X << 'sound/effects/adminhelp.ogg' + window_flash(X) + to_chat(X, msg) - switch(selected_type) - if("Mentorhelp") - msg = "[selected_type]: [key_name(src, TRUE, selected_type)] ([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_SM(mob,"SM")]) ([admin_jump_link(mob)]) (CA) (REJT) [ai_found ? " (CL)" : ""] (TAKE) : [msg]" - for(var/client/X in mentorholders + modholders + adminholders) - if(X.prefs.sound & SOUND_MENTORHELP) - X << 'sound/effects/adminhelp.ogg' - to_chat(X, msg) - if("Adminhelp") - var/ticketNum // Holder for the ticket number - var/prunedmsg ="[usr.client]: [msg]" // Message without links - if(SStickets.checkForOpenTicket(usr)) // If user already has an open ticket - var/datum/admin_ticket/T = SStickets.checkForOpenTicket(usr) // Make T equal to the ticket they have open - ticketNum = T.ticketNum // ticketNum is the number of their ticket. - T.addResponse(usr.client, msg) - else - ticketNum = SStickets.getTicketCounter() // ticketNum is the ticket ready to be assigned. - msg = "[selected_type]: [key_name(src, TRUE, selected_type)] ([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_SM(mob,"SM")]) ([admin_jump_link(mob)]) (CA) (TICKET) [ai_found ? " (CL)" : ""](TAKE) : [msg]" - //Open a new adminticket and inform the user. - SStickets.newTicket(src, prunedmsg, msg) - for(var/client/X in modholders + adminholders) - if(X.prefs.sound & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' - window_flash(X) - to_chat(X, msg) + //show it to the person adminhelping too to_chat(src, "[selected_type]
: [original_msg]") @@ -170,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 5303480e905..e2482c54d7c 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -3,7 +3,7 @@ set category = null set name = "Admin PM Mob" if(!holder) - to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.") + to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.") return if( !ismob(M) || !M.client ) return cmd_admin_pm(M.client,null) @@ -14,7 +14,7 @@ set category = "Admin" set name = "Admin PM Name" if(!holder) - to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") + to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") return var/list/client/targets[0] for(var/client/T) @@ -37,7 +37,7 @@ set category = "Admin" set name = "Admin PM Key" if(!holder) - to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") + to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") return var/list/client/targets[0] for(var/client/T) @@ -60,7 +60,7 @@ //Fetching a message if needed. src is the sender and C is the target client /client/proc/cmd_admin_pm(whom, msg, type = "PM") if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") + to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") return var/client/C @@ -88,7 +88,9 @@ //get message text, limit it's length.and clean/escape html if(!msg) - msg = input(src,"Message:", "Private message to [holder ? key_name(C, FALSE) : key_name_hidden(C, FALSE)]") as text|null + set_typing(C, TRUE) + msg = clean_input("Message:", "Private message to [holder ? key_name(C, FALSE) : key_name_hidden(C, FALSE)]", , src) + set_typing(C, FALSE) if(!msg) return @@ -104,9 +106,11 @@ //clean the message if it's not sent by a high-rank admin if(!check_rights(R_SERVER|R_DEBUG,0)) - msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) + msg = sanitize_simple(copytext(msg,1,MAX_MESSAGE_LEN)) if(!msg) return + else + msg = admin_pencode_to_html(msg) var/recieve_span = "playerreply" var/send_pm_type = " " @@ -125,11 +129,14 @@ recieve_pm_type = holder.rank else if(!C.holder) - to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.") + to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.") return var/recieve_message = "" + pm_tracker.add_message(C, src, msg, mob) + C.pm_tracker.add_message(src, src, msg, C.mob) + if(holder && !C.holder) recieve_message = "-- Click the [recieve_pm_type]'s name to reply --\n" if(C.adminhelped) @@ -142,7 +149,7 @@ spawn(0) //so we don't hold the caller proc up var/sender = src var/sendername = key - var/reply = input(C, msg,"[recieve_pm_type] [type] from-[sendername]", "") as text|null //show message and await a reply + var/reply = clean_input(msg,"[recieve_pm_type] [type] from-[sendername]", "", C) //show message and await a reply if(C && reply) if(sender) C.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them @@ -154,7 +161,7 @@ var/emoji_msg = "[msg]" recieve_message = "[type] from-[recieve_pm_type][C.holder ? key_name(src, TRUE, type) : key_name_hidden(src, TRUE, type)]: [emoji_msg]" to_chat(C, recieve_message) - to_chat(src, "[send_pm_type][type] to-[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]: [emoji_msg]") + to_chat(src, "[send_pm_type][type] to-[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]: [emoji_msg]") /*if(holder && !C.holder) C.last_pm_recieved = world.time @@ -182,31 +189,36 @@ else if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) to_chat(X, "[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]") - - if(type == "Mentorhelp") - return + //Check if the mob being PM'd has any open admin tickets. var/tickets = list() - tickets = SStickets.checkForTicket(C) + if(type == "Mentorhelp") + tickets = SSmentor_tickets.checkForTicket(C) + else + tickets = SStickets.checkForTicket(C) if(tickets) - for(var/datum/admin_ticket/i in tickets) + for(var/datum/ticket/i in tickets) i.addResponse(src, msg) // Add this response to their open tickets. return - - if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets - tickets = SStickets.checkForTicket(src) - if(tickets) - for(var/datum/admin_ticket/i in tickets) - i.addResponse(src, msg) - return + if(type == "Mentorhelp") + if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets + tickets = SSmentor_tickets.checkForTicket(src) + else // Ahelp + if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets + tickets = SStickets.checkForTicket(src) + + if(tickets) + for(var/datum/ticket/i in tickets) + i.addResponse(src, msg) + return /client/proc/cmd_admin_irc_pm() if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") + to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") return - var/msg = input(src,"Message:", "Private message to admins on IRC / 400 character limit") as text|null + var/msg = clean_input("Message:", "Private message to admins on IRC / 400 character limit", , src) as text|null if(!msg) return @@ -220,11 +232,167 @@ send2adminirc("PlayerPM from [key_name(src)]: [html_decode(msg)]") - to_chat(src, "IRC PM to-IRC-Admins: [msg]") + to_chat(src, "IRC PM to-IRC-Admins: [msg]") log_admin("PM: [key_name(src)]->IRC: [msg]") for(var/client/X in GLOB.admins) if(X == src) continue if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob)) - to_chat(X, "PM: [key_name(src, TRUE, 0)]->IRC-Admins: [msg]") + to_chat(X, "PM: [key_name(src, TRUE, 0)]->IRC-Admins: [msg]") + +/client/verb/open_pms_ui() + set name = "My PMs" + set category = "OOC" + pm_tracker.show_ui(usr) + +/client/proc/set_typing(client/target, value) + if(!target) + return + var/datum/pm_convo/convo = target.pm_tracker.pms[key] + if(!convo) + return + convo.typing = value + if(target.pm_tracker.open && target.pm_tracker.current_title == key) + target.pm_tracker.show_ui(target.mob) + +/datum/pm_tracker + var/current_title = "" + var/open = FALSE + var/list/pms = list() + var/show_archived = FALSE + var/window_id = "pms_window" + +/datum/pm_convo + var/list/messages = list() + var/archived = FALSE + var/client/client + var/read = FALSE + var/typing = FALSE + +/datum/pm_convo/New(client/C) + client = C + +/datum/pm_convo/proc/add(client/sender, message) + messages.Add("[sender]: [message]") + archived = FALSE + read = FALSE + +/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) + // The next time the window's opened, it'll be open to the most recent message + current_title = title.key + return + + // If it's already opened, it'll refresh + show_ui(user) + +/datum/pm_tracker/proc/show_ui(mob/user) + var/dat = "" + + dat += "Refresh" + dat += "[show_archived ? "Hide" : "Show"] Archived" + dat += "
" + for(var/title in pms) + if(pms[title].archived && !show_archived) + continue + var/label = "[title]" + var/class = "" + if(title == current_title) + label = "[label]" + class = "linkOn" + else if(!pms[title].read) + label = "*[label]" + 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 += "" + + for(var/message in convo.messages) + dat += "" + + dat += "
[message]
" + dat += "
" + if(convo.typing) + dat += "[current_title] is typing" + dat += "
" + dat += "

" + dat += "Reply" + dat += "[convo.archived ? "Unarchive" : "Archive"]" + if(check_rights(R_ADMIN, FALSE, user)) + dat += "Ping" + + popup.set_content(dat) + popup.open() + open = TRUE + +/datum/pm_tracker/proc/fancy_title(title) + 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 + show_ui(usr) + return + + if(href_list["refresh"]) + show_ui(usr) + return + + if(href_list["newtitle"]) + current_title = href_list["newtitle"] + show_ui(usr) + return + + if(href_list["ping"]) + var/client/C = pms[href_list["ping"]].client + if(C) + C.pm_tracker.current_title = usr.key + window_flash(C) + C.pm_tracker.show_ui(C.mob) + to_chat(usr, "Forced open [C]'s messages window.") + show_ui(usr) + return + + if(href_list["reply"]) + usr.client.cmd_admin_pm(ckey(href_list["reply"]), null) + show_ui(usr) + return + + if(href_list["showarchived"]) + show_archived = !show_archived + show_ui(usr) + return + + if(href_list["close"]) + open = FALSE + return 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/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index 3449350e11f..63ebd52d09b 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -3,7 +3,7 @@ set category = "Debug" set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. set hidden = 1 - if(!ticker) + if(!SSticker) return switch(cinematic) if("explosion") @@ -14,4 +14,4 @@ override = input(src, "mode = ?","Enter Parameter", null) as anything in list("nuclear emergency", "fake", "no override") if(0) override = input(src, "mode = ?","Enter Parameter", null) as anything in list("blob", "nuclear emergency", "AI malfunction", "no override") - ticker.station_explosion_cinematic(parameter, override) \ No newline at end of file + SSticker.station_explosion_cinematic(parameter, override) \ No newline at end of file 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/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 2b96f7d3290..008eaa4a910 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -68,7 +68,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that target = null targetselected = 0 - var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null + var/procname = clean_input("Proc path, eg: /proc/fake_blood","Path:", null) if(!procname) return if(targetselected && !hascall(target,procname)) @@ -102,7 +102,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_PROCCALL)) return - var/procname = input("Proc name, eg: fake_blood","Proc:", null) as text|null + var/procname = clean_input("Proc name, eg: fake_blood","Proc:", null) if(!procname) return @@ -149,7 +149,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that return null if("text") - lst += input("Enter new text:","Text",null) as text + lst += clean_input("Enter new text:","Text",null) if("num") lst += input("Enter new number:","Num",0) as num @@ -215,7 +215,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(istype(M, /mob/living/carbon/human)) @@ -233,7 +233,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return @@ -271,7 +271,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that return 0 var/obj/item/paicard/card = new(T) var/mob/living/silicon/pai/pai = new(card) - var/raw_name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text + var/raw_name = clean_input("Enter your pAI name:", "pAI Name", "Personal AI", choice) var/new_name = reject_bad_name(raw_name, 1) if(new_name) pai.name = new_name @@ -293,7 +293,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(ishuman(M)) @@ -313,7 +313,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(ishuman(M)) @@ -333,7 +333,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(ishuman(M)) @@ -405,7 +405,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_EVENT)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(istype(M, /mob/living/carbon/human)) @@ -612,7 +612,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/datum/job/jobdatum if(dresscode == "as job...") var/jobname = input("Select job", "Robust quick dress shop") as null|anything in get_all_jobs() - jobdatum = job_master.GetJob(jobname) + jobdatum = SSjobs.GetJob(jobname) feedback_add_details("admin_verb", "SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! if(dostrip) @@ -818,7 +818,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(istype(M, /mob/living/carbon)) @@ -905,8 +905,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_DEBUG)) return - global.medals_enabled = !global.medals_enabled + SSmedals.hub_enabled = !SSmedals.hub_enabled - message_admins("[key_name_admin(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.") + message_admins("[key_name_admin(src)] [SSmedals.hub_enabled ? "disabled" : "enabled"] the medal hub lockout.") feedback_add_details("admin_verb","TMH") // If... - log_admin("[key_name(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.") + log_admin("[key_name(src)] [SSmedals.hub_enabled ? "disabled" : "enabled"] the medal hub lockout.") diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 8b8a2b58a52..23d171e69a0 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -83,9 +83,9 @@ "_default" = "NO_FILTER" ) var/output = "Radio Report
" - for(var/fq in radio_controller.frequencies) + for(var/fq in SSradio.frequencies) output += "Freq: [fq]
" - var/list/datum/radio_frequency/fqs = radio_controller.frequencies[fq] + var/list/datum/radio_frequency/fqs = SSradio.frequencies[fq] if(!fqs) output += "  ERROR
" continue @@ -145,7 +145,7 @@ if(!check_rights(R_DEBUG)) return - var/filter = input("Contains what?","Filter") as text|null + var/filter = clean_input("Contains what?","Filter") if(!filter) return @@ -166,7 +166,7 @@ if(!check_rights(R_DEBUG)) return - var/refstring = input("Which reference?","Ref") as text|null + var/refstring = clean_input("Which reference?","Ref") if(!refstring) return diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index b21a0c05cc3..209352993a0 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -28,7 +28,7 @@ var/global/list/frozen_mob_list = list() /mob/living/proc/admin_Freeze(var/client/admin, skip_overlays = FALSE) if(istype(admin)) - to_chat(src, "You have been frozen by [key_name(admin)]") + to_chat(src, "You have been frozen by [admin]") message_admins("[key_name_admin(admin)] froze [key_name_admin(src)]") log_admin("[key_name(admin)] froze [key_name(src)]") @@ -45,7 +45,7 @@ var/global/list/frozen_mob_list = list() /mob/living/proc/admin_unFreeze(var/client/admin, skip_overlays = FALSE) if(istype(admin)) - to_chat(src, "You have been unfrozen by [key_name(admin)]") + to_chat(src, "You have been unfrozen by [admin]") message_admins("[key_name_admin(admin)] unfroze [key_name_admin(src)]") log_admin("[key_name(admin)] unfroze [key_name(src)]") diff --git a/code/modules/admin/verbs/gimmick_team.dm b/code/modules/admin/verbs/gimmick_team.dm index 081c820aaee..cad93e8b880 100644 --- a/code/modules/admin/verbs/gimmick_team.dm +++ b/code/modules/admin/verbs/gimmick_team.dm @@ -7,7 +7,7 @@ set desc = "Spawns a group of players in the specified outfit." if(!check_rights(R_EVENT)) return - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return if(alert("Do you want to spawn a Gimmick Team at YOUR CURRENT LOCATION?",,"Yes","No")=="No") @@ -82,7 +82,7 @@ H.mind.store_memory("[themission]

") if(is_syndicate) - ticker.mode.traitors |= H.mind //Adds them to extra antag list + SSticker.mode.traitors |= H.mind //Adds them to extra antag list players_spawned++ if(players_spawned >= teamsize) diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm index b4c0e6a05eb..f4013edbe1e 100644 --- a/code/modules/admin/verbs/honksquad.dm +++ b/code/modules/admin/verbs/honksquad.dm @@ -4,7 +4,7 @@ var/const/honksquad_possible = 6 //if more Commandos are needed in the future var/global/sent_honksquad = 0 /client/proc/honksquad() - if(!ticker) + if(!SSticker) to_chat(usr, "The game hasn't started yet!") return if(world.time < 6000) @@ -95,7 +95,7 @@ var/global/sent_honksquad = 0 new_honksquad.mind.special_role = SPECIAL_ROLE_HONKSQUAD new_honksquad.mind.offstation_role = TRUE new_honksquad.add_language("Clownish") - ticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list. + SSticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list. new_honksquad.equip_honksquad(honk_leader_selected) return new_honksquad diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm index 551076be62a..a7da1553ec0 100644 --- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm +++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm @@ -10,7 +10,7 @@ var/global/sent_syndicate_infiltration_team = 0 if(!check_rights(R_ADMIN)) to_chat(src, "Only administrators may use this command.") return - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return if(alert("Do you want to send in the Syndicate Infiltration Team?",,"Yes","No")=="No") @@ -132,7 +132,7 @@ var/global/sent_syndicate_infiltration_team = 0 new_syndicate_infiltrator.mind.assigned_role = "Syndicate Infiltrator" new_syndicate_infiltrator.mind.special_role = "Syndicate Infiltrator" new_syndicate_infiltrator.mind.offstation_role = TRUE //they can flee to z2 so make them inelligible as antag targets - ticker.mode.traitors |= new_syndicate_infiltrator.mind //Adds them to extra antag list + SSticker.mode.traitors |= new_syndicate_infiltrator.mind //Adds them to extra antag list new_syndicate_infiltrator.equip_syndicate_infiltrator(syndicate_leader_selected, uplink_tc, is_mgmt) return new_syndicate_infiltrator @@ -170,7 +170,7 @@ var/global/sent_syndicate_infiltration_team = 0 equip_or_collect(new /obj/item/pda(src), slot_in_backpack) // Other gear - equip_to_slot_or_del(new /obj/item/clothing/shoes/syndigaloshes(src), slot_shoes) + equip_to_slot_or_del(new /obj/item/clothing/shoes/chameleon/noslip(src), slot_shoes) var/obj/item/card/id/syndicate/W = new(src) if (flag_mgmt) diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index a87308bb9b1..80a171494ea 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -132,13 +132,13 @@ var/intercom_range_display_status = 0 if(!check_rights(R_DEBUG)) return - var/level = input("Which z-level?","Level?") as text + var/level = clean_input("Which z-level?","Level?") if(!level) return var/num_level = text2num(level) if(!num_level) return if(!isnum(num_level)) return - var/type_text = input("Which type path?","Path?") as text + var/type_text = clean_input("Which type path?","Path?") if(!type_text) return var/type_path = text2path(type_text) if(!type_path) return @@ -170,7 +170,7 @@ var/intercom_range_display_status = 0 if(!check_rights(R_DEBUG)) return - var/type_text = input("Which type path?","") as text + var/type_text = clean_input("Which type path?","") if(!type_text) return var/type_path = text2path(type_text) if(!type_path) return diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 4b3905f37e2..a2a95db957a 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -29,7 +29,7 @@ client/proc/one_click_antag() // You pass in ROLE define (optional), the applicant, and the gamemode, and it will return true / false depending on whether the applicant qualify for the candidacy in question if(jobban_isbanned(M, "Syndicate")) return FALSE - if(M.stat || !M.mind || M.mind.special_role) + if(M.stat || !M.mind || M.mind.special_role || M.mind.offstation_role) return FALSE if(temp) if((M.mind.assigned_role in temp.restricted_jobs) || (M.client.prefs.species in temp.protected_species)) @@ -175,8 +175,13 @@ client/proc/one_click_antag() for(var/i = 0, iYou are a Vox Primalis, fresh out of the Shoal. Your ship has arrived at the Tau Ceti system hosting the NSV Exodus... or was it the Luna? NSS? Utopia? Nobody is really sure, but everyong is raring to start pillaging! Your current goal is: [input]") to_chat(new_vox, "Don't forget to turn on your nitrogen internals!") diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index c2260a051eb..3db8f102320 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -1,5 +1,5 @@ /client/proc/only_one() - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return @@ -14,7 +14,7 @@ var/datum/preferences/A = new() // Randomize appearance A.copy_to(H) - ticker.mode.traitors += H.mind + SSticker.mode.traitors += H.mind H.mind.special_role = SPECIAL_ROLE_TRAITOR var/datum/objective/hijack/hijack_objective = new @@ -58,7 +58,7 @@ world << sound('sound/music/thunderdome.ogg') /client/proc/only_me() - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return @@ -66,7 +66,7 @@ if(H.stat == 2 || !(H.client)) continue if(is_special_character(H)) continue - ticker.mode.traitors += H.mind + SSticker.mode.traitors += H.mind H.mind.special_role = "[H.real_name] Prime" var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone diff --git a/code/modules/admin/verbs/onlyoneteam.dm b/code/modules/admin/verbs/onlyoneteam.dm index d2490cdf9c3..846a77c508a 100644 --- a/code/modules/admin/verbs/onlyoneteam.dm +++ b/code/modules/admin/verbs/onlyoneteam.dm @@ -1,5 +1,5 @@ /client/proc/only_one_team() - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 1c75421f4b7..b6986f4960f 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -18,8 +18,8 @@ var/prayer_type = "PRAYER" var/deity if(usr.job == "Chaplain") - if(ticker && ticker.Bible_deity_name) - deity = ticker.Bible_deity_name + if(SSticker && SSticker.Bible_deity_name) + deity = SSticker.Bible_deity_name cross = image('icons/obj/storage.dmi',"kingyellow") font_color = "blue" prayer_type = "CHAPLAIN PRAYER" @@ -27,7 +27,7 @@ cross = image('icons/obj/storage.dmi',"tome") font_color = "red" prayer_type = "CULTIST PRAYER" - deity = ticker.cultdat.entity_name + deity = SSticker.cultdat.entity_name log_say("(PRAYER) [msg]", usr) msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]: [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (CA) ([ADMIN_SC(src,"SC")]) (BLESS) (SMITE): [msg]" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 24ce21276e7..2c7c6181b1d 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -54,10 +54,13 @@ if(!check_rights(R_SERVER|R_EVENT)) return - var/msg = input("Message:", text("Subtle PM to [M.key]")) as text + var/msg = clean_input("Message:", text("Subtle PM to [M.key]")) if(!msg) return + + msg = admin_pencode_to_html(msg) + if(usr) if(usr.client) if(usr.client.holder) @@ -109,10 +112,11 @@ if(!check_rights(R_SERVER|R_EVENT)) return - var/msg = input("Message:", text("Enter the text you wish to appear to everyone:")) as text + var/msg = clean_input("Message:", text("Enter the text you wish to appear to everyone:")) if(!msg) return + msg = pencode_to_html(msg) to_chat(world, "[msg]") log_admin("GlobalNarrate: [key_name(usr)] : [msg]") message_admins("GlobalNarrate: [key_name_admin(usr)]: [msg]
", 1) @@ -131,10 +135,11 @@ if(!M) return - var/msg = input("Message:", text("Enter the text you wish to appear to your target:")) as text + var/msg = clean_input("Message:", text("Enter the text you wish to appear to your target:")) if( !msg ) return + msg = admin_pencode_to_html(msg) to_chat(M, msg) log_admin("DirectNarrate: [key_name(usr)] to ([key_name(M)]): [msg]") @@ -169,7 +174,7 @@ return message_admins("[key_name_admin(src)] has started answering [key_name_admin(H)]'s [sender] request.") - var/input = input("Please enter a message to reply to [key_name(H)] via their headset.", "Outgoing message from [sender]", "") as text|null + var/input = clean_input("Please enter a message to reply to [key_name(H)] via their headset.", "Outgoing message from [sender]", "") if(!input) message_admins("[key_name_admin(src)] decided not to answer [key_name_admin(H)]'s [sender] request.") return @@ -435,13 +440,13 @@ Traitors and the like can also be revived with the previous role mostly intact. //Now for special roles and equipment. switch(new_character.mind.special_role) if("traitor") - job_master.AssignRank(new_character, new_character.mind.assigned_role, 0) - job_master.EquipRank(new_character, new_character.mind.assigned_role, 1) - ticker.mode.equip_traitor(new_character) + SSjobs.AssignRank(new_character, new_character.mind.assigned_role, 0) + SSjobs.EquipRank(new_character, new_character.mind.assigned_role, 1) + SSticker.mode.equip_traitor(new_character) if("Wizard") new_character.loc = pick(wizardstart) //ticker.mode.learn_basic_spells(new_character) - ticker.mode.equip_wizard(new_character) + SSticker.mode.equip_wizard(new_character) if("Syndicate") var/obj/effect/landmark/synd_spawn = locate("landmark*Syndicate-Spawn") if(synd_spawn) @@ -466,8 +471,8 @@ Traitors and the like can also be revived with the previous role mostly intact. call(/datum/game_mode/proc/add_law_zero)(new_character) //Add aliens. else - job_master.AssignRank(new_character, new_character.mind.assigned_role, 0) - job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)//Or we simply equip them. + SSjobs.AssignRank(new_character, new_character.mind.assigned_role, 0) + SSjobs.EquipRank(new_character, new_character.mind.assigned_role, 1)//Or we simply equip them. //Announces the character on all the systems, based on the record. if(!issilicon(new_character))//If they are not a cyborg/AI. @@ -550,7 +555,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!check_rights(R_EVENT)) return - var/input = input(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", "") as text|null + var/input = clean_input("Please enter anything you want the AI to do. Anything. Serious.", "What?", "") if(!input) return @@ -603,9 +608,9 @@ Traitors and the like can also be revived with the previous role mostly intact. var/type = input(usr, "Pick a type of report to send", "Report Type", "") as anything in MsgType if(type == "Custom") - type = input(usr, "What would you like the report type to be?", "Report Type", "Encrypted Transmission") as text|null + type = clean_input("What would you like the report type to be?", "Report Type", "Encrypted Transmission") - var/customname = input(usr, "Pick a title for the report.", "Title", MsgType[type]) as text|null + var/customname = clean_input("Pick a title for the report.", "Title", MsgType[type]) if(!customname) return var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What's the message?") as message|null @@ -651,7 +656,7 @@ Traitors and the like can also be revived with the previous role mostly intact. feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! if(isturf(D)) var/turf/T = D - T.ChangeTurf(/turf/space) + T.ChangeTurf(T.baseturf) else qdel(D) @@ -662,11 +667,11 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!check_rights(R_ADMIN)) return - if(job_master) + if(SSjobs) var/currentpositiontally var/totalpositiontally to_chat(src, "Job Name: Filled job slot / Total job slots (Free job slots)") - for(var/datum/job/job in job_master.occupations) + for(var/datum/job/job in SSjobs.occupations) to_chat(src, "[job.title]: [job.current_positions] / \ [job.total_positions == -1 ? "UNLIMITED" : job.total_positions] \ ([job.total_positions == -1 ? "UNLIMITED" : job.total_positions - job.current_positions])") @@ -858,7 +863,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Admin" set name = "Toggle Deny Shuttle" - if(!ticker) + if(!SSticker) return if(!check_rights(R_ADMIN)) @@ -891,12 +896,12 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!check_rights(R_SERVER|R_EVENT)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!") return - if(ticker.random_players) - ticker.random_players = 0 + if(SSticker.random_players) + SSticker.random_players = 0 message_admins("Admin [key_name_admin(usr)] has disabled \"Everyone is Special\" mode.", 1) to_chat(usr, "Disabled.") return @@ -914,7 +919,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.") - ticker.random_players = 1 + SSticker.random_players = 1 feedback_add_details("admin_verb","MER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_random_events() @@ -1001,6 +1006,57 @@ Traitors and the like can also be revived with the previous role mostly intact. msg += "" src << browse(msg, "window=Player_ssd_check") +/client/proc/list_afks() + set category = "Admin" + set name = "List AFKs" + set desc = "Lists AFK players" + + if(!check_rights(R_ADMIN)) + return + + var/msg = "AFK Report" + msg += "AFK Players:
" + msg += "" + var/mins_afk + var/job_string + var/key_string + var/role_string + for(var/mob/living/carbon/human/H in GLOB.living_mob_list) + if(H.client == null || H.stat == DEAD) // No clientless or dead + continue + mins_afk = round(H.client.inactivity / 600) + if(mins_afk < config.list_afk_minimum) + continue + if(H.job) + job_string = H.job + else + job_string = "-" + key_string = H.key + if(job_string in command_positions) + job_string = "" + job_string + "" + role_string = "-" + var/obj_count = 0 + var/obj_string = "" + if(H.mind) + if(H.mind.special_role) + role_string = "[H.mind.special_role]" + if(!H.key && H.mind.key) + key_string = H.mind.key + for(var/datum/objective/O in all_objectives) + if(O.target == H.mind) + obj_count++ + if(obj_count > 0) + obj_string = "
Obj Target" + msg += "" + msg += "" + if(istype(H.loc, /obj/machinery/cryopod)) + msg += "" + else + msg += "" + msg += "" + msg += "
KeyReal NameJobMins AFKSpecial RoleAreaPPNCryo
[key_string][H.real_name][job_string][mins_afk][role_string][obj_string][get_area(H)][ADMIN_PP(H,"PP")]De-SpawnCryo
" + src << browse(msg, "window=Player_afk_check") + /client/proc/toggle_ert_calling() set category = "Event" set name = "Toggle ERT" @@ -1009,17 +1065,42 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!check_rights(R_EVENT)) return - if(ticker.mode.ert_disabled) - ticker.mode.ert_disabled = 0 + if(SSticker.mode.ert_disabled) + SSticker.mode.ert_disabled = 0 to_chat(usr, "ERT has been Enabled.") log_admin("Admin [key_name(src)] has enabled ERT calling.") message_admins("Admin [key_name_admin(usr)] has enabled ERT calling.", 1) else - ticker.mode.ert_disabled = 1 + SSticker.mode.ert_disabled = 1 to_chat(usr, "ERT has been Disabled.") log_admin("Admin [key_name(src)] has disabled ERT calling.") message_admins("Admin [key_name_admin(usr)] has disabled ERT calling.", 1) +/client/proc/show_tip() + set category = "Admin" + set name = "Show Custom Tip" + set desc = "Sends a tip (that you specify) to all players. After all \ + you're the experienced player here." + + if(!check_rights(R_ADMIN)) + return + + var/input = input(usr, "Please specify your tip that you want to send to the players.", "Tip", "") as message|null + if(!input) + return + + if(!SSticker) + return + + SSticker.selected_tip = input + + // If we've already tipped, then send it straight away. + if(SSticker.tipped) + SSticker.send_tip_of_the_round() + + message_admins("[key_name_admin(usr)] sent a Tip of the round.") + log_admin("[key_name(usr)] sent \"[input]\" as the Tip of the Round.") + /client/proc/modify_goals() set category = "Event" set name = "Modify Station Goals" @@ -1030,12 +1111,12 @@ Traitors and the like can also be revived with the previous role mostly intact. holder.modify_goals() /datum/admins/proc/modify_goals() - if(!ticker || !ticker.mode) + if(!SSticker || !SSticker.mode) to_chat(usr, "This verb can only be used if the round has started.") return var/dat = "" - for(var/datum/station_goal/S in ticker.mode.station_goals) + for(var/datum/station_goal/S in SSticker.mode.station_goals) dat += "[S.name] - Announce | Remove
" dat += "
Add New Goal" usr << browse(dat, "window=goals;size=400x400") diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index a23e6eea69c..4b555bc724a 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -4,7 +4,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future var/global/sent_strike_team = 0 /client/proc/strike_team() - if(!ticker) + if(!SSticker) to_chat(usr, "The game hasn't started yet!") return if(sent_strike_team == 1) @@ -86,9 +86,9 @@ var/global/sent_strike_team = 0 R.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD R.mind.special_role = SPECIAL_ROLE_DEATHSQUAD R.mind.offstation_role = TRUE - if(!(R.mind in ticker.minds)) - ticker.minds += R.mind - ticker.mode.traitors += R.mind + if(!(R.mind in SSticker.minds)) + SSticker.minds += R.mind + SSticker.mode.traitors += R.mind R.key = ghost_mob.key if(nuke_code) R.mind.store_memory("Nuke Code: [nuke_code].") @@ -150,7 +150,7 @@ var/global/sent_strike_team = 0 new_commando.mind_initialize() new_commando.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD new_commando.mind.special_role = SPECIAL_ROLE_DEATHSQUAD - ticker.mode.traitors |= new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list. + SSticker.mode.traitors |= new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list. new_commando.equip_death_commando(is_leader) return new_commando diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index bf20d2b5503..7e77fe17df7 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -9,7 +9,7 @@ var/global/sent_syndicate_strike_team = 0 if(!src.holder) to_chat(src, "Only administrators may use this command.") return - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return if(sent_syndicate_strike_team == 1) @@ -117,7 +117,7 @@ var/global/sent_syndicate_strike_team = 0 new_syndicate_commando.mind.assigned_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD new_syndicate_commando.mind.special_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD new_syndicate_commando.mind.offstation_role = TRUE - ticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list. + SSticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list. new_syndicate_commando.equip_syndicate_commando(is_leader) qdel(spawn_location) return new_syndicate_commando diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm index 0da0dfc42f6..98a4bf82e98 100644 --- a/code/modules/admin/verbs/tripAI.dm +++ b/code/modules/admin/verbs/tripAI.dm @@ -2,21 +2,21 @@ set category = "Event" set name = "Create AI Triumvirate" - if(ticker.current_state > GAME_STATE_PREGAME) + if(SSticker.current_state > GAME_STATE_PREGAME) to_chat(usr, "This option is currently only usable during pregame. This may change at a later date.") return - if(job_master && ticker) - var/datum/job/job = job_master.GetJob("AI") + if(SSjobs && SSticker) + var/datum/job/job = SSjobs.GetJob("AI") if(!job) to_chat(usr, "Unable to locate the AI job") return - if(ticker.triai) - ticker.triai = 0 + if(SSticker.triai) + SSticker.triai = 0 to_chat(usr, "Only one AI will be spawned at round start.") message_admins("[key_name_admin(usr)] has toggled off triple AIs at round start.", 1) else - ticker.triai = 1 + SSticker.triai = 1 to_chat(usr, "There will be an AI Triumvirate at round start.") message_admins("[key_name_admin(usr)] has toggled on triple AIs at round start.", 1) return diff --git a/code/modules/admin/watchlist.dm b/code/modules/admin/watchlist.dm index 1ac267f1037..040bc08112b 100644 --- a/code/modules/admin/watchlist.dm +++ b/code/modules/admin/watchlist.dm @@ -2,7 +2,7 @@ if(!check_rights(R_ADMIN)) return if(!target_ckey) - var/new_ckey = ckey(input(usr,"Who would you like to add to the watchlist?","Enter a ckey",null) as text) + var/new_ckey = ckey(clean_input("Who would you like to add to the watchlist?","Enter a ckey",null)) if(!new_ckey) return new_ckey = sanitizeSQL(new_ckey) diff --git a/code/modules/alarm/alarm.dm b/code/modules/alarm/alarm.dm index 1d4a570999a..798c5176770 100644 --- a/code/modules/alarm/alarm.dm +++ b/code/modules/alarm/alarm.dm @@ -29,7 +29,7 @@ cameras() // Sets up both cameras and last alarm area. set_source_data(source, duration, severity) -/datum/alarm/proc/process() +/datum/alarm/process() // Has origin gone missing? if(!origin && !end_time) end_time = world.time + ALARM_RESET_DELAY diff --git a/code/modules/alarm/alarm_handler.dm b/code/modules/alarm/alarm_handler.dm index cd09ebe4427..56a673bb5b4 100644 --- a/code/modules/alarm/alarm_handler.dm +++ b/code/modules/alarm/alarm_handler.dm @@ -7,7 +7,7 @@ var/list/datum/alarm/alarms_assoc = new // Associative list of alarms, to efficiently acquire them based on origin. var/list/listeners = new // A list of all objects interested in alarm changes. -/datum/alarm_handler/proc/process() +/datum/alarm_handler/process() for(var/datum/alarm/A in alarms) A.process() check_alarm_cleared(A) diff --git a/code/modules/antagonists/_common/antag_hud.dm b/code/modules/antagonists/_common/antag_hud.dm index 693b0b9450d..89ad9af15ab 100644 --- a/code/modules/antagonists/_common/antag_hud.dm +++ b/code/modules/antagonists/_common/antag_hud.dm @@ -1,5 +1,5 @@ /datum/atom_hud/antag - hud_icons = list(SPECIALROLE_HUD,NATIONS_HUD) + hud_icons = list(SPECIALROLE_HUD) var/self_visible = TRUE /datum/atom_hud/antag/hidden @@ -38,16 +38,6 @@ if(M.mind || new_icon_state) //in mindless mobs, only null is acceptable, otherwise we're antagging a mindless mob, meaning we should runtime M.mind.antag_hud_icon_state = new_icon_state -//Nations Icons -/proc/set_nations_hud(mob/M, new_icon_state) - if(!istype(M)) - CRASH("set_antag_hud(): [M] ([M.type]) is not a mob!") - var/image/holder = M.hud_list[NATIONS_HUD] - if(holder) - holder.icon_state = new_icon_state - if(M.mind || new_icon_state) //in mindless mobs, only null is acceptable, otherwise we're antagging a mindless mob, meaning we should runtime - M.mind.antag_hud_icon_state = new_icon_state - //MIND PROCS //these are called by mind.transfer_to() /datum/mind/proc/transfer_antag_huds(datum/atom_hud/antag/newhud) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 937c831dfbf..d52507bee1d 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -10,73 +10,118 @@ /obj/item/antag_spawner/proc/equip_antag(mob/target) return - -/obj/item/antag_spawner/borg_tele - name = "syndicate cyborg teleporter" - desc = "A single-use teleporter used to deploy a Syndicate Cyborg on the field." +///////////BORGS AND OPERATIVES +/obj/item/antag_spawner/nuke_ops + name = "syndicate operative teleporter" + desc = "A single-use teleporter designed to quickly reinforce operatives in the field." icon = 'icons/obj/device.dmi' icon_state = "locator" - var/checking = FALSE - var/TC_cost = 0 var/borg_to_spawn - var/upload_mind - var/list/possible_types = list("Assault", "Medical", "Saboteur") + var/checking = FALSE + var/rolename = "Syndicate Operative" -/obj/item/antag_spawner/borg_tele/attack_self(mob/user) +/obj/item/antag_spawner/nuke_ops/proc/before_candidate_search(user) + return TRUE + +/obj/item/antag_spawner/nuke_ops/proc/check_usability(mob/user) if(used) to_chat(user, "[src] is out of power!") - return - if(!(user.mind in ticker.mode.syndicates)) + return FALSE + if(!(user.mind in SSticker.mode.syndicates)) to_chat(user, "AUTHENTICATION FAILURE. ACCESS DENIED.") return FALSE if(checking) - to_chat(user, "[src] is already checking for possible borgs.") - return - borg_to_spawn = input("What type of borg would you like to teleport?", "Cyborg Type", type) as null|anything in possible_types - if(!borg_to_spawn || checking || used) - return - upload_mind = input("Would you like to continue playing as an operative or take over the cyborg? (Another player will control your old self)", "Play as") as null|anything in list("Nuclear Operative", "Syndicate Cyborg") - if(!upload_mind || checking || used) - return - if(upload_mind == "Nuclear Operative") - checking = TRUE - to_chat(user, "The device is now checking for possible borgs.") - var/list/borg_candidates = pollCandidates("Do you want to play as a Syndicate [borg_to_spawn] borg?", ROLE_OPERATIVE, 1) - if(borg_candidates.len > 0 && !used) - checking = FALSE - used = TRUE - var/mob/M = pick(borg_candidates) - var/client/C = M.client - spawn_antag(C, get_turf(loc), "syndieborg") - qdel(src) - else - checking = FALSE - to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.") - return - else if(upload_mind == "Syndicate Cyborg") - checking = TRUE - to_chat(user, "You attempt to upload your consciousness into a new syndicate cyborg.") - var/list/nuclear_candidates = pollCandidates("Do you want to play as the Syndicate Nuclear Operative [user.real_name]?", ROLE_OPERATIVE, 1) - if(nuclear_candidates.len > 0 && !used) - checking = FALSE - used = TRUE - var/mob/M = pick(nuclear_candidates) - var/client/nukeop_client = M.client - var/client/borg_client = user.client - spawn_antag(borg_client, get_turf(loc), "syndieborg") - user.key = nukeop_client.key - ticker.mode.greet_syndicate(user.mind) - qdel(src) - else - checking = FALSE - to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.") - return + to_chat(user, "The device is already connecting to Syndicate command. Please wait.") + return FALSE + return TRUE -/obj/item/antag_spawner/borg_tele/spawn_antag(client/C, turf/T, type = "") - if(!borg_to_spawn) //If there's no type at all, let it still be used but don't do anything +/obj/item/antag_spawner/nuke_ops/attack_self(mob/user) + if(!(check_usability(user))) + return + + var/continue_proc = before_candidate_search(user) + if(!continue_proc) + return + + checking = TRUE + + to_chat(user, "You activate [src] and wait for confirmation.") + var/list/nuke_candidates = pollCandidates("Do you want to play as a [rolename]?", ROLE_OPERATIVE, TRUE, 150) + if(LAZYLEN(nuke_candidates)) + checking = FALSE + if(QDELETED(src) || !check_usability(user)) + return + used = TRUE + var/mob/dead/observer/G = pick(nuke_candidates) + spawn_antag(G.client, get_turf(src), user.mind) + do_sparks(4, TRUE, src) + qdel(src) + else + checking = FALSE + to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.") + +/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user) + var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) + + var/agent_number = LAZYLEN(SSticker.mode.syndicates) - 1 + M.real_name = "[syndicate_name()] Operative #[agent_number]" + + set_syndicate_values(C, M) + SSticker.mode.create_syndicate(M.mind) + SSticker.mode.equip_syndicate(M, 0) + SSticker.mode.update_syndicate_id(M.mind, FALSE) + +/obj/item/antag_spawner/nuke_ops/proc/set_syndicate_values(client/C, mob/living/M) + M.key = C.key + + SSticker.mode.syndicates += M.mind + SSticker.mode.update_synd_icons_added(M.mind) + + M.mind.assigned_role = SPECIAL_ROLE_NUKEOPS + M.mind.special_role = SPECIAL_ROLE_NUKEOPS + M.mind.offstation_role = TRUE + + M.faction = list("syndicate") + SSticker.mode.forge_syndicate_objectives(M.mind) + SSticker.mode.greet_syndicate(M.mind) + +//////SYNDICATE BORG +/obj/item/antag_spawner/nuke_ops/borg_tele + name = "syndicate cyborg teleporter" + desc = "A single-use teleporter designed to quickly reinforce operatives in the field." + var/switch_roles = FALSE + +/obj/item/antag_spawner/nuke_ops/borg_tele/assault + name = "syndicate assault cyborg teleporter" + borg_to_spawn = "Assault" + +/obj/item/antag_spawner/nuke_ops/borg_tele/medical + name = "syndicate medical teleporter" + borg_to_spawn = "Medical" + +/obj/item/antag_spawner/nuke_ops/borg_tele/saboteur + name = "syndicate saboteur teleporter" + borg_to_spawn = "Saboteur" + +/obj/item/antag_spawner/nuke_ops/borg_tele/before_candidate_search(mob/user) + var/switch_roles_choice = input("Would you like to continue playing as an operative or take over as the cyborg? If you play as the cyborg, another player will control your old self.", "Play As") as null|anything in list("Nuclear Operative", "Syndicate Cyborg") + if(!switch_roles_choice || !(check_usability(user))) + return FALSE + + if(switch_roles_choice == "Syndicate Cyborg") + switch_roles = TRUE + rolename = initial(rolename) + else + switch_roles = FALSE + rolename = "Syndicate [borg_to_spawn] Cyborg" + + return TRUE + +/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, datum/mind/user) + if(!(user in SSticker.mode.syndicates)) used = FALSE return - do_sparks(4, 1, src) + var/mob/living/silicon/robot/R switch(borg_to_spawn) if("Medical") @@ -85,11 +130,29 @@ R = new /mob/living/silicon/robot/syndicate/saboteur(T) else R = new /mob/living/silicon/robot/syndicate(T) //Assault borg by default - R.key = C.key - ticker.mode.syndicates += R.mind - ticker.mode.update_synd_icons_added(R.mind) - R.mind.special_role = SPECIAL_ROLE_NUKEOPS - R.faction = list("syndicate") + + var/brainfirstname = pick(GLOB.first_names_male) + if(prob(50)) + brainfirstname = pick(GLOB.first_names_female) + var/brainopslastname = pick(GLOB.last_names) + if(syndicate_name()) //the brain inside the syndiborg has the same last name as the other ops. + brainopslastname = syndicate_name() + var/brainopsname = "[brainfirstname] [brainopslastname]" + + R.mmi.name = "[initial(R.mmi.name)]: [brainopsname]" + R.mmi.brainmob.real_name = brainopsname + R.mmi.brainmob.name = brainopsname + + if(!switch_roles) + set_syndicate_values(C, R) + else + var/mob/living/L = user.current + set_syndicate_values(user.current.client, R) + + L.key = C.key + SSticker.mode.greet_syndicate(L.mind) + +///////////SLAUGHTER DEMON /obj/item/antag_spawner/slaughter_demon //Warning edgiest item in the game name = "vial of blood" @@ -104,7 +167,7 @@ var/mob/living/demon_type = /mob/living/simple_animal/slaughter /obj/item/antag_spawner/slaughter_demon/attack_self(mob/user) - if(level_blocks_magic(user.z))//this is to make sure the wizard does NOT summon a demon from the Den.. + if(level_blocks_magic(user.z)) //this is to make sure the wizard does NOT summon a demon from the Den.. to_chat(user, "You should probably wait until you reach the station.") return @@ -114,7 +177,10 @@ used = TRUE to_chat(user, "You break the seal on the bottle, calling upon the dire spirits of the underworld...") - var/list/candidates = pollCandidates("Do you want to play as a slaughter demon summoned by [user.real_name]?", ROLE_DEMON, 1, 100) + var/type = "slaughter" + if(demon_type == /mob/living/simple_animal/slaughter/laughter) + type = "laughter" + var/list/candidates = pollCandidates("Do you want to play as a [type] demon summoned by [user.real_name]?", ROLE_DEMON, 1, 100) if(candidates.len > 0) var/mob/C = pick(candidates) @@ -135,7 +201,7 @@ S.key = C.key S.mind.assigned_role = S.name S.mind.special_role = S.name - ticker.mode.traitors += S.mind + SSticker.mode.traitors += S.mind var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate KillDaWiz.owner = S.mind KillDaWiz.target = user.mind @@ -145,11 +211,9 @@ KillDaCrew.owner = S.mind KillDaCrew.explanation_text = "[objective_verb] everyone else while you're at it." S.mind.objectives += KillDaCrew - S.mind.objectives += KillDaCrew to_chat(S, "Objective #[1]: [KillDaWiz.explanation_text]") to_chat(S, "Objective #[2]: [KillDaCrew.explanation_text]") - /obj/item/antag_spawner/slaughter_demon/laughter name = "vial of tickles" desc = "A magically infused bottle of clown love, distilled from \ @@ -158,5 +222,63 @@ color = "#FF69B4" // HOT PINK veil_msg = "You sense an adorable presence \ lurking just beyond the veil..." - objective_verb = "Hug and Tickle" + objective_verb = "Hug and tickle" demon_type = /mob/living/simple_animal/slaughter/laughter + +///////////MORPH + +/obj/item/antag_spawner/morph + name = "vial of ooze" + desc = "A magically infused bottle of ooze, distilled by methods rather not be spoken of. Used to awaken an all-consuming monstrosity." + icon = 'icons/obj/wizard.dmi' + icon_state = "vialooze" + var/shatter_msg = "You shatter the bottle, no \ + turning back now!" + var/veil_msg = "The sludge is awake and seeps \ + away..." + var/objective_verb = "Eat" + var/mob/living/morph_type = /mob/living/simple_animal/hostile/morph + +/obj/item/antag_spawner/morph/attack_self(mob/user) + if(level_blocks_magic(user.z))//this is to make sure the wizard does NOT summon a morph from the Den.. + to_chat(user, "You should probably wait until you reach the station.") + return + + if(used) + to_chat(user, "This bottle already has a broken seal.") + return + used = TRUE + to_chat(user, "You break the seal on the bottle, calling upon the dire sludge to awaken...") + + var/list/candidates = pollCandidates("Do you want to play as a magical morph awakened by [user.real_name]?", ROLE_MORPH, 1, 100) + + if(candidates.len > 0) + var/mob/C = pick(candidates) + spawn_antag(C, get_turf(src.loc), initial(morph_type.name), user) + to_chat(user, "[shatter_msg]") + to_chat(user, "[veil_msg]") + playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1) + qdel(src) + else + used = FALSE + to_chat(user, "The sludge does not respond to your attempt to awake it. Perhaps you should try again later.") + +/obj/item/antag_spawner/morph/spawn_antag(client/C, turf/T, type = "", mob/user) + var/mob/living/simple_animal/hostile/morph/wizard/M = new /mob/living/simple_animal/hostile/morph/wizard(pick(xeno_spawn)) + M.key = C.key + M.mind.assigned_role = SPECIAL_ROLE_MORPH + M.mind.special_role = SPECIAL_ROLE_MORPH + to_chat(M, M.playstyle_string) + SSticker.mode.traitors += M.mind + var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate + KillDaWiz.owner = M.mind + KillDaWiz.target = user.mind + KillDaWiz.explanation_text = "[objective_verb] [user.real_name], the one who was foolish enough to awake you." + M.mind.objectives += KillDaWiz + var/datum/objective/KillDaCrew = new /datum/objective + KillDaCrew.owner = M.mind + KillDaCrew.explanation_text = "[objective_verb] everyone and everything else while you're at it." + M.mind.objectives += KillDaCrew + to_chat(M, "Objective #[1]: [KillDaWiz.explanation_text]") + to_chat(M, "Objective #[2]: [KillDaCrew.explanation_text]") + M << 'sound/magic/mutate.ogg' diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm index 94c265848b7..a91e392e125 100644 --- a/code/modules/arcade/arcade_prize.dm +++ b/code/modules/arcade/arcade_prize.dm @@ -42,8 +42,8 @@ possible_contents = list(/obj/random/carp_plushie) /obj/item/toy/prizeball/plushie - name = "animal plushie capsule" - desc = "Contains one cuddly animal plushie!" + name = "plushie capsule" + desc = "Contains one cuddly plushie!" possible_contents = list(/obj/random/plushie) /obj/item/toy/prizeball/figure diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm index a68071f8f44..4d2e062677a 100644 --- a/code/modules/arcade/prize_datums.dm +++ b/code/modules/arcade/prize_datums.dm @@ -157,8 +157,8 @@ var/global/datum/prizes/global_prizes = new cost = 65 /datum/prize_item/plushie - name = "Random Animal Plushie" - desc = "A colorful animal-shaped plush toy." + name = "Random Plushie" + desc = "A colorful plush toy." typepath = /obj/item/toy/prizeball/plushie cost = 75 diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index a5dfb44aae2..5e0b463af30 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -125,7 +125,7 @@ ..() /obj/item/assembly/process() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/item/assembly/examine(mob/user) ..() 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/health.dm b/code/modules/assembly/health.dm index 853733784fa..3a543e38f72 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -21,10 +21,10 @@ /obj/item/assembly/health/toggle_secure() secured = !secured if(secured && scanning) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else scanning = FALSE - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) update_icon() return secured @@ -66,9 +66,9 @@ return FALSE scanning = !scanning if(scanning) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return /obj/item/assembly/health/interact(mob/user)//TODO: Change this to the wires thingy 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 91f8da7cc4b..37f5916d535 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -42,12 +42,12 @@ /obj/item/assembly/infra/toggle_secure() secured = !secured if(secured) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else on = FALSE if(first) qdel(first) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) update_icon() return secured @@ -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/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 80e486170c2..e6ae3ec7bc4 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -28,11 +28,11 @@ /obj/item/assembly/prox_sensor/toggle_secure() secured = !secured if(secured) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else scanning = 0 timing = 0 - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) update_icon() return secured diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 6228df02af3..addc6f847ab 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -20,17 +20,17 @@ /obj/item/assembly/signaler/New() ..() - if(radio_controller) + if(SSradio) set_frequency(frequency) /obj/item/assembly/signaler/Initialize() ..() - if(radio_controller) + if(SSradio) set_frequency(frequency) /obj/item/assembly/signaler/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() @@ -151,13 +151,13 @@ return TRUE /obj/item/assembly/signaler/proc/set_frequency(new_frequency) - if(!radio_controller) + if(!SSradio) sleep(20) - if(!radio_controller) + if(!SSradio) return - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) + radio_connection = SSradio.add_object(src, frequency, RADIO_CHAT) // Embedded signaller used in anomalies. /obj/item/assembly/signaler/anomaly diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 5b7eb6ca50a..2c2216fa9d0 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -29,10 +29,10 @@ /obj/item/assembly/timer/toggle_secure() secured = !secured if(secured) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else timing = FALSE - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) update_icon() return secured diff --git a/code/modules/atmos_automation/statements.dm b/code/modules/atmos_automation/statements.dm index 31ee71b7a7d..72937e18eae 100644 --- a/code/modules/atmos_automation/statements.dm +++ b/code/modules/atmos_automation/statements.dm @@ -29,7 +29,7 @@ var/global/automation_types = subtypesof(/datum/automation) /datum/automation/proc/OnRemove() return -/datum/automation/proc/process() +/datum/automation/process() return /datum/automation/proc/Evaluate() diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 33e12abe788..92a6a2b1d86 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -28,13 +28,13 @@ var/datum/disease/disease = null //Do they start with a pre-spawned disease? var/mob_color //Change the mob's color var/assignedrole - var/banType = "lavaland" + var/banType = ROLE_GHOST var/ghost_usable = TRUE - + var/offstation_role = TRUE // If set to true, the role of the user's mind will be set to offstation /obj/effect/mob_spawn/attack_ghost(mob/user) var/mob/dead/observer/O = user - if(ticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable) + if(SSticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable) return if(!uses) to_chat(user, "This spawner is out of charges!") @@ -111,6 +111,7 @@ MM.objectives += new/datum/objective(objective) if(assignedrole) M.mind.assigned_role = assignedrole + M.mind.offstation_role = offstation_role special(M, name) MM.name = M.real_name if(uses > 0) @@ -204,7 +205,7 @@ var/T = vars[slot] if(!isnum(T)) outfit.vars[slot] = T - H.equipOutfit(outfit, TRUE) + H.equipOutfit(outfit) var/list/del_types = list(/obj/item/pda, /obj/item/radio/headset) for(var/del_type in del_types) var/obj/item/I = locate(del_type) in H @@ -431,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" @@ -449,6 +452,13 @@ flavour_text = "You are a space bartender! Time to mix drinks and change lives." assignedrole = "Space Bartender" +/obj/effect/mob_spawn/human/beach/alive/lifeguard + flavour_text = "You're a spunky lifeguard! It's up to you to make sure nobody drowns or gets eaten by sharks and stuff." + mob_gender = "female" + name = "lifeguard sleeper" + id_job = "Lifeguard" + uniform = /obj/item/clothing/under/shorts/red + /datum/outfit/spacebartender name = "Space Bartender" uniform = /obj/item/clothing/under/rank/bartender diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm index 816007d4ff8..4d5d464e136 100644 --- a/code/modules/awaymissions/maploader/reader.dm +++ b/code/modules/awaymissions/maploader/reader.dm @@ -176,7 +176,7 @@ var/global/dmm_suite/preloader/_preloader = new for(var/t in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ]))) var/turf/T = t //we do this after we load everything in. if we don't; we'll have weird atmos bugs regarding atmos adjacent turfs - T.AfterChange(1,keep_cabling = TRUE) + T.AfterChange(1, keep_cabling = TRUE) return bounds /** @@ -321,7 +321,7 @@ var/global/dmm_suite/preloader/_preloader = new var/turf/T = locate(x,y,z) if(T) if(ispath(path, /turf)) - T.ChangeTurf(path, 1, 0) + T.ChangeTurf(path, defer_change = TRUE, keep_icon = FALSE) instance = T else if(ispath(path, /area)) diff --git a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm index 6da42a682fa..7d045f0afcb 100644 --- a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm +++ b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm @@ -1,44 +1,44 @@ /area/awaymission/UO71 name = "UO71" icon_state = "away" - report_alerts = 0 - tele_proof = 1 + report_alerts = FALSE + tele_proof = TRUE /area/awaymission/UO71/plaza name = "UO71 Plaza" icon_state = "awaycontent1" - fire = 1 + fire = TRUE /area/awaymission/UO71/centralhall name = "UO71 Central" icon_state = "awaycontent2" - fire = 1 + fire = TRUE /area/awaymission/UO71/eng name = "UO71 Engineering" icon_state = "awaycontent3" - fire = 1 + fire = TRUE /area/awaymission/UO71/mining name = "UO71 Mining" icon_state = "awaycontent4" - fire = 1 + fire = TRUE /area/awaymission/UO71/science name = "UO71 Science" icon_state = "awaycontent5" - fire = 1 + fire = TRUE /area/awaymission/UO71/medical name = "UO71 Medical" icon_state = "awaycontent6" - fire = 1 + fire = TRUE /area/awaymission/UO71/gateway name = "UO71 Gateway" icon_state = "awaycontent7" - fire = 1 + fire = TRUE /area/awaymission/UO71/outside name = "UO71 Outside" @@ -47,36 +47,41 @@ /area/awaymission/UO71/bridge name = "UO71 Bridge" icon_state = "awaycontent21" - fire = 1 - requires_power = 0 - tele_proof = 1 + fire = TRUE + requires_power = FALSE + tele_proof = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/UO71/queen name = "UO71 Queen Lair" icon_state = "awaycontent9" - fire = 1 - requires_power = 0 - tele_proof = 1 + fire = TRUE + requires_power = FALSE + tele_proof = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/UO71/prince name = "UO71 Prince Containment" icon_state = "awaycontent10" - fire = 1 - requires_power = 0 - tele_proof = 1 + fire = TRUE + requires_power = FALSE + tele_proof = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/UO71/mother name = "UO71 Mother Containment" icon_state = "awaycontent10" - fire = 1 - requires_power = 0 - tele_proof = 1 + fire = TRUE + requires_power = FALSE + tele_proof = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/UO71/loot name = "UO71 Loot Vault" icon_state = "awaycontent11" - requires_power = 0 - tele_proof = 1 + requires_power = FALSE + tele_proof = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /obj/item/paper/terrorspiders1 name = "paper - 'Sealed Facility'" diff --git a/code/modules/awaymissions/mission_code/academy.dm b/code/modules/awaymissions/mission_code/academy.dm index 9ae1cdb223e..e41e29a747f 100644 --- a/code/modules/awaymissions/mission_code/academy.dm +++ b/code/modules/awaymissions/mission_code/academy.dm @@ -3,7 +3,7 @@ /area/awaymission/academy name = "\improper Academy Asteroids" icon_state = "away" - report_alerts = 0 + report_alerts = FALSE /area/awaymission/academy/headmaster name = "\improper Academy Fore Block" @@ -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 = 300) + 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/blackmarketpackers.dm b/code/modules/awaymissions/mission_code/blackmarketpackers.dm index c2d10d7c97d..73e288b56ed 100644 --- a/code/modules/awaymissions/mission_code/blackmarketpackers.dm +++ b/code/modules/awaymissions/mission_code/blackmarketpackers.dm @@ -3,25 +3,24 @@ /area/awaymission/BMPship name = "\improper BMP Asteroids" icon_state = "away" - luminosity = 0 - report_alerts = 0 + report_alerts = FALSE /area/awaymission/BMPship/Aft name = "\improper Aft Block" icon_state = "away1" - requires_power = 1 + requires_power = TRUE /area/awaymission/BMPship/Midship name = "\improper Midship Block" icon_state = "away2" - requires_power = 1 + requires_power = TRUE /area/awaymission/BMPship/Fore name = "\improper Fore Block" icon_state = "away3" - requires_power = 1 + requires_power = TRUE /area/awaymission/BMPship/Gate name = "\improper Gateway Block" icon_state = "away4" - requires_power = 1 \ No newline at end of file + requires_power = TRUE \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/centcomAway.dm b/code/modules/awaymissions/mission_code/centcomAway.dm index 447c53b0fb6..1dc26f932e0 100644 --- a/code/modules/awaymissions/mission_code/centcomAway.dm +++ b/code/modules/awaymissions/mission_code/centcomAway.dm @@ -3,7 +3,7 @@ /area/awaymission/centcomAway name = "XCC-P5831" icon_state = "away" - report_alerts = 0 + report_alerts = FALSE /area/awaymission/centcomAway/general name = "XCC-P5831" diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm index b0a092b7e7d..15dac122c54 100644 --- a/code/modules/awaymissions/mission_code/challenge.dm +++ b/code/modules/awaymissions/mission_code/challenge.dm @@ -3,7 +3,7 @@ /area/awaymission/challenge name = "Challenge" icon_state = "away" - report_alerts = 0 + report_alerts = FALSE /area/awaymission/challenge/start name = "Where Am I?" @@ -12,12 +12,14 @@ /area/awaymission/challenge/main name = "\improper Danger Room" icon_state = "away1" - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED /area/awaymission/challenge/end name = "Administration" icon_state = "away2" - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED /obj/machinery/power/emitter/energycannon diff --git a/code/modules/awaymissions/mission_code/clownplanet.dm b/code/modules/awaymissions/mission_code/clownplanet.dm deleted file mode 100644 index 8d64d3074d2..00000000000 --- a/code/modules/awaymissions/mission_code/clownplanet.dm +++ /dev/null @@ -1,21 +0,0 @@ -//Clown Planet Areas - -/area/planet/clown - name = "\improper Clown Planet" - icon_state = "honk" - luminosity = 1 - dynamic_lighting = 0 - requires_power = 0 - report_alerts = 0 - -/area/awaymission/clownplanet/miningtown - name = "\improper Clown Planet - Bananium-o-Rama" - icon_state = "away1" - luminosity = 1 - requires_power = 0 - -/area/awaymission/clownplanet/mine - name = "\improper Clown Planet - Bananium-o-Rama Mines" - icon_state = "away2" - luminosity = 1 - requires_power = 0 \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/ruins/oldstation.dm b/code/modules/awaymissions/mission_code/ruins/oldstation.dm index 1886aba02ab..7150d0c74c4 100644 --- a/code/modules/awaymissions/mission_code/ruins/oldstation.dm +++ b/code/modules/awaymissions/mission_code/ruins/oldstation.dm @@ -307,6 +307,7 @@ name = "Powered Tile" icon_state = "teleporter" requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/ruin/space/ancientstation/space name = "Exposed To Space" diff --git a/code/modules/awaymissions/mission_code/spacebattle.dm b/code/modules/awaymissions/mission_code/spacebattle.dm index 3f9c9925772..146597fe457 100644 --- a/code/modules/awaymissions/mission_code/spacebattle.dm +++ b/code/modules/awaymissions/mission_code/spacebattle.dm @@ -3,8 +3,9 @@ /area/awaymission/spacebattle name = "\improper Space Battle" icon_state = "away" - requires_power = 0 - report_alerts = 0 + requires_power = FALSE + report_alerts = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED /area/awaymission/spacebattle/cruiser name = "\improper Nanotrasen Cruiser" diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm index 0328dea5b53..d2fda046d7e 100644 --- a/code/modules/awaymissions/mission_code/spacehotel.dm +++ b/code/modules/awaymissions/mission_code/spacehotel.dm @@ -2,7 +2,8 @@ /area/awaymission/spacehotel name = "Deep Space Hotel 419" - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/spacehotel/kitchen name = "Hotel Kitchen" @@ -152,14 +153,6 @@ /obj/machinery/door/unpowered/hotel_door/autoclose() if(!density && !operating && autoclose) close() - -/obj/machinery/door/unpowered/hotel_door/emag_act(mob/user) - if(isliving(user) && density) - var/obj/effect/hotel_controller/H - if(H.controller) - H.controller.deploy_sec(user) - ..() - /obj/item/card/hotel_card name = "Key Card" icon_state = "guest" @@ -283,20 +276,4 @@ spawn(300) if(D.occupant == deadbeat) // they still haven't checked out... - deploy_sec(deadbeat) - checkout(roomid) - -/obj/effect/hotel_controller/proc/deploy_sec(mob/living/target) - if(!istype(target) || !istype(get_area(target), /area/awaymission/spacehotel)) - return - - var/list/secs[0] - for(var/mob/living/carbon/human/interactive/away/hotel/guard/M in get_area(src)) - if(!M.retal) - secs += M - var/mob/living/carbon/human/interactive/away/hotel/guard/S = safepick(secs) - if(!S) - return - - S.retal_target = target - S.retal = 1 + checkout(roomid) \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm b/code/modules/awaymissions/mission_code/spacehotel_npcs.dm deleted file mode 100644 index 2a524ab738c..00000000000 --- a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm +++ /dev/null @@ -1,132 +0,0 @@ -/mob/living/carbon/human/interactive/away/hotel - away_area = /area/awaymission/spacehotel - override_under = /obj/item/clothing/under/mafia - chattyness = SNPC_CHANCE_TALK / 4 - -/mob/living/carbon/human/interactive/away/hotel/Initialize(mapload) - . = ..(mapload, /datum/species/skrell) - -/mob/living/carbon/human/interactive/away/hotel/doSetup() - ..() - MYID.access = list(access_syndicate) - RPID.access = list(access_syndicate) - -/mob/living/carbon/human/interactive/away/hotel/guard - default_job = /datum/job/officer - -/mob/living/carbon/human/interactive/away/hotel/guard/doSetup() - ..("Guard") - - // anti-pinata cheese - var/obj/item/implant/dust/D = new /obj/item/implant/dust(src) - D.implant(src) - - for(var/obj/item/I in get_all_slots()) - I.flags |= NODROP - -/mob/living/carbon/human/interactive/away/hotel/guard/KnockOut() - // you'll never take me alive (this triggers the implant) - emote("deathgasp") - if(stat != DEAD) - // mission failed. we'll get em next time - ..() - -/mob/living/carbon/human/interactive/away/hotel/chef - default_job = /datum/job/chef - away_area = /area/awaymission/spacehotel/kitchen - override_under = /obj/item/clothing/under/mafia/vest - -/mob/living/carbon/human/interactive/away/hotel/bartender - default_job = /datum/job/bartender - override_under = /obj/item/clothing/under/mafia/vest - -/mob/living/carbon/human/interactive/away/hotel/concierge - override_under = /obj/item/clothing/under/mafia/white - away_area = /area/awaymission/spacehotel/reception - var/list/known_guests[0] - var/obj/effect/hotel_controller/hotel - var/obj/item/card/id/last_seen_id = null - -/mob/living/carbon/human/interactive/away/hotel/concierge/random() - ..() - equip_or_collect(new /obj/item/clipboard(src), slot_l_hand) - -/mob/living/carbon/human/interactive/away/hotel/concierge/doSetup() - ..("Concierge") - -/mob/living/carbon/human/interactive/away/hotel/concierge/setup_job() - favoured_types = list(/obj/item/paper, /obj/item/clipboard) - functions += list("stamping", "concierge") - restrictedJob = 1 - -/mob/living/carbon/human/interactive/away/hotel/concierge/proc/concierge() - if(!hotel) - hotel = hotel.controller - if(!hotel) - return - - var/verbs_use = pick_list(speak_file, "verbs_use") - var/verbs_touch = pick_list(speak_file, "verbs_touch") - var/verbs_move = pick_list(speak_file, "verbs_move") - var/nouns_generic = pick_list(speak_file, "nouns_generic") - var/adjective_insult = pick_list(speak_file, "adjective_insult") - var/adjective_objects = pick_list(speak_file, "adjective_objects") - var/adjective_generic = pick_list(speak_file, "adjective_generic") - var/curse_words = pick_list(speak_file, "curse_words") - - var/found = 0 - for(var/mob/living/carbon/human/H in nearby - known_guests) - pointed(H) - known_guests += H - found = 1 - if(found) - say("Welcome to [hotel], [nouns_generic]! Please check in by [ing_verb(verbs_move)] and [ing_verb(verbs_use)] your [adjective_objects] ID onto the table.") - return - - var/obj/item/card/id - var/id_seen = 0 - for(var/obj/item/card/id/I in get_area(src)) - id_seen = 1 - if(I != last_seen_id) - id = I - if(!id_seen) - last_seen_id = null - return - if(!id) - return - var/turf/idloc = get_turf(id) - if(!Adjacent(idloc)) - tryWalk(idloc) - else - // is the last jerk that touched it over here? - var/mob/id_owner - for(var/mob/living/carbon/human/H in nearby) - if(H.ckey == id.fingerprintslast) - id_owner = H - break - - if(!id_owner) - say("Whose card is this?") - pointed(id) - return - - last_seen_id = id - // Checking in or out? - if(id_owner in hotel.guests) - // Check out - say ("Hope you enjoyed your [adjective_objects] stay at our [adjective_generic] hotel!") - hotel.checkout(hotel.guests[id_owner]) - else - // pick a room - var/obj/machinery/door/unpowered/hotel_door/D = safepick(hotel.vacant_rooms) - if(!D) - say("Sorry, all the [adjective_objects] are occupied currently.") - else - // Check in - say("$100 per 10 minutes. The cost will be automatically [past_verb(verbs_touch)] while you're checked in.") - - var/obj/item/card/hotel_card/K = hotel.checkin(D.id, id_owner, id) - if(K) - K.forceMove(idloc) - else - say("Your [adjective_insult] [curse_words] card was rejected.") diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index 17ece10d71a..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 @@ -161,7 +161,7 @@ var/sc_safecode5 = "[rand(0,9)]" desc = "Your body becomes weak and your feel your mind slipping away as you try to comprehend what you know can't be possible." move_self = 0 //Contianed narsie does not move! grav_pull = 0 //Contained narsie does not pull stuff in! - var/uneatable = list(/turf/space, /obj/effect/overlay, /atom/movable/lighting_overlay, /mob/living/simple_animal/hostile/construct) + var/uneatable = list(/turf/space, /obj/effect/overlay, /mob/living/simple_animal/hostile/construct) //Override this to prevent no adminlog runtimes and admin warnings about a singularity without containment /obj/singularity/narsie/sc_Narsie/admin_investigate_setup() @@ -173,14 +173,16 @@ var/sc_safecode5 = "[rand(0,9)]" mezzer() /obj/singularity/narsie/sc_Narsie/consume(var/atom/A) + if(!A.simulated) + return FALSE if(is_type_in_list(A, uneatable)) - return 0 + return FALSE if(istype(A,/mob/living)) var/mob/living/L = A L.gib() else if(istype(A,/obj/)) var/obj/O = A - O.ex_act(1.0) + O.ex_act(1) if(O) qdel(O) else if(isturf(A)) var/turf/T = A @@ -190,7 +192,7 @@ var/sc_safecode5 = "[rand(0,9)]" continue if(O.invisibility == 101) src.consume(O) - T.ChangeTurf(/turf/space) + T.ChangeTurf(T.baseturf) return /obj/singularity/narsie/sc_Narsie/ex_act() diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 91c09d15f30..ca79a1ea2a6 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -9,31 +9,30 @@ /area/awaymission/wwmines name = "\improper Wild West Mines" icon_state = "away1" - luminosity = 1 - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/wwgov name = "\improper Wild West Mansion" icon_state = "away2" - luminosity = 1 - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/wwrefine name = "\improper Wild West Refinery" icon_state = "away3" - luminosity = 1 - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/wwvault name = "\improper Wild West Vault" icon_state = "away3" - luminosity = 0 /area/awaymission/wwvaultdoors name = "\improper Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power icon_state = "away2" - requires_power = 0 - luminosity = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /* * Wish Granter @@ -141,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/snpc.dm b/code/modules/awaymissions/snpc.dm deleted file mode 100644 index 04e3bf19b8e..00000000000 --- a/code/modules/awaymissions/snpc.dm +++ /dev/null @@ -1,85 +0,0 @@ -/mob/living/carbon/human/interactive/away - var/away_area = /area/awaymission // their overriden job area - var/override_under = null // optional type for uniform, else default for job - var/squad_member = 0 // was spawned by squad - var/home_z - -/mob/living/carbon/human/interactive/away/Initialize(mapload) - . = ..() - TRAITS |= TRAIT_ROBUST - faction += "away" - -/mob/living/carbon/human/interactive/away/random() - ..() - // a little hacky but it should prevent doubled uniforms - if(ispath(override_under, /obj/item/clothing/under)) - var/old_under = w_uniform - w_uniform = null - equip_to_slot(new override_under(src), slot_w_uniform) - qdel(old_under) - -/mob/living/carbon/human/interactive/away/doSetup() - ..() - var/datum/data/pda/app/messenger/M = MYPDA.find_program(/datum/data/pda/app/messenger) - M.toff = 1 - -/mob/living/carbon/human/interactive/away/job2area() - return away_area - -/mob/living/carbon/human/interactive/away/doProcess() - if(!home_z) - home_z = get_turf(z) - if(home_z != get_turf(z)) - gib() - ..() - -/obj/effect/spawner/snpc_squad - name = "squad spawner" - icon = 'icons/mob/screen_gen.dmi' - icon_state = "x" - density = 0 - opacity = 0 - invisibility = 101 - var/squad_type = /mob/living/carbon/human/interactive/away - var/squad_size = 3 - - var/global/list/squads[0] - var/list/squad - -/obj/effect/spawner/snpc_squad/New() - processing_objects += src - - squad = squads[squad_type] - if(!squad) - squad = list() - squads[squad_type] = squad - squad += src - -/obj/effect/spawner/snpc_squad/Destroy() - squad = null - processing_objects -= src - return ..() - -/obj/effect/spawner/snpc_squad/process() - // check squad memebers - var/living = 0 - for(var/mob/living/carbon/human/interactive/away/A in squad) - if(!A.stat) - living++ - else - // see if anyone's looking, if not, despawn - var/can_despawn = 1 - for(var/mob/living/M in viewers(A, world.view + 1)) - if(M.client) - living++ // dead guy that can be seen still takes up a slot - can_despawn = 0 - break - if(can_despawn) - squad -= A - qdel(A) - - // spawn new ones - if(living < squad_size && !length(viewers(src, world.view))) - var/mob/living/carbon/human/interactive/away/A = new squad_type(loc) - squad += A - A.squad_member = 1 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/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 36a4eeda829..920f91a7ed0 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -22,9 +22,6 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away var/atom/A = R if(A.smooth) queue_smooth(A) - if(istype(T, /turf/simulated/mineral)) // For the listening post, among other maps - var/turf/simulated/mineral/MT = T - MT.add_edges() log_debug("\tTook [stop_watch(subtimer)]s") log_debug("Late setup finished - took [stop_watch(total_timer)]s") @@ -39,7 +36,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away var/turf/T = thing for(var/otherthing in T) qdel(otherthing) - T.ChangeTurf(/turf/space) + T.ChangeTurf(T.baseturf) /proc/createRandomZlevel() if(awaydestinations.len) //crude, but it saves another var! @@ -137,80 +134,123 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away return potentialMaps -/proc/seedRuins(z_level = 1, budget = 0, whitelist = /area/space, list/potentialRuins = space_ruins_templates) - var/overall_sanity = 100 - var/ruins = potentialRuins.Copy() - var/initialbudget = budget - var/watch = start_watch() +/datum/map_template/ruin/proc/try_to_place(z,allowed_areas) + var/sanity = PLACEMENT_TRIES + while(sanity > 0) + sanity-- + var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(width / 2) + var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(height / 2) + var/turf/central_turf = locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z) + var/valid = TRUE - while(budget > 0 && overall_sanity > 0) - // Pick a ruin - var/datum/map_template/ruin/ruin = ruins[pick(ruins)] - // Can we afford it - if(ruin.cost > budget) - overall_sanity-- + for(var/turf/check in get_affected_turfs(central_turf,1)) + var/area/new_area = get_area(check) + if(!(istype(new_area, allowed_areas)) || check.flags & NO_RUINS) + valid = FALSE + break + + if(!valid) continue - // If so, try to place it - var/sanity = 100 - // And if we can't fit it anywhere, give up, try again - while(sanity > 0) - sanity-- - // 8: 7 is the normal view distance of a client, +1 so that ruins don't suddenly appear - var/turf/T = locate(rand(TRANSITION_BORDER_WEST + (8 + ruin.width/2), TRANSITION_BORDER_EAST - (8 + ruin.width/2)), rand(TRANSITION_BORDER_SOUTH + (8 + ruin.height/2), TRANSITION_BORDER_NORTH - (8 + ruin.height/2)), z_level) - var/valid = 1 + log_world("Ruin \"[name]\" placed at ([central_turf.x], [central_turf.y], [central_turf.z])") - for(var/turf/check in ruin.get_affected_turfs(T,1)) - var/area/new_area = get_area(check) - if(!(istype(new_area, whitelist))) - valid = 0 - break + for(var/i in get_affected_turfs(central_turf, 1)) + var/turf/T = i + for(var/mob/living/simple_animal/monster in T) + qdel(monster) + for(var/obj/structure/flora/ash/plant in T) + qdel(plant) + + load(central_turf,centered = TRUE) + loaded++ - if(!valid) + for(var/turf/T in get_affected_turfs(central_turf, 1)) + T.flags |= NO_RUINS + + new /obj/effect/landmark/ruin(central_turf, src) + return TRUE + return FALSE + +/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins) + if(!z_levels || !z_levels.len) + WARNING("No Z levels provided - Not generating ruins") + return + + for(var/zl in z_levels) + var/turf/T = locate(1, 1, zl) + if(!T) + WARNING("Z level [zl] does not exist - Not generating ruins") + return + + var/list/ruins = potentialRuins.Copy() + + var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) + var/list/ruins_availible = list() //we can try these in the current pass + var/forced_z //If set we won't pick z level and use this one instead. + + //Set up the starting ruin list + for(var/key in ruins) + var/datum/map_template/ruin/R = ruins[key] + if(R.cost > budget) //Why would you do that + continue + if(R.always_place) + forced_ruins[R] = -1 + if(R.unpickable) + continue + ruins_availible[R] = R.placement_weight + + while(budget > 0 && (ruins_availible.len || forced_ruins.len)) + var/datum/map_template/ruin/current_pick + var/forced = FALSE + if(forced_ruins.len) //We have something we need to load right now, so just pick it + for(var/ruin in forced_ruins) + current_pick = ruin + if(forced_ruins[ruin] > 0) //Load into designated z + forced_z = forced_ruins[ruin] + forced = TRUE + break + else //Otherwise just pick random one + current_pick = pickweight(ruins_availible) + + var/placement_tries = PLACEMENT_TRIES + var/failed_to_place = TRUE + var/z_placed = 0 + while(placement_tries > 0) + placement_tries-- + z_placed = pick(z_levels) + if(!current_pick.try_to_place(forced_z ? forced_z : z_placed,whitelist)) continue + else + failed_to_place = FALSE + break - log_world(" Ruin \"[ruin.name]\" loaded in [stop_watch(watch)]s at ([T.x], [T.y], [T.z]).") + //That's done remove from priority even if it failed + if(forced) + //TODO : handle forced ruins with multiple variants + forced_ruins -= current_pick + forced = FALSE + + if(failed_to_place) + for(var/datum/map_template/ruin/R in ruins_availible) + if(R.id == current_pick.id) + ruins_availible -= R + log_world("Failed to place [current_pick.name] ruin.") + else + budget -= current_pick.cost + if(!current_pick.allow_duplicates) + for(var/datum/map_template/ruin/R in ruins_availible) + if(R.id == current_pick.id) + ruins_availible -= R + if(current_pick.never_spawn_with) + for(var/blacklisted_type in current_pick.never_spawn_with) + for(var/possible_exclusion in ruins_availible) + if(istype(possible_exclusion,blacklisted_type)) + ruins_availible -= possible_exclusion + forced_z = 0 - var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T) - R.Load(ruins,ruin) - budget -= ruin.cost - if(!ruin.allow_duplicates) - ruins -= ruin.name - break - - - if(initialbudget == budget) //Kill me - log_world(" No ruins loaded.") - - -/obj/effect/ruin_loader - name = "random ruin" - desc = "If you got lucky enough to see this..." - icon = 'icons/obj/items.dmi' - icon_state = "syndballoon" - invisibility = 0 - -/obj/effect/ruin_loader/proc/Load(list/potentialRuins = space_ruins_templates, datum/map_template/template = null) - var/list/possible_ruins = list() - for(var/A in potentialRuins) - var/datum/map_template/T = potentialRuins[A] - if(!T.loaded) - possible_ruins += T - if(!template && possible_ruins.len) - template = safepick(possible_ruins) - if(!template) - return 0 - var/turf/central_turf = get_turf(src) - for(var/i in template.get_affected_turfs(central_turf, 1)) - var/turf/T = i - for(var/mob/living/simple_animal/monster in T) - qdel(monster) - for(var/obj/structure/flora/ash/plant in T) - qdel(plant) - template.load(get_turf(src),centered = 1) - template.loaded++ - var/datum/map_template/ruin = template - if(istype(ruin)) - new /obj/effect/landmark/ruin(central_turf, ruin) - qdel(src) - return 1 + //Update the availible list + for(var/datum/map_template/ruin/R in ruins_availible) + if(R.cost > budget) + ruins_availible -= R + + log_world("Ruin loader finished with [budget] left to spend.") diff --git a/code/modules/awaymissions/zvis.dm b/code/modules/awaymissions/zvis.dm index 03adaeda629..102554f2e6e 100644 --- a/code/modules/awaymissions/zvis.dm +++ b/code/modules/awaymissions/zvis.dm @@ -1,8 +1,8 @@ /area/awaymission/upperlevel name = "Open Space" color = "#888" - dynamic_lighting = 0 - requires_power = 0 + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + requires_power = FALSE // Used by /turf/unsimulated/floor/upperlevel as a reference for where the other floor is /obj/effect/levelref @@ -58,14 +58,14 @@ owner = o if(args.len >= 3) params = args.Copy(3) - processing_objects += src + START_PROCESSING(SSobj, src) trigger() /obj/effect/portal_sensor/Destroy() - processing_objects -= src + 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) @@ -84,9 +84,14 @@ /obj/effect/portal_sensor/proc/check_light() var/turf/T = loc - if(istype(T) && T.lighting_overlay && !T.lighting_overlay.needs_update) - var/atom/movable/lighting_overlay/O = T.lighting_overlay - var/hash = O.lum_r + O.lum_g + O.lum_b + if(istype(T) && T.lighting_object && !T.lighting_object.needs_update) + var/atom/movable/lighting_object/O = T.lighting_object + var/hash = 0 + + for(var/lighting_corner in O) + var/datum/lighting_corner/C = lighting_corner + hash = hash + C.lum_r + C.lum_g + C.lum_b + if(hash != light_hash) light_hash = hash trigger() @@ -365,4 +370,4 @@ screen_loc = "CENTER[ox >= 0 ? "+" : ""][ox],CENTER[oy >= 0 ? "+" : ""][oy]" /obj/effect/view_portal_dummy/attack_ghost(mob/user) - owner.attack_ghost(user) + owner.attack_ghost(user) \ No newline at end of file diff --git a/code/modules/buildmode/submodes/basic.dm b/code/modules/buildmode/submodes/basic.dm index 1ca36920c64..86988a24e01 100644 --- a/code/modules/buildmode/submodes/basic.dm +++ b/code/modules/buildmode/submodes/basic.dm @@ -35,7 +35,7 @@ T.ChangeTurf(/turf/simulated/floor/plasteel) else if(istype(object,/turf/simulated/floor)) var/turf/T = object - T.ChangeTurf(/turf/space) + T.ChangeTurf(T.baseturf) else if(istype(object,/turf/simulated/wall/r_wall)) var/turf/T = object T.ChangeTurf(/turf/simulated/wall) diff --git a/code/modules/buildmode/submodes/link.dm b/code/modules/buildmode/submodes/link.dm index 608bea17833..136ffad6433 100644 --- a/code/modules/buildmode/submodes/link.dm +++ b/code/modules/buildmode/submodes/link.dm @@ -46,17 +46,17 @@ if(!M.id || M.id == "") M.id = input(user, "Please select an ID for the button", "Buildmode", "") if(!M.id || M.id == "") - goto(line_jump) + goto line_jump if(P.id_tag == M.id && P.id_tag && P.id_tag != "") P.id_tag = null to_chat(user, "[P] unlinked.") - goto(line_jump) + goto line_jump if(!M.normaldoorcontrol) if(link_lines.len && alert(user, "Warning: This will disable links to connected pod doors. Continue?", "Buildmode", "Yes", "No") == "No") - goto(line_jump) + goto line_jump M.normaldoorcontrol = 1 if(P.id_tag && alert(user, "Warning: This will unlink something else from the door. Continue?", "Buildmode", "Yes", "No") == "No") - goto(line_jump) + goto line_jump P.id_tag = M.id if(istype(link_obj, /obj/machinery/door_control) && istype(object, /obj/machinery/door/poddoor)) var/obj/machinery/door_control/M = link_obj @@ -64,21 +64,21 @@ if(!M.id || M.id == "") M.id = input(user, "Please select an ID for the button", "Buildmode", "") if(!M.id || M.id == "") - goto(line_jump) + goto line_jump if(P.id_tag == M.id && P.id_tag && P.id_tag != "") P.id_tag = null to_chat(user, "[P] unlinked.") - goto(line_jump) + goto line_jump if(M.normaldoorcontrol) if(link_lines.len && alert(user, "Warning: This will disable links to connected airlocks. Continue?", "Buildmode", "Yes", "No") == "No") - goto(line_jump) + goto line_jump M.normaldoorcontrol = 0 if(!M.id || M.id == "") M.id = input(user, "Please select an ID for the button", "Buildmode", "") if(!M.id || M.id == "") - goto(line_jump) + goto line_jump if(P.id_tag && P.id_tag != 1 && alert(user, "Warning: This will unlink something else from the door. Continue?", "Buildmode", "Yes", "No") == "No") - goto(line_jump) + goto line_jump P.id_tag = M.id line_jump // For the goto diff --git a/code/modules/busy_space/air_traffic.dm b/code/modules/busy_space/air_traffic.dm index de0b37ed3c3..b5cbf8e6fda 100644 --- a/code/modules/busy_space/air_traffic.dm +++ b/code/modules/busy_space/air_traffic.dm @@ -17,7 +17,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller next_message = world.time + rand(delay_min, delay_max) process() -/datum/lore/atc_controller/proc/process() +/datum/lore/atc_controller/process() if(world.time >= next_message) if(squelched) next_message = world.time + backoff_delay diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index c88347a305b..22325fed75f 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// //////////////// @@ -7,6 +11,7 @@ var/last_message = "" //contains the last message sent by this client - used to protect against copy-paste spamming. var/last_message_count = 0 //contains a number of how many times a message identical to last_message was sent. var/last_message_time = 0 //holds the last time (based on world.time) a message was sent + var/datum/pm_tracker/pm_tracker = new() ///////// //OTHER// @@ -19,9 +24,11 @@ var/area = null var/time_died_as_mouse = null //when the client last died as a mouse + var/typing = FALSE // Prevents typing window stacking + 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 @@ -44,7 +51,7 @@ var/received_irc_pm = -99999 var/irc_admin //IRC admin that spoke with them last. var/mute_irc = 0 - + var/ssd_warning_acknowledged = FALSE //////////////////////////////////// //things that require the database// @@ -53,7 +60,7 @@ var/list/related_accounts_ip = list() //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip var/list/related_accounts_cid = list() //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id - preload_rsc = 1 // This is 0 so we can set it to an URL once the player logs in and have them download the resources from a different server. + preload_rsc = 0 // This is 0 so we can set it to an URL once the player logs in and have them download the resources from a different server. var/global/obj/screen/click_catcher/void @@ -65,29 +72,12 @@ // Set on login. var/datum/media_manager/media = null - ///////////////////////////////////////////////////////////////////// - //adv. hotkey mode vars, code using them in /interface/interface.dm// - ///////////////////////////////////////////////////////////////////// - - var/hotkeytype = "QWERTY" //what set of hotkeys is in use(defaulting to QWERTY because I can't be bothered to make this save on SQL) - var/hotkeyon = 0 //is the hotkey on? - - var/hotkeylist = list( //list defining hotkey types, look at lists in place for structure if adding any if the future - "QWERTY" = list( - "on" = "hotkeymode", - "off" = "macro"), - "AZERTY" = list( - "on" = "AZERTYon", - "off" = "AZERTYoff"), - "Cyborg" = list( - "on" = "borghotkeymode", - "off" = "borgmacro") - ) - var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier control_freak = CONTROL_FREAK_ALL | CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS + var/ip_intel = "Disabled" + var/datum/click_intercept/click_intercept = null //datum that controls the displaying and hiding of tooltips @@ -98,10 +88,10 @@ var/datum/chatOutput/chatOutput // Donator stuff. - var/donator_level = DONATOR_LEVEL_NONE + var/donator_level = 0 // 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 ac9a88aaa08..95f6c16ba97 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -9,6 +9,7 @@ #define MIN_CLIENT_VERSION 0 //Just an ambiguously low version for now, I don't want to suddenly stop people playing. //I would just like the code ready should it ever need to be used. #define SUGGESTED_CLIENT_VERSION 511 // only integers (e.g: 510, 511) useful here. Does not properly handle minor versions (e.g: 510.58, 511.848) +#define SSD_WARNING_TIMER 30 // cycles, not seconds, so 30=60s /* When somebody clicks a link in game, this Topic is called first. @@ -73,11 +74,11 @@ //Admin PM if(href_list["priv_msg"]) var/client/C = locate(href_list["priv_msg"]) - if(ismob(C)) //Old stuff can feed-in mobs instead of clients - var/mob/M = C - C = M.client + if(!C) // Might be a stealthmin ID, so pass it in straight C = href_list["priv_msg"] + else if(C.UID() != href_list["priv_msg"]) + C = null // 404 client not found. Let cmd_admin_pm handle the error cmd_admin_pm(C, null, href_list["type"]) return @@ -225,7 +226,11 @@ vote_on_poll(pollid, optionid, 1) src << browse(null, "window=playerpoll") handle_player_polling() - + if(href_list["ssdwarning"]) + ssd_warning_acknowledged = TRUE + to_chat(src, "SSD warning acknowledged.") + if(href_list["link_forum_account"]) + link_forum_account() switch(href_list["action"]) if("openLink") src << link(href_list["link"]) @@ -292,45 +297,38 @@ 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. - if(config.resource_urls) - preload_rsc = pick(config.resource_urls) - else preload_rsc = 1 // If config.resource_urls is not set, preload like normal. - to_chat(src, "If the title screen is black, resources are still downloading. Please be patient until the title screen appears.") GLOB.clients += src GLOB.directory[ckey] = src - //Admin Authorisation // Automatically makes localhost connection an admin if(!config.disable_localhost_admin) - var/localhost_addresses = list("127.0.0.1", "::1") // Adresses - if(!isnull(address) && address in localhost_addresses) + if(is_connecting_from_localhost()) new /datum/admins("!LOCALHOST!", R_HOST, ckey) // Makes localhost rank holder = admin_datums[ckey] if(holder) GLOB.admins += src holder.owner = src - donator_check() - //preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum) prefs = preferences_datums[ckey] if(!prefs) prefs = new /datum/preferences(src) preferences_datums[ckey] = prefs + else + prefs.parent = src prefs.last_ip = address //these are gonna be used for banning prefs.last_id = computer_id //these are gonna be used for banning if(world.byond_version >= 511 && byond_version >= 511 && prefs.clientfps) @@ -339,12 +337,6 @@ spawn() // Goonchat does some non-instant checks in start() chatOutput.start() - if(custom_event_msg && custom_event_msg != "") - to_chat(src, "

Custom Event

") - to_chat(src, "

A custom event is taking place. OOC Info:

") - to_chat(src, "[html_encode(custom_event_msg)]") - to_chat(src, "
") - if( (world.address == address || !address) && !host ) host = key world.update_status() @@ -367,12 +359,17 @@ . = ..() //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() send_resources() if(prefs.toggles & UI_DARKMODE) // activates dark mode if its flagged. -AA07 @@ -391,21 +388,42 @@ if(establish_db_connection()) to_chat(src,"You have enabled karma gains.") - if(!void) - void = new() + generate_clickcatcher() + apply_clickcatcher() - screen += void + check_forum_link() + + if(custom_event_msg && custom_event_msg != "") + to_chat(src, "

Custom Event

") + to_chat(src, "

A custom event is taking place. OOC Info:

") + to_chat(src, "[html_encode(custom_event_msg)]") + to_chat(src, "
") 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) Master.UpdateTickRate() + // Check total playercount + var/playercount = 0 + for(var/mob/M in GLOB.player_list) + if(M.client) + playercount += 1 + + if(playercount >= 150 && GLOB.panic_bunker_enabled == 0) + GLOB.panic_bunker_enabled = 1 + message_admins("Panic bunker has been automatically enabled due to playercount surpassing 150") + +/client/proc/is_connecting_from_localhost() + var/localhost_addresses = list("127.0.0.1", "::1") // Adresses + if(!isnull(address) && address in localhost_addresses) + return TRUE + return FALSE + ////////////// //DISCONNECT// ////////////// @@ -427,17 +445,27 @@ if(!dbcon.IsConnected()) return + if(check_rights(R_ADMIN, 0, mob)) // Yes, the mob is required, regardless of other examples in this file, it won't work otherwise + donator_level = DONATOR_LEVEL_MAX + donor_loadout_points() + return + //Donator stuff. var/DBQuery/query_donor_select = dbcon.NewQuery("SELECT ckey, tier, active FROM `[format_table_name("donators")]` WHERE ckey = '[ckey]'") query_donor_select.Execute() while(query_donor_select.NextRow()) if(!text2num(query_donor_select.item[3])) // Inactive donator. - donator_level = DONATOR_LEVEL_NONE + donator_level = 0 return donator_level = text2num(query_donor_select.item[2]) + donor_loadout_points() break +/client/proc/donor_loadout_points() + if(donator_level > 0 && prefs) + prefs.max_gear_slots = config.max_loadout_points + 5 + /client/proc/log_client_to_db(connectiontopic) if(IsGuestKey(key)) return @@ -515,6 +543,14 @@ message_admins("SQL ERROR during log_client_to_db (update). Error : \[[err]\]\n") else //New player!! Need to insert all the stuff + + // Check new peeps for panic bunker + if(GLOB.panic_bunker_enabled) + message_admins("Failed Login: [key] - New account attempting to connect during panic bunker") + src << "Sorry but the server is currently not accepting connections from never before seen players. Please try again later." + del(src) + return // Dont insert or they can just go in again + var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')") if(!query_insert.Execute()) var/err = query_insert.ErrorMsg() @@ -526,6 +562,81 @@ var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `[format_table_name("connection_log")]`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[ckey]','[sql_ip]','[sql_computerid]');") query_accesslog.Execute() +/client/proc/check_ip_intel() + set waitfor = 0 //we sleep when getting the intel, no need to hold up the client connection while we sleep + if(config.ipintel_email) + if(config.ipintel_maxplaytime && config.use_exp_tracking) + var/living_hours = get_exp_type_num(EXP_TYPE_LIVING) / 60 + if(living_hours >= config.ipintel_maxplaytime) + return + + if(is_connecting_from_localhost()) + log_debug("check_ip_intel: skip check for player [key_name_admin(src)] connecting from localhost.") + return + + if(vpn_whitelist_check(ckey)) + log_debug("check_ip_intel: skip check for player [key_name_admin(src)] [address] on whitelist.") + return + + var/datum/ipintel/res = get_ip_intel(address) + ip_intel = res.intel + verify_ip_intel() + +/client/proc/verify_ip_intel() + if(ip_intel >= config.ipintel_rating_bad) + var/detailsurl = config.ipintel_detailsurl ? "(IP Info)" : "" + if(config.ipintel_whitelist) + spawn(40) // This is necessary because without it, they won't see the message, and addtimer cannot be used because the timer system may not have initialized yet + message_admins("IPIntel: [key_name_admin(src)] on IP [address] was rejected. [detailsurl]") + var/blockmsg = "Error: proxy/VPN detected. Proxy/VPN use is not allowed here. Deactivate it before you reconnect." + if(config.banappeals) + blockmsg += "\nIf you are not actually using a proxy/VPN, or have no choice but to use one, request whitelisting at: [config.banappeals]" + to_chat(src, blockmsg) + qdel(src) + else + message_admins("IPIntel: [key_name_admin(src)] on IP [address] is likely to be using a Proxy/VPN. [detailsurl]") + + +/client/proc/check_forum_link() + if(config.forum_link_url && prefs && !prefs.fuid) + to_chat(src, "You do not have your forum account linked. LINK FORUM ACCOUNT") + +/client/proc/create_oauth_token() + var/DBQuery/query_find_token = dbcon.NewQuery("SELECT token FROM [format_table_name("oauth_tokens")] WHERE ckey = '[ckey]' limit 1") + if(!query_find_token.Execute()) + log_debug("create_oauth_token: failed db read") + return + if(query_find_token.NextRow()) + return query_find_token.item[1] + var/tokenstr = md5("[ckey][rand()]") + var/DBQuery/query_insert_token = dbcon.NewQuery("INSERT INTO [format_table_name("oauth_tokens")] (ckey, token) VALUES('[ckey]','[tokenstr]')") + if(!query_insert_token.Execute()) + return + return tokenstr + +/client/proc/link_forum_account() + if(IsGuestKey(key)) + to_chat(src, "Guest keys cannot be linked.") + return + if(prefs && prefs.fuid) + to_chat(src, "Your forum account is already set.") + return + var/DBQuery/query_find_link = dbcon.NewQuery("SELECT fuid FROM [format_table_name("player")] WHERE ckey = '[ckey]' limit 1") + if(!query_find_link.Execute()) + log_debug("link_forum_account: failed db read") + return + if(query_find_link.NextRow()) + if(query_find_link.item[1]) + to_chat(src, "Your forum account is already set. (" + query_find_link.item[1] + ")") + return + var/tokenid = create_oauth_token() + if(!tokenid) + to_chat(src, "link_forum_account: unable to create token") + return + var/url = "[config.forum_link_url][tokenid]" + to_chat(src, {"Now opening a windows to verify your information with the forums. If the window does not load, please go to: [url]."}) + src << link(url) + return #undef TOPIC_SPAM_DELAY #undef UPLOAD_LIMIT @@ -567,7 +678,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]) @@ -578,7 +689,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) @@ -596,7 +707,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 @@ -657,6 +768,11 @@ //Send resources to the client. /client/proc/send_resources() + // Change the way they should download resources. + if(config.resource_urls) + preload_rsc = pick(config.resource_urls) + else + preload_rsc = 1 // If config.resource_urls is not set, preload like normal. // Most assets are now handled through global_cache.dm getFiles( 'html/search.js', // Used in various non-NanoUI HTML windows for search functionality @@ -675,8 +791,8 @@ message += " (RESTRICTED)" to_chat(world, "[message]") -/client/proc/colour_transition(var/list/colour_to = null, var/time = 10) //Call this with no parameters to reset to default. - animate(src, color=colour_to, time=time, easing=SINE_EASING) +/client/proc/colour_transition(list/colour_to = null, time = 10) //Call this with no parameters to reset to default. + animate(src, color = colour_to, time = time, easing = SINE_EASING) /client/proc/on_varedit() var_edited = TRUE @@ -698,18 +814,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") @@ -733,18 +846,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") @@ -770,3 +880,25 @@ winset(src, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF") else winset(src, "rpane.changelog", "background-color=none;text-color=#000000") + +/client/proc/generate_clickcatcher() + if(!void) + void = new() + screen += void + +/client/proc/apply_clickcatcher() + generate_clickcatcher() + var/list/actualview = getviewsize(view) + void.UpdateGreed(actualview[1],actualview[2]) + +/client/proc/send_ssd_warning(mob/M) + if(!config.ssd_warning) + return FALSE + if(ssd_warning_acknowledged) + return FALSE + if(M && M.player_logged < SSD_WARNING_TIMER) + return FALSE + to_chat(src, "Interacting with SSD players is against server rules unless you've ahelped first for permission. If you have, confirm that and proceed.") + return TRUE + +#undef SSD_WARNING_TIMER diff --git a/code/modules/client/preference/loadout/loadout.dm b/code/modules/client/preference/loadout/loadout.dm index b42c5d5abf1..63825cc1237 100644 --- a/code/modules/client/preference/loadout/loadout.dm +++ b/code/modules/client/preference/loadout/loadout.dm @@ -4,7 +4,6 @@ var/list/gear_datums = list() /datum/loadout_category var/category = "" var/list/gear = list() - var/donor_only = FALSE /datum/loadout_category/New(cat) category = cat @@ -34,8 +33,6 @@ var/list/gear_datums = list() if(!loadout_categories[use_category]) loadout_categories[use_category] = new /datum/loadout_category(use_category) var/datum/loadout_category/LC = loadout_categories[use_category] - if(initial(G.donor_only)) - LC.donor_only = TRUE gear_datums[use_name] = new geartype LC.gear[use_name] = gear_datums[use_name] @@ -57,7 +54,7 @@ var/list/gear_datums = list() var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned. var/subtype_path = /datum/gear //for skipping organizational subtypes (optional) var/subtype_cost_overlap = TRUE //if subtypes can take points at the same time - var/donor_only = FALSE // if it's only available to donors + var/donator_tier = 0 /datum/gear/New() ..() diff --git a/code/modules/client/preference/loadout/loadout_accessories.dm b/code/modules/client/preference/loadout/loadout_accessories.dm index c4a49ee5575..09cc082dc5d 100644 --- a/code/modules/client/preference/loadout/loadout_accessories.dm +++ b/code/modules/client/preference/loadout/loadout_accessories.dm @@ -166,7 +166,7 @@ /datum/gear/accessory/armband_sec display_name = " armband, security" path = /obj/item/clothing/accessory/armband/sec - allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician") + allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician", "Security Pod Pilot") /datum/gear/accessory/armband_cargo display_name = "cargo armband" diff --git a/code/modules/client/preference/loadout/loadout_donor.dm b/code/modules/client/preference/loadout/loadout_donor.dm index 9e13662a7d8..5558a988209 100644 --- a/code/modules/client/preference/loadout/loadout_donor.dm +++ b/code/modules/client/preference/loadout/loadout_donor.dm @@ -1,5 +1,5 @@ /datum/gear/donor - donor_only = TRUE + donator_tier = 2 sort_category = "Donor" subtype_path = /datum/gear/donor @@ -77,6 +77,26 @@ display_name = "Guy Fawkes mask" path = /obj/item/clothing/mask/fawkes -/datum/gear/donor/noble_clothes - display_name = "Noble Clothes" - path = /obj/item/clothing/under/noble_clothes +/datum/gear/donor/id_decal_silver + display_name = "Silver ID Decal" + path = /obj/item/id_decal/silver + donator_tier = 3 + cost = 2 + +/datum/gear/donor/id_decal_prisoner + display_name = "Prisoner ID Decal" + path = /obj/item/id_decal/prisoner + donator_tier = 3 + cost = 2 + +/datum/gear/donor/id_decal_emag + display_name = "Emag ID Decal" + path = /obj/item/id_decal/emag + donator_tier = 3 + cost = 2 + +/datum/gear/donor/id_decal_gold + display_name = "Gold ID Decal" + path = /obj/item/id_decal/gold + donator_tier = 4 + cost = 4 \ No newline at end of file diff --git a/code/modules/client/preference/loadout/loadout_suit.dm b/code/modules/client/preference/loadout/loadout_suit.dm index ae43a10ee89..3d6b5ded994 100644 --- a/code/modules/client/preference/loadout/loadout_suit.dm +++ b/code/modules/client/preference/loadout/loadout_suit.dm @@ -158,3 +158,46 @@ /datum/gear/suit/purplesuit display_name = "suit jacket, purple" path = /obj/item/clothing/suit/storage/lawyer/purpjacket + +//Mantles! +/datum/gear/suit/mantle + display_name = "mantle" + path = /obj/item/clothing/suit/mantle + +/datum/gear/suit/old_scarf + display_name = "old scarf" + path = /obj/item/clothing/suit/mantle/old + +/datum/gear/suit/regal_shawl + display_name = "regal shawl" + path = /obj/item/clothing/suit/mantle/regal + +/datum/gear/suit/captain_cloak + display_name = "mantle, captain" + path = /obj/item/clothing/suit/mantle/armor/captain + allowed_roles = list("Captain") + +/datum/gear/suit/ce_mantle + display_name = "mantle, chief engineer" + path = /obj/item/clothing/suit/mantle/chief_engineer + allowed_roles = list("Chief Engineer") + +/datum/gear/suit/cmo_mantle + display_name = "mantle, chief medical officer" + path = /obj/item/clothing/suit/mantle/labcoat/chief_medical_officer + allowed_roles = list("Chief Medical Officer") + +/datum/gear/suit/armored_shawl + display_name = "mantle, head of security" + path = /obj/item/clothing/suit/mantle/armor + allowed_roles = list("Head of Security") + +/datum/gear/suit/hop_shawl + display_name = "mantle, head of personnel" + path = /obj/item/clothing/suit/mantle/armor/head_of_personnel + allowed_roles = list("Head of Personnel") + +/datum/gear/suit/rd_mantle + display_name = "mantle, research director" + path = /obj/item/clothing/suit/mantle/labcoat + allowed_roles = list("Research Director") diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index caf98b866cc..97f9ddc6169 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 @@ -92,6 +92,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/windowflashing = TRUE 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 @@ -183,7 +185,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts // 0 = character settings, 1 = game preferences var/current_tab = TAB_CHAR - // OOC Metadata: + // OOC Metadata: var/metadata = "" var/slot_name = "" @@ -211,8 +213,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts unlock_content = C.IsByondMember() if(unlock_content) max_save_slots = MAX_SAVE_SLOTS_MEMBER - if(C.donator_level >= DONATOR_LEVEL_ONE) - max_gear_slots += 5 loaded_preferences_successfully = load_preferences(C) // Do not call this with no client/C, it generates a runtime / SQL error if(loaded_preferences_successfully) @@ -438,9 +438,11 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts // LEFT SIDE OF THE PAGE dat += "" + if(G.donator_tier > user.client.donator_level) + dat += "" + else + dat += "" dat += "" - dat += "" + // Pockets + dat += "" dat += "" dat += "" @@ -447,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) @@ -551,19 +557,17 @@ /mob/living/carbon/human/update_sight() if(!client) return + if(stat == DEAD) grant_death_vision() return dna.species.update_sight(src) + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() -//Removed the horrible safety parameter. It was only being used by ninja code anyways. -//Now checks siemens_coefficient of the affected area by default -/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, override = 0, tesla_shock = 0) - if(status_flags & GODMODE) //godmode - return 0 - if(NO_SHOCK in mutations) //shockproof - return 0 +//Added a safety check in case you want to shock a human mob directly through electrocute_act. +/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE) if(tesla_shock) var/total_coeff = 1 if(gloves) @@ -581,20 +585,18 @@ siemens_coeff = 0 else if(!safety) var/gloves_siemens_coeff = 1 - var/species_siemens_coeff = 1 if(gloves) var/obj/item/clothing/gloves/G = gloves gloves_siemens_coeff = G.siemens_coefficient - if(dna.species) - species_siemens_coeff = dna.species.siemens_coeff - siemens_coeff = gloves_siemens_coeff * species_siemens_coeff - if(undergoing_cardiac_arrest()) + siemens_coeff = gloves_siemens_coeff + if(undergoing_cardiac_arrest() && !illusion) if(shock_damage * siemens_coeff >= 1 && prob(25)) set_heartattack(FALSE) if(stat == CONSCIOUS) to_chat(src, "You feel your heart beating again!") - . = ..() + dna.species.spec_electrocute_act(src, shock_damage, source, siemens_coeff, safety, override, tesla_shock, illusion, stun) + . = ..(shock_damage, source, siemens_coeff, safety, override, tesla_shock, illusion, stun) /mob/living/carbon/human/Topic(href, href_list) if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr)) @@ -709,17 +711,9 @@ if(usr.incapacitated()) return var/found_record = 0 - var/perpname = "wot" - if(wear_id) - var/obj/item/card/id/I = wear_id.GetID() - if(I) - perpname = I.registered_name - else - perpname = name - else - perpname = name + var/perpname = get_visible_name(TRUE) - if(perpname) + if(perpname != "Unknown") for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.security) @@ -756,17 +750,9 @@ if(hasHUD(usr,"security")) if(usr.incapacitated()) return - var/perpname = "wot" + var/perpname = get_visible_name(TRUE) var/read = 0 - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.security) @@ -788,24 +774,16 @@ if(hasHUD(usr,"security")) if(usr.incapacitated()) return - var/perpname = "wot" + var/perpname = get_visible_name(TRUE) var/read = 0 - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.security) if(R.fields["id"] == E.fields["id"]) if(hasHUD(usr,"security")) read = 1 - if(length(R.fields["comments"])) + if(LAZYLEN(R.fields["comments"])) for(var/c in R.fields["comments"]) to_chat(usr, c) else @@ -819,15 +797,8 @@ if(hasHUD(usr,"security")) if(usr.incapacitated()) return - var/perpname = "wot" - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name + var/perpname = get_visible_name(TRUE) + for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.security) @@ -850,17 +821,8 @@ if(hasHUD(usr,"medical")) if(usr.incapacitated()) return - var/perpname = "wot" var/modified = 0 - - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name + var/perpname = get_visible_name(TRUE) for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) @@ -885,17 +847,9 @@ if(hasHUD(usr,"medical")) if(usr.incapacitated()) return - var/perpname = "wot" var/read = 0 - - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name + var/perpname = get_visible_name(TRUE) + for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.medical) @@ -918,24 +872,16 @@ if(hasHUD(usr,"medical")) if(usr.incapacitated()) return - var/perpname = "wot" + var/perpname = get_visible_name(TRUE) var/read = 0 - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.medical) if(R.fields["id"] == E.fields["id"]) if(hasHUD(usr,"medical")) read = 1 - if(length(R.fields["comments"])) + if(LAZYLEN(R.fields["comments"])) for(var/c in R.fields["comments"]) to_chat(usr, c) else @@ -949,15 +895,7 @@ if(hasHUD(usr,"medical")) if(usr.incapacitated()) return - var/perpname = "wot" - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name + var/perpname = get_visible_name(TRUE) for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.medical) @@ -972,6 +910,9 @@ if(isrobot(usr)) var/mob/living/silicon/robot/U = usr R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [station_time_timestamp()]
[t1]" + if(isAI(usr)) + var/mob/living/silicon/ai/U = usr + R.fields["comments"] += "Made by [U.name] (artificial intelligence) on [current_date_string] [station_time_timestamp()]
[t1]" if(href_list["lookitem"]) var/obj/item/I = locate(href_list["lookitem"]) @@ -1330,11 +1271,13 @@ var/list/thing_to_check = list(slot_wear_mask, slot_head, slot_shoes, slot_gloves, slot_l_ear, slot_r_ear, slot_glasses, slot_l_hand, slot_r_hand) var/list/kept_items[0] - + var/list/item_flags[0] for(var/thing in thing_to_check) var/obj/item/I = get_item_by_slot(thing) if(I) kept_items[I] = thing + item_flags[I] = I.flags + I.flags = 0 // Temporary set the flags to 0 if(retain_damage) //Create a list of body parts which are damaged by burn or brute and save them to apply after new organs are generated. First we just handle external organs. @@ -1400,8 +1343,9 @@ else dna.species.create_organs(src) - for(var/thing in kept_items) + for(var/obj/item/thing in kept_items) equip_to_slot_if_possible(thing, kept_items[thing], redraw_mob = 0) + thing.flags = item_flags[thing] // Reset the flags to the origional ones //Handle default hair/head accessories for created mobs. var/obj/item/organ/external/head/H = get_organ("head") @@ -1440,11 +1384,7 @@ dna.species.on_species_gain(src) - see_in_dark = dna.species.get_resultant_darksight(src) - if(see_in_dark > 2) - see_invisible = SEE_INVISIBLE_LEVEL_ONE - else - see_invisible = SEE_INVISIBLE_LIVING + update_sight() dna.species.handle_dna(src) //Give them whatever special dna business they got. @@ -1477,19 +1417,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)) @@ -1507,7 +1450,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 @@ -1515,7 +1460,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) @@ -1599,7 +1545,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X //Check for arrest warrant if(judgebot.check_records) - var/perpname = get_face_name(get_id_name()) + var/perpname = get_visible_name(TRUE) var/datum/data/record/R = find_record("name", perpname, data_core.security) if(R && R.fields["criminal"]) switch(R.fields["criminal"]) @@ -1651,6 +1597,9 @@ Eyes need to have significantly high darksight to shine unless the mob has the X ..() /mob/living/carbon/human/proc/do_cpr(mob/living/carbon/human/H) + if(H == src) + to_chat(src, "You cannot perform CPR on yourself!") + return if(H.stat == DEAD || (H.status_flags & FAKEDEATH)) to_chat(src, "[H.name] is dead!") return @@ -1662,25 +1611,29 @@ Eyes need to have significantly high darksight to shine unless the mob has the X return if((head && (head.flags_cover & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && !wear_mask.mask_adjusted)) to_chat(src, "Remove your mask first!") - return 0 + return if((H.head && (H.head.flags_cover & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags_cover & MASKCOVERSMOUTH) && !H.wear_mask.mask_adjusted)) to_chat(src, "Remove [H.p_their()] mask first!") - return 0 - visible_message("[src] is trying to perform CPR on [H.name]!", \ - "You try to perform CPR on [H.name]!") + return + if(H.receiving_cpr) // To prevent spam stacking + to_chat(src, "They are already receiving CPR!") + return + visible_message("[src] is trying to perform CPR on [H.name]!", "You try to perform CPR on [H.name]!") + H.receiving_cpr = TRUE if(do_mob(src, H, 40)) - if(H.health > config.health_threshold_dead && H.health <= config.health_threshold_crit) - var/suff = min(H.getOxyLoss(), 7) - H.adjustOxyLoss(-suff) + if(H.health <= HEALTH_THRESHOLD_CRIT) + H.adjustOxyLoss(-15) + H.SetLoseBreath(0) + H.AdjustParalysis(-1) H.updatehealth("cpr") - visible_message("[src] performs CPR on [H.name]!", \ - "You perform CPR on [H.name].") + visible_message("[src] performs CPR on [H.name]!", "You perform CPR on [H.name].") to_chat(H, "You feel a breath of fresh air enter your lungs. It feels good.") - to_chat(src, "Repeat at least every 7 seconds.") + H.receiving_cpr = FALSE add_attack_logs(src, H, "CPRed", ATKLOG_ALL) - return 1 + return TRUE else + H.receiving_cpr = FALSE to_chat(src, "You need to stay still while performing CPR!") /mob/living/carbon/human/canBeHandcuffed() @@ -1696,13 +1649,13 @@ Eyes need to have significantly high darksight to shine unless the mob has the X return FALSE /mob/living/carbon/human/InCritical() - return (health <= config.health_threshold_crit && stat == UNCONSCIOUS) + return (health <= HEALTH_THRESHOLD_CRIT && stat == UNCONSCIOUS) /mob/living/carbon/human/IsAdvancedToolUser() if(dna.species.has_fine_manipulation) - return 1 - return 0 + return TRUE + return FALSE /mob/living/carbon/human/get_permeability_protection() var/list/prot = list("hands"=0, "chest"=0, "groin"=0, "legs"=0, "feet"=0, "arms"=0, "head"=0) @@ -1925,7 +1878,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()]" @@ -1967,7 +1919,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X if(7) // Pride log_game("[src] was influenced by the sin of pride.") O = new /datum/objective/sintouched/pride - ticker.mode.sintouched += src.mind + SSticker.mode.sintouched += src.mind src.mind.objectives += O var/obj_count = 1 to_chat(src, "[pick(GLOB.boo_phrases)]") + /mob/living/carbon/human/extinguish_light() // Parent function handles stuff the human may be holding ..() @@ -2000,4 +1955,4 @@ Eyes need to have significantly high darksight to shine unless the mob has the X var/obj/item/organ/internal/lantern/O = get_int_organ(/obj/item/organ/internal/lantern) if(O && O.glowing) O.toggle_biolum(TRUE) - visible_message("[src] is engulfed in shadows and fades into the darkness.", "A sense of dread washes over you as you suddenly dim dark.") + visible_message("[src] is engulfed in shadows and fades into the darkness.", "A sense of dread washes over you as you suddenly dim dark.") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index b858cca130a..e106d214fd3 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -15,7 +15,7 @@ health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute //TODO: fix husking - if(((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD) + if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD) ChangeToHusk() update_stat("updatehealth([reason])") med_hud_set_health() @@ -31,7 +31,10 @@ if(sponge) if(dna.species && amount > 0) amount = amount * dna.species.brain_mod - sponge.receive_damage(amount, 1) + sponge.damage = Clamp(sponge.damage + amount, 0, 120) + if(sponge.damage >= 120) + visible_message("[src] goes limp, [p_their()] facial expression utterly blank.") + death() if(updating) update_stat("adjustBrainLoss") return STATUS_UPDATE_STAT @@ -45,7 +48,10 @@ if(sponge) if(dna.species && amount > 0) amount = amount * dna.species.brain_mod - sponge.damage = min(max(amount, 0), (maxHealth*2)) + sponge.damage = Clamp(amount, 0, 120) + if(sponge.damage >= 120) + visible_message("[src] goes limp, [p_their()] facial expression utterly blank.") + death() if(updating) update_stat("setBrainLoss") return STATUS_UPDATE_STAT @@ -171,11 +177,17 @@ // Defined here solely to take species flags into account without having to recast at mob/living level. /mob/living/carbon/human/adjustOxyLoss(amount) + if(NO_BREATHE in dna.species.species_traits) + oxyloss = 0 + return FALSE if(dna.species && amount > 0) amount = amount * dna.species.oxy_mod . = ..() /mob/living/carbon/human/setOxyLoss(amount) + if(NO_BREATHE in dna.species.species_traits) + oxyloss = 0 + return FALSE if(dna.species && amount > 0) amount = amount * dna.species.oxy_mod . = ..() @@ -350,7 +362,7 @@ This function restores all organs. if(LAssailant && ishuman(LAssailant)) //superheros still get the comical hit markers var/mob/living/carbon/human/H = LAssailant - if(H.mind && H.mind in (ticker.mode.superheroes || ticker.mode.supervillains || ticker.mode.greyshirts)) + if(H.mind && H.mind in (SSticker.mode.superheroes || SSticker.mode.supervillains || SSticker.mode.greyshirts)) var/list/attack_bubble_recipients = list() var/mob/living/user for(var/mob/O in viewers(user, src)) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 84764bfddaa..b95920e688b 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -157,7 +157,7 @@ emp_act return 1 return 0 -/mob/living/carbon/human/check_block() +/mob/living/carbon/human/proc/check_block() if(martial_art && prob(martial_art.block_chance) && martial_art.can_use(src) && in_throw_mode && !incapacitated(FALSE, TRUE)) return TRUE @@ -220,6 +220,10 @@ emp_act if(check_shields(I.force, "the [I.name]", I, MELEE_ATTACK, I.armour_penetration)) return 0 + if(check_block()) + visible_message("[src] blocks [I]!") + return FALSE + if(istype(I,/obj/item/card/emag)) emag_act(user, affecting) @@ -263,7 +267,7 @@ emp_act apply_effect(5, WEAKEN, armor) AdjustConfused(15) if(prob(I.force + ((100 - health)/2)) && src != user && I.damtype == BRUTE) - ticker.mode.remove_revolutionary(mind) + SSticker.mode.remove_revolutionary(mind) if(bloody)//Apply blood if(wear_mask) @@ -502,9 +506,9 @@ emp_act return 0 ..() -/mob/living/carbon/human/water_act(volume, temperature, source) - ..() - dna.species.water_act(src,volume,temperature,source) +/mob/living/carbon/human/water_act(volume, temperature, source, method = TOUCH) + . = ..() + dna.species.water_act(src, volume, temperature, source, method) /mob/living/carbon/human/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE) if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES)) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 22a9d40f6fd..987041bc7ad 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,7 +1,7 @@ var/global/default_martial_art = new/datum/martial_art /mob/living/carbon/human - hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD,GLAND_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,GLAND_HUD) //Marking colour and style var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000. @@ -64,6 +64,7 @@ var/global/default_martial_art = new/datum/martial_art var/check_mutations=0 // Check mutations on next life tick var/heartbeat = 0 + var/receiving_cpr = FALSE var/fire_dmi = 'icons/mob/OnFire.dmi' var/fire_sprite = "Standing" diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm deleted file mode 100644 index 06df994df5f..00000000000 --- a/code/modules/mob/living/carbon/human/interactive/functions.dm +++ /dev/null @@ -1,874 +0,0 @@ -/mob/living/carbon/human/interactive/proc/chatter(obj) - var/verbs_use = pick_list(speak_file, "verbs_use") - var/verbs_touch = pick_list(speak_file, "verbs_touch") - var/verbs_move = pick_list(speak_file, "verbs_move") - var/nouns_insult = pick_list(speak_file, "nouns_insult") - var/nouns_generic = pick_list(speak_file, "nouns_generic") - var/nouns_objects = pick_list(speak_file, "nouns_objects") - var/nouns_body = pick_list(speak_file, "nouns_body") - var/adjective_insult = pick_list(speak_file, "adjective_insult") - var/adjective_objects = pick_list(speak_file, "adjective_objects") - var/adjective_generic = pick_list(speak_file, "adjective_generic") - var/curse_words = pick_list(speak_file, "curse_words") - - var/chatmsg = "" - - if(prob(10)) // 10% chance to broadcast it over the radio - chatmsg = ";" - - if(prob(chattyness) || knownStrings.len < 10) // say a generic phrase, otherwise draw from our strings. - if(doing & SNPC_INTERACTING) - if(prob(chattyness)) - chatmsg += pick("This [nouns_objects] is a little [adjective_objects].", - "Well [verbs_use] my [nouns_body], this [nouns_insult] is pretty [adjective_insult].", - "[capitalize(curse_words)], what am I meant to do with this [adjective_insult] [nouns_objects].") - else if(doing & SNPC_TRAVEL) - if(prob(chattyness)) - chatmsg += pick("Oh [curse_words], [verbs_move]!", - "Time to get my [adjective_generic] [adjective_insult] [nouns_body] elsewhere.", - "I wonder if there is anything to [verbs_use] and [verbs_touch] somewhere else..") - else if(doing & SNPC_FIGHTING) - if(prob(chattyness)) - chatmsg += pick("I'm going to [verbs_use] you, you [adjective_insult] [nouns_insult]!", - "Rend and [verbs_touch], Rend and [verbs_use]!", - "You [nouns_insult], I'm going to [verbs_use] you right in the [nouns_body]. JUST YOU WAIT!") - if(prob(chattyness/2)) - chatmsg = ";" - var/what = pick(1,2,3,4,5) - switch(what) - if(1) - chatmsg += "Well [curse_words], this is a [adjective_generic] situation." - if(2) - chatmsg += "Oh [curse_words], that [nouns_insult] was one hell of an [adjective_insult] [nouns_body]." - if(3) - chatmsg += "I want to [verbs_use] that [nouns_insult] when I find them." - if(4) - chatmsg += "[pick("Innocent","Guilty","Traitorous","Honk")] until proven [adjective_generic]!" - if(5) - var/toSay = "" - for(var/i = 0; i < 5; i++) - curse_words = pick_list(speak_file, "curse_words") - toSay += "[curse_words] " - chatmsg += "Hey [nouns_generic], why don't you go [copytext(toSay, 1, length(toSay))], you [nouns_insult]!" - else if(prob(chattyness)) - chatmsg += pick(knownStrings) - if(prob(25)) // cut out some phrases now and then to make sure we're fresh and new - knownStrings -= pick(chatmsg) - - if(chatmsg != ";" && chatmsg != "") - say(chatmsg) - -/mob/living/carbon/human/interactive/proc/traitor(obj) - - if(traitorType == SNPC_PSYCHO && nearby.len) - traitorTarget = pick(nearby) - - if(prob(traitorScale)) - if(!Adjacent(traitorTarget) && !(traitorType == SNPC_PSYCHO)) - tryWalk(get_turf(traitorTarget)) - else - switch(traitorType) - if(SNPC_BRUTE) - retal = 1 - retal_target = traitorTarget - if(SNPC_STEALTH) - if(istype(traitorTarget,/mob)) // it's inside something, lets kick their shit in - var/mob/M = traitorTarget - if(!M.stat) - retal = 1 - retal_target = traitorTarget - else - var/obj/item/I = traitorTarget - I.loc = get_turf(traitorTarget) // pull it outta them - else - take_to_slot(traitorTarget) - if(SNPC_MARTYR) - custom_emote(1, "[src]'s chest opens up, revealing a large mass of explosives and tangled wires!") - if(inactivity_period <= 0) - inactivity_period = 9999 // technically infinite - if(do_after(src, 60, target = traitorTarget)) - custom_emote(1, "A fire bursts from [src]'s eyes, igniting white hot and consuming [p_their()] body in a flaming explosion!") - explosion(src, 6, 6, 6) - else - inactivity_period = 0 - custom_emote(1, "[src]'s chest closes, hiding [p_their()] insides.") - if(SNPC_PSYCHO) - var/choice = pick(typesof(/obj/item/grenade/chem_grenade) - /obj/item/grenade/chem_grenade) - - new choice(src) - - retal = 1 - retal_target = traitorTarget - -/mob/living/carbon/human/interactive/proc/botany(obj) - if(shouldModulePass()) - return - - if(enforceHome()) - return - - var/list/allContents = getAllContents() - - var/obj/item/reagent_containers/glass/beaker/bluespace/internalBeaker = locate(/obj/item/reagent_containers/glass/beaker/bluespace) in allContents - var/obj/item/storage/bag/plants/internalBag = locate(/obj/item/storage/bag/plants) in allContents - - if(!internalBag) - internalBag = new/obj/item/storage/bag/plants(src) - if(!internalBeaker) - internalBeaker = new/obj/item/reagent_containers/glass/beaker/bluespace(src) - internalBeaker.name = "Grow-U-All Super Spray" - - if(internalBeaker && internalBag) - var/obj/machinery/hydroponics/HP - - //consider the appropriate target - var/list/considered = list() - - for(var/obj/machinery/hydroponics/tester in view(12,src)) - considered[tester] = 1 - - if(!tester.myseed) - considered[tester] += 50 - if(tester.weedlevel > 0) - considered[tester] += 5 - if(tester.pestlevel > 0) - considered[tester] += 5 - if(tester.nutrilevel < tester.maxnutri) - considered[tester] += 15 - if(tester.waterlevel < tester.maxwater) - considered[tester] += 15 - if(tester.harvest || tester.dead) - considered[tester] += 100 - considered[tester] = max(1, considered[tester] - get_dist(src,tester)) - - var/index = 0 - for(var/A in considered) - ++index - if(considered[A] > considered[HP] || !HP) - HP = considered[index] - - if(HP) - TARGET = HP - if(!Adjacent(HP)) - tryWalk(get_turf(HP)) - else - if(HP.harvest || HP.dead) - HP.attack_hand(src) - else if(!HP.myseed) - var/obj/item/seeds/SEED = new /obj/item/seeds/random(src) - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")] towards [TARGET], producing a [SEED]!") - HP.attackby(SEED, src) - else - var/change = 0 - if(HP.weedlevel > 0) - change = 1 - if(!internalBeaker.reagents.has_reagent("atrazine", 10)) - internalBeaker.reagents.add_reagent("atrazine", 10) - if(HP.pestlevel > 0) - change = 1 - if(!internalBeaker.reagents.has_reagent("diethylamine", 10)) - internalBeaker.reagents.add_reagent("diethylamine", 10) - if(HP.nutrilevel < HP.maxnutri) - change = 1 - if(!internalBeaker.reagents.has_reagent("eznutriment", 15)) - internalBeaker.reagents.add_reagent("eznutriment", 15) - if(!internalBeaker.reagents.has_reagent("diethylamine", 15)) - internalBeaker.reagents.add_reagent("diethylamine", 15) - if(HP.waterlevel < HP.maxwater) - change = 1 - if(!internalBeaker.reagents.has_reagent("holywater", 50)) - internalBeaker.reagents.add_reagent("holywater", 50) - if(change) - HP.attackby(internalBeaker,src) - - var/obj/item/reagent_containers/food/snacks/grown/GF = locate(/obj/item/reagent_containers/food/snacks/grown) in view(12,src) - if(GF) - if(!Adjacent(GF)) - tryWalk(get_turf(GF)) - else - GF.attackby(internalBag,src) - - if(internalBag.contents.len) - var/obj/machinery/smartfridge/SF = locate(/obj/machinery/smartfridge) in range(12, src) - if(!Adjacent(SF)) - tryWalk(get_turf(SF)) - else - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")], upending the [internalBag]'s contents all over the [SF]!") - //smartfridges call updateUsrDialog when you call attackby, so we're going to have to cheese-magic-space this - for(var/obj/toLoad in internalBag.contents) - if(contents.len >= SF.max_n_of_items) - break - if(SF.accept_check(toLoad)) - SF.load(toLoad, src) - else - qdel(toLoad) // destroy everything we dont need - -/mob/living/carbon/human/interactive/proc/bartend(obj) - if(shouldModulePass()) - return - - if(enforceHome()) - return - - var/list/rangeCheck = oview(6,src) - var/obj/structure/table/RT - - var/mob/living/carbon/human/serveTarget - - for(var/mob/living/carbon/human/H in rangeCheck) - if(!locate(/obj/item/reagent_containers/food/drinks) in orange(1, H)) - serveTarget = H - - - if(serveTarget) - RT = locate(/obj/structure/table) in orange(1, serveTarget) - - if(RT && serveTarget) - if(!Adjacent(RT)) - tryWalk(get_turf(RT)) - else - var/drinkChoice = pick(typesof(/obj/item/reagent_containers/food/drinks) - /obj/item/reagent_containers/food/drinks) - if(drinkChoice) - var/obj/item/reagent_containers/food/drinks/D = new drinkChoice(get_turf(src)) - RT.attackby(D,src) - say("[pick("Something to wet your whistle!","Down the hatch, a tasty beverage!","One drink, coming right up!","Tasty liquid for your oral intake!","Enjoy!")]") - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")], serving up a [D]!") - -/mob/living/carbon/human/interactive/proc/shitcurity(obj) - var/list/allContents = getAllContents() - - if(retal && TARGET) - if(Adjacent(TARGET)) - var/obj/item/restraints/R = locate() in allContents - if(R) - R.attack(TARGET, src) // go go bluespace restraint launcher! - else if(TARGET in oview(7, src)) - var/obj/item/gun/G = locate() in allContents - if(G) - G.afterattack(TARGET, src) - -/mob/living/carbon/human/interactive/proc/clowning(obj) - if(shouldModulePass()) - return - var/list/allContents = getAllContents() - var/list/rangeCheck = oview(12, src) - - var/mob/living/carbon/human/clownTarget - var/list/clownPriority = list() - - var/obj/item/reagent_containers/spray/S - if(!locate(/obj/item/reagent_containers/spray) in allContents) - new/obj/item/reagent_containers/spray(src) - else - S = locate(/obj/item/reagent_containers/spray) in allContents - - for(var/mob/living/carbon/human/C in rangeCheck) - var/pranksNearby = 100 - for(var/turf/simulated/T in orange(1, C)) - for(var/obj/item/A in T) - if(istype(A,/obj/item/soap) || istype(A,/obj/item/reagent_containers/food/snacks/grown/banana) || istype(A,/obj/item/grown/bananapeel)) - pranksNearby-- - if(T.wet) - pranksNearby -= 10 - clownPriority[C] = pranksNearby - - for(var/A in clownPriority) - if(!clownTarget) - clownTarget = A - else - if(clownPriority[A] > clownPriority[clownTarget]) - clownTarget = clownPriority[A] - - if(clownTarget) - if(!Adjacent(clownTarget)) - tryWalk(clownTarget) - else - var/hasPranked = 0 - for(var/A in allContents) - if(prob(smartness/2) && !hasPranked) - if(istype(A,/obj/item/soap)) - npcDrop(A) - hasPranked = 1 - if(istype(A,/obj/item/reagent_containers/food/snacks/grown/banana)) - var/obj/item/reagent_containers/food/snacks/B = A - B.attack(src, src) - if(istype(A,/obj/item/grown/bananapeel)) - npcDrop(A) - hasPranked = 1 - if(!hasPranked) - if(S.reagents.total_volume <= 5) - S.reagents.add_reagent("water", 25) - S.afterattack(get_turf(pick(orange(1, clownTarget))),src) - - -/mob/living/carbon/human/interactive/proc/healpeople(obj) - var/shouldTryHeal = 0 - var/obj/item/stack/medical/M - - var/list/allContents = getAllContents() - - for(var/A in allContents) - if(istype(A,/obj/item/stack/medical)) - shouldTryHeal = 1 - M = A - - var/obj/item/reagent_containers/hypospray/HPS - - if(!locate(/obj/item/reagent_containers/hypospray) in allContents) - new/obj/item/reagent_containers/hypospray(src) - else - HPS = locate(/obj/item/reagent_containers/hypospray) in allContents - if(!shouldTryHeal) - shouldTryHeal = 2 // we have no stackables to use, lets use our internal hypospray instead - - if(shouldTryHeal == 1) - for(var/mob/living/carbon/human/C in nearby) - if(istype(C,/mob/living/carbon/human)) //I haven't the foggiest clue why this is turning up non-carbons but sure here whatever - if(C.health <= 75) - if(get_dist(src,C) <= 2) - src.say("Wait, [C], let me heal you!") - M.attack(C,src) - sleep(25) - else - tryWalk(get_turf(C)) - else if(shouldTryHeal == 2) - if(HPS) - if(HPS.reagents.total_volume <= 0) - HPS.reagents.add_reagent("omnizine",30) - for(var/mob/living/carbon/human/C in nearby) - if(istype(C,/mob/living/carbon/human)) - if(C.health <= 75 && C.reagents.get_reagent_amount("omnizine") <= 0) // make sure they wont be overdosing - if(get_dist(src,C) <= 2) - src.say("Wait, [C], let me heal you!") - HPS.attack(C,src) - sleep(25) - else - tryWalk(get_turf(C)) - - -/mob/living/carbon/human/interactive/proc/dojanitor(obj) - if(shouldModulePass()) - return - var/list/allContents = getAllContents() - //now with bluespace magic! - var/obj/item/reagent_containers/spray/SP = locate() in allContents - if(!SP) - SP = new /obj/item/reagent_containers/spray(src) - var/obj/item/soap/SO = locate() in allContents - if(!SO) - SO = new /obj/item/soap(src) - - if(SP.reagents.total_volume <= 5) - SP.reagents.add_reagent("cleaner", 25) // bluespess water delivery for AI - - var/obj/effect/decal/cleanable/TC - TC = locate(/obj/effect/decal/cleanable) in view(6, src) - - if(TC) - if(!Adjacent(TC)) - tryWalk(TC) - else - var/turf/T = get_turf(TC) - if(T && !T.density) - SP.afterattack(TC, src, 1) - else - SO.afterattack(TC, src, 1) - qdel(TC) - -// START COOKING MODULE -/mob/living/carbon/human/interactive/proc/refundrecipe(list/ingredients) - for(var/obj/I in ingredients) - I.loc = contents - -// Ingredients may be in the rangeCheck or inside the chef's inventory. -// As they are checked off, they are moved to a seperate list as to not be counted twice -// If the recipe fails (eg somebody else took an ingredient before it was picked up) the ingredients are dumped back to inventory -// That way, the chef has a better chance of making a recipe next ptick, if he has more stuff on him -/mob/living/carbon/human/interactive/proc/makerecipe(datum/recipe/R, allContents, rangeCheck) - set background = 1 - - var/list/ingredients[0] - - for(var/P in R.items) - var/obj/item/I = locate(P) in allContents - if(I) - ingredients += I - I.forceMove(null) - continue - - I = locate(P) in rangeCheck - TARGET = I - if(I && !Adjacent(I)) - tryWalk(get_turf(I)) - sleep(get_dist(src, I)) - if(!I || !(I in rangeCheck)) - refundrecipe(ingredients) - return 0 - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")], picking up [I].") - ingredients += I - I.forceMove(null) - - // cheaply cook the ingredients into result - sleep(R.time) - for(var/obj/I in ingredients) - qdel(I) - ingredients.Cut() - var/result = new R.result(get_turf(src)) - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")] and, with a bang, \a [result] is cooked!") - return 1 - -/mob/living/carbon/human/interactive/proc/souschef(obj) - if(shouldModulePass() || enforceHome() || prob(SNPC_FUZZY_CHANCE_HIGH) || prob(SNPC_FUZZY_CHANCE_HIGH)) - return - - if(doing & SNPC_SPECIAL) - return - doing |= SNPC_SPECIAL - - var/static/list/customableTypes = list(/obj/item/reagent_containers/food/snacks/customizable,/obj/item/reagent_containers/food/snacks/breadslice,/obj/item/reagent_containers/food/snacks/bun,/obj/item/reagent_containers/food/snacks/sliceable/flatdough,/obj/item/reagent_containers/food/snacks/boiledspaghetti,/obj/item/trash/plate,/obj/item/trash/bowl) - - var/static/list/rawtypes = list(/obj/item/reagent_containers/food/snacks/grown, /obj/item/reagent_containers/food/snacks/rawcutlet, /obj/item/reagent_containers/food/snacks/rawsticks, /obj/item/reagent_containers/food/snacks/salmonmeat, /obj/item/reagent_containers/food/snacks/carpmeat, /obj/item/reagent_containers/food/snacks/catfishmeat, /obj/item/reagent_containers/food/snacks/spaghetti, /obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/sliceable/flatdough, /obj/item/reagent_containers/food/snacks/doughslice, /obj/item/reagent_containers/food/snacks/meat, /obj/item/reagent_containers/food/snacks/boiledrice, /obj/item/reagent_containers/food/snacks/cheesewedge, /obj/item/reagent_containers/food/snacks/raw_bacon) - - try - var/list/allContents = getAllContents() - var/list/rangeCheck = view(6, src) - - //Bluespace in some inbuilt tools - var/obj/item/kitchen/rollingpin/RP = locate() in allContents - if(!RP) - RP = new /obj/item/kitchen/rollingpin(src) - - var/obj/item/kitchen/knife/KK = locate() in allContents - if(!KK) - KK = new /obj/item/kitchen/knife(src) - - var/global/list/available_recipes - if(!available_recipes) - available_recipes = list() - for(var/type in subtypesof(/datum/recipe)) - var/datum/recipe/recipe = new type - if(recipe.result) // Ignore recipe subtypes that lack a result - available_recipes += recipe - else - qdel(recipe) - - var/foundCookable = 0 - - //Make some basic custom food - var/foundCustom - for(var/customType in customableTypes) - var/A = locate(customType) in rangeCheck - var/obj/item/reagent_containers/food/snacks/customizable/I = A - if(A && (!istype(I) || I.ingredients.len <= 3)) - foundCustom = A // this will eventually wittle down to 0 - break - - var/obj/machinery/smartfridge/SF = locate(/obj/machinery/smartfridge) in rangeCheck - if(SF) - if(SF.contents.len > 0) - if(!Adjacent(SF)) - tryWalk(get_turf(SF)) - else - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")], grabbing various foodstuffs from [SF] and sticking them in its mouth!") - for(var/obj/item/A in SF.contents) - if(prob(smartness/2)) - var/count = SF.item_quants[A.name] - if(count) - SF.item_quants[A.name] = count - 1 - A.forceMove(src) - - if(foundCustom) - var/obj/item/reagent_containers/food/snacks/FC = foundCustom - for(var/obj/item/reagent_containers/food/snacks/toMake in allContents) - if(prob(smartness)) - if(FC.reagents) - if(toMake.reagents) - var/raw = 0 - for(var/type in rawtypes) - if(istype(toMake, type)) - raw = 1 - break - if(!raw) - npcDrop(toMake) - FC.attackby(toMake, src) - allContents -= toMake - break - else - qdel(FC) // this food is usless, toss it - - // Process tool-based ingredients - var/obj/item/reagent_containers/food/snacks/dough/D = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/sliceable/flatdough/FD = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/rawcutlet/RC = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/sliceable/cheesewheel/CW = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/grown/potato/PO = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/meat/ME = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/raw_bacon/RB = locate() in rangeCheck - - if(D) - TARGET = D - if(prob(50)) - tryWalk(get_turf(D)) - sleep(get_dist(src, D)) - D.attackby(RP, src) - foundCookable = 1 - else if(FD) - TARGET = FD - if(prob(50)) - tryWalk(get_turf(FD)) - sleep(get_dist(src, FD)) - FD.attackby(KK, src) - foundCookable = 1 - else if(RC) - TARGET = RC - if(prob(50)) - tryWalk(get_turf(RC)) - sleep(get_dist(src, RC)) - RC.attackby(KK, src) - foundCookable = 1 - else if(CW) - TARGET = CW - if(prob(50)) - tryWalk(get_turf(CW)) - sleep(get_dist(src, CW)) - CW.attackby(KK, src) - foundCookable = 1 - else if(PO) - TARGET = PO - if(prob(50)) - tryWalk(get_turf(PO)) - sleep(get_dist(src, PO)) - PO.attackby(KK, src) - foundCookable = 1 - else if(ME) - TARGET = ME - if(prob(50)) - tryWalk(get_turf(ME)) - sleep(get_dist(src, ME)) - ME.attackby(KK, src) - foundCookable = 1 - else if(RB) - TARGET = RB - if(prob(50)) - tryWalk(get_turf(RB)) - sleep(get_dist(src, RB)) - RB.attackby(KK, src) - foundCookable = 1 - - // refresh - allContents = getAllContents() - rangeCheck = view(6, src) - - // Find most complex recipe we can cook - var/ingredientZone = rangeCheck + allContents - var/highest_count = 0 - var/datum/recipe/winner = null - for(var/datum/recipe/R in available_recipes) - if(R.check_items(ingredientZone) >= 0) - var/count = (R.items ? R.items.len : 0) - if(count > highest_count) - highest_count = count - winner = R - - // make winner - if(winner) - if(makerecipe(winner, allContents, rangeCheck)) - foundCookable = 1 - - // refresh - allContents = getAllContents() - rangeCheck = view(6, src) - - // dont display our ingredients - var/list/finishedList = list() - for(var/obj/item/reagent_containers/food/snacks/toDisplay in allContents) - var/raw = 0 - for(var/type in rawtypes) - if(istype(toDisplay, type)) - raw = 1 - break - if(!raw) - finishedList += toDisplay - - for(var/obj/item/reagent_containers/food/snacks/toGrab in rangeCheck) - if(!(locate(/obj/structure/table/reinforced) in get_turf(toGrab))) //it's not being displayed - var/raw = 0 - for(var/type in rawtypes) - if(istype(toGrab, type)) - raw = 1 - break - if(!raw) - foundCookable = 1 - if(!Adjacent(toGrab)) - tryWalk(toGrab) - else - finishedList += toGrab - toGrab.forceMove(src) - - if(finishedList.len) - var/obj/structure/table/reinforced/RT - - for(var/obj/structure/table/reinforced/toCheck in rangeCheck) - var/counted = 0 - for(var/obj/item/reagent_containers/food/snacks/S in get_turf(toCheck)) - ++counted - if(counted < 12) // make sure theres not too much food here - RT = toCheck - break - - if(RT) - foundCookable = 1 - if(!Adjacent(RT)) - tryWalk(get_turf(RT)) - else - for(var/obj/item/reagent_containers/food/snacks/toPlop in finishedList) - RT.attackby(toPlop,src) - - if(!foundCookable) - var/chosenType = pick(rawtypes) - - var/obj/item/reagent_containers/food/snacks/newSnack = new chosenType(get_turf(src)) - TARGET = newSnack - newSnack.reagents.remove_any((newSnack.reagents.total_volume/2)-1) - newSnack.name = "synthetic [newSnack.name]" - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as [p_they()] vomit[p_s()] [newSnack] from [p_their()] mouth!") - catch(var/exception/e) - log_runtime(e, src, "Caught in SNPC cooking module") - doing &= ~SNPC_SPECIAL -// END COOKING MODULE - -/mob/living/carbon/human/interactive/proc/combat(obj) - set background = 1 - enforce_hands() - if(canmove) - if((graytide || (TRAITS & TRAIT_MEAN)) || retal) - interest += targetInterestShift - a_intent = INTENT_HARM - zone_sel.selecting = pick("chest","r_leg","l_leg","r_arm","l_arm","head") - doing |= SNPC_FIGHTING - if(retal) - TARGET = retal_target - else - var/mob/living/M = locate(/mob/living) in oview(7, src) - if(!M) - doing = doing & ~SNPC_FIGHTING - else if(M != src && !compareFaction(M.faction)) - TARGET = M - - //no infighting - if(retal) - if(retal_target) - if(compareFaction(retal_target.faction)) - retal = 0 - retal_target = null - TARGET = null - doing = 0 - - //ensure we're using the best object possible - - var/obj/item/best - var/foundFav = 0 - var/list/allContents = getAllContents() - for(var/test in allContents) - for(var/a in favoured_types) - if(ispath(test,a) && !(doing & SNPC_FIGHTING)) // if we're not in combat and we find our favourite things, use them (for people like janitor and doctors) - best = test - foundFav = 1 - return - if(!foundFav) - if(istype(test,/obj/item)) - var/obj/item/R = test - if(R.force > 2) // make sure we don't equip any non-weaponlike items, ie bags and stuff - if(!best) - best = R - else - if(best.force < R.force) - best = R - if(istype(R, /obj/item/gun)) - var/obj/item/gun/G = R - if(G.can_shoot()) - best = R - break // gun with ammo? screw the rest - if(best && best != main_hand) - take_to_slot(best,1) - - if(TARGET && (doing & SNPC_FIGHTING)) // this is a redundancy check - var/mob/living/M = TARGET - if(istype(M,/mob/living)) - if(M.health > 1 && (M in oview(src, 6))) - //THROWING OBJECTS - for(var/A in allContents) - if(istype(A,/obj/item/gun)) // guns are for shooting, not throwing. - continue - if(prob(robustness)) - if(istype(A,/obj/item)) - var/obj/item/W = A - if(W.throwforce > 19) // Only throw worthwile stuff, no more lobbing wrenches at wenches - npcDrop(W, 1) - throw_item(TARGET) - if(istype(A,/obj/item/grenade)) // Allahu ackbar! ALLAHU ACKBARR!! - var/obj/item/grenade/G = A - G.attack_self(src) - if(prob(smartness)) - npcDrop(G, 1) - sleep(15) - throw_item(TARGET) - - if(!main_hand && other_hand) - swap_hands() - if(main_hand) - if(main_hand.force != 0) - if(istype(main_hand,/obj/item/gun)) - var/obj/item/gun/G = main_hand - if(G.can_trigger_gun(src)) - var/shouldFire = 1 - if(istype(main_hand, /obj/item/gun/energy)) - var/obj/item/gun/energy/P = main_hand - var/stunning = 0 - for(var/A in P.ammo_type) - if(ispath(A,/obj/item/ammo_casing/energy/electrode)) - stunning = 1 - var/mob/stunCheck = TARGET - if(stunning && stunCheck.stunned) - shouldFire = 0 - if(shouldFire) - if(!G.can_shoot()) - G.shoot_with_empty_chamber(src) - npcDrop(G, 1) - else - G.process_fire(TARGET, src) - else - if(get_dist(src,TARGET) > 6) - if(!walk2derpless(TARGET)) - timeout++ - else - var/obj/item/W = main_hand - W.attack(TARGET, src) - else - npcDrop(G, 1) - else - if(targetRange(TARGET) > 2) - tryWalk(TARGET) - else - if(Adjacent(TARGET)) - a_intent = pick(INTENT_DISARM, INTENT_HARM) - M.attack_hand(src) - timeout++ - else if(timeout >= 10 || !(targetRange(M) > 14)) - doing = doing & ~SNPC_FIGHTING - timeout = 0 - TARGET = null - retal = 0 - retal_target = null - else - timeout++ - -/mob/living/carbon/human/interactive/proc/past_verb(word) - if(copytext(word, length(word)) == "e") - return "[word]d" - else - return "[word]ed" - -/mob/living/carbon/human/interactive/proc/ing_verb(word) - if(copytext(word, length(word)) == "e") - return "[copytext(word, 1, length(word))]ing" - else - return "[word]ing" - -/mob/living/carbon/human/interactive/proc/paperwork_sentence() - var/verbs_use = pick_list(speak_file, "verbs_use") - var/verbs_touch = pick_list(speak_file, "verbs_touch") - var/verbs_move = pick_list(speak_file, "verbs_move") - var/nouns_insult = pick_list(speak_file, "nouns_insult") - var/nouns_generic = pick_list(speak_file, "nouns_generic") - var/nouns_objects = pick_list(speak_file, "nouns_objects") - var/nouns_body = pick_list(speak_file, "nouns_body") - var/adjective_insult = pick_list(speak_file, "adjective_insult") - var/adjective_objects = pick_list(speak_file, "adjective_objects") - var/adjective_generic = pick_list(speak_file, "adjective_generic") - var/curse_words = pick_list(speak_file, "curse_words") - var/result = pick("fired", "promoted", "demoted", "terminated", "incinerated", "sent to CentCom", "borged") - - return pick( - "The [adjective_insult] [pick(command_positions)] [past_verb(verbs_touch)] the [adjective_objects] [nouns_objects] and was [result].", - "The [adjective_generic] [pick(engineering_positions)] [past_verb(verbs_touch)] the [adjective_insult] [nouns_objects]. [capitalize(curse_words)], the [nouns_insult] was [result].", - "The [adjective_insult] [pick(security_positions)] [past_verb(verbs_touch)] the [adjective_generic] [nouns_insult] [pick(support_positions)]'s [nouns_body] and had to be [result].", - "Medical had to [verbs_use] the [adjective_generic] [pick(command_positions)]'s [adjective_objects] [nouns_body] after the incident.", - "I demand that [nouns_generic] respond with a [adjective_generic] update ASAP.", - "Would like an update from [nouns_generic] regarding the [adjective_insult] [pick(command_positions)] being [result].", - "The [pick(medical_positions)] needs to [verbs_move] faster when the crew's [adjective_objects] [nouns_body]s are injured, or they will be [result].", - "[capitalize(curse_words)] [adjective_insult] [curse_words].", - "

") - -/mob/living/carbon/human/interactive/proc/pickStamp(allContents) - var/list/stamps[0] - for(var/obj/item/stamp/S in allContents) - stamps += S - if(stamps.len) - return pick(stamps) - - // just make one, maybe - if(prob(SNPC_FUZZY_CHANCE_LOW / 2)) - for(var/p in favoured_types) - if(ispath(p, /obj/item/stamp)) - return new p(src) - return null - -/mob/living/carbon/human/interactive/proc/paperwork(obj) - set background = 1 - - if(shouldModulePass() || !prob(SNPC_FUZZY_CHANCE_LOW / 4)) - return - - var/list/allContents = getAllContents() - - var/obj/item/paper/P = locate() in allContents - var/obj/item/stamp/S = pickStamp(allContents) - var/mob/living/carbon/human/H = locate() in nearby - - if(!P) - P = new /obj/item/paper(src) - - if(P && S && H) - if(!P.stamped || !P.stamped.len) - // generate form - P.name = pick("Inspection Report", "Re: Crew", "Complaint", "To: CentCom") - P.info = {"

[paperwork_sentence()]
"} - for(var/I in 1 to rand(10, 20)) - P.info += "[paperwork_sentence()] " - P.info += {"

[pick("Signed", "Sincerely", "Regards")], [real_name]"} - P.update_icon() - P.stamp(S) - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] and throws [P] on the ground!") - npcDrop(P) - P.throw_at(H, P.throw_range, P.throw_speed, src) - -/mob/living/carbon/human/interactive/proc/stamping(obj) - if(shouldModulePass()) - return - - var/list/allContents = getAllContents() - var/list/rangeCheck = view(7, src) - - var/obj/item/stamp/S = pickStamp(allContents) - if(!S) - return - - // stamp a paper we're holding, and drop it - var/obj/item/paper/P = locate() in allContents - if(P) - if(!P.stamped || !P.stamped.len) - P.stamp(S) - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as they stamp \the [P] with \a [S]!") - npcDrop(P, 1) - return - - // stamp a paper in the world - for(var/obj/item/paper/A in rangeCheck) - if(!A.stamped || !A.stamped.len) - if(!Adjacent(A)) - tryWalk(A) - else - A.stamp(S) - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as they stamp \the [A] with \a [S]!") - return diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm deleted file mode 100644 index bb9ae87bdc7..00000000000 --- a/code/modules/mob/living/carbon/human/interactive/interactive.dm +++ /dev/null @@ -1,960 +0,0 @@ -/* - NPC VAR EXPLANATIONS (for modules and other things) - - doing = their current action, SNPC_INTERACTING, SNPC_TRAVEL or SNPC_FIGHTING - interest = how interested the NPC is in the situation, if they are idle, this drops - timeout = this is internal - TARGET = their current target - LAST_TARGET = their last target - nearby = a list of nearby mobs - best_force = the highest force object, used for checking when to swap items - retal = this is internal - retal_target = this is internal - update_hands = this is a bool (1/0) to determine if the NPC should update what is in his hands - - MYID = their ID card - MYPDA = their PDA - main_hand = what is in their "main" hand (chosen from left > right) - TRAITS = the traits assigned to this npc - mymjob = the job assigned to the npc - - robustness = the chance for the npc to hit something - smartness = the inverse chance for an npc to do stupid things - attitude = the chance for an npc to do rude or mean things - slyness = the chance for an npc to do naughty things ie thieving - - functions = the list of procs that the npc will use for modules - - graytide = shitmin var to make them go psycho -*/ -/mob/living/carbon/human/interactive - name = "interactive station member" - var/doing = 0 - var/interest = 10 - var/maxInterest = 10 - var/timeout = 0 - var/inactivity_period = 0 - var/atom/TARGET = null - var/atom/LAST_TARGET = null - var/list/nearby = list() - var/best_force = 0 - var/retal = 0 - var/mob/retal_target = null - var/update_hands = 0 - var/list/blacklistItems = list() // items we should be ignoring - var/maxStepsTick = 6 // step as many times as we can per frame - //Job and mind data - var/obj/item/card/id/MYID - var/obj/item/card/id/RPID // the "real" idea they use - var/obj/item/pda/MYPDA - var/obj/item/main_hand - var/obj/item/other_hand - var/TRAITS = 0 - var/obj/item/card/id/Path_ID - var/default_job = /datum/job/civilian // the type for the default job - var/datum/job/myjob - var/list/myPath = list() - faction = list("synth") - //trait vars - var/robustness = 50 - var/smartness = 50 - var/attitude = 50 - var/slyness = 50 - var/graytide = 0 - var/list/favoured_types = list() // allow a mob to favour a type, and hold onto them - var/chattyness = SNPC_CHANCE_TALK - var/targetInterestShift = 5 // how much a good action should "reward" the npc - //modules - var/list/functions = list("nearbyscan","combat","shitcurity","chatter") - var/restrictedJob = 0 - var/forceProcess = 0 - var/speak_file = "npc_chatter.json" - var/debugexamine = FALSE //If we show debug info in our examine - var/showexaminetext = TRUE //If we show our telltale examine text - - var/voice_saved = FALSE - - var/list/knownStrings = list() - - //snpc traitor variables - - var/isTraitor = 0 - var/traitorTarget - var/traitorScale = 0 // our ability as a traitor - var/traitorType = 0 - - -/// SNPC voice handling - -/mob/living/carbon/human/interactive/proc/loadVoice() - var/savefile/S = new /savefile("data/npc_saves/snpc.sav") - S["knownStrings"] >> knownStrings - - if(isnull(knownStrings)) - knownStrings = list() - -/mob/living/carbon/human/interactive/proc/saveVoice() - if(voice_saved) - return - var/savefile/S = new /savefile("data/npc_saves/snpc.sav") - S["knownStrings"] << knownStrings - -//botPool funcs -/mob/living/carbon/human/interactive/proc/takeDelegate(mob/living/carbon/human/interactive/from,doReset=TRUE) - change_eye_color(255, 0, 0) - if(from == src) - return FALSE - TARGET = from.TARGET - LAST_TARGET = from.LAST_TARGET - retal = from.retal - retal_target = from.retal_target - doing = from.doing - // - timeout = 0 - inactivity_period = 0 - interest = maxInterest - // - update_icons() - if(doReset) - from.TARGET = null - from.LAST_TARGET = null - from.retal = 0 - from.retal_target = null - from.doing = 0 - return TRUE - -//end pool funcs - -/mob/living/carbon/human/interactive/proc/random() - //this is here because this has no client/prefs/brain whatever. - age = rand(AGE_MIN, AGE_MAX) - change_gender(pick("male", "female")) - rename_character(real_name, dna.species.get_random_name(gender)) - //job handling - myjob = new default_job() - job = myjob.title - mind.assigned_role = job - myjob.equip(src) - -/mob/living/carbon/human/interactive/proc/reset() - walk(src, 0) - timeout = 100 - retal = 0 - doing = 0 - inactivity_period = 0 - -/client/proc/resetSNPC(mob/living/carbon/human/interactive/T in SSnpcpool.processing) - set name = "Reset SNPC" - set desc = "Reset the SNPC" - set category = "Debug" - - if(!holder) - return - - if(istype(T)) - T.reset() - -/client/proc/customiseSNPC(mob/living/carbon/human/interactive/T in SSnpcpool.processing) - set name = "Customize SNPC" - set desc = "Customize the SNPC" - set category = "Debug" - - if(!holder) - return - - if(!istype(T)) - return - - var/list/jobs[0] - for(var/datum/job/j in job_master.occupations) - if(j.title != "AI" && j.title != "Cyborg") - jobs[j.title] = j - jobs = sortAssoc(jobs) - var/job_name = input("Choose Job") as null|anything in jobs - - if(job_name) - var/datum/job/cjob = jobs[job_name] - var/alt_title = input("Choose Alt Title") in (list(job_name) + cjob.alt_titles) - - T.myjob = cjob - T.job = cjob.title - T.mind.assigned_role = cjob.title - for(var/obj/item/I in T) - if(istype(I, /obj/item/implant)) - continue - if(istype(I, /obj/item/organ)) - continue - qdel(I) - T.myjob.equip(T) - T.doSetup(alt_title) - - var/shouldDoppel = input("Do you want the SNPC to disguise themself as a crewmember?") as anything in list("Yes", "No") - if(shouldDoppel == "Yes") - var/list/validchoices = list() - for(var/mob/living/carbon/human/M in GLOB.mob_list) - validchoices += M - - var/mob/living/carbon/human/chosen = input("Which crewmember?") as null|anything in validchoices - - if(chosen) - var/datum/dna/toDoppel = chosen.dna - - T.real_name = toDoppel.real_name - T.set_species(chosen.dna.species.type) - T.dna = toDoppel.Clone() - T.body_accessory = chosen.body_accessory - T.UpdateAppearance() - domutcheck(T) - - var/doTrait = input("Do you want the SNPC to be a traitor?") as anything in list("Yes", "No") - if(doTrait == "Yes") - var/list/tType = list("Brute" = SNPC_BRUTE, "Stealth" = SNPC_STEALTH, "Martyr" = SNPC_MARTYR, "Psycho" = SNPC_PSYCHO) - var/cType = input("Choose the traitor personality.") as null|anything in tType - if(cType) - var/value = tType[cType] - T.makeTraitor(value) - - var/doTele = input("Place the SNPC in their department?") as anything in list("Yes", "No") - if(doTele == "Yes") - T.loc = pick(get_area_turfs(T.job2area(T.myjob))) - - T.revive() - -/mob/living/carbon/human/interactive/proc/doSetup(alt_title = null) - Path_ID = new /obj/item/card/id(src) - - var/datum/job/captain/C = new/datum/job/captain - Path_ID.access = C.get_access() - - if(!alt_title) - alt_title = job - - MYID = new(src) - MYID.name = "[real_name]'s ID Card ([alt_title])" - MYID.assignment = "[alt_title]" - MYID.rank = job - MYID.sex = capitalize(gender) - MYID.age = age - MYID.registered_name = real_name - MYID.photo = get_id_photo(src) - MYID.access = Path_ID.access.Copy() // Automatons have strange powers... strange indeed - - RPID = new(src) - RPID.name = "[real_name]'s ID Card ([alt_title])" - RPID.assignment = "[alt_title]" - RPID.rank = job - RPID.sex = capitalize(gender) - RPID.age = age - RPID.registered_name = real_name - RPID.photo = get_id_photo(src) - RPID.access = myjob.get_access() - - if(wear_id) - qdel(wear_id) - if(!equip_to_slot_or_del(MYID, slot_wear_id)) - create_attack_log("Deleted ID due to slot contention") - if(wear_pda) - MYPDA = wear_pda - else - MYPDA = new(src) - equip_to_slot_or_del(MYPDA, slot_wear_pda) - MYPDA.owner = real_name - MYPDA.ownjob = alt_title - MYPDA.ownrank = job - MYPDA.name = "PDA-[real_name] ([alt_title])" - zone_sel.selecting = "chest" - //arms - if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4)) - var/obj/item/organ/external/R = bodyparts_by_name["r_arm"] - if(R) - R.robotize(make_tough = 1) - else - var/obj/item/organ/external/L = bodyparts_by_name["l_arm"] - if(L) - L.robotize(make_tough = 1) - //legs - if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4)) - var/obj/item/organ/external/R = bodyparts_by_name["r_leg"] - if(R) - R.robotize(make_tough = 1) - else - var/obj/item/organ/external/L = bodyparts_by_name["l_leg"] - if(L) - L.robotize(make_tough = 1) - UpdateDamageIcon() - regenerate_icons() - - hand = 0 - functions = list("nearbyscan", "combat", "shitcurity", "chatter") // stop customize adding multiple copies of a function - setup_job(job) - - if(TRAITS & TRAIT_ROBUST) - robustness = 75 - else if(TRAITS & TRAIT_UNROBUST) - robustness = 25 - - //modifiers are prob chances, lower = smarter - if(TRAITS & TRAIT_SMART) - smartness = 75 - else if(TRAITS & TRAIT_DUMB) - disabilities |= CLUMSY - smartness = 25 - - if(TRAITS & TRAIT_MEAN) - attitude = 75 - else if(TRAITS & TRAIT_FRIENDLY) - attitude = 1 - - if(TRAITS & TRAIT_THIEVING) - slyness = 75 - -/mob/living/carbon/human/interactive/proc/InteractiveProcess() - if(ticker.current_state == GAME_STATE_FINISHED) - saveVoice() - voice_saved = TRUE - doProcess() - -/mob/living/carbon/human/interactive/proc/setup_job(thejob) - switch(thejob) - if("Civilian") - favoured_types = list(/obj/item/clothing, /obj/item) - if("Captain", "Head of Personnel") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/captain,/obj/item/disk/nuclear) - if("Nanotrasen Representative") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/centcom, /obj/item/paper, /obj/item/melee/classic_baton/ntcane) - functions += "paperwork" - if("Magistrate", "Internal Affairs Agent") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/law, /obj/item/paper) - functions += "paperwork" - if("Quartermaster", "Cargo Technician") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/granted, /obj/item/stamp/denied, /obj/item/paper, /obj/item/clipboard) - functions += "stamping" - if("Chef") - favoured_types = list(/obj/item/reagent_containers/food, /obj/item/kitchen) - functions += "souschef" - restrictedJob = 1 - if("Bartender") - favoured_types = list(/obj/item/reagent_containers/food, /obj/item/kitchen) - functions += "bartend" - restrictedJob = 1 - if("Station Engineer", "Chief Engineer", "Life Support Specialist", "Mechanic") - favoured_types = list(/obj/item/stack, /obj/item, /obj/item/clothing) - if("Chief Medical Officer", "Medical Doctor", "Chemist", "Virologist", "Geneticist", "Psychiatrist", "Paramedic", "Brig Physician") - favoured_types = list(/obj/item/reagent_containers/glass/beaker, /obj/item/storage/firstaid, /obj/item/stack/medical, /obj/item/reagent_containers/syringe) - functions += "healpeople" - if("Research Director", "Scientist", "Roboticist") - favoured_types = list(/obj/item/reagent_containers/glass/beaker, /obj/item/stack, /obj/item/reagent_containers) - if("Head of Security", "Warden", "Security Officer", "Detective", "Security Pod Pilot", "Blueshield") - favoured_types = list(/obj/item/clothing, /obj/item, /obj/item/restraints) - if("Janitor") - favoured_types = list(/obj/item/mop, /obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/spray/cleaner, /obj/effect/decal/cleanable) - functions += "dojanitor" - if("Clown") - favoured_types = list(/obj/item/soap, /obj/item/reagent_containers/food/snacks/grown/banana, /obj/item/grown/bananapeel) - functions += "clowning" - if("Botanist") - favoured_types = list(/obj/machinery/hydroponics, /obj/item/reagent_containers, /obj/item) - functions += "botany" - restrictedJob = 1 - else - favoured_types = list(/obj/item/clothing) - -/mob/living/carbon/human/interactive/proc/makeTraitor(var/inPers) - isTraitor = 1 - traitorScale = (slyness + smartness) + rand(-10,10) - traitorType = inPers - - ticker.mode.traitors += mind - mind.special_role = SPECIAL_ROLE_TRAITOR - var/datum/mindslaves/slaved = new() - slaved.masters += mind - mind.som = slaved - ticker.mode.update_traitor_icons_added(mind) - - switch(traitorType) - if(SNPC_BRUTE) // SMASH KILL RAAARGH - var/datum/objective/assassinate/A = new - A.owner = mind - A.find_target() - mind.objectives += A - traitorTarget = A.target.current - if(SNPC_STEALTH) // Shhh we is sneekies - var/datum/objective/steal/S = new - S.owner = mind - S.find_target() - mind.objectives += S - traitorTarget = locate(S.steal_target.typepath) in world - if(SNPC_MARTYR) // MY LIFE FOR SPESZUL - var/targetType = pick(/obj/structure/particle_accelerator, /obj/machinery/gravity_generator/main, /obj/machinery/power/smes) - traitorTarget = locate(targetType) in world - var/datum/objective/O = new("Destroy \the [traitorTarget].") - O.owner = mind - mind.objectives += O - if(SNPC_PSYCHO) // YOU'RE LIKE A FLESH BICYLE AND I WANT TO DISMANTLE YOU - var/datum/objective/hijack/H = new - H.owner = mind - mind.objectives += H - traitorTarget = null - - functions += "traitor" - faction -= "neutral" - faction += "hostile" - -/mob/living/carbon/human/interactive/create_mob_hud() - if(!hud_used) - hud_used = new /datum/hud/human(src) - -/mob/living/carbon/human/interactive/Initialize() - ..() - return INITIALIZE_HINT_LATELOAD - -/mob/living/carbon/human/interactive/LateInitialize() - . = ..() - GLOB.snpc_list += src - - create_mob_hud() - - sync_mind() - random() - doSetup() - START_PROCESSING(SSnpcpool, src) - loadVoice() - GLOB.hear_radio_list += src - - // a little bit of variation to make individuals more unique - robustness += rand(-10, 10) - smartness += rand(-10, 10) - attitude += rand(-10, 10) - slyness += rand(-10, 10) - - doProcess() - -/mob/living/carbon/human/interactive/Destroy() - SSnpcpool.stop_processing(src) - return ..() - -/mob/living/carbon/human/interactive/proc/retalTarget(mob/living/target) - var/mob/living/M = target - if(istype(M)) - if(health > 0) - if(M.a_intent == INTENT_HELP && !incapacitated()) - chatter() - if(istype(target, /mob/living/carbon) && !retal && prob(SNPC_FUZZY_CHANCE_LOW)) - var/mob/living/carbon/C = target - if(!Adjacent(target)) - tryWalk(target) - else - C.help_shake_act(src) - if(M.a_intent == INTENT_HARM) - retal = 1 - retal_target = target - -//Retaliation clauses - -/mob/living/carbon/human/interactive/attacked_by(obj/item/I, mob/living/user, def_zone) - ..() - retalTarget(user) - -/mob/living/carbon/human/interactive/hitby(atom/movable/AM, skipcatch, hitpush, blocked) - ..() - var/mob/living/carbon/C = locate(/mob/living/carbon) in view(SNPC_MIN_RANGE_FIND, src) - if(C) - retalTarget(C) - -/mob/living/carbon/human/interactive/bullet_act(obj/item/projectile/P) - ..() - retalTarget(P.firer) - -/mob/living/carbon/human/interactive/attack_hand(mob/living/carbon/human/M) - ..() - retalTarget(M) - -/mob/living/carbon/human/interactive/show_inv(mob/user) - ..() - retalTarget(user) - -/mob/living/carbon/human/interactive/can_inject(mob/user, error_msg, target_zone, var/penetrate_thick = 0) - ..() - retalTarget(user) - -//THESE EXIST FOR DEBUGGING OF THE DOING/INTEREST SYSTEM EASILY -/mob/living/carbon/human/interactive/proc/doing2string(doin) - var/toReturn = "" - if(!doin) - toReturn = "not doing anything" - if(doin & SNPC_INTERACTING) - toReturn += "interacting with something, " - if(doin & SNPC_FIGHTING) - toReturn += "engaging in combat, " - if(doin & SNPC_TRAVEL) - toReturn += "and going somewhere" - return toReturn - -/mob/living/carbon/human/interactive/proc/interest2string(inter) - var/toReturn = "Flatlined" - if(inter >= 0 && inter <= 25) - toReturn = "Very Bored" - if(inter >= 26 && inter <= 50) - toReturn = "Bored" - if(inter >= 51 && inter <= 75) - toReturn = "Content" - if(inter >= 76) - toReturn = "Excited" - return toReturn -//END DEBUG - -/mob/living/carbon/human/interactive/proc/IsDeadOrIncap(checkDead = TRUE) - if(!canmove) - return 1 - if(health <= 0 && checkDead) - return 1 - if(restrained()) - return 1 - if(paralysis) - return 1 - if(stunned) - return 1 - if(stat) - return 1 - if(inactivity_period > 0) - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/enforce_hands() - if(main_hand) - if(main_hand.loc != src) - main_hand = null - if(other_hand) - if(other_hand.loc != src) - other_hand = null - if(hand) - if(!l_hand) - main_hand = null - if(r_hand) - swap_hands() - else - if(!r_hand) - main_hand = null - if(l_hand) - swap_hands() - -/mob/living/carbon/human/interactive/proc/swap_hands() - hand = !hand - var/obj/item/T = other_hand - main_hand = other_hand - other_hand = T - update_hands = 1 - -/mob/living/carbon/human/interactive/proc/take_to_slot(obj/item/G, var/hands=0) - var/list/slots = list("left pocket" = slot_l_store, "right pocket" = slot_r_store, "left hand" = slot_l_hand, "right hand" = slot_r_hand) - if(hands) - slots = list("left hand" = slot_l_hand, "right hand" = slot_r_hand) - G.loc = src - if(G.force && G.force > best_force) - best_force = G.force - equip_in_one_of_slots(G, slots) - update_hands = 1 - -/mob/living/carbon/human/interactive/proc/insert_into_backpack() - var/list/slots = list(slot_l_store, slot_r_store, slot_l_hand, slot_r_hand) - var/obj/item/I = get_item_by_slot(pick(slots)) - var/obj/item/storage/BP = get_item_by_slot(slot_back) - if(back && BP && I) - // hack to allow SNPCs to "sticky grab" items without losing their inventorying - var/oldnodrop = I.flags | NODROP - I.flags &= ~NODROP - if(BP.can_be_inserted(I)) - BP.handle_item_insertion(I) - I.flags |= oldnodrop - else - unEquip(I,TRUE) - update_hands = 1 - -/mob/living/carbon/human/interactive/proc/targetRange(towhere) - return get_dist(get_turf(towhere), get_turf(src)) - -/mob/living/carbon/human/interactive/death() - // Only execute the below if we successfully died - . = ..() - if(!.) - return FALSE - saveVoice() - -/mob/living/carbon/human/interactive/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol) - if(!istype(speaker, /mob/living/carbon/human/interactive)) - knownStrings |= html_decode(multilingual_to_message(message_pieces)) - ..() - -/mob/living/carbon/human/interactive/hear_radio(list/message_pieces, verb = "says", part_a, part_b, mob/speaker = null, hard_to_hear = 0, vname = "", atom/follow_target) - if(!istype(speaker, /mob/living/carbon/human/interactive)) - knownStrings |= html_decode(multilingual_to_message(message_pieces)) - ..() - -/mob/living/carbon/human/interactive/proc/doProcess() - set waitfor = FALSE - if(IsDeadOrIncap()) - reset() - return - //--------------------------- - //---- interest flow control - if(interest < 0 || inactivity_period < 0) - if(interest < 0) - interest = 0 - if(inactivity_period < 0) - inactivity_period = 0 - if(interest > maxInterest) - interest = maxInterest - //--------------------------- - //VIEW FUNCTIONS - - //doorscan is now integrated into life and runs before all other procs - var/mistake_chance = (100 - smartness) / 2 - spawn(0) - for(var/dir in alldirs) - var/turf/T = get_step(src, dir) - if(T) - for(var/obj/machinery/door/D in T.contents) - if(!istype(D,/obj/machinery/door/poddoor) && D.density) - spawn(0) - if(istype(D,/obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/AL = D - if(!AL.CanAStarPass(RPID)) // only crack open doors we can't get through - inactivity_period = 20 - AL.panel_open = 1 - AL.update_icon() - AL.shock(src, mistake_chance) - sleep(5) - if(QDELETED(AL)) - return - AL.unlock() - if(prob(mistake_chance)) - if(!AL.wires.IsIndexCut(AIRLOCK_WIRE_DOOR_BOLTS)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_DOOR_BOLTS) - else - if(AL.wires.IsIndexCut(AIRLOCK_WIRE_DOOR_BOLTS)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_DOOR_BOLTS, 1) - if(AL.locked) - AL.wires.UpdatePulsed(AIRLOCK_WIRE_DOOR_BOLTS) - if(!AL.wires.IsIndexCut(AIRLOCK_WIRE_MAIN_POWER1)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_MAIN_POWER1) - if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_SAFETY)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_SAFETY) - if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_ELECTRIFY)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_ELECTRIFY) - sleep(5) - if(QDELETED(AL)) - return - AL.panel_open = 0 - AL.update_icon() - D.open() - - if(update_hands) - if(l_hand || r_hand) - if(l_hand) - hand = 1 - main_hand = l_hand - if(r_hand) - other_hand = r_hand - else if(r_hand) - hand = 0 - main_hand = r_hand - if(l_hand) //this technically shouldnt occur, but its a redundancy - other_hand = l_hand - update_icons() - update_hands = 0 - - if(grabbed_by.len > 0) - for(var/obj/item/grab/G in grabbed_by) - if(Adjacent(G)) - a_intent = INTENT_DISARM - G.assailant.attack_hand(src) - inactivity_period = 10 - - if(buckled) - resist() - inactivity_period = 10 - - //proc functions - for(var/Proc in functions) - if(!IsDeadOrIncap()) - INVOKE_ASYNC(src, Proc) - - - //target interaction stays hardcoded - - if(TARGET && (TARGET in blacklistItems)) // don't use blacklisted items - TARGET = null - - if(TARGET && Adjacent(TARGET)) - doing |= SNPC_INTERACTING - //--------DOORS - if(istype(TARGET, /obj/machinery/door)) - var/obj/machinery/door/D = TARGET - if(D.check_access(MYID) && !istype(D,/obj/machinery/door/poddoor)) - inactivity_period = 10 - D.open() - var/turf/T = get_step(get_step(D.loc, dir), dir) //recursion yo - tryWalk(T) - //THIEVING SKILLS - insert_into_backpack() // dump random item into backpack to make space - //---------ITEMS - if(istype(TARGET, /obj/item)) - var/obj/item/I = TARGET - if(I.anchored) - TARGET = null - else if(istype(TARGET, /obj/item)) - var/obj/item/W = TARGET - if(W.force >= best_force || prob((SNPC_FUZZY_CHANCE_LOW + SNPC_FUZZY_CHANCE_HIGH) / 2) || favouredObjIn(list(W))) - if(!l_hand || !r_hand) - put_in_hands(W) - else - insert_into_backpack() - else - if(!l_hand || !r_hand) - put_in_hands(TARGET) - else - insert_into_backpack() - //---------FASHION - if(istype(TARGET, /obj/item/clothing)) - drop_item() - dressup(TARGET) - update_hands = 1 - if(MYPDA in loc) - equip_to_appropriate_slot(MYPDA) - if(MYID in loc) - equip_to_appropriate_slot(MYID) - //THIEVING SKILLS END - //-------------TOUCH ME - if(istype(TARGET, /obj/structure)) - var/obj/structure/STR = TARGET - if(main_hand) - var/obj/item/W = main_hand - STR.attackby(W, src) - else - STR.attack_hand(src) - interest += targetInterestShift - doing = doing & ~SNPC_INTERACTING - timeout = 0 - TARGET = null - else - if(TARGET) - tryWalk(TARGET) - timeout++ - - if(doing == 0) - interest-- - else - interest++ - - if(inactivity_period > 0) - inactivity_period-- - - if(interest <= 0 || timeout >= 10) // facilitate boredom functions - TARGET = null - doing = 0 - timeout = 0 - myPath = list() - - //this is boring, lets move - if(!doing && !IsDeadOrIncap() && !TARGET) - doing |= SNPC_TRAVEL - if(!isTraitor || !traitorTarget || get_dist(src, traitorTarget) >= SNPC_MAX_RANGE_FIND || get_dist(src, traitorTarget) <= 1) - var/choice = rand(1,50) - switch(choice) - if(1 to 30) - //chance to chase an item - TARGET = locate(/obj/item) in favouredObjIn(oview(SNPC_MIN_RANGE_FIND, src)) - if(31 to 40) - TARGET = safepick(get_area_turfs(job2area(myjob))) - if(41 to 45) - TARGET = pick(target_filter(favouredObjIn(urange(SNPC_MAX_RANGE_FIND, src, 1)))) - if(46 to 50) - TARGET = pick(target_filter(oview(SNPC_MIN_RANGE_FIND, src))) - else - TARGET = traitorTarget - tryWalk(TARGET) - LAST_TARGET = TARGET - -/mob/living/carbon/human/interactive/proc/dressup(obj/item/clothing/C) - set waitfor = FALSE - inactivity_period = 12 - sleep(5) - if(!QDELETED(C) && !QDELETED(src)) - take_to_slot(C,1) - if(!equip_to_appropriate_slot(C)) - var/obj/item/I = get_item_by_slot(C) - unEquip(I) - sleep(5) - if(!QDELETED(src) && !QDELETED(C)) - equip_to_appropriate_slot(C) - -/mob/living/carbon/human/interactive/proc/favouredObjIn(list/inList) - var/list/outList = list() - for(var/i in inList) - for(var/path in favoured_types) - if(istype(i, path)) - outList += i - if(!outList.len) - outList = inList - return outList - -/mob/living/carbon/human/interactive/proc/tryWalk(turf/inTarget) - if(restrictedJob) // we're a job that has to stay in our home - if(!(get_turf(inTarget) in get_area_turfs(job2area(myjob)))) - TARGET = null - return - - if(!IsDeadOrIncap()) - if(!walk2derpless(inTarget)) - timeout++ - else - timeout++ - -/mob/living/carbon/human/interactive/proc/getGoodPath(target, maxtries=512) - set background = 1 - var/turf/end = get_turf(target) - - var/turf/current = get_turf(src) - - var/list/path = list() - var/tries = 0 - while(current != end && tries < maxtries) - var/turf/shortest = current - for(var/turf/T in view(current,1)) - var/foundDense = 0 - for(var/atom/A in T) - if(A.density) - foundDense = 1 - if(T.density == 0 && !foundDense) - if(get_dist(T, target) < get_dist(shortest,target)) - shortest = T - else - tries++ - else - tries++ - current = shortest - path += shortest - return path - -/mob/living/carbon/human/interactive/proc/walk2derpless(target) - set background = 1 - if(!target) - return 0 - - if(myPath.len <= 0) - myPath = get_path_to(src, get_turf(target), /turf/proc/Distance, SNPC_MAX_RANGE_FIND + 1, 250,1, id=Path_ID, simulated_only = 0) - - if(myPath) - if(myPath.len > 0) - doing = doing & ~SNPC_TRAVEL - for(var/i = 0; i < maxStepsTick; ++i) - if(!IsDeadOrIncap()) - if(myPath.len >= 1) - walk_to(src,myPath[1],0,5) - myPath -= myPath[1] - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/job2area(target) - var/datum/job/T = target - switch(T.title) - if("Civilian", "Paramedic") - return /area/hallway/primary - if("Captain", "Head of Personnel", "Blueshield") - return /area/bridge - if("Bartender") - return /area/crew_quarters/bar - if("Chef") - return /area/crew_quarters/kitchen - if("Station Engineer", "Chief Engineer", "Mechanic") - return /area/engine - if("Life Support Specialist") - return /area/atmos - if("Chief Medical Officer", "Medical Doctor", "Chemist", "Virologist", "Psychiatrist") - return /area/medical - if("Geneticist") - return /area/medical/genetics - if("Research Director", "Scientist") - return /area/toxins - if("Roboticist") - return /area/assembly/robotics - if("Head of Security", "Warden", "Security Officer", "Detective", "Security Pod Pilot", "Brig Physician", "Magistrate", "Internal Affairs Agent") - return /area/security - if("Botanist") - return /area/hydroponics - else - return pick(/area/hallway, /area/crew_quarters) - -/mob/living/carbon/human/interactive/proc/target_filter(target) - var/list/filtered_targets = list(/area, /turf, /obj/machinery/door, /atom/movable/lighting_overlay, /obj/structure/cable, /obj/machinery/atmospherics, /obj/item/radio/intercom) - var/list/L = target - for(var/atom/A in target) // added a bunch of "junk" that clogs up the general find procs - if(is_type_in_list(A,filtered_targets)) - L -= A - return L - -/mob/living/carbon/human/interactive/proc/shouldModulePass() // returns 1 if the npc is in anything "primary" - if(doing & (SNPC_FIGHTING | SNPC_SPECIAL)) - return 1 - if(retal) - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/getAllContents() - var/list/allContents = list() - for(var/atom/A in contents) - allContents += A - if(A.contents.len) - for(var/atom/B in A) - allContents += B - return allContents - -/mob/living/carbon/human/interactive/proc/enforceHome() - var/list/validHome = get_area_turfs(job2area(myjob)) - - if(TARGET) - var/atom/tcheck = TARGET - if(tcheck) - if(!(get_turf(tcheck) in validHome)) - TARGET = null - return 1 - - if(!(get_turf(src) in validHome) && validHome.len) - tryWalk(pick(get_area_turfs(job2area(myjob)))) - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/npcDrop(obj/item/A, blacklist = 0) - if(blacklist) - blacklistItems += A - unEquip(A) - enforce_hands() - update_icons() - -/mob/living/carbon/human/interactive/proc/compareFaction(list/targetFactions) - var/hasSame = 0 - - for(var/A in targetFactions) - if(A in faction) - hasSame = 1 - - return hasSame - -/mob/living/carbon/human/interactive/proc/nearbyscan(obj) - nearby = list() - for(var/mob/living/M in view(4,src)) - if(M != src) - nearby += M - -/mob/living/carbon/human/interactive/rename_character(oldname, newname) - if(!..()) - return 0 - - if(oldname) - if(MYID) - MYID.registered_name = newname - MYID.name = "[newname]'s ID Card ([MYID.assignment])" - if(RPID) - RPID.registered_name = MYID.registered_name - RPID.name = MYID.name - return 1 diff --git a/code/modules/mob/living/carbon/human/interactive/prefabs.dm b/code/modules/mob/living/carbon/human/interactive/prefabs.dm deleted file mode 100644 index cee716b66ec..00000000000 --- a/code/modules/mob/living/carbon/human/interactive/prefabs.dm +++ /dev/null @@ -1,24 +0,0 @@ -/mob/living/carbon/human/interactive/angry/Initialize(mapload) - TRAITS |= TRAIT_ROBUST - TRAITS |= TRAIT_MEAN - faction += "bot_angry" - return ..() - -/mob/living/carbon/human/interactive/friendly/Initialize(mapload) - TRAITS |= TRAIT_FRIENDLY - TRAITS |= TRAIT_UNROBUST - faction += "bot_friendly" - faction += "neutral" - functions -= "combat" - return ..() - -/mob/living/carbon/human/interactive/greytide/Initialize(mapload) - TRAITS |= TRAIT_ROBUST - TRAITS |= TRAIT_MEAN - TRAITS |= TRAIT_THIEVING - TRAITS |= TRAIT_DUMB - maxInterest = 5 // really short attention span - targetInterestShift = 2 // likewise - faction += "bot_grey" - graytide = 1 - return ..() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 7d83c7eaa1d..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)) @@ -44,9 +36,9 @@ return has_organ("chest") if(slot_wear_id) // the only relevant check for this is the uniform check - return 1 + return TRUE if(slot_wear_pda) - return 1 + return TRUE if(slot_l_ear) return has_organ("head") if(slot_r_ear) @@ -70,9 +62,9 @@ if(slot_s_store) return has_organ("chest") if(slot_in_backpack) - return 1 + return TRUE if(slot_tie) - return 1 + return TRUE // The actual dropping happens at the mob level - checks to prevent drops should // come here @@ -115,7 +107,7 @@ update_tint() if(G.prescription) update_nearsighted_effects() - if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view) + if(G.vision_flags || G.see_in_dark || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() update_inv_glasses() update_client_colour() @@ -128,7 +120,7 @@ // Bandanas and paper hats go on the head but are not head clothing if(istype(I,/obj/item/clothing/head)) var/obj/item/clothing/head/hat = I - if(hat.vision_flags || hat.darkness_view || hat.helmet_goggles_invis_view) + if(hat.vision_flags || hat.see_in_dark || !isnull(hat.lighting_alpha)) update_sight() head_update(I) update_inv_head() @@ -187,134 +179,136 @@ //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() //set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc. -/mob/living/carbon/human/equip_to_slot(obj/item/W as obj, slot, redraw_mob = 1) - if(!slot) return - if(!istype(W)) return - if(!has_organ_for_slot(slot)) return +/mob/living/carbon/human/equip_to_slot(obj/item/I, slot, redraw_mob = 1) + if(!slot) + return + if(!istype(I)) + return + if(!has_organ_for_slot(slot)) + return - if(W == src.l_hand) + if(I == src.l_hand) src.l_hand = null update_inv_l_hand() //So items actually disappear from hands. - else if(W == src.r_hand) + else if(I == src.r_hand) src.r_hand = null update_inv_r_hand() - W.screen_loc = null - W.loc = src - W.equipped(src, slot) - W.layer = 20 - W.plane = HUD_PLANE + I.screen_loc = null + I.forceMove(src) + I.equipped(src, slot) + I.layer = ABOVE_HUD_LAYER + I.plane = ABOVE_HUD_PLANE switch(slot) if(slot_back) - back = W + back = I update_inv_back(redraw_mob) if(slot_wear_mask) - wear_mask = W + wear_mask = I if((wear_mask.flags & BLOCKHAIR) || (wear_mask.flags & BLOCKHEADHAIR)) update_hair(redraw_mob) //rebuild hair update_fhair(redraw_mob) update_head_accessory(redraw_mob) if(hud_list.len) sec_hud_set_ID() - wear_mask_update(W, toggle_off = TRUE) + wear_mask_update(I, toggle_off = TRUE) update_inv_wear_mask(redraw_mob) if(slot_handcuffed) - handcuffed = W + handcuffed = I update_inv_handcuffed(redraw_mob) if(slot_legcuffed) - legcuffed = W + legcuffed = I update_inv_legcuffed(redraw_mob) if(slot_l_hand) - l_hand = W + l_hand = I update_inv_l_hand(redraw_mob) if(slot_r_hand) - r_hand = W + r_hand = I update_inv_r_hand(redraw_mob) if(slot_belt) - belt = W + belt = I update_inv_belt(redraw_mob) if(slot_wear_id) - wear_id = W + wear_id = I if(hud_list.len) sec_hud_set_ID() update_inv_wear_id(redraw_mob) if(slot_wear_pda) - wear_pda = W + wear_pda = I update_inv_wear_pda(redraw_mob) if(slot_l_ear) - l_ear = W + l_ear = I if(l_ear.slot_flags & SLOT_TWOEARS) - var/obj/item/clothing/ears/offear/O = new(W) - O.loc = src + var/obj/item/clothing/ears/offear/O = new(I) + O.forceMove(src) r_ear = O - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE update_inv_ears(redraw_mob) if(slot_r_ear) - r_ear = W + r_ear = I if(r_ear.slot_flags & SLOT_TWOEARS) - var/obj/item/clothing/ears/offear/O = new(W) - O.loc = src + var/obj/item/clothing/ears/offear/O = new(I) + O.forceMove(src) l_ear = O - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE update_inv_ears(redraw_mob) if(slot_glasses) - glasses = W - var/obj/item/clothing/glasses/G = W + glasses = I + var/obj/item/clothing/glasses/G = I if(G.tint) update_tint() if(G.prescription) update_nearsighted_effects() - if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view) + if(G.vision_flags || G.see_in_dark || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() update_inv_glasses(redraw_mob) update_client_colour() if(slot_gloves) - gloves = W + gloves = I update_inv_gloves(redraw_mob) if(slot_head) - head = W + head = I if((head.flags & BLOCKHAIR) || (head.flags & BLOCKHEADHAIR)) update_hair(redraw_mob) //rebuild hair update_fhair(redraw_mob) update_head_accessory(redraw_mob) // paper + bandanas - if(istype(W, /obj/item/clothing/head)) - var/obj/item/clothing/head/hat = W - if(hat.vision_flags || hat.darkness_view || hat.helmet_goggles_invis_view) + if(istype(I, /obj/item/clothing/head)) + var/obj/item/clothing/head/hat = I + if(hat.vision_flags || hat.see_in_dark || !isnull(hat.lighting_alpha)) update_sight() - head_update(W) + head_update(I) update_inv_head(redraw_mob) if(slot_shoes) - shoes = W + shoes = I update_inv_shoes(redraw_mob) if(slot_wear_suit) - wear_suit = W + wear_suit = I update_inv_wear_suit(redraw_mob) if(slot_w_uniform) - w_uniform = W + w_uniform = I update_inv_w_uniform(redraw_mob) if(slot_l_store) - l_store = W + l_store = I update_inv_pockets(redraw_mob) if(slot_r_store) - r_store = W + r_store = I update_inv_pockets(redraw_mob) if(slot_s_store) - s_store = W + s_store = I update_inv_s_store(redraw_mob) if(slot_in_backpack) - if(get_active_hand() == W) - unEquip(W) - W.loc = back + if(get_active_hand() == I) + unEquip(I) + I.forceMove(back) if(slot_tie) var/obj/item/clothing/under/uniform = src.w_uniform - uniform.attackby(W,src) + uniform.attackby(I, src) else to_chat(src, "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!") - return /mob/living/carbon/human/put_in_hands(obj/item/W) if(!W) return 0 @@ -419,56 +413,34 @@ /mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = 0) switch(dna.species.handle_can_equip(I, slot, disable_warning, src)) - if(1) return 1 - if(2) return 0 //if it returns 2, it wants no normal handling - + if(1) return TRUE + if(2) return FALSE //if it returns 2, it wants no normal handling + if(!has_organ_for_slot(slot)) + return FALSE + if(istype(I, /obj/item/clothing/under) || istype(I, /obj/item/clothing/suit)) if(FAT in mutations) //testing("[M] TOO FAT TO WEAR [src]!") if(!(I.flags_size & ONESIZEFITSALL)) if(!disable_warning) to_chat(src, "You're too fat to wear the [I].") - return 0 + return FALSE switch(slot) if(slot_l_hand) - if(l_hand) - return 0 - return 1 + return !l_hand && !incapacitated() if(slot_r_hand) - if(r_hand) - return 0 - return 1 + return !r_hand && !incapacitated() if(slot_wear_mask) - if(wear_mask) - return 0 - if(!(I.slot_flags & SLOT_MASK)) - return 0 - return 1 + return !wear_mask && (I.slot_flags & SLOT_MASK) if(slot_back) - if(back) - return 0 - if(!(I.slot_flags & SLOT_BACK)) - return 0 - return 1 + return !back && (I.slot_flags & SLOT_BACK) if(slot_wear_suit) - if(wear_suit) - return 0 - if(!(I.slot_flags & SLOT_OCLOTHING)) - return 0 - return 1 + return !wear_suit && (I.slot_flags & SLOT_OCLOTHING) if(slot_gloves) - if(gloves) - return 0 - if(!(I.slot_flags & SLOT_GLOVES)) - return 0 - return 1 + return !gloves && (I.slot_flags & SLOT_GLOVES) if(slot_shoes) - if(shoes) - return 0 - if(!(I.slot_flags & SLOT_FEET)) - return 0 - return 1 + return !shoes && (I.slot_flags & SLOT_FEET) if(slot_belt) if(belt) return 0 @@ -480,39 +452,15 @@ return return 1 if(slot_glasses) - if(glasses) - return 0 - if(!(I.slot_flags & SLOT_EYES)) - return 0 - return 1 + return !glasses && (I.slot_flags & SLOT_EYES) if(slot_head) - if(head) - return 0 - if(!(I.slot_flags & SLOT_HEAD)) - return 0 - return 1 + return !head && (I.slot_flags & SLOT_HEAD) if(slot_l_ear) - if(l_ear) - return 0 - if(!(I.slot_flags & SLOT_EARS)) - return 0 - if((I.slot_flags & SLOT_TWOEARS) && r_ear ) - return 0 - return 1 + return !l_ear && (I.slot_flags & SLOT_EARS) && !((I.slot_flags & SLOT_TWOEARS) && r_ear) if(slot_r_ear) - if(r_ear) - return 0 - if(!(I.slot_flags & SLOT_EARS)) - return 0 - if((I.slot_flags & SLOT_TWOEARS) && l_ear) - return 0 - return 1 + return !r_ear && (I.slot_flags & SLOT_EARS) && !((I.slot_flags & SLOT_TWOEARS) && l_ear) if(slot_w_uniform) - if(w_uniform) - return 0 - if(!(I.slot_flags & SLOT_ICLOTHING)) - return 0 - return 1 + return !w_uniform && (I.slot_flags & SLOT_ICLOTHING) if(slot_wear_id) if(wear_id) return 0 @@ -581,17 +529,9 @@ return 1 return 0 if(slot_handcuffed) - if(handcuffed) - return 0 - if(!istype(I, /obj/item/restraints/handcuffs)) - return 0 - return 1 + return !handcuffed && istype(I, /obj/item/restraints/handcuffs) if(slot_legcuffed) - if(legcuffed) - return 0 - if(!istype(I, /obj/item/restraints/legcuffs)) - return 0 - return 1 + return !legcuffed && istype(I, /obj/item/restraints/legcuffs) if(slot_in_backpack) if(back && istype(back, /obj/item/storage/backpack)) var/obj/item/storage/backpack/B = back diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 8d0261528ed..d6c667b1b74 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -10,10 +10,8 @@ update_mutations() check_mutations=0 - handle_shock() handle_pain() handle_heartbeat() - handle_heartattack() handle_drunk() dna.species.handle_life(src) @@ -39,6 +37,34 @@ if(life_tick == 1) regenerate_icons() // Make sure the inventory updates + handle_ghosted() + handle_ssd() + +/mob/living/carbon/human/proc/handle_ghosted() + if(player_ghosted > 0 && stat == CONSCIOUS && job && !restrained()) + if(key) + player_ghosted = 0 + else + player_ghosted++ + if(player_ghosted % 150 == 0) + force_cryo_human(src) + +/mob/living/carbon/human/proc/handle_ssd() + if(player_logged > 0 && stat != DEAD && job) + player_logged++ + if(istype(loc, /obj/machinery/cryopod)) + return + if(config.auto_cryo_ssd_mins && (player_logged >= (config.auto_cryo_ssd_mins * 30)) && player_logged % 30 == 0) + var/turf/T = get_turf(src) + if(!is_station_level(T.z)) + return + var/area/A = get_area(src) + if(cryo_ssd(src)) + var/obj/effect/portal/P = new /obj/effect/portal(T, null, null, 40) + P.name = "NT SSD Teleportation Portal" + if(A.fast_despawn) + force_cryo_human(src) + /mob/living/carbon/human/calculate_affecting_pressure(var/pressure) ..() var/pressure_difference = abs( pressure - ONE_ATMOSPHERE ) @@ -141,15 +167,6 @@ if(3) emote("drool") - if(getBrainLoss() >= 100 && stat != DEAD) //you lapse into a coma and die without immediate aid; RIP. -Fox - Weaken(20) - AdjustLoseBreath(10) - AdjustSilence(2) - - if(getBrainLoss() >= 120 && stat != DEAD) //they died from stupidity--literally. -Fox - visible_message("[src] goes limp, [p_their()] facial expression utterly blank.") - death() - /mob/living/carbon/human/handle_mutations_and_radiation() for(var/datum/dna/gene/gene in dna_genes) if(!gene.block) @@ -242,12 +259,10 @@ var/obj/item/organ/internal/L = get_organ_slot("lungs") if(!L || L && (L.status & ORGAN_DEAD)) - if(health >= config.health_threshold_crit) + if(health >= HEALTH_THRESHOLD_CRIT) adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1) else if(!(NOCRITDAMAGE in dna.species.species_traits)) - adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) - - failed_last_breath = TRUE + adjustOxyLoss(HUMAN_MAX_OXYLOSS) if(dna.species) var/datum/species/S = dna.species @@ -270,7 +285,7 @@ // USED IN DEATHWHISPERS /mob/living/carbon/human/proc/isInCrit() // Health is in deep shit and we're not already dead - return health <= 0 && stat != 2 + return health <= HEALTH_THRESHOLD_CRIT && stat != DEAD /mob/living/carbon/human/get_breath_from_internal(volume_needed) //making this call the parent would be far too complicated @@ -405,7 +420,7 @@ if(on_fire) var/thermal_protection = get_thermal_protection() - if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) + if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) return if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT) bodytemperature += 11 @@ -791,6 +806,69 @@ handle_organs() + if(getBrainLoss() >= 120 || (health + (getOxyLoss() / 2)) <= -500) + death() + return + + if(getBrainLoss() >= 100) // braindeath + AdjustLoseBreath(10, bound_lower = 0, bound_upper = 25) + Weaken(30) + + if(!check_death_method()) + if(health <= HEALTH_THRESHOLD_DEAD) + var/deathchance = min(99, ((getBrainLoss() * -5) + (health + (getOxyLoss() / 2))) * -0.01) + if(prob(deathchance)) + death() + return + + if(health <= HEALTH_THRESHOLD_CRIT) + if(prob(5)) + emote(pick("faint", "collapse", "cry", "moan", "gasp", "shudder", "shiver")) + AdjustStuttering(5, bound_lower = 0, bound_upper = 5) + EyeBlurry(5) + if(prob(7)) + AdjustConfused(2) + if(prob(5)) + Paralyse(2) + switch(health) + if(-INFINITY to -100) + adjustOxyLoss(1) + if(prob(health * -0.1)) + if(ishuman(src)) + var/mob/living/carbon/human/H = src + H.set_heartattack(TRUE) + if(prob(health * -0.2)) + var/datum/disease/D = new /datum/disease/critical/heart_failure + ForceContractDisease(D) + Paralyse(5) + if(-99 to -80) + adjustOxyLoss(1) + if(prob(4)) + to_chat(src, "Your chest hurts...") + Paralyse(2) + var/datum/disease/D = new /datum/disease/critical/heart_failure + ForceContractDisease(D) + if(-79 to -50) + adjustOxyLoss(1) + if(prob(10)) + var/datum/disease/D = new /datum/disease/critical/shock + ForceContractDisease(D) + if(prob(health * -0.08)) + var/datum/disease/D = new /datum/disease/critical/heart_failure + ForceContractDisease(D) + if(prob(6)) + to_chat(src, "You feel [pick("horrible pain", "awful", "like shit", "absolutely awful", "like death", "like you are dying", "nothing", "warm", "sweaty", "tingly", "really, really bad", "horrible")]!") + Weaken(3) + if(prob(3)) + Paralyse(2) + if(-49 to 0) + adjustOxyLoss(1) + if(prob(3)) + var/datum/disease/D = new /datum/disease/critical/shock + ForceContractDisease(D) + if(prob(5)) + to_chat(src, "You feel [pick("terrible", "awful", "like shit", "sick", "numb", "cold", "sweaty", "tingly", "horrible")]!") + Weaken(3) else //dead SetSilence(0) @@ -944,12 +1022,12 @@ if(prob(2)) var/obj/item/clothing/mask/M = H.wear_mask if(M && (M.flags_cover & MASKCOVERSMOUTH)) - return + continue if(NO_BREATHE in H.dna.species.species_traits) - return //no puking if you can't smell! + continue //no puking if you can't smell! // Humans can lack a mind datum, y'know if(H.mind && (H.mind.assigned_role == "Detective" || H.mind.assigned_role == "Coroner")) - return //too cool for puke + continue //too cool for puke to_chat(H, "You smell something foul...") H.fakevomit() @@ -962,7 +1040,7 @@ return if(H.is_robotic()) //Handle robotic hearts specially with a wuuuubb. This also applies to machine-people. - if(shock_stage >= 10 || istype(get_turf(src), /turf/space)) + if(isinspace()) //PULSE_THREADY - maximum value for pulse, currently it 5. //High pulse value corresponds to a fast rate of heartbeat. //Divided by 2, otherwise it is too slow. @@ -980,7 +1058,7 @@ if(pulse == PULSE_NONE) return - if(pulse >= PULSE_2FAST || shock_stage >= 10 || istype(get_turf(src), /turf/space)) + if(pulse >= PULSE_2FAST || isinspace()) //PULSE_THREADY - maximum value for pulse, currently it 5. //High pulse value corresponds to a fast rate of heartbeat. //Divided by 2, otherwise it is too slow. @@ -999,7 +1077,7 @@ */ /mob/living/carbon/human/proc/can_heartattack() - if(NO_BLOOD in dna.species.species_traits) + if((NO_BLOOD in dna.species.species_traits) && !dna.species.forced_heartattack) return FALSE if(NO_INTORGANS in dna.species.species_traits) return FALSE @@ -1026,13 +1104,16 @@ heart.beating = !status -/mob/living/carbon/human/proc/handle_heartattack() +/mob/living/carbon/human/handle_heartattack() if(!can_heartattack() || !undergoing_cardiac_arrest() || reagents.has_reagent("corazone")) return - AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3) - adjustOxyLoss(5) - Paralyse(4) - adjustBruteLoss(2) + if(getOxyLoss()) + adjustBrainLoss(3) + else if(prob(10)) + adjustBrainLoss(1) + Weaken(5) + AdjustLoseBreath(20, bound_lower = 0, bound_upper = 25) + adjustOxyLoss(20) diff --git a/code/modules/mob/living/carbon/human/logout.dm b/code/modules/mob/living/carbon/human/logout.dm index c7e76343c38..2dae7ea5b9a 100644 --- a/code/modules/mob/living/carbon/human/logout.dm +++ b/code/modules/mob/living/carbon/human/logout.dm @@ -1,4 +1,4 @@ /mob/living/carbon/human/Logout() ..() - if(mind.active && stat != DEAD) + if(mind && mind.active && stat != DEAD) overlays += image('icons/effects/effects.dmi', icon_state = "zzz_glow") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index ff8083f8093..2f181d77077 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -62,27 +62,38 @@ return ..() /mob/living/carbon/human/proc/HasVoiceChanger() - if(istype(back,/obj/item/rig)) + if(istype(back, /obj/item/rig)) var/obj/item/rig/rig = back if(rig.speech && rig.speech.voice_holder && rig.speech.voice_holder.active && rig.speech.voice_holder.voice) return rig.speech.voice_holder.voice - for(var/obj/item/gear in list(wear_mask,wear_suit,head)) + for(var/obj/item/gear in list(wear_mask, wear_suit, head)) if(!gear) continue + var/obj/item/voice_changer/changer = locate() in gear - if(changer && changer.active && changer.voice) - return changer.voice - return 0 + if(changer && changer.active) + if(changer.voice) + return changer.voice + else if(wear_id) + var/obj/item/card/id/idcard = wear_id.GetID() + if(istype(idcard)) + return idcard.registered_name + + return FALSE /mob/living/carbon/human/GetVoice() var/has_changer = HasVoiceChanger() + if(has_changer) return has_changer + if(mind && mind.changeling && mind.changeling.mimicing) return mind.changeling.mimicing + if(GetSpecialVoice()) return GetSpecialVoice() + return real_name /mob/living/carbon/human/IsVocal() @@ -91,7 +102,7 @@ var/obj/item/organ/internal/L = get_organ_slot("lungs") if((breathes && !L) || breathes && L && (L.status & ORGAN_DEAD)) return FALSE - if(oxyloss > 10 || losebreath >= 4) + if(getOxyLoss() > 10 || losebreath >= 4) emote("gasp") return FALSE if(mind) @@ -124,7 +135,6 @@ span = mind.speech_span if((COMIC in mutations) \ || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs) \ - || istype(get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown) \ || GetComponent(/datum/component/jestosterone)) span = "sans" diff --git a/code/modules/mob/living/carbon/human/shock.dm b/code/modules/mob/living/carbon/human/shock.dm deleted file mode 100644 index e2d5dd79cec..00000000000 --- a/code/modules/mob/living/carbon/human/shock.dm +++ /dev/null @@ -1,75 +0,0 @@ -/mob/living/carbon/human/var/traumatic_shock = 0 -/mob/living/carbon/human/var/shock_stage = 0 - -// proc to find out in how much pain the mob is at the moment -/mob/living/carbon/human/proc/updateshock() - traumatic_shock = getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss() - - // broken or ripped off organs will add quite a bit of pain - for(var/thing in bodyparts) - var/obj/item/organ/external/BP = thing - if(BP.status & ORGAN_BROKEN && !(BP.status & ORGAN_SPLINTED) || BP.open) - traumatic_shock += 15 - - if(reagents) - for(var/datum/reagent/R in reagents.reagent_list) - if(R.shock_reduction) - traumatic_shock = max(0, traumatic_shock - R.shock_reduction) // now you too can varedit cyanide to reduce shock by 1000 - Iamgoofball - if(drunk) - traumatic_shock = max(0, traumatic_shock - 10) - - return traumatic_shock - -/mob/living/carbon/human/proc/handle_shock() - if(status_flags & GODMODE) //godmode - return - if(NO_PAIN in dna.species.species_traits) - return - - updateshock() - - if(health <= config.health_threshold_softcrit)// health 0 makes you immediately collapse - shock_stage = max(shock_stage, 61) - - if(traumatic_shock >= 100) - shock_stage += 1 - else - shock_stage = min(shock_stage, 160) - shock_stage = max(shock_stage-1, 0) - return - - if(shock_stage == 10) - to_chat(src, ""+pick("It hurts so much!", "You really need some painkillers..", "Dear god, the pain!")) - - if(shock_stage >= 30) - if(shock_stage == 30) - custom_emote(1,"is having trouble keeping [p_their()] eyes open.") - EyeBlurry(2) - Stuttering(5) - - if(shock_stage == 40) - to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) - - if(shock_stage >=60) - if(shock_stage == 60) - custom_emote(1,"falls limp.") - if(prob(2)) - to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) - Weaken(20) - - if(shock_stage >= 80) - if(prob(5)) - to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) - Weaken(20) - - if(shock_stage >= 120) - if(prob(2)) - to_chat(src, ""+pick("You black out!", "You feel like you could die any moment now.", "You're about to lose consciousness.")) - Paralyse(5) - - if(shock_stage == 150) - custom_emote(1,"can no longer stand, collapsing!") - Weaken(20) - - if(shock_stage >= 150) - Weaken(20) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 1335c8e2d57..438d3386948 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -39,8 +39,6 @@ var/siemens_coeff = 1 //base electrocution coefficient - var/invis_sight = SEE_INVISIBLE_LIVING - var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure. var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning. var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning. @@ -80,7 +78,7 @@ var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods var/blood_color = "#A10808" //Red. - var/flesh_color = "#FFC896" //Pink. + var/flesh_color = "#d1aa2e" //Gold. var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs var/remains_type = /obj/effect/decal/remains/human //What sort of remains is left behind when the species dusts var/base_color //Used when setting species. @@ -91,6 +89,8 @@ var/is_small var/show_ssd = 1 + var/forced_heartattack = FALSE //Some species have blood, but we still want them to have heart attacks + var/dies_at_threshold = FALSE // Do they die or get knocked out at specific thresholds, or do they go through complex crit? var/can_revive_by_healing // Determines whether or not this species can be revived by simply healing them var/has_gender = TRUE var/blacklisted = FALSE @@ -255,8 +255,6 @@ . += (health_deficiency / 75) else . += (health_deficiency / 25) - if(H.shock_stage >= 10) - . += 3 . += 2 * H.stance_damage //damaged/missing feet or legs is slow if((hungry >= 70) && !flight) @@ -298,11 +296,8 @@ // (Slime People changing color based on the reagents they consume) /datum/species/proc/handle_life(mob/living/carbon/human/H) if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations)) - H.setOxyLoss(0) - H.SetLoseBreath(0) - var/takes_crit_damage = (!(NOCRITDAMAGE in species_traits)) - if((H.health <= config.health_threshold_crit) && takes_crit_damage) + if((H.health <= HEALTH_THRESHOLD_CRIT) && takes_crit_damage) H.adjustBruteLoss(1) return @@ -312,17 +307,20 @@ /datum/species/proc/handle_death(mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns). return +/datum/species/proc/spec_electrocute_act(mob/living/carbon/human/H, shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE) + return + /datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) if(attacker_style && attacker_style.help_act(user, target))//adminfu only... return TRUE - if(target.health >= config.health_threshold_crit && !(target.status_flags & FAKEDEATH)) + if(target.health >= HEALTH_THRESHOLD_CRIT && !(target.status_flags & FAKEDEATH)) target.help_shake_act(user) return TRUE else user.do_cpr(target) /datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) - if(target.check_block()) //cqc + if(target.check_block()) target.visible_message("[target] blocks [user]'s grab attempt!") return FALSE if(attacker_style && attacker_style.grab_act(user, target)) @@ -333,25 +331,22 @@ /datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) //Vampire code - if(user.mind && user.mind.vampire && (user.mind in ticker.mode.vampires) && !user.mind.vampire.draining && user.zone_sel && user.zone_sel.selecting == "head" && target != user) + if(user.mind && user.mind.vampire && (user.mind in SSticker.mode.vampires) && !user.mind.vampire.draining && user.zone_sel && user.zone_sel.selecting == "head" && target != user) if((NO_BLOOD in target.dna.species.species_traits) || target.dna.species.exotic_blood || !target.blood_volume) to_chat(user, "They have no blood!") return - if(target.mind && target.mind.vampire && (target.mind in ticker.mode.vampires)) + if(target.mind && target.mind.vampire && (target.mind in SSticker.mode.vampires)) to_chat(user, "Your fangs fail to pierce [target.name]'s cold flesh") return 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") return //end vampire codes - if(target.check_block()) //cqc + if(target.check_block()) target.visible_message("[target] blocks [user]'s attack!") return FALSE if(attacker_style && attacker_style.harm_act(user, target)) @@ -396,7 +391,7 @@ SEND_SIGNAL(target, COMSIG_PARENT_ATTACKBY) /datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) - if(target.check_block()) //cqc + if(target.check_block()) target.visible_message("[target] blocks [user]'s disarm attempt!") return FALSE if(attacker_style && attacker_style.disarm_act(user, target)) @@ -524,6 +519,7 @@ miss_sound = 'sound/weapons/slashmiss.ogg' sharp = TRUE animation_type = ATTACK_EFFECT_CLAW + var/has_been_sharpened = FALSE /datum/unarmed_attack/bite attack_verb = list("chomp") @@ -539,7 +535,7 @@ return FALSE /datum/species/proc/get_perceived_trauma(mob/living/carbon/human/H) - return 100 - ((NO_PAIN in species_traits) ? 0 : H.traumatic_shock) - H.getStaminaLoss() + return H.health - H.getStaminaLoss() /datum/species/proc/handle_hud_icons(mob/living/carbon/human/H) if(!H.client) @@ -604,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 @@ -629,22 +642,19 @@ It'll return null if the organ doesn't correspond, so include null checks when u return null return has_organ[organ_slot] -/datum/species/proc/get_resultant_darksight(mob/living/carbon/human/H) //Returns default value of 2 if the mob doesn't have eyes, otherwise it grabs the eyes darksight. - var/resultant_darksight = 2 - var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes) - if(eyes) - resultant_darksight = eyes.get_dark_view() - return resultant_darksight - /datum/species/proc/update_sight(mob/living/carbon/human/H) H.sight = initial(H.sight) - H.see_in_dark = get_resultant_darksight(H) - H.see_invisible = invis_sight - if(H.see_in_dark > 2) //Preliminary see_invisible handling as per set_species() in code\modules\mob\living\carbon\human\human.dm. - H.see_invisible = SEE_INVISIBLE_LEVEL_ONE + var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes) + if(eyes) + H.sight |= eyes.vision_flags + H.see_in_dark = eyes.see_in_dark + H.see_invisible = eyes.see_invisible + H.lighting_alpha = eyes.lighting_alpha else - H.see_invisible = SEE_INVISIBLE_LIVING + H.see_in_dark = initial(H.see_in_dark) + H.see_invisible = initial(H.see_invisible) + H.lighting_alpha = initial(H.lighting_alpha) if(H.client && H.client.eye != H) var/atom/A = H.client.eye @@ -655,39 +665,43 @@ It'll return null if the organ doesn't correspond, so include null checks when u if(H.mind.vampire.get_ability(/datum/vampire_passive/full)) H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS H.see_in_dark = 8 - H.see_invisible = SEE_INVISIBLE_MINIMUM + H.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE else if(H.mind.vampire.get_ability(/datum/vampire_passive/vision)) H.sight |= SEE_MOBS + H.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE for(var/obj/item/organ/internal/cyberimp/eyes/E in H.internal_organs) H.sight |= E.vision_flags - if(E.dark_view) - H.see_in_dark = E.dark_view + if(E.see_in_dark) + H.see_in_dark = max(H.see_in_dark, E.see_in_dark) if(E.see_invisible) H.see_invisible = min(H.see_invisible, E.see_invisible) + if(E.lighting_alpha) + H.lighting_alpha = min(H.lighting_alpha, E.lighting_alpha) - var/lesser_darkview_bonus = INFINITY // my glasses, I can't see without my glasses if(H.glasses) var/obj/item/clothing/glasses/G = H.glasses H.sight |= G.vision_flags - lesser_darkview_bonus = G.darkness_view + H.see_in_dark = max(G.see_in_dark, H.see_in_dark) + if(G.invis_override) H.see_invisible = G.invis_override else H.see_invisible = min(G.invis_view, H.see_invisible) + if(!isnull(G.lighting_alpha)) + H.lighting_alpha = min(G.lighting_alpha, H.lighting_alpha) + // better living through hat trading if(H.head) if(istype(H.head, /obj/item/clothing/head)) var/obj/item/clothing/head/hat = H.head H.sight |= hat.vision_flags + H.see_in_dark = max(hat.see_in_dark, H.see_in_dark) - if(hat.darkness_view) // Pick the lowest of the two darkness_views between the glasses and helmet. - lesser_darkview_bonus = min(hat.darkness_view,lesser_darkview_bonus) - - if(hat.helmet_goggles_invis_view) - H.see_invisible = min(hat.helmet_goggles_invis_view, H.see_invisible) + if(!isnull(hat.lighting_alpha)) + H.lighting_alpha = min(hat.lighting_alpha, H.lighting_alpha) if(istype(H.back, /obj/item/rig)) ///aghhh so snowflakey var/obj/item/rig/rig = H.back @@ -696,29 +710,29 @@ It'll return null if the organ doesn't correspond, so include null checks when u if(rig.visor && rig.visor.vision && rig.visor.active && rig.visor.vision.glasses) var/obj/item/clothing/glasses/G = rig.visor.vision.glasses if(istype(G)) - H.see_in_dark = (G.darkness_view ? G.darkness_view : get_resultant_darksight(H)) // Otherwise we keep our darkness view with togglable nightvision. - if(G.vision_flags) // MESONS - H.sight |= G.vision_flags - + H.sight |= G.vision_flags + H.see_in_dark = max(G.see_in_dark, H.see_in_dark) H.see_invisible = min(G.invis_view, H.see_invisible) - if(lesser_darkview_bonus != INFINITY) - H.see_in_dark = max(lesser_darkview_bonus, H.see_in_dark) + if(!isnull(G.lighting_alpha)) + H.lighting_alpha = min(G.lighting_alpha, H.lighting_alpha) if(H.vision_type) - H.see_in_dark = max(H.see_in_dark, H.vision_type.see_in_dark, get_resultant_darksight(H)) - H.see_invisible = H.vision_type.see_invisible - if(H.vision_type.light_sensitive) - H.weakeyes = 1 H.sight |= H.vision_type.sight_flags + H.see_in_dark = max(H.see_in_dark, H.vision_type.see_in_dark) + + if(!isnull(H.vision_type.lighting_alpha)) + H.lighting_alpha = min(H.vision_type.lighting_alpha, H.lighting_alpha) + + if(H.vision_type.light_sensitive) + H.weakeyes = TRUE if(XRAY in H.mutations) H.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) - if(H.see_override) //Override all - H.see_invisible = H.see_override + H.sync_lighting_plane_alpha() -/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source) +/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source, method = TOUCH) if(abs(temperature - M.bodytemperature) > 10) //If our water and mob temperature varies by more than 10K, cool or/ heat them appropriately M.bodytemperature = (temperature + M.bodytemperature) * 0.5 //Approximation for gradual heating or cooling diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm index cf1492e8408..64c5a4aa0b3 100644 --- a/code/modules/mob/living/carbon/human/species/abductor.dm +++ b/code/modules/mob/living/carbon/human/species/abductor.dm @@ -16,8 +16,7 @@ ) species_traits = list(NO_BLOOD, NO_BREATHE, VIRUSIMMUNE, NOGUNS, NO_EXAMINE) - - oxy_mod = 0 + dies_at_threshold = TRUE clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_OMNI diff --git a/code/modules/mob/living/carbon/human/species/diona.dm b/code/modules/mob/living/carbon/human/species/diona.dm index 82def809a4b..bccbeb6c5a7 100644 --- a/code/modules/mob/living/carbon/human/species/diona.dm +++ b/code/modules/mob/living/carbon/human/species/diona.dm @@ -32,6 +32,7 @@ water and other radiation." species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN) + dies_at_threshold = TRUE clothing_flags = HAS_SOCKS default_hair_colour = "#000000" has_gender = FALSE @@ -39,8 +40,6 @@ taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE skinned_type = /obj/item/stack/sheet/wood - oxy_mod = 0 - body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not blood_color = "#004400" flesh_color = "#907E4A" diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index 032af8ea3b9..c1e416a8a48 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -6,10 +6,10 @@ deform = 'icons/mob/human_races/r_golem.dmi' species_traits = list(NO_BREATHE, NO_BLOOD, NO_PAIN, RADIMMUNE, VIRUSIMMUNE, NOGUNS) + dies_at_threshold = TRUE brute_mod = 0.45 //55% damage reduction burn_mod = 0.45 tox_mod = 0.45 - oxy_mod = 0 dietflags = DIET_OMNI //golems can eat anything because they are magic or something reagent_tag = PROCESS_ORG @@ -163,6 +163,8 @@ if(H.bodytemperature > 850 && H.on_fire && prob(25)) explosion(get_turf(H), 1, 2, 4, flame_range = 5) + msg_admin_attack("Plasma Golem ([H.name]) exploded with radius 1, 2, 4 (flame_range: 5) at ([H.x],[H.y],[H.z]). User Ckey: [key_name_admin(H)]", ATKLOG_FEW) + log_game("Plasma Golem ([H.name]) exploded with radius 1, 2, 4 (flame_range: 5) at ([H.x],[H.y],[H.z]). User Ckey: [key_name_admin(H)]", ATKLOG_FEW) if(H) H.gib() if(H.fire_stacks < 2) //flammable @@ -533,23 +535,26 @@ check_flags = AB_CHECK_CONSCIOUS button_icon_state = "blink" icon_icon = 'icons/mob/actions/actions.dmi' + var/activated = FALSE // To prevent spamming var/cooldown = 150 var/last_teleport = 0 var/tele_range = 6 /datum/action/innate/unstable_teleport/IsAvailable() if(..()) - if(world.time > last_teleport + cooldown) + if(world.time > last_teleport + cooldown && !activated) return 1 return 0 /datum/action/innate/unstable_teleport/Activate() + activated = TRUE var/mob/living/carbon/human/H = owner H.visible_message("[H] starts vibrating!", "You start charging your bluespace core...") playsound(get_turf(H), 'sound/weapons/flash.ogg', 25, 1) addtimer(CALLBACK(src, .proc/teleport, H), 15) /datum/action/innate/unstable_teleport/proc/teleport(mob/living/carbon/human/H) + activated = FALSE H.visible_message("[H] teleports!", "You teleport!") var/list/turfs = new/list() for(var/turf/T in orange(tele_range, H)) @@ -602,7 +607,6 @@ ..() last_banana = world.time last_honk = world.time - H.job = "Clown" H.mutations.Add(COMIC) H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(H), slot_r_store) H.equip_to_slot_or_del(new /obj/item/bikehorn(H), slot_l_store) @@ -677,7 +681,6 @@ /datum/species/golem/tranquillite/on_species_gain(mob/living/carbon/human/H) ..() - H.job = "Mime" H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head) H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_r_store) H.equip_to_slot_or_del(new /obj/item/cane(H), slot_l_hand) diff --git a/code/modules/mob/living/carbon/human/species/grey.dm b/code/modules/mob/living/carbon/human/species/grey.dm index e5492e60293..3b8bbe34ffb 100644 --- a/code/modules/mob/living/carbon/human/species/grey.dm +++ b/code/modules/mob/living/carbon/human/species/grey.dm @@ -27,6 +27,7 @@ dietflags = DIET_HERB has_gender = FALSE reagent_tag = PROCESS_ORG + flesh_color = "#a598ad" blood_color = "#A200FF" /datum/species/grey/handle_dna(mob/living/carbon/human/H, remove) @@ -35,10 +36,38 @@ genemutcheck(H, REMOTETALKBLOCK, null, MUTCHK_FORCED) H.dna.default_blocks.Add(REMOTETALKBLOCK) -/datum/species/grey/water_act(mob/living/carbon/human/H, volume, temperature, source) - ..() - H.take_organ_damage(5, min(volume, 20)) - H.emote("scream") +/datum/species/grey/water_act(mob/living/carbon/human/H, volume, temperature, source, method = TOUCH) + . = ..() + + if(method == TOUCH) + if(volume > 25) + if(H.wear_mask) + to_chat(H, "Your [H.wear_mask] protects you from the acid!") + return + + if(H.head) + to_chat(H, "Your [H.wear_mask] protects you from the acid!") + return + + if(prob(75)) + H.take_organ_damage(5, 10) + H.emote("scream") + var/obj/item/organ/external/affecting = H.get_organ("head") + if(affecting) + affecting.disfigure() + else + H.take_organ_damage(5, 10) + else + H.take_organ_damage(5, 10) + else + to_chat(H, "The water stings[volume < 10 ? " you, but isn't concentrated enough to harm you" : null]!") + if(volume >= 10) + H.adjustFireLoss(min(max(4, (volume - 10) * 2), 20)) + H.emote("scream") + to_chat(H, "The water stings[volume < 10 ? " you, but isn't concentrated enough to harm you" : null]!") + if(volume >= 10) + H.adjustFireLoss(min(max(4, (volume - 10) * 2), 20)) + H.emote("scream") /datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H) var/translator_pref = H.client.prefs.speciesprefs @@ -56,6 +85,9 @@ /datum/species/grey/handle_reagents(mob/living/carbon/human/H, datum/reagent/R) if(R.id == "sacid") - H.reagents.del_reagent(R.id) - return 0 + H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM) + return FALSE + if(R.id == "water") + H.adjustFireLoss(1) + return TRUE return ..() diff --git a/code/modules/mob/living/carbon/human/species/kidan.dm b/code/modules/mob/living/carbon/human/species/kidan.dm index a1d2fb6624d..538b524d4d8 100644 --- a/code/modules/mob/living/carbon/human/species/kidan.dm +++ b/code/modules/mob/living/carbon/human/species/kidan.dm @@ -13,6 +13,7 @@ bodyflags = HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS eyes = "kidan_eyes_s" dietflags = DIET_HERB + flesh_color = "#ba7814" blood_color = "#FB9800" reagent_tag = PROCESS_ORG //Default styles for created mobs. diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm index 88ed0a626cb..4f5a65c82a2 100644 --- a/code/modules/mob/living/carbon/human/species/machine.dm +++ b/code/modules/mob/living/carbon/human/species/machine.dm @@ -19,7 +19,6 @@ burn_mod = 2.28 // So they take 50% extra damage from brute/burn overall tox_mod = 0 clone_mod = 0 - oxy_mod = 0 death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..." species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_INTORGANS, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) @@ -36,6 +35,7 @@ //Default styles for created mobs. default_hair = "Blue IPC Screen" + dies_at_threshold = TRUE can_revive_by_healing = 1 has_gender = FALSE reagent_tag = PROCESS_SYN diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index cac42a29cd2..7eedf2520a3 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -59,6 +59,8 @@ genemutcheck(H, MONKEYBLOCK, null, MUTCHK_FORCED) /datum/species/monkey/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user) + if(!user.has_organ_for_slot(slot)) + return 2 switch(slot) if(slot_l_hand) if(user.l_hand) diff --git a/code/modules/mob/living/carbon/human/species/nucleation.dm b/code/modules/mob/living/carbon/human/species/nucleation.dm index 21d8a5c0012..fe8a5587017 100644 --- a/code/modules/mob/living/carbon/human/species/nucleation.dm +++ b/code/modules/mob/living/carbon/human/species/nucleation.dm @@ -13,8 +13,8 @@ language = "Sol Common" burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores brute_mod = 2 // damn, double wham, double dam - oxy_mod = 0 species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_BLOOD, NO_PAIN, NO_SCAN, RADIMMUNE) + dies_at_threshold = TRUE dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet //Default styles for created mobs. diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index a8fd532a3f1..785d737aec2 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -7,6 +7,7 @@ //language = "Clatter" species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING) + forced_heartattack = TRUE // Plasmamen have no blood, but they should still get heart-attacks skinned_type = /obj/item/stack/sheet/mineral/plasma // We're low on plasma, R&D! *eyes plasmaman co-worker intently* dietflags = DIET_OMNI reagent_tag = PROCESS_ORG @@ -40,6 +41,7 @@ ) speciesbox = /obj/item/storage/box/survival_plasmaman + flesh_color = "#8b3fba" /datum/species/plasmaman/say_filter(mob/M, message, datum/language/speaking) if(copytext(message, 1, 2) != "*") @@ -128,8 +130,8 @@ suit=/obj/item/clothing/suit/space/eva/plasmaman/cargo helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/cargo if("Shaft Miner") - suit=/obj/item/clothing/suit/space/eva/plasmaman/miner - helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/miner + suit=/obj/item/clothing/suit/space/eva/plasmaman/explorer + helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer if("Botanist") suit=/obj/item/clothing/suit/space/eva/plasmaman/botanist helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/botanist @@ -187,6 +189,6 @@ H.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER) H.adjustPlasma(20) H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM) - return 0 //Handling reagent removal on our own. Prevents plasma from dealing toxin damage to Plasmamen. + return FALSE //Handling reagent removal on our own. Prevents plasma from dealing toxin damage to Plasmamen. return ..() diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index df1ecd61484..fb7fd2ebda1 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -18,8 +18,7 @@ ) species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE) - - oxy_mod = 0 + dies_at_threshold = TRUE dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race reagent_tag = PROCESS_ORG diff --git a/code/modules/mob/living/carbon/human/species/shadowling.dm b/code/modules/mob/living/carbon/human/species/shadowling.dm index 1ce7b5cd0e0..f65aedb530b 100644 --- a/code/modules/mob/living/carbon/human/species/shadowling.dm +++ b/code/modules/mob/living/carbon/human/species/shadowling.dm @@ -11,7 +11,6 @@ species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS, NO_EXAMINE) //Can't use guns due to muzzle flash burn_mod = 1.5 //1.5x burn damage, 2x is excessive - oxy_mod = 0 heatmod = 1.5 silent_steps = 1 @@ -63,7 +62,6 @@ species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NO_EXAMINE) burn_mod = 1.1 - oxy_mod = 0 heatmod = 1.1 /datum/species/shadow/ling/lesser/handle_life(mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm index 6a2b74fb671..0199722d1f4 100644 --- a/code/modules/mob/living/carbon/human/species/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/skeleton.dm @@ -11,10 +11,9 @@ flesh_color = "#E6E6C6" species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE) + dies_at_threshold = TRUE skinned_type = /obj/item/stack/sheet/bone - oxy_mod = 0 - dietflags = DIET_OMNI reagent_tag = PROCESS_ORG @@ -42,7 +41,7 @@ /datum/species/skeleton/handle_reagents(mob/living/carbon/human/H, datum/reagent/R) // Crazylemon is still silly if(R.id == "milk") - H.heal_overall_damage(4,4) + H.heal_overall_damage(4, 4) if(prob(5)) // 5% chance per proc to find a random limb, and mend it var/list/our_organs = H.bodyparts.Copy() shuffle(our_organs) @@ -55,7 +54,7 @@ L.perma_injury = 0 break // We're only checking one limb here, bucko if(prob(3)) - H.say(pick("Thanks Mr Skeltal", "Thank for strong bones", "Doot doot!")) - return 1 + H.say(pick("Thanks Mr. Skeltal", "Thank for strong bones", "Doot doot!")) + return TRUE return ..() diff --git a/code/modules/mob/living/carbon/human/species/slime.dm b/code/modules/mob/living/carbon/human/species/slime.dm index 5631f600afc..37b38de361c 100644 --- a/code/modules/mob/living/carbon/human/species/slime.dm +++ b/code/modules/mob/living/carbon/human/species/slime.dm @@ -20,18 +20,19 @@ cold_level_3 = 200 coldmod = 3 - oxy_mod = 0 brain_mod = 2.5 male_cough_sounds = list('sound/effects/slime_squish.ogg') female_cough_sounds = list('sound/effects/slime_squish.ogg') species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_INTORGANS, NO_SCAN) + dies_at_threshold = TRUE clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR | NO_EYES dietflags = DIET_CARN reagent_tag = PROCESS_ORG + flesh_color = "#5fe8b1" blood_color = "#0064C8" exotic_blood = "water" blood_damage_type = TOX @@ -83,7 +84,7 @@ H.update_body() ..() -/datum/species/slime/can_hear() // fucking snowflakes +/datum/species/slime/can_hear() // fucking snowflakes . = TRUE /datum/action/innate/slimecolor diff --git a/code/modules/mob/living/carbon/human/species/tajaran.dm b/code/modules/mob/living/carbon/human/species/tajaran.dm index 2b0c65aa821..6c8c2312e17 100644 --- a/code/modules/mob/living/carbon/human/species/tajaran.dm +++ b/code/modules/mob/living/carbon/human/species/tajaran.dm @@ -31,7 +31,7 @@ taste_sensitivity = TASTE_SENSITIVITY_SHARP reagent_tag = PROCESS_ORG - flesh_color = "#AFA59E" + flesh_color = "#b5a69b" base_color = "#424242" butt_sprite = "tajaran" diff --git a/code/modules/mob/living/carbon/human/species/unathi.dm b/code/modules/mob/living/carbon/human/species/unathi.dm index f255091a7d6..6146f00fa6f 100644 --- a/code/modules/mob/living/carbon/human/species/unathi.dm +++ b/code/modules/mob/living/carbon/human/species/unathi.dm @@ -102,7 +102,18 @@ to_chat(user, "You run out of momentum!") return - - /datum/species/unathi/handle_death(mob/living/carbon/human/H) H.stop_tail_wagging(1) + +/datum/species/unathi/ashwalker + name = "Ash Walker" + name_plural = "Ash Walkers" + + blurb = "These reptillian creatures appear to be related to the Unathi, but seem significantly less evolved. \ + They roam the wastes of Lavaland, worshipping a dead city and capturing unsuspecting miners." + + language = "Sinta'unathi" + default_language = "Sinta'unathi" + + slowdown = -0.80 + species_traits = list(NO_BREATHE, NOGUNS) diff --git a/code/modules/mob/living/carbon/human/species/vox.dm b/code/modules/mob/living/carbon/human/species/vox.dm index bc21dd1ee5f..f8485e8f9e9 100644 --- a/code/modules/mob/living/carbon/human/species/vox.dm +++ b/code/modules/mob/living/carbon/human/species/vox.dm @@ -31,7 +31,7 @@ eyes = "vox_eyes_s" species_traits = list(NO_SCAN, IS_WHITELISTED, NOTRANSSTING) - clothing_flags = HAS_SOCKS + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS //Species-fitted 'em all. dietflags = DIET_OMNI bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS @@ -173,8 +173,9 @@ eyes = "blank_eyes" species_traits = list(NO_SCAN, NO_BLOOD, NO_PAIN, IS_WHITELISTED) + clothing_flags = 0 //IDK if you've ever seen underwear on an Armalis, but it ain't pretty. bodyflags = HAS_TAIL - dietflags = DIET_OMNI //should inherit this from vox, this is here just in case + dies_at_threshold = TRUE blood_color = "#2299FC" flesh_color = "#808D11" diff --git a/code/modules/mob/living/carbon/human/species/wryn.dm b/code/modules/mob/living/carbon/human/species/wryn.dm index 8c576f9e30e..6069da28f84 100644 --- a/code/modules/mob/living/carbon/human/species/wryn.dm +++ b/code/modules/mob/living/carbon/human/species/wryn.dm @@ -39,7 +39,7 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too - oxy_mod = 0 + dies_at_threshold = TRUE reagent_tag = PROCESS_ORG base_color = "#704300" diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index e7a65129017..30653023751 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -1,3 +1,9 @@ +/mob/living/carbon/human/SetLoseBreath(amount) + if(NO_BREATHE in dna.species.species_traits) + losebreath = 0 + return FALSE + . = ..() + /mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0) if(dna.species) amount = amount * dna.species.stun_mod diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index ff93cd54b80..73a76e00420 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -254,17 +254,20 @@ var/global/list/damage_icon_parts = list() if(underwear && dna.species.clothing_flags & HAS_UNDERWEAR) var/datum/sprite_accessory/underwear/U = GLOB.underwear_list[underwear] if(U) - underwear_standing.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY) + var/u_icon = U.sprite_sheets && (dna.species.name in U.sprite_sheets) ? U.sprite_sheets[dna.species.name] : U.icon //Species-fit the undergarment. + underwear_standing.Blend(new /icon(u_icon, "uw_[U.icon_state]_s"), ICON_OVERLAY) if(undershirt && dna.species.clothing_flags & HAS_UNDERSHIRT) var/datum/sprite_accessory/undershirt/U2 = GLOB.undershirt_list[undershirt] if(U2) - underwear_standing.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY) + var/u2_icon = U2.sprite_sheets && (dna.species.name in U2.sprite_sheets) ? U2.sprite_sheets[dna.species.name] : U2.icon + underwear_standing.Blend(new /icon(u2_icon, "us_[U2.icon_state]_s"), ICON_OVERLAY) if(socks && dna.species.clothing_flags & HAS_SOCKS) var/datum/sprite_accessory/socks/U3 = GLOB.socks_list[socks] if(U3) - underwear_standing.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY) + var/u3_icon = U3.sprite_sheets && (dna.species.name in U3.sprite_sheets) ? U3.sprite_sheets[dna.species.name] : U3.icon + underwear_standing.Blend(new /icon(u3_icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY) if(underwear_standing) overlays_standing[UNDERWEAR_LAYER] = mutable_appearance(underwear_standing, layer = -UNDERWEAR_LAYER) @@ -594,7 +597,7 @@ var/global/list/damage_icon_parts = list() client.screen -= thing // WHAT THE FUCKING FUCK BAY GODDAMNIT // **I FUCKING HATE YOU AAAAAAAAAA** if(thing) // - thing.loc = loc // + thing.forceMove(drop_location()) // thing.dropped(src) // thing.layer = initial(thing.layer) thing.plane = initial(thing.plane) @@ -656,6 +659,7 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_inv_glasses(var/update_icons=1) remove_overlay(GLASSES_LAYER) remove_overlay(GLASSES_OVER_LAYER) + remove_overlay(OVER_MASK_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_glasses] @@ -678,7 +682,12 @@ var/global/list/damage_icon_parts = list() new_glasses = mutable_appearance('icons/mob/eyes.dmi', "[glasses.icon_state]", layer = -GLASSES_LAYER) var/datum/sprite_accessory/hair/hair_style = GLOB.hair_styles_full_list[head_organ.h_style] - if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value. + var/obj/item/clothing/glasses/G = glasses + if(istype(G) && G.over_mask) //If the user's used the 'wear over mask' verb on the glasses. + new_glasses.layer = -OVER_MASK_LAYER + overlays_standing[OVER_MASK_LAYER] = new_glasses + apply_overlay(OVER_MASK_LAYER) + else if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value. new_glasses.layer = -GLASSES_OVER_LAYER overlays_standing[GLASSES_OVER_LAYER] = new_glasses apply_overlay(GLASSES_OVER_LAYER) @@ -1214,7 +1223,7 @@ var/global/list/damage_icon_parts = list() //Adds a collar overlay above the helmet layer if the suit has one // Suit needs an identically named sprite in icons/mob/collar.dmi -// For suits with species_fit and sprite_sheets, an identically named sprite needs to exist in a file like this icons/mob/species/[species_name_here]/collar.dmi. +// For suits with sprite_sheets, an identically named sprite needs to exist in a file like this icons/mob/species/[species_name_here]/collar.dmi. /mob/living/carbon/human/proc/update_collar(var/update_icons=1) remove_overlay(COLLAR_LAYER) var/icon/C = new('icons/mob/collar.dmi') diff --git a/code/modules/mob/living/carbon/human/update_stat.dm b/code/modules/mob/living/carbon/human/update_stat.dm index d8c26a91964..6228038c710 100644 --- a/code/modules/mob/living/carbon/human/update_stat.dm +++ b/code/modules/mob/living/carbon/human/update_stat.dm @@ -2,20 +2,11 @@ if(status_flags & GODMODE) return ..(reason) - if(stat != DEAD) - switch(getBrainLoss()) - if(100 to 120) - Weaken(20) - create_debug_log("collapsed from brain damage, trigger reason: [reason]") - if(120 to INFINITY) - visible_message("[src] goes limp, [p_their()] facial expression utterly blank.") - death() - create_debug_log("died of brain damage, trigger reason: [reason]") - else + if(stat == DEAD) if(dna.species && dna.species.can_revive_by_healing) var/obj/item/organ/internal/brain/B = get_int_organ(/obj/item/organ/internal/brain) if(B) - if((health >= (config.health_threshold_dead + config.health_threshold_crit) * 0.5) && getBrainLoss()<120) + if((health >= (HEALTH_THRESHOLD_DEAD + HEALTH_THRESHOLD_CRIT) * 0.5) && getBrainLoss() < 120) update_revive() create_debug_log("revived from healing, trigger reason: [reason]") @@ -30,4 +21,7 @@ /mob/living/carbon/human/can_hear() . = TRUE // Fallback if we don't have a species if(dna.species) - . = dna.species.can_hear(src) \ No newline at end of file + . = dna.species.can_hear(src) + +/mob/living/carbon/human/check_death_method() + return dna.species.dies_at_threshold \ No newline at end of file diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 18e42c98d08..c5cbbc0b1d3 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -27,8 +27,8 @@ //Start of a breath chain, calls breathe() /mob/living/carbon/handle_breathing(times_fired) - if(times_fired % 4 == 2 || failed_last_breath) - breathe() //Breathe per 4 ticks, unless suffocating + if(times_fired % 2 == 1) + breathe() //Breathe every other tick, unless suffocating else if(istype(loc, /obj/)) var/obj/location_as_object = loc @@ -47,13 +47,13 @@ var/datum/gas_mixture/breath - if(health <= config.health_threshold_crit) + if(health <= HEALTH_THRESHOLD_CRIT && check_death_method()) AdjustLoseBreath(1) //Suffocate if(losebreath > 0) AdjustLoseBreath(-1) - if(prob(10)) + if(prob(75)) emote("gasp") if(istype(loc, /obj/)) var/obj/loc_as_obj = loc @@ -97,7 +97,6 @@ //CRIT if(!breath || (breath.total_moles() == 0) || !lungs) adjustOxyLoss(1) - failed_last_breath = TRUE throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) return FALSE @@ -121,15 +120,12 @@ if(O2_partialpressure > 0) var/ratio = 1 - O2_partialpressure/safe_oxy_min adjustOxyLoss(min(5*ratio, 3)) - failed_last_breath = TRUE oxygen_used = breath.oxygen*ratio else adjustOxyLoss(3) - failed_last_breath = TRUE throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) else //Enough oxygen - failed_last_breath = FALSE adjustOxyLoss(-5) oxygen_used = breath.oxygen clear_alert("not_enough_oxy") @@ -336,7 +332,7 @@ break //Only count the first bedsheet if(drunk) comfort += 1 //Aren't naps SO much better when drunk? - AdjustDrunk(1-0.0015*comfort) //reduce drunkenness ~6% per two seconds, when on floor. + AdjustDrunk(-0.2*comfort) //reduce drunkenness while sleeping. if(comfort > 1 && prob(3))//You don't heal if you're just sleeping on the floor without a blanket. adjustBruteLoss(-1*comfort) adjustFireLoss(-1*comfort) @@ -347,36 +343,6 @@ Sleeping(2) return sleeping -/mob/living/carbon/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - return - - see_invisible = initial(see_invisible) - see_in_dark = initial(see_in_dark) - sight = initial(sight) - - if(XRAY in mutations) - grant_xray_vision() - - if(client.eye != src) - var/atom/A = client.eye - if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. - return - - for(var/obj/item/organ/internal/cyberimp/eyes/E in internal_organs) - sight |= E.vision_flags - if(E.dark_view) - see_in_dark = max(see_in_dark,E.dark_view) - if(E.see_invisible) - see_invisible = min(see_invisible, E.see_invisible) - - if(see_override) - see_invisible = see_override - - /mob/living/carbon/handle_hud_icons() return @@ -406,35 +372,54 @@ handle_hud_icons_health_overlay() /mob/living/carbon/proc/handle_hud_icons_health_overlay() - if(stat == UNCONSCIOUS && health <= config.health_threshold_crit) - var/severity = 0 - switch(health) - if(-20 to -10) severity = 1 - if(-30 to -20) severity = 2 - if(-40 to -30) severity = 3 - if(-50 to -40) severity = 4 - if(-60 to -50) severity = 5 - if(-70 to -60) severity = 6 - if(-80 to -70) severity = 7 - if(-90 to -80) severity = 8 - if(-95 to -90) severity = 9 - if(-INFINITY to -95) severity = 10 - overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity) - else if(stat == CONSCIOUS) - clear_fullscreen("crit") - if(oxyloss) + if(stat == UNCONSCIOUS && health <= HEALTH_THRESHOLD_CRIT) + if(check_death_method()) var/severity = 0 - switch(oxyloss) - if(10 to 20) severity = 1 - if(20 to 25) severity = 2 - if(25 to 30) severity = 3 - if(30 to 35) severity = 4 - if(35 to 40) severity = 5 - if(40 to 45) severity = 6 - if(45 to INFINITY) severity = 7 - overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity) - else - clear_fullscreen("oxy") + switch(health) + if(-20 to -10) + severity = 1 + if(-30 to -20) + severity = 2 + if(-40 to -30) + severity = 3 + if(-50 to -40) + severity = 4 + if(-60 to -50) + severity = 5 + if(-70 to -60) + severity = 6 + if(-80 to -70) + severity = 7 + if(-90 to -80) + severity = 8 + if(-95 to -90) + severity = 9 + if(-INFINITY to -95) + severity = 10 + overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity) + else if(stat == CONSCIOUS) + if(check_death_method()) + clear_fullscreen("crit") + if(getOxyLoss()) + var/severity = 0 + switch(getOxyLoss()) + if(10 to 20) + severity = 1 + if(20 to 25) + severity = 2 + if(25 to 30) + severity = 3 + if(30 to 35) + severity = 4 + if(35 to 40) + severity = 5 + if(40 to 45) + severity = 6 + if(45 to INFINITY) + severity = 7 + overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity) + else + clear_fullscreen("oxy") //Fire and Brute damage overlay (BSSR) var/hurtdamage = getBruteLoss() + getFireLoss() + damageoverlaytemp @@ -450,4 +435,4 @@ if(85 to INFINITY) severity = 6 overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) else - clear_fullscreen("brute") + clear_fullscreen("brute") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm index a07f1ba3b2e..c938ac17214 100644 --- a/code/modules/mob/living/carbon/slime/emote.dm +++ b/code/modules/mob/living/carbon/slime/emote.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/slime/emote(act, m_type = 1, message = null) +/mob/living/carbon/slime/emote(act, m_type = 1, message = null, force) if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) //param = copytext(act, t1 + 1, length(act) + 1) diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index 649ec7b3f00..e3bfcb74431 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -174,11 +174,11 @@ else health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - if(health < config.health_threshold_dead && stat != 2) + if(health < HEALTH_THRESHOLD_DEAD && check_death_method() && stat != DEAD) death() return - else if(src.health <= config.health_threshold_crit) + else if(src.health <= HEALTH_THRESHOLD_CRIT && check_death_method()) if(!src.reagents.has_reagent("epinephrine")) src.adjustOxyLoss(10) diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm index 23918680197..40f9060ee63 100644 --- a/code/modules/mob/living/carbon/slime/powers.dm +++ b/code/modules/mob/living/carbon/slime/powers.dm @@ -47,7 +47,7 @@ /mob/living/carbon/slime/proc/Feedon(var/mob/living/M) Victim = M - src.loc = M.loc + forceMove(M.loc) canmove = 0 anchored = 1 var/lastnut = nutrition @@ -64,7 +64,7 @@ canmove = 0 if(Adjacent(Victim)) - loc = M.loc + forceMove(M.loc) if(iscarbon(Victim)) Victim.adjustCloneLoss(rand(5,6)) @@ -163,7 +163,7 @@ /mob/living/carbon/slime/proc/UpdateFeed(var/mob/M) if(Victim) if(Victim == M) - loc = M.loc // simple "attach to head" effect! + forceMove(M.loc) // simple "attach to head" effect! /mob/living/carbon/slime/verb/Evolve() diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 914c810da27..38dadbbbfa7 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -146,6 +146,44 @@ stat(null,"Power Level: [powerlevel]") +/mob/living/carbon/slime/updatehealth(reason) + . = ..() + update_health_hud() + +/mob/living/carbon/slime/proc/update_health_hud() + if(hud_used) + var/severity = 0 + var/healthpercent = (health/maxHealth) * 100 + if(stat != DEAD) + switch(healthpercent) + if(100 to INFINITY) + healths.icon_state = "slime_health0" + if(80 to 100) + healths.icon_state = "slime_health1" + severity = 1 + if(60 to 80) + healths.icon_state = "slime_health2" + severity = 2 + if(40 to 60) + healths.icon_state = "slime_health3" + severity = 3 + if(20 to 40) + healths.icon_state = "slime_health4" + severity = 4 + if(0 to 20) + healths.icon_state = "slime_health5" + severity = 5 + if(-199 to 0) + healths.icon_state = "slime_health6" + severity = 6 + else + healths.icon_state = "slime_health7" + severity = 6 + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") + /mob/living/carbon/slime/adjustFireLoss(amount) ..(-abs(amount)) // Heals them return diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm index 4e04090b649..62935713a80 100644 --- a/code/modules/mob/living/carbon/superheroes.dm +++ b/code/modules/mob/living/carbon/superheroes.dm @@ -50,11 +50,11 @@ if(class == "Superhero") W.assignment = "Superhero" W.rank = "Superhero" - ticker.mode.superheroes += H.mind + SSticker.mode.superheroes += H.mind else if(class == "Supervillain") W.assignment = "Supervillain" W.rank = "Supervillain" - ticker.mode.supervillains += H.mind + SSticker.mode.supervillains += H.mind W.icon_state = "lifetimeid" W.SetOwnerInfo(H) W.UpdateName() @@ -157,7 +157,7 @@ /obj/effect/proc_holder/spell/targeted/recruit/cast(list/targets,mob/living/user = usr) for(var/mob/living/carbon/human/target in targets) var/obj/item/organ/external/head/head_organ = target.get_organ("head") - if(ticker.mode.greyshirts.len >= 3) + if(SSticker.mode.greyshirts.len >= 3) to_chat(user, "You have already recruited the maximum number of henchmen.") if(!in_range(user, target)) to_chat(user, "You need to be closer to enthrall [target].") @@ -218,7 +218,7 @@ to_chat(target, "You have decided to enroll as a henchman for [user]. You are now part of the feared 'Greyshirts'.") to_chat(target, "You must follow the orders of [user], and help [user.p_them()] succeed in [user.p_their()] dastardly schemes.") to_chat(target, "You may not harm other Greyshirt or [user]. However, you do not need to obey other Greyshirts.") - ticker.mode.greyshirts += target.mind + SSticker.mode.greyshirts += target.mind target.set_species(/datum/species/human) head_organ.h_style = "Bald" head_organ.f_style = "Shaved" diff --git a/code/modules/mob/living/carbon/update_status.dm b/code/modules/mob/living/carbon/update_status.dm index 22030c78f4b..58c6e09764b 100644 --- a/code/modules/mob/living/carbon/update_status.dm +++ b/code/modules/mob/living/carbon/update_status.dm @@ -3,12 +3,12 @@ return if(stat != DEAD) // if(health <= min_health) - if(health <= config.health_threshold_dead) + if(health <= HEALTH_THRESHOLD_DEAD && check_death_method()) death() create_debug_log("died of damage, trigger reason: [reason]") return // if(paralysis || sleeping || getOxyLoss() > low_oxy_ko || (status_flags & FAKEDEATH) || health <= crit_health) - if(paralysis || sleeping || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= config.health_threshold_crit) + if(paralysis || sleeping || (check_death_method() && getOxyLoss() > 50) || (status_flags & FAKEDEATH) || health <= HEALTH_THRESHOLD_CRIT && check_death_method()) if(stat == CONSCIOUS) KnockOut() create_debug_log("fell unconscious, trigger reason: [reason]") @@ -21,7 +21,7 @@ ..() if(staminaloss) var/total_health = (health - staminaloss) - if(total_health <= config.health_threshold_softcrit && !stat) + if(total_health <= HEALTH_THRESHOLD_CRIT && !stat) to_chat(src, "You're too exhausted to keep going...") Weaken(5) setStaminaLoss(health - 2) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 734dd556b48..afca9ad8798 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -104,11 +104,11 @@ /mob/living/proc/getBruteLoss() return bruteloss -/mob/living/proc/adjustBruteLoss(var/amount, updating_health = TRUE) +/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) return FALSE //godmode var/old_bruteloss = bruteloss - bruteloss = min(max(bruteloss + amount, 0),(maxHealth*2)) + bruteloss = max(bruteloss + amount, 0) if(old_bruteloss == bruteloss) updating_health = FALSE . = STATUS_UPDATE_NONE @@ -120,11 +120,15 @@ /mob/living/proc/getOxyLoss() return oxyloss -/mob/living/proc/adjustOxyLoss(var/amount, updating_health = TRUE) +/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) + oxyloss = 0 return FALSE //godmode + if(BREATHLESS in mutations) + oxyloss = 0 + return FALSE var/old_oxyloss = oxyloss - oxyloss = min(max(oxyloss + amount, 0),(maxHealth*2)) + oxyloss = max(oxyloss + amount, 0) if(old_oxyloss == oxyloss) updating_health = FALSE . = STATUS_UPDATE_NONE @@ -135,7 +139,11 @@ /mob/living/proc/setOxyLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) + oxyloss = 0 return FALSE //godmode + if(BREATHLESS in mutations) + oxyloss = 0 + return FALSE var/old_oxyloss = oxyloss oxyloss = amount if(old_oxyloss == oxyloss) @@ -149,11 +157,11 @@ /mob/living/proc/getToxLoss() return toxloss -/mob/living/proc/adjustToxLoss(var/amount, updating_health = TRUE) +/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) return FALSE //godmode var/old_toxloss = toxloss - toxloss = min(max(toxloss + amount, 0),(maxHealth*2)) + toxloss = max(toxloss + amount, 0) if(old_toxloss == toxloss) updating_health = FALSE . = STATUS_UPDATE_NONE @@ -162,7 +170,7 @@ if(updating_health) updatehealth("adjustToxLoss") -/mob/living/proc/setToxLoss(var/amount, updating_health = TRUE) +/mob/living/proc/setToxLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) return FALSE //godmode var/old_toxloss = toxloss @@ -178,11 +186,11 @@ /mob/living/proc/getFireLoss() return fireloss -/mob/living/proc/adjustFireLoss(var/amount, updating_health = TRUE) +/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) return FALSE //godmode var/old_fireloss = fireloss - fireloss = min(max(fireloss + amount, 0),(maxHealth*2)) + fireloss = max(fireloss + amount, 0) if(old_fireloss == fireloss) updating_health = FALSE . = STATUS_UPDATE_NONE @@ -194,11 +202,11 @@ /mob/living/proc/getCloneLoss() return cloneloss -/mob/living/proc/adjustCloneLoss(var/amount, updating_health = TRUE) +/mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) return FALSE //godmode var/old_cloneloss = cloneloss - cloneloss = min(max(cloneloss + amount, 0),(maxHealth*2)) + cloneloss = max(cloneloss + amount, 0) if(old_cloneloss == cloneloss) updating_health = FALSE . = STATUS_UPDATE_NONE @@ -207,8 +215,9 @@ if(updating_health) updatehealth("adjustCloneLoss") -/mob/living/proc/setCloneLoss(var/amount, updating_health = TRUE) - if(status_flags & GODMODE) return 0 //godmode +/mob/living/proc/setCloneLoss(amount, updating_health = TRUE) + if(status_flags & GODMODE) + return FALSE //godmode var/old_cloneloss = cloneloss cloneloss = amount if(old_cloneloss == cloneloss) @@ -235,7 +244,7 @@ if(status_flags & GODMODE) return FALSE var/old_stamloss = staminaloss - staminaloss = min(max(staminaloss + amount, 0),(maxHealth*2)) + staminaloss = max(staminaloss + amount, 0) if(old_stamloss == staminaloss) updating = FALSE . = STATUS_UPDATE_NONE @@ -300,4 +309,4 @@ updatehealth("take overall damage") /mob/living/proc/has_organic_damage() - return (maxHealth - health) + return (maxHealth - health) \ No newline at end of file diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 43a811dc3a3..6054068eb15 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -57,9 +57,9 @@ SetLoseBreath(0) if(!gibbed && deathgasp_on_death) - emote("deathgasp") + emote("deathgasp", force = TRUE) - if(suiciding) + if(mind && suiciding) mind.suicided = TRUE clear_fullscreens() update_sight() @@ -69,7 +69,6 @@ med_hud_set_status() if(!gibbed && !QDELETED(src)) addtimer(CALLBACK(src, .proc/med_hud_set_status), (DEFIB_TIME_LIMIT * 10) + 1) - callHook("death", list(src, gibbed)) for(var/s in ownedSoullinks) var/datum/soullink/S = s @@ -89,10 +88,16 @@ mind.store_memory("Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]", 0) GLOB.respawnable_list += src - if(ticker && ticker.mode) - ticker.mode.check_win() + if(SSticker && SSticker.mode) + SSticker.mode.check_win() if(mind && mind.devilinfo) // Expand this into a general-purpose death-response system when appropriate mind.devilinfo.beginResurrectionCheck(src) // u no we dead return TRUE + +/mob/living/proc/delayed_gib() + visible_message("[src] starts convulsing violently!", "You feel as if your body is tearing itself apart!") + Weaken(15) + do_jitter_animation(1000, -1) + addtimer(CALLBACK(src, .proc/gib), rand(20, 100)) \ No newline at end of file diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 66f3eec1683..4909148b492 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -3,11 +3,20 @@ set background = BACKGROUND_ENABLED if(notransform) - return 0 + return FALSE if(!loc) - return 0 + return FALSE var/datum/gas_mixture/environment = loc.return_air() + if(client || registered_z) // This is a temporary error tracker to make sure we've caught everything + var/turf/T = get_turf(src) + if(client && registered_z != T.z) + message_admins("[src] [ADMIN_FLW(src, "FLW")] has somehow ended up in Z-level [T.z] despite being registered in Z-level [registered_z]. If you could ask them how that happened and notify the coders, it would be appreciated.") + log_game("Z-TRACKING: [src] has somehow ended up in Z-level [T.z] despite being registered in Z-level [registered_z].") + update_z(T.z) + else if (!client && registered_z) + log_game("Z-TRACKING: [src] of type [src.type] has a Z-registration despite not having a client.") + update_z(null) if(stat != DEAD) //Chemicals in the body handle_chemicals_in_body() @@ -25,6 +34,10 @@ handle_diseases() + //Heart Attack, if applicable + if(stat != DEAD) + handle_heartattack() + //Handle temperature/pressure differences between body and environment if(environment) handle_environment(environment) @@ -46,16 +59,16 @@ 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 - if(get_nations_mode()) - process_nations() + handle_regular_hud_updates() ..() /mob/living/proc/handle_breathing(times_fired) return +/mob/living/proc/handle_heartattack() + return + /mob/living/proc/handle_mutations_and_radiation() radiation = 0 //so radiation don't accumulate in simple animals return @@ -192,38 +205,19 @@ if(!remote_view && !client.adminobs) reset_perspective(null) -/mob/living/proc/update_sight() - if(stat == DEAD) - grant_death_vision() - return - // Gives a mob the vision of being dead /mob/living/proc/grant_death_vision() sight |= SEE_TURFS sight |= SEE_MOBS sight |= SEE_OBJS + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE see_in_dark = 8 see_invisible = SEE_INVISIBLE_OBSERVER - -// See through walls, dark, etc. -// basically the same as death vision except you can't -// see ghosts -/mob/living/proc/grant_xray_vision() - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO + sync_lighting_plane_alpha() /mob/living/proc/handle_hud_icons() handle_hud_icons_health() return /mob/living/proc/handle_hud_icons_health() - return - -/mob/living/proc/process_nations() - if(client) - var/client/C = client - for(var/mob/living/carbon/human/H in view(src, world.view)) - C.images += H.hud_list[NATIONS_HUD] + return \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index bf933f568d4..57c67f5fd61 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -246,17 +246,20 @@ set hidden = 1 if(InCritical()) create_attack_log("[src] has ["succumbed to death"] with [round(health, 0.1)] points of health!") - adjustOxyLoss(health - config.health_threshold_dead) + adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD) // super check for weird mobs, including ones that adjust hp // we don't want to go overboard and gib them, though for(var/i = 1 to 5) - if(health < config.health_threshold_dead) + if(health < HEALTH_THRESHOLD_DEAD) break - take_overall_damage(max(5, health - config.health_threshold_dead), 0) + take_overall_damage(max(5, health - HEALTH_THRESHOLD_DEAD), 0) + death() to_chat(src, "You have given up life and succumbed to death.") + /mob/living/proc/InCritical() - return (health < 0 && health > -95.0 && stat == UNCONSCIOUS) + return (health < HEALTH_THRESHOLD_CRIT && health > HEALTH_THRESHOLD_DEAD && stat == UNCONSCIOUS) + /mob/living/ex_act(severity) ..() @@ -462,7 +465,6 @@ human_mob = src human_mob.set_heartattack(FALSE) human_mob.restore_blood() - human_mob.shock_stage = 0 human_mob.decaylevel = 0 human_mob.remove_all_embedded_objects() @@ -519,7 +521,6 @@ var/turf/T = loc . = ..() if(.) - SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED) handle_footstep(loc) step_count++ @@ -529,7 +530,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))) @@ -691,7 +692,7 @@ return name /mob/living/update_gravity(has_gravity) - if(!ticker) + if(!SSticker) return if(has_gravity) clear_alert("weightless") @@ -759,7 +760,7 @@ if(!silent) visible_message("[src] tries to put [what] on [who].") if(do_mob(src, who, what.put_on_delay)) - if(what && Adjacent(who)) + if(what && Adjacent(who) && !(what.flags & NODROP)) unEquip(what) who.equip_to_slot_if_possible(what, where, 0, 1) add_attack_logs(src, who, "Equipped [what]") @@ -786,11 +787,11 @@ ..() floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement. -/mob/living/proc/do_jitter_animation(jitteriness) +/mob/living/proc/do_jitter_animation(jitteriness, loop_amount = 6) var/amplitude = min(4, (jitteriness/100) + 1) var/pixel_x_diff = rand(-amplitude, amplitude) var/pixel_y_diff = rand(-amplitude/3, amplitude/3) - animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6) + animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = loop_amount) animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y) , time = 2) floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement. @@ -953,6 +954,27 @@ to_chat(src, "You can taste [english_list(final_taste_list)].") +/mob/living/proc/update_z(new_z) // 1+ to register, null to unregister + if(registered_z != new_z) + if(registered_z) + SSmobs.clients_by_zlevel[registered_z] -= src + if(client) + if(new_z) + SSmobs.clients_by_zlevel[new_z] += src + for (var/I in length(SSidlenpcpool.idle_mobs_by_zlevel[new_z]) to 1 step -1) //Backwards loop because we're removing (guarantees optimal rather than worst-case performance), it's fine to use .len here but doesn't compile on 511 + var/mob/living/simple_animal/SA = SSidlenpcpool.idle_mobs_by_zlevel[new_z][I] + if (SA) + SA.toggle_ai(AI_ON) // Guarantees responsiveness for when appearing right next to mobs + else + SSidlenpcpool.idle_mobs_by_zlevel[new_z] -= SA + registered_z = new_z + else + registered_z = null + +/mob/living/onTransitZ(old_z,new_z) + ..() + update_z(new_z) + /mob/living/proc/owns_soul() if(mind) return mind.soulOwner == mind @@ -992,3 +1014,29 @@ for(var/atom/A in src) if(A.light_range > 0) A.extinguish_light() + +/mob/living/vv_edit_var(var_name, var_value) + switch(var_name) + if("stat") + if((stat == DEAD) && (var_value < DEAD))//Bringing the dead back to life + GLOB.dead_mob_list -= src + GLOB.living_mob_list += src + if((stat < DEAD) && (var_value == DEAD))//Kill he + GLOB.living_mob_list -= src + GLOB.dead_mob_list += src + . = ..() + switch(var_name) + if("weakened") + SetWeakened(var_value) + if("stunned") + SetStunned(var_value) + if("paralysis") + SetParalysis(var_value) + if("sleeping") + SetSleeping(var_value) + if("maxHealth") + updatehealth() + if("resize") + update_transform() + if("lighting_alpha") + sync_lighting_plane_alpha() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 0641ce380f5..f0c3b85ece1 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -55,8 +55,22 @@ /mob/living/proc/check_projectile_dismemberment(obj/item/projectile/P, def_zone) return 0 -/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0) - return 0 //only carbon liveforms have this proc +/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE) + SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage) + if(status_flags & GODMODE) //godmode + return FALSE + if(NO_SHOCK in mutations) //shockproof + return FALSE + if(tesla_shock && tesla_ignore) + return FALSE + if(shock_damage > 0) + if(!illusion) + adjustFireLoss(shock_damage) + visible_message( + "[src] was shocked by \the [source]!", + "You feel a powerful shock coursing through your body!", + "You hear a heavy electrical crack.") + return shock_damage /mob/living/emp_act(severity) var/list/L = src.get_contents() @@ -202,13 +216,9 @@ fire_stacks += L.fire_stacks IgniteMob() -//Mobs on Fire end - -/mob/living/water_act(volume, temperature) - if(volume >= 20) fire_stacks -= 0.5 - if(volume >= 50) fire_stacks -= 1 - - +/mob/living/water_act(volume, temperature, source, method = TOUCH) + . = ..() + adjust_fire_stacks(-(volume * 0.2)) //This is called when the mob is thrown into a dense turf /mob/living/proc/turf_collision(var/turf/T, var/speed) @@ -265,7 +275,7 @@ return G /mob/living/attack_slime(mob/living/carbon/slime/M) - if(!ticker) + if(!SSticker) to_chat(M, "You cannot attack people before the game has started.") return @@ -337,8 +347,4 @@ return TRUE if(INTENT_DISARM) M.do_attack_animation(src, ATTACK_EFFECT_DISARM) - return TRUE - -//defined here, overridden for humans in human_defense. By default, living mobs don't get to block anything -/mob/living/proc/check_block() - return FALSE \ No newline at end of file + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 6e12748911b..837e75738a9 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -33,7 +33,6 @@ var/mob_size = MOB_SIZE_HUMAN var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature.. var/digestion_ratio = 1 //controls how quickly reagents metabolize; largely governered by species attributes. - var/nightvision = 0 var/bloodcrawl = 0 //0 No blood crawling, 1 blood crawling, 2 blood crawling+mob devour var/holder = null //The holder for blood crawling @@ -68,3 +67,5 @@ var/list/status_effects //a list of all status effects the mob has var/deathgasp_on_death = FALSE + + var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index dcc046f7b00..580996e54d9 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -5,6 +5,10 @@ update_stat("mob login") update_sight() + var/turf/T = get_turf(src) + if(isturf(T)) + update_z(T.z) + //If they're SSD, remove it so they can wake back up. player_logged = 0 //Vents @@ -14,9 +18,15 @@ if(ranged_ability) ranged_ability.add_ranged_ability(src, "You currently have [ranged_ability] active!") + //for when action buttons are lost and need to be regained, such as when the mind enters a new mob + var/datum/changeling/changeling = usr.mind.changeling + if(changeling) + for(var/power in changeling.purchasedpowers) + var/datum/action/changeling/S = power + if(istype(S) && S.needs_button) + S.Grant(src) + //Should update regardless of if we can ventcrawl, since we can end up in pipes in other ways. update_pipe_vision() - update_interface() - return . diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm index 87384669a7c..e1c33f89a7e 100644 --- a/code/modules/mob/living/logout.dm +++ b/code/modules/mob/living/logout.dm @@ -1,4 +1,5 @@ /mob/living/Logout() + update_z(null) if(ranged_ability && client) ranged_ability.remove_mousepointer(client) ..() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index cf5fff66caa..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 @@ -275,7 +283,7 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/proc/GetVoice() return name -/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't already snowflaked to shit can call the parent and handle emoting sanely +/mob/living/emote(act, type, message, force) //emote code is terrible, this is so that anything that isn't already snowflaked to shit can call the parent and handle emoting sanely if(client) if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot speak in IC (Muted).") @@ -284,17 +292,20 @@ proc/get_radio_key_from_channel(var/channel) if(stat) return 0 - if(..(act, type, message)) + if(..()) return 1 if(act && type && message) //parent call 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) @@ -306,7 +317,8 @@ proc/get_radio_key_from_channel(var/channel) return 1 else //everything else failed, emote is probably invalid - if(act == "help") return //except help, because help is handled individually + if(act == "help") + return //except help, because help is handled individually to_chat(src, "Unusable emote '[act]'. Say *help for a list.") /mob/living/whisper(message as text) @@ -379,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)) @@ -390,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 5f0397becfe..023c03cd00a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -38,7 +38,7 @@ var/list/ai_verbs_default = list( name = "AI" icon = 'icons/mob/ai.dmi'// icon_state = "ai" - move_resist = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_NORMAL density = 1 status_flags = CANSTUN|CANPARALYSE|CANPUSH mob_size = MOB_SIZE_LARGE @@ -498,7 +498,7 @@ var/list/ai_verbs_default = list( if(check_unable(AI_CHECK_WIRELESS)) return - var/input = input(usr, "Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") as text|null + var/input = clean_input("Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") if(!input || stat) return @@ -534,14 +534,12 @@ var/list/ai_verbs_default = list( if(!isturf(loc)) // if their location isn't a turf return // stop - var/is_anchored = FALSE - if(move_resist == MOVE_FORCE_VERY_STRONG) - move_resist = MOVE_FORCE_VERY_STRONG + if(anchored) + anchored = FALSE else - is_anchored = TRUE - move_resist = MOVE_FORCE_NORMAL + anchored = TRUE - to_chat(src, "[is_anchored ? "You are now anchored." : "You are now unanchored."]") + to_chat(src, "[anchored ? "You are now anchored." : "You are now unanchored."]") /mob/living/silicon/ai/update_canmove() return FALSE @@ -636,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_animal_list + var/mob/living/simple_animal/bot/target = locate(href_list["trackbot"]) in GLOB.bots_list if(target) ai_actual_track(target) else @@ -644,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_animal_list + 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 @@ -652,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_animal_list + Bot = locate(href_list["interface"]) in GLOB.bots_list if(!Bot || Bot.remote_disabled || control_disabled) return Bot.attack_ai(src) @@ -748,7 +746,7 @@ var/list/ai_verbs_default = list( d += "Query network status
" d += "
" dat += "

General Settings

" - dat += "Attack Animations: [(show_ghostitem_attack) ? "Yes" : "No"]
" 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) dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
" dat += "Custom UI settings:
" @@ -448,13 +450,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += " - Color: [UI_style_color]    
" dat += " - UI Style: [UI_style]
" dat += "Deadchat Anonymity: [ghost_anonsay ? "Anonymous" : "Not Anonymous"]
" - if(user.client.donator_level >= DONATOR_LEVEL_ONE) + if(user.client.donator_level > 0) dat += "Donator Publicity: [(toggles & DONATOR_PUBLIC) ? "Public" : "Hidden"]
" dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"]
" - dat += "FPS: [clientfps]
" + dat += "FPS: [clientfps]
" dat += "Ghost Ears: [(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" - dat += "Ghost Sight: [(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "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) @@ -508,10 +511,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/firstcat = 1 for(var/category in loadout_categories) - var/datum/loadout_category/LC = loadout_categories[category] - if(LC.donor_only) - if(user.client.donator_level < DONATOR_LEVEL_TWO) // level two donators get the donator loadout, so don't show it to anyone with less than that - continue if(firstcat) firstcat = 0 else @@ -529,7 +528,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts for(var/gear_name in LC.gear) var/datum/gear/G = LC.gear[gear_name] var/ticked = (G.display_name in gear) - dat += "
[G.display_name]
[G.display_name]
[G.display_name][G.cost]" if(G.allowed_roles) dat += "Restrictions: " @@ -576,7 +578,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts /datum/preferences/proc/SetChoices(mob/user, limit = 13, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790) - if(!job_master) + if(!SSjobs) return //limit - The amount of jobs allowed per column. Defaults to 17 to make it look nice. @@ -597,8 +599,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows. var/datum/job/lastJob - if(!job_master) return - for(var/datum/job/job in job_master.occupations) + if(!SSjobs) + return + for(var/datum/job/job in SSjobs.occupations) if(job.admin_only) continue @@ -802,7 +805,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts return 0 /datum/preferences/proc/UpdateJobPreference(mob/user, role, desiredLvl) - var/datum/job/job = job_master.GetJob(role) + var/datum/job/job = SSjobs.GetJob(role) if(!job) user << browse(null, "window=mob_occupation") @@ -908,7 +911,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts player_alt_titles[job.title] = new_title /datum/preferences/proc/SetJob(mob/user, role) - var/datum/job/job = job_master.GetJob(role) + var/datum/job/job = SSjobs.GetJob(role) if(!job) user << browse(null, "window=mob_occupation") ShowChoices(user) @@ -1146,10 +1149,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(TG.display_name in gear) gear -= TG.display_name else - if(TG.donor_only) - if(user.client.donator_level < DONATOR_LEVEL_TWO) // donator items are locked to > tier 2 - //they normally can't even get this far- but just in case of href exploits, we check them here - return + if(TG.donator_tier && user.client.donator_level < TG.donator_tier) + to_chat(user, "That gear is only available at a higher donation tier than you are on.") + return var/total_cost = 0 var/list/type_blacklist = list() for(var/gear_name in gear) @@ -1261,7 +1263,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("input") switch(href_list["preference"]) if("name") - var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null + var/raw_name = clean_input("Choose your character's name:", "Character Preference", , user) if(!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.) var/new_name = reject_bad_name(raw_name, 1) if(new_name) @@ -1920,22 +1922,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(world.byond_version >= 511 && user.client && user.client.byond_version >= 511) parent.fps = clientfps -/* - if("skin_style") - var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3") - if(!skin_style_name) return -*/ - -/* if("spawnpoint") - var/list/spawnkeys = list() - for(var/S in spawntypes) - spawnkeys += S - var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys - if(!choice || !spawntypes[choice]) - spawnpoint = "Arrivals Shuttle" - return - spawnpoint = choice */ - else switch(href_list["preference"]) if("publicity") @@ -1943,7 +1929,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts toggles ^= MEMBER_PUBLIC if("donor_public") - if(user.client.donator_level >= DONATOR_LEVEL_ONE) + if(user.client.donator_level > 0) toggles ^= DONATOR_PUBLIC if("gender") @@ -1993,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 @@ -2046,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 @@ -2080,6 +2072,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(href_list["tab"]) current_tab = text2num(href_list["tab"]) + if("ambientocclusion") + toggles ^= AMBIENT_OCCLUSION + if(parent && parent.screen && parent.screen.len) + var/obj/screen/plane_master/game_world/PM = locate(/obj/screen/plane_master/game_world) in parent.screen + PM.filters -= FILTER_AMBIENT_OCCLUSION + if(toggles & AMBIENT_OCCLUSION) + PM.filters += FILTER_AMBIENT_OCCLUSION + ShowChoices(user) return 1 @@ -2289,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 6800a63f669..cdbfe2afb2f 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -18,7 +18,9 @@ ghost_anonsay, exp, clientfps, - atklog + atklog, + fuid, + afk_watch FROM [format_table_name("player")] WHERE ckey='[C.ckey]'"} ) @@ -50,12 +52,14 @@ exp = query.item[16] 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)) UI_style = sanitize_inlist(UI_style, list("White", "Midnight"), initial(UI_style)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) - toggles = sanitize_integer(toggles, 0, 524287, initial(toggles)) + toggles = sanitize_integer(toggles, 0, TOGGLES_TOTAL, initial(toggles)) sound = sanitize_integer(sound, 0, 65535, initial(sound)) UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color)) UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha)) @@ -69,6 +73,8 @@ exp = sanitize_text(exp, initial(exp)) 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) @@ -87,7 +93,7 @@ UI_style_alpha='[UI_style_alpha]', be_role='[sanitizeSQL(list2params(be_special))]', default_slot='[default_slot]', - toggles='[toggles]', + toggles='[num2text(toggles, Ceiling(log(10, (TOGGLES_TOTAL))))]', atklog='[atklog]', sound='[sound]', randomslot='[randomslot]', @@ -98,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 2899432501a..e164a2ab843 100644 --- a/code/modules/client/preference/preferences_toggles.dm +++ b/code/modules/client/preference/preferences_toggles.dm @@ -230,4 +230,47 @@ to_chat(usr, "You have disabled karma gains.") else to_chat(usr, "You have enabled karma gains.") + +/client/verb/toggle_popup_limiter() + set name = "Toggle Text Popup Limiter" + set category = "Preferences" + set desc = "Will let you limit the text input popups to one at a time." + prefs.toggles ^= TYPING_ONCE + prefs.save_preferences(src) + if(prefs.toggles & TYPING_ONCE) + 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/chameleon.dm b/code/modules/clothing/chameleon.dm new file mode 100644 index 00000000000..e62fc3c2814 --- /dev/null +++ b/code/modules/clothing/chameleon.dm @@ -0,0 +1,544 @@ +#define EMP_RANDOMISE_TIME 300 + +/datum/action/chameleon_outfit + name = "Select Chameleon Outfit" + button_icon_state = "chameleon_outfit" + var/list/outfit_options //By default, this list is shared between all instances. It is not static because if it were, subtypes would not be able to have their own. If you ever want to edit it, copy it first. + +/datum/action/chameleon_outfit/New() + ..() + initialize_outfits() + +/datum/action/chameleon_outfit/proc/initialize_outfits() + var/static/list/standard_outfit_options + if(!standard_outfit_options) + standard_outfit_options = list() + for(var/path in subtypesof(/datum/outfit/job)) + var/datum/outfit/O = path + standard_outfit_options[initial(O.name)] = path + sortTim(standard_outfit_options, /proc/cmp_text_asc) + outfit_options = standard_outfit_options + +/datum/action/chameleon_outfit/Trigger() + return select_outfit(owner) + +/datum/action/chameleon_outfit/proc/select_outfit(mob/user) + if(!user || !IsAvailable()) + return FALSE + var/selected = input("Select outfit to change into", "Chameleon Outfit") as null|anything in outfit_options + if(!IsAvailable() || QDELETED(src) || QDELETED(user)) + return FALSE + var/outfit_type = outfit_options[selected] + if(!outfit_type) + return FALSE + var/datum/outfit/O = new outfit_type() + var/list/outfit_types = O.get_chameleon_disguise_info() + + for(var/V in user.chameleon_item_actions) + var/datum/action/item_action/chameleon/change/A = V + var/done = FALSE + for(var/T in outfit_types) + for(var/name in A.chameleon_list) + if(A.chameleon_list[name] == T) + A.update_look(user, T) + outfit_types -= T + done = TRUE + break + if(done) + break + //hardsuit helmets/suit hoods + if(ispath(O.suit, /obj/item/clothing/suit/hooded) && ishuman(user)) + var/mob/living/carbon/human/H = user + //make sure they are actually wearing the suit, not just holding it, and that they have a chameleon hat + if(istype(H.wear_suit, /obj/item/clothing/suit/chameleon) && istype(H.head, /obj/item/clothing/head/chameleon)) + var/helmet_type + var/obj/item/clothing/suit/hooded/hooded = O.suit + helmet_type = initial(hooded.hoodtype) + + if(helmet_type) + var/obj/item/clothing/head/chameleon/hat = H.head + hat.chameleon_action.update_look(user, helmet_type) + qdel(O) + return TRUE + + +/datum/action/item_action/chameleon/change + name = "Chameleon Change" + var/list/chameleon_blacklist = list() //This is a typecache + var/list/chameleon_list = list() + var/chameleon_type = null + var/chameleon_name = "Item" + + var/emp_timer + +/datum/action/item_action/chameleon/change/Grant(mob/M) + if(M && (owner != M)) + if(!M.chameleon_item_actions) + M.chameleon_item_actions = list(src) + var/datum/action/chameleon_outfit/O = new /datum/action/chameleon_outfit() + O.Grant(M) + else + M.chameleon_item_actions |= src + ..() + +/datum/action/item_action/chameleon/change/Remove(mob/M) + if(M && (M == owner)) + LAZYREMOVE(M.chameleon_item_actions, src) + if(!LAZYLEN(M.chameleon_item_actions)) + var/datum/action/chameleon_outfit/O = locate(/datum/action/chameleon_outfit) in M.actions + qdel(O) + ..() + +/datum/action/item_action/chameleon/change/proc/initialize_disguises() + if(button) + button.name = "Change [chameleon_name] Appearance" + + chameleon_blacklist |= typecacheof(target.type) + for(var/V in typesof(chameleon_type)) + if(ispath(V) && ispath(V, /obj/item)) + var/obj/item/I = V + if(chameleon_blacklist[V] || (initial(I.flags) & ABSTRACT) || !initial(I.icon_state)) + continue + var/chameleon_item_name = "[initial(I.name)] ([initial(I.icon_state)])" + chameleon_list[chameleon_item_name] = I + +/datum/action/item_action/chameleon/change/proc/select_look(mob/user) + var/obj/item/picked_item + var/picked_name + picked_name = input("Select [chameleon_name] to change into", "Chameleon [chameleon_name]", picked_name) as null|anything in chameleon_list + if(!picked_name) + return + picked_item = chameleon_list[picked_name] + if(!picked_item) + return + update_look(user, picked_item) + +/datum/action/item_action/chameleon/change/proc/random_look(mob/user) + var/picked_name = pick(chameleon_list) + // If a user is provided, then this item is in use, and we + // need to update our icons and stuff + + if(user) + update_look(user, chameleon_list[picked_name]) + + // Otherwise, it's likely a random initialisation, so we + // don't have to worry + + else + update_item(chameleon_list[picked_name]) + +/datum/action/item_action/chameleon/change/proc/update_look(mob/user, obj/item/picked_item) + if(isliving(user)) + var/mob/living/C = user + if(C.stat != CONSCIOUS) + return + + update_item(picked_item) + var/obj/item/thing = target + thing.update_slot_icon() + UpdateButtonIcon() + +/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) + // Species-related variables are lists, which can not be retrieved using initial(). As such, we need to instantiate the picked item. + var/obj/item/P = new picked_item(null) + + target.name = P.name + target.desc = P.desc + target.icon_state = P.icon_state + + if(isitem(target)) + var/obj/item/I = target + + I.item_state = P.item_state + I.item_color = P.item_color + + I.icon_override = P.icon_override + I.sprite_sheets = P.sprite_sheets + + if(istype(I, /obj/item/clothing) && istype(P, /obj/item/clothing)) + var/obj/item/clothing/CL = I + var/obj/item/clothing/PCL = P + CL.flags_cover = PCL.flags_cover + + target.icon = P.icon + qdel(P) + +/datum/action/item_action/chameleon/change/Trigger() + if(!IsAvailable()) + return + + select_look(owner) + return 1 + +/datum/action/item_action/chameleon/change/proc/emp_randomise(var/amount = EMP_RANDOMISE_TIME) + START_PROCESSING(SSprocessing, src) + random_look(owner) + + var/new_value = world.time + amount + if(new_value > emp_timer) + emp_timer = new_value + +/datum/action/item_action/chameleon/change/process() + if(world.time > emp_timer) + STOP_PROCESSING(SSprocessing, src) + return + random_look(owner) + +/obj/item/clothing/under/chameleon + name = "black jumpsuit" + icon_state = "black" + item_state = "bl_suit" + item_color = "black" + desc = "It's a plain jumpsuit. It has a small dial on the wrist." + sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? + random_sensor = FALSE + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/under/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/under + chameleon_action.chameleon_name = "Jumpsuit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/clothing/under/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/under/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/suit/chameleon + name = "armor" + desc = "A slim armored vest that protects against most types of damage." + icon_state = "armor" + item_state = "armor" + blood_overlay_type = "armor" + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/suit/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/suit + chameleon_action.chameleon_name = "Suit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/clothing/suit/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/suit/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/glasses/chameleon + name = "Optical Meson Scanner" + desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." + icon_state = "meson" + item_state = "meson" + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' + ) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/glasses/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/glasses + chameleon_action.chameleon_name = "Glasses" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/glasses/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/glasses/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/glasses/chameleon/thermal + origin_tech = "magnets=3;syndicate=4" + vision_flags = SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + flash_protect = -1 + prescription_upgradable = TRUE + +/obj/item/clothing/glasses/hud/security/chameleon + flash_protect = 1 + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/glasses/hud/security/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/glasses + chameleon_action.chameleon_name = "HUD" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/glasses/hud/security/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/glasses/hud/security/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/gloves/chameleon + desc = "These gloves will protect the wearer from electric shock." + name = "insulated gloves" + icon_state = "yellow" + item_state = "ygloves" + + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/gloves/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/gloves + chameleon_action.chameleon_name = "Gloves" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/clothing/gloves/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/gloves/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/head/chameleon + name = "grey cap" + desc = "It's a baseball hat in a tasteful grey colour." + icon_state = "greysoft" + item_color = "grey" + + resistance_flags = NONE + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi' + ) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/head/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/head + chameleon_action.chameleon_name = "Hat" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/head/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/head/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/mask/chameleon + name = "gas mask" + desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate + icon_state = "gas_alt" + item_state = "gas_alt" + resistance_flags = NONE + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + flags = AIRTIGHT | BLOCK_GAS_SMOKE_EFFECT + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + gas_transfer_coefficient = 0.01 + permeability_coefficient = 0.01 + flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Drask" = 'icons/mob/species/drask/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi' + ) + + var/obj/item/voice_changer/voice_changer + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/mask/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/mask + chameleon_action.chameleon_name = "Mask" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + + voice_changer = new(src) + +/obj/item/clothing/mask/chameleon/Destroy() + QDEL_NULL(voice_changer) + return ..() + +/obj/item/clothing/mask/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/mask/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/shoes/chameleon + name = "black shoes" + icon_state = "black" + item_color = "black" + desc = "A pair of black shoes." + permeability_coefficient = 0.05 + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/shoes/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/shoes + chameleon_action.chameleon_name = "Shoes" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/shoes/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/shoes/chameleon/noslip + name = "black shoes" + icon_state = "black" + item_color = "black" + desc = "A pair of black shoes." + flags = NOSLIP + +/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/backpack/chameleon + name = "backpack" + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/back.dmi' + ) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/backpack/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/backpack + chameleon_action.chameleon_name = "Backpack" + chameleon_action.initialize_disguises() + +/obj/item/storage/backpack/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/storage/backpack/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/belt/chameleon + name = "toolbelt" + desc = "Holds tools." + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/belt/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/belt + chameleon_action.chameleon_name = "Belt" + chameleon_action.initialize_disguises() + +/obj/item/storage/belt/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/storage/belt/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/radio/headset/chameleon + name = "radio headset" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/radio/headset/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/radio/headset + chameleon_action.chameleon_name = "Headset" + chameleon_action.initialize_disguises() + +/obj/item/radio/headset/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/radio/headset/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/pda/chameleon + name = "PDA" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/pda/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/pda + chameleon_action.chameleon_name = "PDA" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/pda/heads), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/pda/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/pda/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/stamp/chameleon + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/stamp/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/stamp + chameleon_action.chameleon_name = "Stamp" + chameleon_action.initialize_disguises() + +/obj/item/stamp/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 484151de797..4bbf68b4b7f 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -151,14 +151,16 @@ slot_flags = SLOT_EYES materials = list(MAT_GLASS = 250) var/vision_flags = 0 - var/darkness_view = 0 //Base human is 2 + var/see_in_dark = 0 //Base human is 2 var/invis_view = SEE_INVISIBLE_LIVING var/invis_override = 0 + var/lighting_alpha var/emagged = 0 var/list/color_view = null//overrides client.color while worn var/prescription = 0 var/prescription_upgradable = 0 + var/over_mask = FALSE //Whether or not the eyewear is rendered above the mask. Purely cosmetic. strip_delay = 20 // but seperated to allow items to protect but not impair vision, like space helmets put_on_delay = 25 burn_state = FIRE_PROOF @@ -173,6 +175,28 @@ SEE_PIXELS// if an object is located on an unlit area, but some of its pixels ar BLIND // can't see anything */ +/obj/item/clothing/glasses/verb/adjust_eyewear() //Adjust eyewear to be worn above or below the mask. + set name = "Adjust Eyewear" + set category = "Object" + set desc = "Adjust your eyewear to be worn over or under a mask." + set src in usr + + var/mob/living/carbon/human/user = usr + if(!istype(user)) + return + if(user.incapacitated()) //Dead spessmen adjust no glasses. Resting/buckled ones do, though + return + + var/action_fluff = "You adjust \the [src]" + if(user.glasses == src) + if(!user.canUnEquip(src)) + to_chat(usr, "[src] is stuck to you!") + return + if(attack_hand(user)) //Remove the glasses for this action. Prevents logic-defying instances where glasses phase through your mask as it ascends/descends to another plane of existence. + action_fluff = "You remove \the [src] and adjust it" + + over_mask = !over_mask + to_chat(user, "[action_fluff] to be worn [over_mask ? "over" : "under"] a mask.") //Gloves /obj/item/clothing/gloves @@ -189,7 +213,7 @@ BLIND // can't see anything var/clipped = 0 strip_delay = 20 put_on_delay = 40 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/gloves.dmi', "Drask" = 'icons/mob/species/drask/gloves.dmi' @@ -281,9 +305,11 @@ BLIND // can't see anything slot_flags = SLOT_HEAD var/blockTracking // Do we block AI tracking? var/HUDType = null - var/darkness_view = 0 - var/helmet_goggles_invis_view = 0 + var/vision_flags = 0 + var/see_in_dark = 0 + var/lighting_alpha + var/can_toggle = null //Mask @@ -378,7 +404,7 @@ BLIND // can't see anything permeability_coefficient = 0.50 slowdown = SHOES_SLOWDOWN - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/shoes.dmi' ) @@ -568,14 +594,16 @@ BLIND // can't see anything permeability_coefficient = 0.90 slot_flags = SLOT_ICLOTHING armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) - species_fit = list("Vox", "Drask", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/uniform.dmi', "Drask" = 'icons/mob/species/drask/uniform.dmi', "Grey" = 'icons/mob/species/grey/uniform.dmi' ) - var/has_sensor = 1//For the crew computer 2 = unable to change mode - var/sensor_mode = 0 + + var/has_sensor = TRUE//For the crew computer 2 = unable to change mode + var/sensor_mode = SENSOR_OFF + var/random_sensor = TRUE /* 1 = Report living/dead 2 = Report detailed damages @@ -587,7 +615,8 @@ BLIND // can't see anything var/basecolor /obj/item/clothing/under/rank/New() - sensor_mode = pick(0,1,2,3) + if(random_sensor) + sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_VITALS, SENSOR_COORDS) ..() /obj/item/clothing/under/Destroy() @@ -596,12 +625,14 @@ BLIND // can't see anything /obj/item/clothing/under/proc/can_attach_accessory(obj/item/clothing/accessory/A) if(istype(A)) - .=1 + . = 1 else return 0 - if(accessories.len && (A.slot in list("utility","armband"))) + if(accessories.len) for(var/obj/item/clothing/accessory/AC in accessories) - if(AC.slot == A.slot) + if((A.slot in list(ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_ARMBAND)) && AC.slot == A.slot) + return 0 + if(!A.allow_duplicates && AC.type == A.type) return 0 /obj/item/clothing/under/attackby(obj/item/I, mob/user, params) @@ -627,38 +658,6 @@ BLIND // can't see anything ..() -/obj/item/clothing/under/attack_hand(mob/user as mob) - //only forward to the attached accessory if the clothing is equipped (not in a storage) - if(accessories.len && src.loc == user) - for(var/obj/item/clothing/accessory/A in accessories) - A.attack_hand(user) - return - - if(ishuman(usr) && src.loc == user) //make it harder to accidentally undress yourself - return - - ..() - -/obj/item/clothing/under/MouseDrop(obj/over_object as obj) - if(ishuman(usr)) - //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away. - if(!(src.loc == usr)) - return - if(!( usr.restrained() ) && !( usr.stat ) && ( over_object )) - if(!usr.canUnEquip(src)) - to_chat(usr, "[src] appears stuck on you!") - return - switch(over_object.name) - if("r_hand") - usr.unEquip(src) - usr.put_in_r_hand(src) - if("l_hand") - usr.unEquip(src) - usr.put_in_l_hand(src) - src.add_fingerprint(usr) - return - return - /obj/item/clothing/under/examine(mob/user) ..(user) switch(src.sensor_mode) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 35c5243de64..0f1aad16814 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -37,9 +37,9 @@ item_state = "glasses" origin_tech = "magnets=1;engineering=2" vision_flags = SEE_TURFS - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE prescription_upgradable = 1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -52,7 +52,8 @@ icon_state = "nvgmeson" item_state = "glasses" origin_tech = "magnets=4;engineering=5;plasmatech=4" - darkness_view = 8 + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE prescription_upgradable = 0 /obj/item/clothing/glasses/meson/prescription @@ -87,7 +88,7 @@ origin_tech = "magnets=2;engineering=1" prescription_upgradable = 0 scan_reagents = 1 //You can see reagents while wearing science goggles - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -103,15 +104,15 @@ desc = "Now you can science in darkness." icon_state = "nvpurple" item_state = "glasses" - darkness_view = 8 - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these /obj/item/clothing/glasses/janitor name = "Janitorial Goggles" desc = "These'll keep the soap out of your eyes." icon_state = "purple" item_state = "glasses" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi' ) @@ -122,9 +123,9 @@ icon_state = "night" item_state = "glasses" origin_tech = "materials=4;magnets=4;plasmatech=4;engineering=4" - darkness_view = 8 - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these - species_fit = list("Vox") + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -136,7 +137,7 @@ desc = "Yarr." icon_state = "eyepatch" item_state = "eyepatch" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -148,7 +149,7 @@ icon_state = "monocle" item_state = "headset" // lol prescription_upgradable = 1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -162,7 +163,7 @@ item_state = "glasses" origin_tech = "magnets=3;engineering=3" vision_flags = SEE_OBJS - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -177,13 +178,22 @@ flags = NODROP flags_cover = null +/obj/item/clothing/glasses/material/lighting + name = "Neutron Goggles" + desc = "These odd glasses use a form of neutron-based imaging to completely negate the effects of light and darkness." + origin_tech = null + vision_flags = 0 + + flags = NODROP + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + /obj/item/clothing/glasses/regular name = "prescription glasses" desc = "Made by Nerd. Co." icon_state = "glasses" item_state = "glasses" prescription = 1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -200,7 +210,7 @@ name = "3D glasses" icon_state = "3d" item_state = "3d" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -211,7 +221,7 @@ desc = "Forest green glasses, like the kind you'd wear when hatching a nasty scheme." icon_state = "gglasses" item_state = "gglasses" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -223,11 +233,11 @@ name = "sunglasses" icon_state = "sun" item_state = "sunglasses" - darkness_view = 1 + see_in_dark = 1 flash_protect = 1 tint = 1 prescription_upgradable = 1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -237,7 +247,7 @@ /obj/item/clothing/glasses/sunglasses/fake desc = "Cheap, plastic sunglasses. They don't even have UV protection." name = "cheap sunglasses" - darkness_view = 0 + see_in_dark = 0 flash_protect = 0 tint = 0 @@ -246,16 +256,16 @@ desc = "Somehow these seem even more out-of-date than normal sunglasses." actions_types = list(/datum/action/item_action/noir) -/obj/item/clothing/glasses/sunglasses/noir/attack_self() - toggle_noir() +/obj/item/clothing/glasses/sunglasses/noir/attack_self(mob/user) + toggle_noir(user) /obj/item/clothing/glasses/sunglasses/noir/item_action_slot_check(slot) if(slot == slot_glasses) return 1 -/obj/item/clothing/glasses/sunglasses/noir/proc/toggle_noir() +/obj/item/clothing/glasses/sunglasses/noir/proc/toggle_noir(mob/user) color_view = color_view ? null : MATRIX_GREYSCALE //Toggles between null and grayscale, with null being the default option. - usr.update_client_colour() + user.update_client_colour() /obj/item/clothing/glasses/sunglasses/yeah name = "agreeable glasses" @@ -285,10 +295,10 @@ name = "sunglasses" icon_state = "sun" item_state = "sunglasses" - darkness_view = 1 + see_in_dark = 1 flash_protect = 1 tint = 1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -314,7 +324,7 @@ actions_types = list(/datum/action/item_action/toggle) flash_protect = 2 tint = 2 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -382,44 +392,26 @@ item_state = "glasses" origin_tech = "magnets=3" vision_flags = SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE flash_protect = -1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' ) - emp_act(severity) - if(istype(src.loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/M = src.loc - to_chat(M, "The Optical Thermal Scanner overloads and blinds you!") - if(M.glasses == src) - M.EyeBlind(3) - M.EyeBlurry(5) - if(!(M.disabilities & NEARSIGHTED)) - M.BecomeNearsighted() - spawn(100) - M.CureNearsighted() - ..() - -/obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete - name = "Optical Meson Scanner" - desc = "Used for seeing walls, floors, and stuff through anything." - icon_state = "meson" - origin_tech = "magnets=3;syndicate=4" - prescription_upgradable = 1 - -/obj/item/clothing/glasses/thermal/syndi/sunglasses - name = "sunglasses" - desc = "Strangely ancient technology used to help provide rudimentary eye cover." - icon_state = "sun" - item_state = "sunglasses" - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Drask" = 'icons/mob/species/drask/eyes.dmi', - "Grey" = 'icons/mob/species/grey/eyes.dmi' - ) +/obj/item/clothing/glasses/thermal/emp_act(severity) + if(istype(src.loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = src.loc + to_chat(M, "The Optical Thermal Scanner overloads and blinds you!") + if(M.glasses == src) + M.EyeBlind(3) + M.EyeBlurry(5) + if(!(M.disabilities & NEARSIGHTED)) + M.BecomeNearsighted() + spawn(100) + M.CureNearsighted() + ..() /obj/item/clothing/glasses/thermal/monocle name = "Thermoncle" @@ -446,68 +438,17 @@ item_state = "eyepatch" flags = NODROP -/obj/item/clothing/glasses/proc/chameleon(var/mob/user) - var/input_glasses = input(user, "Choose a piece of eyewear to disguise as.", "Choose glasses style.") as null|anything in list("Sunglasses", "Medical HUD", "Mesons", "Science Goggles", "Glasses", "Security Sunglasses","Eyepatch","Welding","Gar") - - if(user && src in user.contents) - switch(input_glasses) - if("Sunglasses") - desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes." - name = "sunglasses" - icon_state = "sun" - item_state = "sunglasses" - if("Medical HUD") - name = "Health Scanner HUD" - desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." - icon_state = "healthhud" - item_state = "healthhud" - if("Mesons") - name = "Optical Meson Scanner" - desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." - icon_state = "meson" - item_state = "meson" - if("Science Goggles") - name = "Science Goggles" - desc = "A pair of snazzy goggles used to protect against chemical spills." - icon_state = "purple" - item_state = "glasses" - if("Glasses") - name = "Prescription Glasses" - desc = "Made by Nerd. Co." - icon_state = "glasses" - item_state = "glasses" - if("Security Sunglasses") - name = "HUDSunglasses" - desc = "Sunglasses with a HUD." - icon_state = "sunhud" - item_state = "sunglasses" - if("Eyepatch") - name = "eyepatch" - desc = "Yarr." - icon_state = "eyepatch" - item_state = "eyepatch" - if("Welding") - name = "welding goggles" - desc = "Protects the eyes from welders; approved by the mad scientist association." - icon_state = "welding-g" - item_state = "welding-g" - if("Gar") - desc = "Just who the hell do you think I am?!" - name = "gar glasses" - icon_state = "gar" - item_state = "gar" - /obj/item/clothing/glasses/godeye name = "eye of god" desc = "A strange eye, said to have been torn from an omniscient creature that used to roam the wastes." icon_state = "godeye" item_state = "godeye" vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS - darkness_view = 8 + see_in_dark = 8 scan_reagents = 1 flags = NODROP flags_cover = null - invis_view = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE /obj/item/clothing/glasses/godeye/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, src) && W != src && W.loc == user) @@ -533,6 +474,10 @@ up = 0 tint = 0 + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi' + ) + /obj/item/clothing/glasses/tajblind/eng name = "industrial veil" icon_state = "tajblind_engi" diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index fb4f3736d6c..049710bbe3e 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -31,7 +31,7 @@ icon_state = "healthhud" origin_tech = "magnets=3;biotech=2" HUDType = DATA_HUD_MEDICAL_ADVANCED - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -50,8 +50,8 @@ icon_state = "healthhudnight" item_state = "glasses" origin_tech = "magnets=4;biotech=4;plasmatech=4;engineering=5" - darkness_view = 8 - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE prescription_upgradable = 0 /obj/item/clothing/glasses/hud/diagnostic @@ -60,7 +60,7 @@ icon_state = "diagnostichud" origin_tech = "magnets=2;engineering=2" HUDType = DATA_HUD_DIAGNOSTIC - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -72,8 +72,8 @@ icon_state = "diagnostichudnight" item_state = "glasses" origin_tech = "magnets=4;powerstorage=4;plasmatech=4;engineering=5" - darkness_view = 8 - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE prescription_upgradable = 0 /obj/item/clothing/glasses/hud/security @@ -84,35 +84,28 @@ var/global/list/jobs[0] HUDType = DATA_HUD_SECURITY_ADVANCED var/read_only = FALSE - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' ) -/obj/item/clothing/glasses/hud/security/chameleon - name = "Chameleon Security HUD" - desc = "A stolen security HUD integrated with Syndicate chameleon technology. Toggle to disguise the HUD. Provides flash protection." - flash_protect = 1 - -/obj/item/clothing/glasses/hud/security/chameleon/attack_self(mob/user) - chameleon(user) - /obj/item/clothing/glasses/hud/security/sunglasses/jensenshades name = "augmented shades" desc = "Polarized bioneural eyewear, designed to augment your vision." icon_state = "jensenshades" item_state = "jensenshades" vision_flags = SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE /obj/item/clothing/glasses/hud/security/night name = "\improper Night Vision Security HUD" desc = "An advanced heads-up display which provides id data and vision in complete darkness." icon_state = "securityhudnight" origin_tech = "magnets=4;combat=4;plasmatech=4;engineering=5" - darkness_view = 8 - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these prescription_upgradable = 0 /obj/item/clothing/glasses/hud/security/sunglasses/read_only @@ -123,11 +116,11 @@ desc = "Sunglasses with a HUD." icon_state = "sunhud" origin_tech = "magnets=3;combat=3;engineering=3" - darkness_view = 1 + see_in_dark = 1 flash_protect = 1 tint = 1 prescription_upgradable = 1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -142,7 +135,7 @@ desc = "A heads-up display capable of analyzing the health and status of plants growing in hydro trays and soil." icon_state = "hydroponichud" HUDType = DATA_HUD_HYDROPONIC - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -153,8 +146,8 @@ desc = "A hydroponic HUD fitted with a light amplifier." icon_state = "hydroponichudnight" item_state = "glasses" - darkness_view = 8 - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE prescription_upgradable = 0 /obj/item/clothing/glasses/hud/security/tajblind @@ -166,6 +159,10 @@ actions_types = list(/datum/action/item_action/toggle) up = 0 + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi' + ) + /obj/item/clothing/glasses/hud/security/tajblind/attack_self() toggle_veil() @@ -178,5 +175,9 @@ actions_types = list(/datum/action/item_action/toggle) up = 0 + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi' + ) + /obj/item/clothing/glasses/hud/health/tajblind/attack_self() toggle_veil() diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index f7d8fe3ee38..7a65d579b8e 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -12,6 +12,9 @@ description_antag = "These are a pair of power gloves, and can be used to fire bolts of electricity while standing over powered power cables." var/old_mclick_override var/datum/middleClickOverride/power_gloves/mclick_override = new /datum/middleClickOverride/power_gloves + var/last_shocked = 0 + var/shock_delay = 40 + var/unlimited_power = FALSE // Does this really need explanation? /obj/item/clothing/gloves/color/yellow/power/equipped(mob/user, slot) if(!ishuman(user)) @@ -21,7 +24,10 @@ if(H.middleClickOverride) old_mclick_override = H.middleClickOverride H.middleClickOverride = mclick_override - to_chat(H, "You feel electricity begin to build up in [src].") + if(!unlimited_power) + to_chat(H, "You feel electricity begin to build up in [src].") + else + to_chat(H, "You feel like you have UNLIMITED POWER!!") /obj/item/clothing/gloves/color/yellow/power/dropped(mob/user, slot) if(!ishuman(user)) @@ -34,6 +40,12 @@ else H.middleClickOverride = null +/obj/item/clothing/gloves/color/yellow/power/unlimited + name = "UNLIMITED POWER gloves" + desc = "These gloves possess UNLIMITED POWER." + shock_delay = 0 + unlimited_power = TRUE + /obj/item/clothing/gloves/color/yellow/fake desc = "These gloves will protect the wearer from electric shock. They don't feel like rubber..." siemens_coefficient = 1 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/head/collectable.dm b/code/modules/clothing/head/collectable.dm index bbaf5b34e8b..70f0b1944de 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -59,7 +59,7 @@ icon_state = "welding" item_state = "welding" burn_state = FIRE_PROOF - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -126,7 +126,7 @@ icon_state = "swat" item_state = "swat" burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi' ) diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index b6179258d9e..0e9d2bac8de 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -11,30 +11,44 @@ flags_inv = 0 actions_types = list(/datum/action/item_action/toggle_helmet_light) burn_state = FIRE_PROOF - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) -/obj/item/clothing/head/hardhat/attack_self(mob/user) +/obj/item/clothing/head/hardhat/attack_self(mob/living/user) + toggle_helmet_light(user) + +/obj/item/clothing/head/hardhat/proc/toggle_helmet_light(mob/living/user) on = !on + if(on) + turn_on(user) + else + turn_off(user) + update_icon() + +/obj/item/clothing/head/hardhat/update_icon() icon_state = "hardhat[on]_[item_color]" item_state = "hardhat[on]_[item_color]" - if(on) - set_light(brightness_on) - else - set_light(0) - + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.update_inv_head() for(var/X in actions) var/datum/action/A = X A.UpdateButtonIcon() + ..() -/obj/item/clothing/head/hardhat/extinguish_light() +/obj/item/clothing/head/hardhat/proc/turn_on(mob/user) + set_light(brightness_on) + +/obj/item/clothing/head/hardhat/proc/turn_off(mob/user) + set_light(0) + +/obj/item/clothing/head/hardhat/extinguish_light(mob/living/user) if(on) on = FALSE - set_light(0) - icon_state = "hardhat0_[item_color]" - item_state = "hardhat0_[item_color]" + turn_off(user) + update_icon() visible_message("[src]'s light fades and turns off.") /obj/item/clothing/head/hardhat/orange @@ -78,10 +92,10 @@ flags = STOPSPRESSUREDMAGE flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE heat_protection = HEAD - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/helmet.dmi' ) \ No newline at end of file diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 35b4b6a75e0..4c915e5fc9c 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -13,7 +13,7 @@ max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 60 burn_state = FIRE_PROOF - species_fit = list("Vox", "Drask", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', "Drask" = 'icons/mob/species/drask/helmet.dmi', @@ -50,6 +50,7 @@ desc = "A helmet with a built-in thermal scanning visor." icon_state = "helmetthermals" vision_flags = SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE /obj/item/clothing/head/helmet/meson name = "meson visor helmet" @@ -67,7 +68,7 @@ name = "night-vision helmet" desc = "A helmet with a built-in pair of night vision goggles." icon_state = "helmetNVG" - helmet_goggles_invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these /obj/item/clothing/head/helmet/alt name = "bulletproof helmet" @@ -202,7 +203,7 @@ obj/item/clothing/head/blob item_state = "blobhat" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi' ) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 62873252ad1..c3377296177 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -76,7 +76,7 @@ desc = "A plastic replica of a syndicate agent's space helmet, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!" flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/helmet.dmi' ) @@ -90,7 +90,7 @@ flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -103,7 +103,7 @@ flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -265,7 +265,7 @@ icon_state = "chickenhead" item_state = "chickensuit" flags = BLOCKHAIR - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -419,7 +419,7 @@ item_state = "griffinhat" flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -452,7 +452,7 @@ icon_state = "papersack" flags = BLOCKHAIR flags_inv = HIDEFACE|HIDEEARS - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -463,7 +463,7 @@ icon_state = "papersack_smile" flags = BLOCKHAIR flags_inv = HIDEFACE|HIDEEARS - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index ba1b74aad66..35f346402f9 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -25,7 +25,7 @@ flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) actions_types = list(/datum/action/item_action/toggle) burn_state = FIRE_PROOF - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi', "Unathi" = 'icons/mob/species/unathi/helmet.dmi', @@ -94,7 +94,7 @@ /obj/item/clothing/head/cakehat/process() if(!onfire) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return var/turf/location = src.loc @@ -113,7 +113,7 @@ src.force = 3 src.damtype = "fire" src.icon_state = "cake1" - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else src.force = null src.damtype = "brute" @@ -132,7 +132,7 @@ flags_inv = HIDEEARS cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -159,7 +159,7 @@ flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -230,7 +230,7 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH species_disguise = "High-tech robot" - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -256,10 +256,10 @@ desc = "A band of rubber with a very reflective looking mirror attached to the front of it. One of the early signs of medical budget cuts." icon_state = "head_mirror" item_state = "head_mirror" - species_fit = list("Vox, Drask") + sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/head.dmi', - "Drask" = 'icons/mob/species/drask/head.dmi', - "Grey" = 'icons/mob/species/grey/head.dmi' + "Vox" = 'icons/mob/species/vox/head.dmi', + "Drask" = 'icons/mob/species/drask/head.dmi', + "Grey" = 'icons/mob/species/grey/head.dmi' ) diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 93d420f8ede..81d36884ef2 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -6,7 +6,7 @@ item_color = "cargo" var/flipped = 0 actions_types = list(/datum/action/item_action/flip_cap) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi' ) diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index d66daf59760..78034a3c0c8 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -8,7 +8,7 @@ w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/adjust) adjusted_flags = SLOT_HEAD - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -29,7 +29,7 @@ flags = BLOCKHAIR flags_inv = HIDEFACE w_class = WEIGHT_CLASS_SMALL - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 55c305cf449..df229f5b9c3 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -10,14 +10,14 @@ permeability_coefficient = 0.50 actions_types = list(/datum/action/item_action/adjust) burn_state = FIRE_PROOF - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey" ) sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', "Grey" = 'icons/mob/species/grey/mask.dmi', - "Drask" = 'icons/mob/species/drask/mask.dmi' + "Drask" = 'icons/mob/species/drask/mask.dmi', + "Plasmaman" = 'icons/mob/species/plasmaman/mask.dmi' ) /obj/item/clothing/mask/breath/attack_self(var/mob/user) @@ -36,7 +36,6 @@ item_state = "medical" permeability_coefficient = 0.01 put_on_delay = 10 - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") /obj/item/clothing/mask/breath/vox desc = "A weirdly-shaped breath mask." diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 0c4dba9ae49..289250befac 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -10,14 +10,14 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 burn_state = FIRE_PROOF - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', "Drask" = 'icons/mob/species/drask/mask.dmi', - "Grey" = 'icons/mob/species/grey/mask.dmi' + "Grey" = 'icons/mob/species/grey/mask.dmi', + "Plasmaman" = 'icons/mob/species/plasmaman/mask.dmi' ) // **** Welding gas mask **** @@ -62,6 +62,34 @@ var/datum/action/A = X A.UpdateButtonIcon() +/obj/item/clothing/mask/gas/explorer + name = "explorer gas mask" + desc = "A military-grade gas mask that can be connected to an air supply." + icon_state = "gas_mining" + actions_types = list(/datum/action/item_action/adjust) + armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 0, "bio" = 50, "rad" = 0) + resistance_flags = FIRE_PROOF + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Drask" = 'icons/mob/species/drask/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi' + ) + +/obj/item/clothing/mask/gas/explorer/attack_self(mob/user) + adjustmask(user) + +/obj/item/clothing/mask/gas/explorer/adjustmask(user) + ..() + w_class = mask_adjusted ? WEIGHT_CLASS_SMALL : WEIGHT_CLASS_NORMAL + +/obj/item/clothing/mask/gas/explorer/folded/Initialize() + . = ..() + adjustmask() + //Bane gas mask /obj/item/clothing/mask/banemask name = "bane mask" @@ -162,11 +190,6 @@ item_state = "sexymime" burn_state = FLAMMABLE -/obj/item/clothing/mask/gas/death_commando - name = "Death Commando Mask" - icon_state = "death_commando_mask" - item_state = "death_commando_mask" - /obj/item/clothing/mask/gas/cyborg name = "cyborg visor" desc = "Beep boop" @@ -199,6 +222,7 @@ name = "security gas mask" desc = "A standard issue Security gas mask with integrated 'Compli-o-nator 3000' device, plays over a dozen pre-recorded compliance phrases designed to get scumbags to stand still whilst you taze them. Do not tamper with the device." icon_state = "sechailer" + item_state = "sechailer" var/phrase = 1 var/aggressiveness = 1 var/safety = 1 diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 77fcd03c7df..b11dfd45d68 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -11,7 +11,7 @@ var/mute = MUZZLE_MUTE_ALL var/security_lock = FALSE // Requires brig access to remove 0 - Remove as normal var/locked = FALSE //Indicates if a mask is locked, should always start as 0. - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi' ) @@ -89,7 +89,7 @@ resist_time = 150 mute = MUZZLE_MUTE_MUFFLE flags = DROPDEL - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -99,22 +99,34 @@ ) /obj/item/clothing/mask/muzzle/tapegag/dropped(mob/user) - var/obj/item/trash/tapetrash/TT = new(drop_location(src)) + var/obj/item/trash/tapetrash/TT = new transfer_fingerprints_to(TT) user.transfer_fingerprints_to(TT) + user.put_in_active_hand(TT) playsound(src, 'sound/items/poster_ripped.ogg', 40, 1) - ..() user.emote("scream") + ..() /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." @@ -196,7 +208,7 @@ permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0) actions_types = list(/datum/action/item_action/adjust) - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -215,7 +227,7 @@ icon_state = "fake-moustache" flags_inv = HIDEFACE actions_types = list(/datum/action/item_action/pontificate) - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -294,7 +306,7 @@ var/voicechange = 0 var/temporaryname = " the Horse" var/originalname = "" - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/mask.dmi' ) @@ -389,7 +401,7 @@ desc = "It's the eater of worlds, and of children." icon_state = "pennywise_mask" item_state = "pennywise_mask" - species_fit = list("Vox") + flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR // Bandanas @@ -402,7 +414,7 @@ slot_flags = SLOT_MASK adjusted_flags = SLOT_HEAD icon_state = "bandbotany" - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -491,5 +503,6 @@ /obj/item/clothing/mask/cursedclown/suicide_act(mob/user) user.visible_message("[user] gazes into the eyes of [src]. [src] gazes back!") spawn(10) - user.gib() - return BRUTELOSS + if(user) + user.gib() + return OBLITERATION diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm deleted file mode 100644 index b5b6298dcb2..00000000000 --- a/code/modules/clothing/masks/voice.dm +++ /dev/null @@ -1,38 +0,0 @@ -/obj/item/voice_changer - name = "voice changer" - desc = "A voice scrambling module. If you can see this, report it as a bug on the tracker." - var/voice //If set and item is present in mask/suit, this name will be used for the wearer's speech. - var/active - -/obj/item/clothing/mask/gas/voice - name = "gas mask" -// desc = "A face-covering mask that can be connected to an air supply. It seems to house some odd electronics." - var/obj/item/voice_changer/changer - burn_state = FIRE_PROOF - -/obj/item/clothing/mask/gas/voice/verb/Toggle_Voice_Changer() - set category = "Object" - set src in usr - - changer.active = !changer.active - to_chat(usr, "You [changer.active ? "enable" : "disable"] the voice-changing module in \the [src].") - -/obj/item/clothing/mask/gas/voice/verb/Set_Voice(name as text) - set category = "Object" - set src in usr - - var/voice = sanitize(copytext(name,1,MAX_MESSAGE_LEN)) - if(!voice || !length(voice)) return - changer.voice = voice - to_chat(usr, "You are now mimicking [changer.voice].") - -/obj/item/clothing/mask/gas/voice/New() - ..() - changer = new(src) - -/obj/item/clothing/mask/gas/voice/clown - name = "clown wig and mask" - desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." - icon_state = "clown" - item_state = "clown_hat" - flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR \ No newline at end of file diff --git a/code/modules/clothing/patreon/glasses.dm b/code/modules/clothing/patreon/glasses.dm index 8f795b212a2..f52d54f7df2 100644 --- a/code/modules/clothing/patreon/glasses.dm +++ b/code/modules/clothing/patreon/glasses.dm @@ -7,7 +7,7 @@ desc = "Row row!" icon_state = "gar" item_state = "gar" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi' ) diff --git a/code/modules/clothing/patreon/hats.dm b/code/modules/clothing/patreon/hats.dm index bfcc69972e4..abee0cb9466 100644 --- a/code/modules/clothing/patreon/hats.dm +++ b/code/modules/clothing/patreon/hats.dm @@ -9,7 +9,7 @@ icon_state = "mushhat" item_state = "mushhat" flags = BLOCKHAIR - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi' ) @@ -20,7 +20,7 @@ desc = "Poshness incarnate." icon_state = "goldtophat" item_state = "goldtophat" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi' ) @@ -45,7 +45,7 @@ icon_state = "guardhelm" item_state = "guardhelm" flags = BLOCKHAIR - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi' ) @@ -57,7 +57,7 @@ icon_state = "blacksombrero" item_state = "blacksombrero" flags = BLOCKHAIR - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi' ) \ No newline at end of file diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index ed4471d7b7c..7a5bd2255da 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -71,6 +71,30 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team silence_steps = 1 shoe_sound = "clownstep" origin_tech = "magnets=4;syndicate=2" + var/enabled_waddle = TRUE + var/datum/component/waddle + +/obj/item/clothing/shoes/magboots/clown/equipped(mob/user, slot) + . = ..() + if(slot == slot_shoes && enabled_waddle) + waddle = user.AddComponent(/datum/component/waddling) + +/obj/item/clothing/shoes/magboots/clown/dropped(mob/user) + . = ..() + QDEL_NULL(waddle) + +/obj/item/clothing/shoes/magboots/clown/CtrlClick(mob/living/user) + if(!isliving(user)) + return + if(user.get_active_hand() != src) + to_chat(user, "You must hold [src] in your hand to do this.") + return + if(!enabled_waddle) + to_chat(user, "You switch off the waddle dampeners!") + enabled_waddle = TRUE + else + to_chat(user, "You switch on the waddle dampeners!") + enabled_waddle = FALSE /obj/item/clothing/shoes/magboots/wizard //bundled with the wiz hardsuit name = "boots of gripping" @@ -83,7 +107,7 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team /obj/item/clothing/shoes/magboots/wizard/attack_self(mob/user) if(user) - if(user.mind in ticker.mode.wizards) + if(user.mind in SSticker.mode.wizards) if(magpulse) //faint blue light when shoes are turned on gives a reason to turn them off when not needed in maint set_light(0) else diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index f3a2efed260..bca650a30b1 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -1,21 +1,3 @@ -/obj/item/clothing/shoes/syndigaloshes - desc = "A pair of brown shoes. They seem to have extra grip." - name = "brown shoes" - icon_state = "brown" - item_state = "brown" - permeability_coefficient = 0.05 - flags = NOSLIP - origin_tech = "syndicate=2" - burn_state = FIRE_PROOF - var/list/clothing_choices = list() - silence_steps = 1 - -/obj/item/clothing/shoes/syndigaloshes/black - name = "black shoes" - icon_state = "black" - item_color = "black" - desc = "A pair of black shoes. They seem to have extra grip." - /obj/item/clothing/shoes/mime name = "mime shoes" icon_state = "mime" @@ -73,7 +55,7 @@ t_loc.MakeDry(TURF_WET_WATER) /obj/item/clothing/shoes/clown_shoes - desc = "The prankster's standard-issue clowning shoes. Damn they're huge!" + desc = "The prankster's standard-issue clowning shoes. Damn they're huge! Ctrl-click to toggle the waddle dampeners!" name = "clown shoes" icon_state = "clown" item_state = "clown_shoes" @@ -81,6 +63,30 @@ item_color = "clown" var/footstep = 1 //used for squeeks whilst walking shoe_sound = "clownstep" + var/enabled_waddle = TRUE + var/datum/component/waddle + +/obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot) + . = ..() + if(slot == slot_shoes && enabled_waddle) + waddle = user.AddComponent(/datum/component/waddling) + +/obj/item/clothing/shoes/clown_shoes/dropped(mob/user) + . = ..() + QDEL_NULL(waddle) + +/obj/item/clothing/shoes/clown_shoes/CtrlClick(mob/living/user) + if(!isliving(user)) + return + if(user.get_active_hand() != src) + to_chat(user, "You must hold [src] in your hand to do this.") + return + if(!enabled_waddle) + to_chat(user, "You switch off the waddle dampeners!") + enabled_waddle = TRUE + else + to_chat(user, "You switch on the waddle dampeners!") + enabled_waddle = FALSE /obj/item/clothing/shoes/clown_shoes/magical name = "magical clown shoes" @@ -113,6 +119,12 @@ can_cut_open = 1 icon_state = "workboots" +/obj/item/clothing/shoes/workboots/mining + name = "mining boots" + desc = "Steel-toed mining boots for mining in hazardous environments. Very good at keeping toes uncrushed." + icon_state = "explorer" + resistance_flags = FIRE_PROOF + /obj/item/clothing/shoes/winterboots name = "winter boots" desc = "Boots lined with 'synthetic' animal fur." @@ -263,3 +275,35 @@ force = 0 silence_steps = TRUE w_class = WEIGHT_CLASS_SMALL + +/obj/item/clothing/shoes/bhop + name = "jump boots" + desc = "A specialized pair of combat boots with a built-in propulsion system for rapid foward movement." + icon_state = "jetboots" + item_state = "jetboots" + item_color = "hosred" + resistance_flags = FIRE_PROOF + actions_types = list(/datum/action/item_action/bhop) + permeability_coefficient = 0.05 + can_cut_open = FALSE + var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles + var/jumpspeed = 3 + var/recharging_rate = 60 //default 6 seconds between each dash + var/recharging_time = 0 //time until next dash + +/obj/item/clothing/shoes/bhop/ui_action_click(mob/user, action) + if(!isliving(user)) + return + + if(recharging_time > world.time) + to_chat(user, "The boot's internal propulsion needs to recharge still!") + return + + var/atom/target = get_edge_target_turf(user, user.dir) //gets the user's direction + + if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE)) + playsound(src, 'sound/effects/stealthoff.ogg', 50, 1, 1) + user.visible_message("[usr] dashes forward into the air!") + recharging_time = world.time + recharging_rate + else + to_chat(user, "Something prevents you from dashing forward!") \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 88f94e5b50a..fdd871a3448 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -122,7 +122,7 @@ else new_camera(user) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/item/clothing/suit/space/chronos/proc/activate() if(!activating && !activated && !teleporting) @@ -143,7 +143,7 @@ to_chat(user, "\[ ok \] Starting ui display driver") to_chat(user, "\[ ok \] Initializing chronowalk4-view") new_camera(user) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) activated = 1 else to_chat(user, "\[ fail \] Mounting /dev/helmet") diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm index 2fbf38a7e07..099b46a10b9 100644 --- a/code/modules/clothing/spacesuits/ert.dm +++ b/code/modules/clothing/spacesuits/ert.dm @@ -9,7 +9,7 @@ var/obj/machinery/camera/camera var/has_camera = TRUE strip_delay = 130 - species_fit = list("Grey", "Vox") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/helmet.dmi', "Vox" = 'icons/mob/species/vox/helmet.dmi' @@ -42,7 +42,7 @@ /obj/item/radio, /obj/item/analyzer, /obj/item/gun/energy/laser, /obj/item/gun/energy/pulse, \ /obj/item/gun/energy/gun/advtaser, /obj/item/melee/baton, /obj/item/gun/energy/gun, /obj/item/gun/projectile/automatic/lasercarbine, /obj/item/gun/energy/gun/blueshield, /obj/item/gun/energy/immolator/multi) strip_delay = 130 - species_fit = list("Drask", "Vox") + sprite_sheets = list( "Drask" = 'icons/mob/species/drask/suit.dmi', "Vox" = 'icons/mob/species/vox/suit.dmi' @@ -58,10 +58,9 @@ /obj/item/clothing/head/helmet/space/hardsuit/ert/commander/gamma name = "elite emergency response team commander helmet" - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "hardsuit0-gammacommander" item_color = "gammacommander" - species_fit = null /obj/item/clothing/suit/space/hardsuit/ert/commander name = "emergency response team commander suit" @@ -71,9 +70,8 @@ /obj/item/clothing/suit/space/hardsuit/ert/commander/gamma name = "elite emergency response team commander suit" - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "ert_gcommander" - species_fit = null //Security /obj/item/clothing/head/helmet/space/hardsuit/ert/security @@ -85,10 +83,9 @@ /obj/item/clothing/head/helmet/space/hardsuit/ert/security/gamma name = "elite emergency response team security helmet" - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "hardsuit0-gammasecurity" item_color = "gammasecurity" - species_fit = null /obj/item/clothing/suit/space/hardsuit/ert/security name = "emergency response team security suit" @@ -98,9 +95,8 @@ /obj/item/clothing/suit/space/hardsuit/ert/security/gamma name = "elite emergency response team security suit" - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "ert_gsecurity" - species_fit = null //Engineer /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer @@ -113,10 +109,9 @@ //Engineer /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer/gamma name = "elite emergency response team engineer helmet" - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "hardsuit0-gammaengineer" item_color = "gammaengineer" - species_fit = null /obj/item/clothing/suit/space/hardsuit/ert/engineer name = "emergency response team engineer suit" @@ -126,9 +121,8 @@ /obj/item/clothing/suit/space/hardsuit/ert/engineer/gamma name = "elite emergency response team engineer suit" - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "ert_gengineer" - species_fit = null //Medical /obj/item/clothing/head/helmet/space/hardsuit/ert/medical @@ -139,10 +133,9 @@ /obj/item/clothing/head/helmet/space/hardsuit/ert/medical/gamma name = "elite emergency response team medical helmet" - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "hardsuit0-gammamedical" item_color = "gammamedical" - species_fit = null /obj/item/clothing/suit/space/hardsuit/ert/medical name = "emergency response team medical suit" @@ -151,9 +144,8 @@ /obj/item/clothing/suit/space/hardsuit/ert/medical/gamma name = "elite emergency response team medical suit" - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "ert_gmedical" - species_fit = null //Janitor /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor @@ -164,11 +156,9 @@ /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor/gamma name = "elite emergency response team janitor helmet" - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "hardsuit0-gammajanitor" item_color = "gammajanitor" - species_fit = null - /obj/item/clothing/suit/space/hardsuit/ert/janitor name = "emergency response team janitor suit" desc = "A suit worn by the janitorial of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured, space ready, and fire resistant." @@ -176,9 +166,8 @@ /obj/item/clothing/suit/space/hardsuit/ert/janitor/gamma name = "elite emergency response team janitor suit" - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "ert_gjanitor" - species_fit = null //Paranormal /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal @@ -186,7 +175,7 @@ desc = "A helmet worn by those who deal with paranormal threats for a living." icon_state = "hardsuit0-ert_paranormal" item_color = "ert_paranormal" - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT sprite_sheets = null actions_types = list() has_camera = 0 @@ -195,7 +184,7 @@ name = "paranormal response team suit" desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats." icon_state = "hardsuit-paranormal" - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT sprite_sheets = null actions_types = list() diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 1d19a145af8..ead2c04016d 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -291,7 +291,7 @@ item_color = "white" armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90) heat_protection = HEAD //Uncomment to enable firesuit protection - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT /obj/item/clothing/suit/space/hardsuit/elite icon_state = "hardsuit-white" @@ -300,7 +300,7 @@ item_state = "ce_hardsuit" armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90) heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT //Mining hardsuit /obj/item/clothing/head/helmet/space/hardsuit/mining @@ -436,7 +436,7 @@ item_color = "syndielite" armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70) heat_protection = HEAD - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT sprite_sheets = null /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/attack_self(mob/user) @@ -455,7 +455,7 @@ item_color = "syndielite" armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70) heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT sprite_sheets = null /obj/item/clothing/suit/space/hardsuit/syndi/elite/attack_self(mob/user) @@ -497,8 +497,8 @@ unacidable = TRUE //No longer shall our kind be foiled by lone chemists with spray bottles! armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50) heat_protection = HEAD //Uncomment to enable firesuit protection - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT - species_fit = list("Grey") + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/helmet.dmi' ) @@ -514,7 +514,7 @@ armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50) allowed = list(/obj/item/teleportation_scroll,/obj/item/tank) heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT sprite_sheets = null magical = TRUE @@ -565,7 +565,7 @@ item_color = "atmos" armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0) heat_protection = HEAD //Uncomment to enable firesuit protection - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT /obj/item/clothing/suit/space/hardsuit/atmos desc = "A special suit that protects against hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding." @@ -574,7 +574,7 @@ item_state = "atmos_hardsuit" armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0) heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT //Singuloth armor /obj/item/clothing/head/helmet/space/hardsuit/singuloth @@ -633,7 +633,7 @@ owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks!") current_charges-- recharge_cooldown = world.time + recharge_delay - processing_objects |= src + START_PROCESSING(SSobj, src) if(current_charges <= 0) owner.visible_message("[owner]'s shield overloads!") shield_state = "broken" @@ -643,7 +643,7 @@ /obj/item/clothing/suit/space/hardsuit/shielded/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/clothing/suit/space/hardsuit/shielded/process() @@ -652,7 +652,7 @@ playsound(loc, 'sound/magic/charge.ogg', 50, 1) if(current_charges == max_charges) playsound(loc, 'sound/machines/ding.ogg', 50, 1) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) shield_state = "[shield_on]" if(istype(loc, /mob/living/carbon/human)) var/mob/living/carbon/human/C = loc diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index cbf7a0a0910..9706b254fa8 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -8,7 +8,7 @@ permeability_coefficient = 0.01 armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50) species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Vox", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', "Grey" = 'icons/mob/species/grey/helmet.dmi' @@ -32,7 +32,7 @@ allowed = list(/obj/item/tank, /obj/item/flashlight,/obj/item/gun/energy, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton,/obj/item/restraints/handcuffs) armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50) species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -44,10 +44,11 @@ icon_state = "deathsquad" item_state = "deathsquad" armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT unacidable = 1 vision_flags = SEE_MOBS - helmet_goggles_invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these + see_in_dark = 8 HUDType = MEDHUD strip_delay = 130 @@ -58,7 +59,7 @@ item_state = "swat_suit" allowed = list(/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/tank,/obj/item/kitchen/knife/combat) armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT unacidable = 1 strip_delay = 130 @@ -72,7 +73,7 @@ armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 90, rad = 20) strip_delay = 120 species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -99,13 +100,14 @@ name = "Santa's hat" desc = "Ho ho ho. Merrry X-mas!" icon_state = "santahat" - species_fit = list("Grey, Drask") + sprite_sheets = list( "Grey" = 'icons/mob/species/Grey/head.dmi', "Drask" = 'icons/mob/species/Drask/helmet.dmi' ) flags = BLOCKHAIR | STOPSPRESSUREDMAGE flags_cover = HEADCOVERSEYES + /obj/item/clothing/head/helmet/space/santahat/attack_self(mob/user as mob) if(src.icon_state == "santahat") src.icon_state = "santahat_beard" @@ -158,7 +160,7 @@ item_state = "paramedic-eva-helmet" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Vox", "Grey" , "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', "Grey" = 'icons/mob/species/grey/helmet.dmi', @@ -179,7 +181,7 @@ desc = "A brand new paramedic EVA suit. The nitrile seems a bit too thin to be space proof. Used for retrieving bodies in space." armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Vox", "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi', "Skrell" = 'icons/mob/species/skrell/suit.dmi', @@ -199,7 +201,7 @@ desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies." armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin") + sprite_sheets = list( "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', "Unathi" = 'icons/mob/species/unathi/suit.dmi', @@ -222,7 +224,7 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) flash_protect = 0 species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin", "Grey") + sprite_sheets = list( "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', "Unathi" = 'icons/mob/species/unathi/helmet.dmi', @@ -243,7 +245,6 @@ icon_state = "spacemimehelmet" item_state = "spacemimehelmet" species_restricted = list("exclude","Diona","Vox","Wryn") - species_fit = null sprite_sheets = null sprite_sheets_obj = null @@ -254,7 +255,6 @@ icon_state = "spacemime_suit" item_state = "spacemime_items" species_restricted = list("exclude","Diona","Vox","Wryn") - species_fit = null sprite_sheets = null sprite_sheets_obj = null @@ -265,7 +265,6 @@ icon_state = "clownhelmet" item_state = "clownhelmet" species_restricted = list("exclude","Diona","Vox","Wryn") - species_fit = null sprite_sheets = null sprite_sheets_obj = null @@ -276,6 +275,6 @@ icon_state = "spaceclown_suit" item_state = "spaceclown_items" species_restricted = list("exclude","Diona","Vox","Wryn") - species_fit = null sprite_sheets = null sprite_sheets_obj = null + \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 02742940456..e355aead650 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -112,14 +112,14 @@ name = "plasmaman atmospheric suit" icon_state = "plasmamanAtmos_suit" armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0) - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT /obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech name = "plasmaman atmospheric helmet" icon_state = "plasmamanAtmos_helmet0" base_state = "plasmamanAtmos_helmet" armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0) - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT flash_protect = 2 /obj/item/clothing/suit/space/eva/plasmaman/engineer @@ -137,14 +137,14 @@ /obj/item/clothing/suit/space/eva/plasmaman/engineer/ce name = "plasmaman chief engineer suit" icon_state = "plasmaman_CE" - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT /obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce name = "plasmaman chief engineer helmet" icon_state = "plasmaman_CE_helmet0" base_state = "plasmaman_CE_helmet" - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT flash_protect = 2 //SERVICE @@ -235,6 +235,16 @@ base_state = "plasmamanMiner_helmet" armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50) +/obj/item/clothing/suit/space/eva/plasmaman/explorer + name = "plasmaman explorer suit" + icon_state = "plasmamanExplorer_suit" + armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50) + +/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer + name = "plasmaman explorer helmet" + icon_state = "plasmamanExplorer_helmet0" + base_state = "plasmamanExplorer_helmet" + armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50) // MEDSCI diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index aa62763a6d3..bfb326eae1d 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -269,14 +269,13 @@ /obj/item/rig_module/voice/New() ..() voice_holder = new(src) - voice_holder.active = 0 + voice_holder.active = FALSE /obj/item/rig_module/voice/installed() ..() holder.speech = src /obj/item/rig_module/voice/engage() - if(!..()) return 0 @@ -287,17 +286,17 @@ switch(choice) if("Enable") - active = 1 - voice_holder.active = 1 + active = TRUE + voice_holder.active = TRUE to_chat(usr, "You enable the speech synthesiser.") if("Disable") - active = 0 - voice_holder.active = 0 + active = FALSE + voice_holder.active = FALSE to_chat(usr, "You disable the speech synthesiser.") if("Set Name") var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null, MAX_NAME_LEN) if(!raw_choice) - return 0 + return FALSE voice_holder.voice = raw_choice to_chat(usr, "You are now mimicking [voice_holder.voice].") return 1 diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index c65ea335c4d..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() ..() @@ -110,7 +113,7 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) if(initial_modules && initial_modules.len) for(var/path in initial_modules) @@ -166,7 +169,7 @@ if(istype(M)) M.unEquip(piece) qdel(piece) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) QDEL_NULL(wires) QDEL_NULL(spark_system) return ..() diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index a138f71eec7..5723cdff52c 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -75,7 +75,7 @@ obj/item/clothing/head/helmet/space/syndicate/black/strike name = "Syndicate Strike Team commando helmet" desc = "A heavily armored black helmet that is only given to high-ranking Syndicate operatives." armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) //Matches DS gear. - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT unacidable = 1 /obj/item/clothing/suit/space/syndicate/black @@ -87,7 +87,7 @@ obj/item/clothing/suit/space/syndicate/black/strike name = "Syndicate Strike Team commando space suit" desc = "A heavily armored, black space suit that is only given to high-ranking Syndicate operatives." armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) //Matches DS gear. - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT unacidable = 1 //Black-green syndicate space suit @@ -148,7 +148,7 @@ obj/item/clothing/head/helmet/space/syndicate/black/red/strike name = "Syndicate Strike Team leader helmet" desc = "A heavily armored, black and red space helmet that is only given to elite Syndicate operatives, it looks particularly menacing." armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) //Matches DS gear. - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT unacidable = 1 /obj/item/clothing/suit/space/syndicate/black/red @@ -160,7 +160,7 @@ obj/item/clothing/suit/space/syndicate/black/red/strike name = "Syndicate Strike Team leader space suit" desc = "A heavily armored, black and red space suit that is only given to elite Syndicate operatives, it looks particularly menacing." armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) //Matches DS gear. - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT unacidable = 1 diff --git a/code/modules/clothing/suits/alien.dm b/code/modules/clothing/suits/alien.dm index 664e1dea237..1a2fabea889 100644 --- a/code/modules/clothing/suits/alien.dm +++ b/code/modules/clothing/suits/alien.dm @@ -1,6 +1,5 @@ //Unathi clothing. /obj/item/clothing/suit/unathi/ - species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 87d79e5f5ff..96c2ed46f7a 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -8,7 +8,7 @@ strip_delay = 60 put_on_delay = 40 burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -91,7 +91,6 @@ desc = "A vest drenched in the blood of Greytide. It has seen better days." icon_state = "bloody_armor" item_state = "bloody_armor" - species_fit = null sprite_sheets = null /obj/item/clothing/suit/armor/secjacket @@ -137,7 +136,6 @@ icon_state = "jensencoat" item_state = "jensencoat" flags_inv = 0 - species_fit = null sprite_sheets = null /obj/item/clothing/suit/armor/vest/warden @@ -383,7 +381,6 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - species_fit = null sprite_sheets = null armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) @@ -476,4 +473,68 @@ heat_protection = UPPER_TORSO|LOWER_TORSO max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT burn_state = FIRE_PROOF - armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) \ No newline at end of file + armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) + +//LAVALAND! + +/obj/item/clothing/suit/hooded/drake + name = "drake armour" + icon_state = "dragon" + item_state = "dragon" + desc = "A suit of armour fashioned from the remains of an ash drake." + 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, /obj/item/twohanded/spear) + armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100) + hoodtype = /obj/item/clothing/head/hooded/drake + heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + resistance_flags = FIRE_PROOF + +/obj/item/clothing/head/hooded/drake + name = "drake helmet" + icon_state = "dragon" + item_state = "dragon" + desc = "The skull of a dragon." + armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100) + heat_protection = HEAD + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + resistance_flags = FIRE_PROOF + flags = BLOCKHAIR + flags_cover = HEADCOVERSEYES + +/obj/item/clothing/suit/hooded/goliath + name = "goliath cloak" + icon_state = "goliath_cloak" + item_state = "goliath_cloak" + desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits." + 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, /obj/item/twohanded/spear) + armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot + hoodtype = /obj/item/clothing/head/hooded/goliath + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + +/obj/item/clothing/head/hooded/goliath + name = "goliath cloak hood" + icon_state = "golhood" + item_state = "golhood" + desc = "A protective & concealing hood." + armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + flags = BLOCKHAIR + flags_cover = HEADCOVERSEYES + +/obj/item/clothing/suit/armor/bone + name = "bone armor" + desc = "A tribal armor plate, crafted from animal bone." + icon_state = "bonearmor" + item_state = "bonearmor" + blood_overlay_type = "armor" + armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS + +/obj/item/clothing/head/skullhelmet + name = "skull helmet" + desc = "An intimidating tribal helmet, it doesn't look very comfortable." + flags = BLOCKHAIR + flags_cover = HEADCOVERSEYES + armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 10, "bio" = 5, "rad" = 20, "fire" = 40, "acid" = 20) + icon_state = "skull" + item_state = "skull" \ No newline at end of file diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 0c85db3d533..86130ba8008 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -9,7 +9,7 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES burn_state = FIRE_PROOF - species_fit = list("Vox", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', "Grey" = 'icons/mob/species/grey/head.dmi' @@ -33,7 +33,7 @@ strip_delay = 70 put_on_delay = 70 burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -97,5 +97,5 @@ item_state = "bio_suit" strip_delay = 40 put_on_delay = 20 - species_fit = null + sprite_sheets = null diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 59e5ce301d0..abc5809f0e2 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -10,7 +10,7 @@ allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \ /obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -25,7 +25,7 @@ /obj/item/healthanalyzer, /obj/item/flashlight, \ /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser) armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -39,7 +39,7 @@ blood_overlay_type = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO allowed = list(/obj/item/reagent_containers/spray/plantbgone,/obj/item/plant_analyzer,/obj/item/seeds,/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/cultivator,/obj/item/reagent_containers/spray/pestspray,/obj/item/hatchet,/obj/item/storage/bag/plants) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -54,12 +54,11 @@ flags_inv = HIDEJUMPSUIT flags_size = ONESIZEFITSALL allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/flash, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/emergency_oxygen) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) - /obj/item/clothing/suit/captunic/capjacket name = "captain's uniform jacket" desc = "A less formal jacket for everyday captain use." @@ -67,11 +66,18 @@ item_state = "bio_suit" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEJUMPSUIT - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) +/obj/item/clothing/suit/mantle/armor/captain + name = "captain's cloak" + desc = "An armor-plated piece of fashion for the ruling elite. Protect your upper half in style." + icon_state = "capmantle" + item_state = "capmantle" + armor = list(melee = 50, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) + //Chaplain /obj/item/clothing/suit/hooded/chaplain_hoodie name = "chaplain hoodie" @@ -81,7 +87,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS hoodtype = /obj/item/clothing/head/hooded/chaplain_hood allowed = list(/obj/item/storage/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/emergency_oxygen) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -96,7 +102,7 @@ flags_inv = HIDESHOES|HIDEJUMPSUIT hoodtype = /obj/item/clothing/head/hooded/nun_hood allowed = list(/obj/item/storage/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/emergency_oxygen) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -136,7 +142,7 @@ permeability_coefficient = 0.50 body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS allowed = list (/obj/item/kitchen/knife) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -151,6 +157,21 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO allowed = list(/obj/item/kitchen/knife) +//Chief Engineer +/obj/item/clothing/suit/mantle/chief_engineer + name = "chief engineer's mantle" + desc = "A slick, authoritative cloak designed for the Chief Engineer." + icon_state = "cemantle" + item_state = "cemantle" + allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/t_scanner, /obj/item/rcd) + +//Chief Medical Officer +/obj/item/clothing/suit/mantle/labcoat/chief_medical_officer + name = "chief medical officer's mantle" + desc = "An absorbent, clean cover found on the shoulders of the Chief Medical Officer." + icon_state = "cmomantle" + item_state = "cmomantle" + //Detective /obj/item/clothing/suit/storage/det_suit name = "coat" @@ -159,12 +180,12 @@ item_state = "det_suit" blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/reagent_containers/spray/pepper,/obj/item/flashlight,/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/storage/fancy/cigarettes,/obj/item/lighter,/obj/item/detective_scanner,/obj/item/taperecorder) + allowed = list(/obj/item/tank/emergency_oxygen, /obj/item/reagent_containers/spray/pepper, /obj/item/flashlight, /obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/detective_scanner, /obj/item/taperecorder) armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_size = ONESIZEFITSALL - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -201,7 +222,7 @@ cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_size = ONESIZEFITSALL - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -215,14 +236,13 @@ blood_overlay_type = "armor" allowed = list (/obj/item/flashlight, /obj/item/t_scanner, /obj/item/tank/emergency_oxygen) burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) //Lawyer /obj/item/clothing/suit/storage/lawyer - species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -259,6 +279,29 @@ blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|ARMS +//Head of Security +/obj/item/clothing/suit/mantle/armor + name = "armored shawl" + desc = "A reinforced shawl, worn by the Head of Security. Do you dare take up their mantle?" + icon_state = "hosmantle" + item_state = "hosmantle" + allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic, /obj/item/kitchen/knife/combat) + armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0) + min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT + heat_protection = UPPER_TORSO|ARMS + max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT + strip_delay = 60 + put_on_delay = 40 + burn_state = FIRE_PROOF + +//Head of Personnel +/obj/item/clothing/suit/mantle/armor/head_of_personnel + name = "head of personnel's shawl" + desc = "An armored shawl for the head of personnel. It's remarkably well kept." + icon_state = "hopmantle" + item_state = "hopmantle" + armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) + //Internal Affairs /obj/item/clothing/suit/storage/internalaffairs name = "\improper Internal Affairs jacket" @@ -271,7 +314,7 @@ suit_adjusted = 1 actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -286,7 +329,7 @@ ignore_suitadjust = 0 actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -304,7 +347,7 @@ suit_adjusted = 1 actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -316,7 +359,24 @@ icon = 'icons/obj/clothing/belts.dmi' icon_state = "suspenders" blood_overlay_type = "armor" //it's the less thing that I can put here - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) + +// Surgeon +/obj/item/clothing/suit/apron/surgical + name = "surgical apron" + desc = "A sterile blue surgical apron." + icon_state = "surgical" + item_state = "surgical" + allowed = list(/obj/item/scalpel, /obj/item/surgical_drapes, /obj/item/cautery, /obj/item/hemostat, /obj/item/retractor) + +//Research Director +/obj/item/clothing/suit/mantle/labcoat + name = "research director's mantle" + desc = "A tweed mantle, worn by the Research Director. Smells like science." + icon_state = "rdmantle" + item_state = "rdmantle" + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index c7ab509fb2c..f3759a67786 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -9,7 +9,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0) - species_fit = list("Vox","Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi', "Grey" = 'icons/mob/species/grey/suit.dmi' diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 70c9fd31632..084637e2943 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -1,974 +1,1006 @@ -/* - * Contains: - * Lasertag - * Costume - * Winter Coats - * Misc - */ - -/* - * Lasertag - */ -/obj/item/clothing/suit/bluetag - name = "blue laser tag armour" - desc = "Blue Pride, Station Wide." - icon_state = "bluetag" - item_state = "bluetag" - blood_overlay_type = "armor" - body_parts_covered = UPPER_TORSO|LOWER_TORSO - allowed = list (/obj/item/gun/energy/laser/tag/blue) - burn_state = FIRE_PROOF - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -/obj/item/clothing/suit/redtag - name = "red laser tag armour" - desc = "Pew pew pew." - icon_state = "redtag" - item_state = "redtag" - blood_overlay_type = "armor" - body_parts_covered = UPPER_TORSO|LOWER_TORSO - allowed = list (/obj/item/gun/energy/laser/tag/red) - burn_state = FIRE_PROOF - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -/* - * Costume - */ -/obj/item/clothing/suit/pirate_brown - name = "brown pirate coat" - desc = "Yarr." - icon_state = "pirate_old" - item_state = "pirate_old" - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -/obj/item/clothing/suit/pirate_black - name = "black pirate coat" - desc = "Yarr." - icon_state = "pirate" - item_state = "pirate" - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -/obj/item/clothing/suit/hgpirate - name = "pirate captain coat" - desc = "Yarr." - icon_state = "hgpirate" - item_state = "hgpirate" - flags_inv = HIDEJUMPSUIT - - -/obj/item/clothing/suit/cyborg_suit - name = "cyborg suit" - desc = "Suit for a cyborg costume." - icon_state = "death" - item_state = "death" - flags = CONDUCT - fire_resist = T0C+5200 - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - - -/obj/item/clothing/suit/greatcoat - name = "great coat" - desc = "A Nazi great coat." - icon_state = "nazi" - item_state = "nazi" - - -/obj/item/clothing/suit/johnny_coat - name = "johnny~~ coat" - desc = "Johnny~~" - icon_state = "johnny" - item_state = "johnny" - - -/obj/item/clothing/suit/justice - name = "justice suit" - desc = "this pretty much looks ridiculous" - icon_state = "justice" - item_state = "justice" - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - - -/obj/item/clothing/suit/judgerobe - name = "judge's robe" - desc = "This robe commands authority." - icon_state = "judge" - item_state = "judge" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - allowed = list(/obj/item/storage/fancy/cigarettes,/obj/item/stack/spacecash) - flags_inv = HIDEJUMPSUIT - - -/obj/item/clothing/suit/wcoat - name = "waistcoat" - desc = "For some classy, murderous fun." - icon_state = "vest" - item_state = "wcoat" - blood_overlay_type = "armor" - body_parts_covered = UPPER_TORSO|LOWER_TORSO - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -/obj/item/clothing/suit/apron/overalls - name = "coveralls" - desc = "A set of denim overalls." - icon_state = "overalls" - item_state = "overalls" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS - - -/obj/item/clothing/suit/syndicatefake - name = "black and red space suit replica" - icon_state = "syndicate-black-red" - item_state = "syndicate-black-red" - desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!" - w_class = WEIGHT_CLASS_NORMAL - allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy) - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - burn_state = FIRE_PROOF - - -/obj/item/clothing/suit/hastur - name = "Hastur's robes" - desc = "Robes not meant to be worn by man." - icon_state = "hastur" - item_state = "hastur" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - - -/obj/item/clothing/suit/imperium_monk - name = "imperium monk" - desc = "Have YOU killed a xeno today?" - icon_state = "imperium_monk" - item_state = "imperium_monk" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - flags_inv = HIDESHOES|HIDEJUMPSUIT - allowed = list(/obj/item/storage/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/emergency_oxygen) - -/obj/item/clothing/suit/chickensuit - name = "chicken suit" - desc = "A suit made long ago by the ancient empire KFC." - icon_state = "chickensuit" - item_state = "chickensuit" - body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET - flags_inv = HIDESHOES|HIDEJUMPSUIT - -/obj/item/clothing/suit/corgisuit - name = "corgi suit" - desc = "A suit made long ago by the ancient empire KFC." - icon_state = "corgisuit" - item_state = "chickensuit" - body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET - flags_inv = HIDESHOES|HIDEJUMPSUIT - -/obj/item/clothing/suit/corgisuit/super_hero - name = "super-hero corgi suit" - desc = "A suit made long ago by the ancient empire KFC. This one pulses with a strange power." - flags = NODROP - -/obj/item/clothing/suit/corgisuit/super_hero/en - name = "\improper super-hero E-N suit" - icon_state = "ensuit" - -/obj/item/clothing/suit/corgisuit/super_hero/en/New() - ..() - processing_objects.Add(src) - -/obj/item/clothing/suit/corgisuit/super_hero/en/Destroy() - processing_objects.Remove(src) - return ..() - -/obj/item/clothing/suit/corgisuit/super_hero/en/process() - if(prob(2)) - for(var/obj/M in orange(2,src)) - if(!M.anchored && (M.flags & CONDUCT)) - step_towards(M,src) - for(var/mob/living/silicon/S in orange(2,src)) - if(istype(S, /mob/living/silicon/ai)) continue - step_towards(S,src) - for(var/mob/living/carbon/human/machine/M in orange(2,src)) - step_towards(M,src) - -/obj/item/clothing/suit/monkeysuit - name = "monkey suit" - desc = "A suit that looks like a primate" - icon_state = "monkeysuit" - item_state = "monkeysuit" - body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET|HANDS - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - - -/obj/item/clothing/suit/holidaypriest - name = "holiday priest" - desc = "This is a nice holiday my son." - icon_state = "holidaypriest" - item_state = "holidaypriest" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - flags_inv = HIDEJUMPSUIT - allowed = list(/obj/item/storage/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/emergency_oxygen) - -/obj/item/clothing/suit/cardborg - name = "cardborg suit" - desc = "An ordinary cardboard box with holes cut in the sides." - icon_state = "cardborg" - item_state = "cardborg" - body_parts_covered = UPPER_TORSO|LOWER_TORSO - flags_inv = HIDEJUMPSUIT - species_disguise = "High-tech robot" - -/obj/item/clothing/suit/cardborg/equipped(mob/living/user, slot) - ..() - if(slot == slot_wear_suit) - disguise(user) - -/obj/item/clothing/suit/cardborg/dropped(mob/living/user) - ..() - user.remove_alt_appearance("standard_borg_disguise") - -/obj/item/clothing/suit/cardborg/proc/disguise(mob/living/carbon/human/H, obj/item/clothing/head/cardborg/borghead) - if(istype(H)) - if(!borghead) - borghead = H.head - if(istype(borghead, /obj/item/clothing/head/cardborg)) //why is this done this way? because equipped() is called BEFORE THE ITEM IS IN THE SLOT WHYYYY - var/image/I = image(icon = 'icons/mob/robots.dmi' , icon_state = "robot", loc = H) - I.override = 1 - I.overlays += image(icon = 'icons/mob/robots.dmi' , icon_state = "eyes-robot") //gotta look realistic - H.add_alt_appearance("standard_borg_disguise", I, GLOB.silicon_mob_list+H) //you look like a robot to robots! (including yourself because you're totally a robot) - -/obj/item/clothing/suit/snowman - name = "snowman outfit" - desc = "Two white spheres covered in white glitter. 'Tis the season." - icon_state = "snowman" - item_state = "snowman" - body_parts_covered = UPPER_TORSO|LOWER_TORSO - flags_inv = HIDEJUMPSUIT - -/obj/item/clothing/suit/poncho - name = "poncho" - desc = "Your classic, non-racist poncho." - icon_state = "classicponcho" - item_state = "classicponcho" - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -/obj/item/clothing/suit/poncho/green - name = "green poncho" - desc = "Your classic, non-racist poncho. This one is green." - icon_state = "greenponcho" - item_state = "greenponcho" - -/obj/item/clothing/suit/poncho/red - name = "red poncho" - desc = "Your classic, non-racist poncho. This one is red." - icon_state = "redponcho" - item_state = "redponcho" - -/obj/item/clothing/suit/poncho/ponchoshame - name = "poncho of shame" - desc = "Forced to live on your shameful acting as a fake Mexican, you and your poncho have grown inseperable. Literally." - icon_state = "ponchoshame" - item_state = "ponchoshame" - flags = NODROP - -/obj/item/clothing/suit/hooded/carp_costume - name = "carp costume" - desc = "A costume made from 'synthetic' carp scales, it smells." - icon_state = "carp_casual" - item_state = "labcoat" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too - allowed = list(/obj/item/tank/emergency_oxygen) - hoodtype = /obj/item/clothing/head/hooded/carp_hood - -/obj/item/clothing/head/hooded/carp_hood - name = "carp hood" - desc = "A hood attached to a carp costume." - icon_state = "carp_casual" - body_parts_covered = HEAD - cold_protection = HEAD - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - flags = BLOCKHAIR - flags_inv = HIDEEARS - -/obj/item/clothing/suit/hooded/bee_costume // It's Hip! - name = "bee costume" - desc = "Bee the true Queen!" - icon_state = "bee" - item_state = "labcoat" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - flags = THICKMATERIAL - hoodtype = /obj/item/clothing/head/hooded/bee_hood - -/obj/item/clothing/head/hooded/bee_hood - name = "bee hood" - desc = "A hood attached to a bee costume." - icon_state = "bee" - body_parts_covered = HEAD - flags = THICKMATERIAL|BLOCKHAIR - flags_inv = HIDEEARS - -/obj/item/clothing/suit/bloated_human //OH MY GOD WHAT HAVE YOU DONE!?!?!? - name = "bloated human suit" - desc = "A horribly bloated suit made from human skins." - icon_state = "lingspacesuit" - item_state = "lingspacesuit" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - -/obj/item/clothing/suit/draculacoat // Bleh! - name = "transylvanian coat" - desc = "What is a spessman? A miserable little pile of secrets." - icon_state = "draculacoat" - item_state = "draculacoat" - -/* - * Winter Coats - */ - -/obj/item/clothing/suit/hooded/wintercoat - name = "winter coat" - desc = "A heavy jacket made from 'synthetic' animal furs." - icon_state = "wintercoat" - item_state = "labcoat" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) - allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) - species_fit = list("Vox") - sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi') - -/obj/item/clothing/head/hooded/winterhood - name = "winter hood" - desc = "A hood attached to a heavy winter jacket." - icon_state = "winterhood" - body_parts_covered = HEAD - cold_protection = HEAD - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - flags = BLOCKHAIR - flags_inv = HIDEEARS - species_fit = list("Vox") - sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi') - -/obj/item/clothing/suit/hooded/wintercoat/captain - name = "captain's winter coat" - icon_state = "wintercoat_captain" - armor = list(melee = 25, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0) - allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic) - hoodtype = /obj/item/clothing/head/hooded/winterhood/captain - -/obj/item/clothing/head/hooded/winterhood/captain - icon_state = "winterhood_captain" - -/obj/item/clothing/suit/hooded/wintercoat/security - name = "security winter coat" - icon_state = "wintercoat_sec" - armor = list(melee = 10, bullet = 10, laser = 10, energy = 5, bomb = 15, bio = 0, rad = 0) - allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic) - hoodtype = /obj/item/clothing/head/hooded/winterhood/security - -/obj/item/clothing/head/hooded/winterhood/security - icon_state = "winterhood_sec" - -/obj/item/clothing/suit/hooded/wintercoat/medical - name = "medical winter coat" - icon_state = "wintercoat_med" - allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0) - hoodtype = /obj/item/clothing/head/hooded/winterhood/medical - -/obj/item/clothing/head/hooded/winterhood/medical - icon_state = "winterhood_med" - -/obj/item/clothing/suit/hooded/wintercoat/science - name = "science winter coat" - icon_state = "wintercoat_sci" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0) - hoodtype = /obj/item/clothing/head/hooded/winterhood/science - -/obj/item/clothing/head/hooded/winterhood/science - icon_state = "winterhood_sci" - -/obj/item/clothing/suit/hooded/wintercoat/engineering - name = "engineering winter coat" - icon_state = "wintercoat_engi" - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20) - allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/t_scanner, /obj/item/rcd) - hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering - -/obj/item/clothing/head/hooded/winterhood/engineering - icon_state = "winterhood_engi" - -/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos - name = "atmospherics winter coat" - icon_state = "wintercoat_atmos" - hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering/atmos - -/obj/item/clothing/head/hooded/winterhood/engineering/atmos - icon_state = "winterhood_atmos" - -/obj/item/clothing/suit/hooded/wintercoat/hydro - name = "hydroponics winter coat" - icon_state = "wintercoat_hydro" - allowed = list(/obj/item/reagent_containers/spray, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/hatchet, /obj/item/storage/bag/plants) - hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro - -/obj/item/clothing/head/hooded/winterhood/hydro - icon_state = "winterhood_hydro" - -/obj/item/clothing/suit/hooded/wintercoat/cargo - name = "cargo winter coat" - icon_state = "wintercoat_cargo" - hoodtype = /obj/item/clothing/head/hooded/winterhood/cargo - -/obj/item/clothing/head/hooded/winterhood/cargo - icon_state = "winterhood_cargo" - -/obj/item/clothing/suit/hooded/wintercoat/miner - name = "mining winter coat" - icon_state = "wintercoat_miner" - allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) - armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) - hoodtype = /obj/item/clothing/head/hooded/winterhood/miner - -/obj/item/clothing/head/hooded/winterhood/miner - icon_state = "winterhood_miner" - - -/* - * Misc - */ - -//hoodies -/obj/item/clothing/suit/hooded/hoodie - name = "black hoodie" - desc = "It's a hoodie. It has a hood. Most hoodies do." - icon_state = "black_hoodie" - item_state = "blueshieldcoat" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen) - hoodtype = /obj/item/clothing/head/hooded/hood - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -/obj/item/clothing/head/hooded/hood - name = "black hood" - desc = "A hood attached to a hoodie." - icon_state = "blackhood" - body_parts_covered = HEAD - cold_protection = HEAD - flags = BLOCKHAIR - flags_inv = HIDEEARS - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/head.dmi' - ) - -/obj/item/clothing/head/hooded/hood/blue - icon_state = "bluehood" - -/obj/item/clothing/head/hooded/hood/white - icon_state = "whitehood" - -/obj/item/clothing/suit/hooded/hoodie/blue - name = "blue hoodie" - icon_state = "blue_hoodie" - hoodtype = /obj/item/clothing/head/hooded/hood/blue - -/obj/item/clothing/suit/hooded/hoodie/mit - name = "Martian Institute of Technology hoodie" - desc = "A hoodie proudly worn by students and graduates alike, has the letters 'MIT' on the back." - icon_state = "mit_hoodie" - hoodtype = /obj/item/clothing/head/hooded/hood - -/obj/item/clothing/suit/hooded/hoodie/cut - name = "Canaan University of Technology hoodie" - desc = "A bright hoodie with the Canaan University of Technology logo on the front." - icon_state = "cut_hoodie" - hoodtype = /obj/item/clothing/head/hooded/hood/white - -/obj/item/clothing/suit/hooded/hoodie/lam - name = "Lunar Academy of Medicine hoodie" - desc = "A bright hoodie with the Lunar Academy of Medicine logo on the back." - icon_state = "lam_hoodie" - hoodtype = /obj/item/clothing/head/hooded/hood/white - -/obj/item/clothing/suit/hooded/hoodie/nt - name = "Nanotrasen hoodie" - desc = "A blue hoodie with the Nanotrasen logo on the back." - icon_state = "nt_hoodie" - hoodtype = /obj/item/clothing/head/hooded/hood/blue - -/obj/item/clothing/suit/hooded/hoodie/tp - name = "Tharsis Polytech hoodie" - desc = "A dark hoodie with the Tharsis Polytech logo on the back." - icon_state = "tp_hoodie" - hoodtype = /obj/item/clothing/head/hooded/hood - -/obj/item/clothing/suit/straight_jacket - name = "straight jacket" - desc = "A suit that completely restrains the wearer." - icon_state = "straight_jacket" - item_state = "straight_jacket" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL - flags_size = ONESIZEFITSALL - strip_delay = 60 - breakouttime = 3000 - -/obj/item/clothing/suit/ianshirt - name = "worn shirt" - desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it but it's pretty close. Good for sleeping in." - icon_state = "ianshirt" - item_state = "ianshirt" - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - - - -//pyjamas -//originally intended to be pinstripes >.> - -/obj/item/clothing/under/bluepyjamas - name = "blue pyjamas" - desc = "Slightly old-fashioned sleepwear." - icon_state = "blue_pyjamas" - item_state = "blue_pyjamas" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - -/obj/item/clothing/under/redpyjamas - name = "red pyjamas" - desc = "Slightly old-fashioned sleepwear." - icon_state = "red_pyjamas" - item_state = "red_pyjamas" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - -//coats - -/obj/item/clothing/suit/leathercoat - name = "leather coat" - desc = "A long, thick black leather coat." - icon_state = "leathercoat" - item_state = "leathercoat" - burn_state = FIRE_PROOF - -/obj/item/clothing/suit/browncoat - name = "brown leather coat" - desc = "A long, brown leather coat." - icon_state = "browncoat" - item_state = "browncoat" - -/obj/item/clothing/suit/neocoat - name = "black coat" - desc = "A flowing, black coat." - icon_state = "neocoat" - item_state = "neocoat" - -/obj/item/clothing/suit/browntrenchcoat - name = "brown trench coat" - desc = "It makes you stand out. Just the opposite of why it's typically worn. Nice try trying to blend in while wearing it." - icon_state = "brtrenchcoat" - item_state = "brtrenchcoat" - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -/obj/item/clothing/suit/blacktrenchcoat - name = "black trench coat" - desc = "That shade of black just makes you look a bit more evil. Good for those mafia types." - icon_state = "bltrenchcoat" - item_state = "bltrenchcoat" - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -//trackjackets - -/obj/item/clothing/suit/tracksuit - name = "black tracksuit" - desc = "Lightweight and stylish. What else could a man ask of his tracksuit?" - icon_state = "trackjacket_open" - item_state = "bltrenchcoat" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - ignore_suitadjust = 0 - suit_adjusted = 1 - actions_types = list(/datum/action/item_action/openclose) - adjust_flavour = "unzip" - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -/obj/item/clothing/suit/tracksuit/green - name = "green tracksuit" - icon_state = "trackjacketgreen_open" - -/obj/item/clothing/suit/tracksuit/red - name = "red tracksuit" - icon_state = "trackjacketred_open" - -/obj/item/clothing/suit/tracksuit/white - name = "white tracksuit" - icon_state = "trackjacketwhite_open" - -//actual suits - -/obj/item/clothing/suit/creamsuit - name = "cream suit" - desc = "A cream coloured, genteel suit." - icon_state = "creamsuit" - item_state = "creamsuit" - -/obj/item/clothing/under/stripper/mankini - name = "the mankini" - desc = "No honest man would wear this abomination" - icon_state = "mankini" - item_color = "mankini" - -/obj/item/clothing/suit/jacket/miljacket - name = "olive military jacket" - desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one comes in olive." - icon_state = "militaryjacket" - item_state = "militaryjacket" - ignore_suitadjust = 1 - actions_types = list() - adjust_flavour = null - allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter,/obj/item/gun/projectile/automatic/pistol,/obj/item/gun/projectile/revolver,/obj/item/gun/projectile/revolver/detective) - -/obj/item/clothing/suit/jacket/miljacket/navy - name = "navy military jacket" - desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one comes in navy blue." - icon_state = "navy_jacket" - -/obj/item/clothing/suit/jacket/miljacket/desert - name = "desert military jacket" - desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one comes in desert beige." - icon_state = "desert_jacket" - -/obj/item/clothing/suit/jacket/miljacket/white - name = "white military jacket" - desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one comes in snow white." - icon_state = "white_jacket" - -/obj/item/clothing/suit/xenos - name = "xenos suit" - desc = "A suit made out of chitinous alien hide." - icon_state = "xenos" - item_state = "xenos_helm" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - flags_size = ONESIZEFITSALL - -//swimsuit -/obj/item/clothing/under/swimsuit/ - -/obj/item/clothing/under/swimsuit/black - name = "black swimsuit" - desc = "An oldfashioned black swimsuit." - icon_state = "swim_black" - item_color = "swim_black" - -/obj/item/clothing/under/swimsuit/blue - name = "blue swimsuit" - desc = "An oldfashioned blue swimsuit." - icon_state = "swim_blue" - item_color = "swim_blue" - -/obj/item/clothing/under/swimsuit/purple - name = "purple swimsuit" - desc = "An oldfashioned purple swimsuit." - icon_state = "swim_purp" - item_color = "swim_purp" - -/obj/item/clothing/under/swimsuit/green - name = "green swimsuit" - desc = "An oldfashioned green swimsuit." - icon_state = "swim_green" - item_color = "swim_green" - -/obj/item/clothing/under/swimsuit/red - name = "red swimsuit" - desc = "An oldfashioned red swimsuit." - icon_state = "swim_red" - item_color = "swim_red" - -/obj/item/clothing/suit/storage/mercy_hoodie - name = "mercy robe" - desc = "A soft white robe made of a synthetic fiber that provides improved protection against biohazards. Possessing multiple overlapping layers, yet light enough to allow complete freedom of movement, it denotes its wearer as a master physician." - icon_state = "mercy_hoodie" - item_state = "mercy_hoodie" - w_class = WEIGHT_CLASS_BULKY - gas_transfer_coefficient = 0.01 - permeability_coefficient = 0.01 - flags_size = ONESIZEFITSALL - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/pen,/obj/item/flashlight/pen) - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL - -/obj/item/clothing/head/mercy_hood - name = "Mercy Hood" - desc = "A soft white hood made of a synthetic fiber that provides improved protection against biohazards. Its elegant design allows a clear field of vision." - icon_state = "mercy_hood" - item_state = "mercy_hood" - permeability_coefficient = 0.01 - flags = BLOCKHAIR - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES - -/obj/item/clothing/suit/jacket - name = "bomber jacket" - desc = "Aviators not included." - icon_state = "bomber" - item_state = "bomber" - ignore_suitadjust = 0 - allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter) - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS - actions_types = list(/datum/action/item_action/zipper) - adjust_flavour = "unzip" - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -/obj/item/clothing/suit/jacket/pilot - name = "security bomber jacket" - desc = "A stylish and worn-in armoured black bomber jacket emblazoned with the NT Security crest on the left breast. Looks rugged." - icon_state = "bombersec" - item_state = "bombersec" - ignore_suitadjust = 0 - //Inherited from Security armour. - allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/flashlight/seclite,/obj/item/melee/classic_baton/telescopic,/obj/item/kitchen/knife/combat) - heat_protection = UPPER_TORSO|LOWER_TORSO - min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT - max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT - strip_delay = 60 - put_on_delay = 40 - flags_size = ONESIZEFITSALL - armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) - //End of inheritance from Security armour. - -/obj/item/clothing/suit/jacket/leather - name = "leather jacket" - desc = "Pompadour not included." - icon_state = "leatherjacket" - ignore_suitadjust = 1 - actions_types = list() - adjust_flavour = null - burn_state = FIRE_PROOF - -/obj/item/clothing/suit/jacket/leather/overcoat - name = "leather overcoat" - desc = "That's a damn fine coat." - icon_state = "leathercoat" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - -/obj/item/clothing/suit/officercoat - name = "Clown Officer's Coat" - desc = "A classy clown officer's overcoat, also designed by Hugo Boss." - icon_state = "officersuit" - item_state = "officersuit" - ignore_suitadjust = 0 - actions_types = list(/datum/action/item_action/button) - adjust_flavour = "unbutton" - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -/obj/item/clothing/suit/soldiercoat - name = "Clown Soldier's Coat" - desc = "An overcoat for the clown soldier, to keep him warm during those cold winter nights on the front." - icon_state = "soldiersuit" - item_state = "soldiersuit" - ignore_suitadjust = 0 - actions_types = list(/datum/action/item_action/button) - adjust_flavour = "unbutton" - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) - -/obj/item/clothing/suit/toggle/owlwings - name = "owl cloak" - desc = "A soft brown cloak made of synthetic feathers. Soft to the touch, stylish, and a 2 meter wing span that will drive the ladies mad." - icon_state = "owl_wings" - item_state = "owl_wings" - body_parts_covered = ARMS - armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) - allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/flashlight/seclite) - actions_types = list(/datum/action/item_action/toggle_wings) - - -/obj/item/clothing/suit/toggle/owlwings/griffinwings - name = "griffon cloak" - desc = "A plush white cloak made of synthetic feathers. Soft to the touch, stylish, and a 2 meter wing span that will drive your captives mad." - icon_state = "griffin_wings" - item_state = "griffin_wings" - -/obj/item/clothing/suit/toggle/attack_self() - if(icon_state == initial(icon_state)) - icon_state = icon_state + "_t" - item_state = icon_state + "_t" - else - icon_state = initial(icon_state) - item_state = initial(item_state) - usr.update_inv_wear_suit() - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() - -/obj/item/clothing/suit/lordadmiral - name = "Lord Admiral's Coat" - desc = "You'll be the Ruler of the King's Navy in no time." - icon_state = "lordadmiral" - item_state = "lordadmiral" - allowed = list (/obj/item/gun) - -/obj/item/clothing/suit/fluff/noble_coat - name = "noble coat" - desc = "The livid blues, purples and greens are awesome enough to evoke a visceral response in you; it is not dissimilar to indigestion." - icon_state = "noble_coat" - item_state = "noble_coat" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - - -///Advanced Protective Suit, AKA, God Mode in wearable form. - -/obj/item/clothing/suit/advanced_protective_suit - name = "Advanced Protective Suit" - desc = "An incredibly advanced and complex suit; it has so many buttons and dials as to be incomprehensible." - icon_state = "bomb" - item_state = "bomb" - actions_types = list(/datum/action/item_action/toggle) - gas_transfer_coefficient = 0.01 - permeability_coefficient = 0.01 - flags = STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD - armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100) - cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - heat_protection = UPPER_TORSO | LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT - slowdown = -10 - siemens_coefficient = 0 - var/on = 0 - -/obj/item/clothing/suit/advanced_protective_suit/Destroy() - if(on) - on = 0 - processing_objects.Remove(src) - return ..() - -/obj/item/clothing/suit/advanced_protective_suit/ui_action_click() - if(on) - on = 0 - to_chat(usr, "You turn the suit's special processes off.") - else - on = 1 - to_chat(usr, "You turn the suit's special processes on.") - processing_objects.Add(src) - - -/obj/item/clothing/suit/advanced_protective_suit/IsReflect() - return (on) - -/obj/item/clothing/suit/advanced_protective_suit/process() - if(on) - var/mob/living/carbon/human/user = src.loc - if(user && ishuman(user) && (user.wear_suit == src)) - if(user.reagents.get_reagent_amount("stimulants") < 15) - user.reagents.add_reagent("stimulants", 15) - if(user.reagents.get_reagent_amount("adminordrazine") < 15) - user.reagents.add_reagent("adminordrazine", 15) - if(user.reagents.get_reagent_amount("nanites") < 15) - user.reagents.add_reagent("nanites", 15) - if(user.reagents.get_reagent_amount("syndicate_nanites") < 15) - user.reagents.add_reagent("syndicate_nanites", 15) - else - processing_objects.Remove(src) - -//Syndicate Chaplain Robe (WOLOLO!) -/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe - description_antag = "This robe is made of reinforced fibers, granting it superior protection. The robes also wirelessly generate power for the neurotransmitter in the linked missionary staff while being worn." - armor = list(melee = 10, bullet = 10, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 15) - var/obj/item/nullrod/missionary_staff/linked_staff = null - -/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/Destroy() - if(linked_staff) //delink on destruction - linked_staff.robes = null - linked_staff = null - processing_objects -= src //probably is cleared in a parent call already, but just in case we're gonna do it here - return ..() - -/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/equipped(mob/living/carbon/human/H, slot) - if(!istype(H) || slot != slot_wear_suit) - processing_objects -= src - return - else - processing_objects |= src - -/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/process() - if(!linked_staff) //if we don't have a linked staff, the rest of this is useless - return - - if(!ishuman(loc)) //if we somehow try to process while not on a human, remove ourselves from processing and return - processing_objects -= src - return - - var/mob/living/carbon/human/H = loc - - if(linked_staff.faith >= 100) //if the linked staff is fully recharged, do nothing - return - - if(!linked_staff in range(3, get_turf(src))) //staff won't charge at range (to prevent it from being handed off / stolen and used) - if(prob(10)) //10% chance per process should avoid being too spammy, can tweak if it ends up still being too frequent. - to_chat(H, "Your staff is unable to charge at this range. Get closer!") - return - - linked_staff.faith += 5 - if(linked_staff.faith >= 100) //if this charge puts the staff at or above full, notify the wearer - to_chat(H, "Faith renewed; ready to convert new followers.") - -/obj/item/clothing/suit/tailcoat - name = "victorian tailcoat" - desc = "A fancy victorian tailcoat." - icon_state = "tailcoat" - item_state = "tailcoat" - -/obj/item/clothing/suit/victcoat - name = "ladies victorian coat" - desc = "A fancy victorian coat." - icon_state = "ladiesvictoriancoat" - item_state = "ladiesvictoriancoat" - -/obj/item/clothing/suit/victcoat/red - name = "ladies red victorian coat" - icon_state = "ladiesredvictoriancoat" - item_state = "ladiesredvictoriancoat" +/* + * Contains: + * Lasertag + * Costume + * Winter Coats + * Misc + */ + +/* + * Lasertag + */ +/obj/item/clothing/suit/bluetag + name = "blue laser tag armour" + desc = "Blue Pride, Station Wide." + icon_state = "bluetag" + item_state = "bluetag" + blood_overlay_type = "armor" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + allowed = list (/obj/item/gun/energy/laser/tag/blue) + burn_state = FIRE_PROOF + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +/obj/item/clothing/suit/redtag + name = "red laser tag armour" + desc = "Pew pew pew." + icon_state = "redtag" + item_state = "redtag" + blood_overlay_type = "armor" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + allowed = list (/obj/item/gun/energy/laser/tag/red) + burn_state = FIRE_PROOF + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +/* + * Costume + */ +/obj/item/clothing/suit/pirate_brown + name = "brown pirate coat" + desc = "Yarr." + icon_state = "pirate_old" + item_state = "pirate_old" + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +/obj/item/clothing/suit/pirate_black + name = "black pirate coat" + desc = "Yarr." + icon_state = "pirate" + item_state = "pirate" + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +/obj/item/clothing/suit/hgpirate + name = "pirate captain coat" + desc = "Yarr." + icon_state = "hgpirate" + item_state = "hgpirate" + flags_inv = HIDEJUMPSUIT + + +/obj/item/clothing/suit/cyborg_suit + name = "cyborg suit" + desc = "Suit for a cyborg costume." + icon_state = "death" + item_state = "death" + flags = CONDUCT + fire_resist = T0C+5200 + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + + +/obj/item/clothing/suit/greatcoat + name = "great coat" + desc = "A Nazi great coat." + icon_state = "nazi" + item_state = "nazi" + + +/obj/item/clothing/suit/johnny_coat + name = "johnny~~ coat" + desc = "Johnny~~" + icon_state = "johnny" + item_state = "johnny" + + +/obj/item/clothing/suit/justice + name = "justice suit" + desc = "this pretty much looks ridiculous" + icon_state = "justice" + item_state = "justice" + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + + +/obj/item/clothing/suit/judgerobe + name = "judge's robe" + desc = "This robe commands authority." + icon_state = "judge" + item_state = "judge" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + allowed = list(/obj/item/storage/fancy/cigarettes,/obj/item/stack/spacecash) + flags_inv = HIDEJUMPSUIT + + +/obj/item/clothing/suit/wcoat + name = "waistcoat" + desc = "For some classy, murderous fun." + icon_state = "vest" + item_state = "wcoat" + blood_overlay_type = "armor" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +/obj/item/clothing/suit/apron/overalls + name = "coveralls" + desc = "A set of denim overalls." + icon_state = "overalls" + item_state = "overalls" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS + + +/obj/item/clothing/suit/syndicatefake + name = "black and red space suit replica" + icon_state = "syndicate-black-red" + item_state = "syndicate-black-red" + desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!" + w_class = WEIGHT_CLASS_NORMAL + allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy) + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + burn_state = FIRE_PROOF + + +/obj/item/clothing/suit/hastur + name = "Hastur's robes" + desc = "Robes not meant to be worn by man." + icon_state = "hastur" + item_state = "hastur" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + + +/obj/item/clothing/suit/imperium_monk + name = "imperium monk" + desc = "Have YOU killed a xeno today?" + icon_state = "imperium_monk" + item_state = "imperium_monk" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + flags_inv = HIDESHOES|HIDEJUMPSUIT + allowed = list(/obj/item/storage/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/emergency_oxygen) + +/obj/item/clothing/suit/chickensuit + name = "chicken suit" + desc = "A suit made long ago by the ancient empire KFC." + icon_state = "chickensuit" + item_state = "chickensuit" + body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET + flags_inv = HIDESHOES|HIDEJUMPSUIT + +/obj/item/clothing/suit/corgisuit + name = "corgi suit" + desc = "A suit made long ago by the ancient empire KFC." + icon_state = "corgisuit" + item_state = "chickensuit" + body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET + flags_inv = HIDESHOES|HIDEJUMPSUIT + +/obj/item/clothing/suit/corgisuit/super_hero + name = "super-hero corgi suit" + desc = "A suit made long ago by the ancient empire KFC. This one pulses with a strange power." + flags = NODROP + +/obj/item/clothing/suit/corgisuit/super_hero/en + name = "\improper super-hero E-N suit" + icon_state = "ensuit" + +/obj/item/clothing/suit/corgisuit/super_hero/en/New() + ..() + START_PROCESSING(SSobj, src) + +/obj/item/clothing/suit/corgisuit/super_hero/en/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/clothing/suit/corgisuit/super_hero/en/process() + if(prob(2)) + for(var/obj/M in orange(2,src)) + if(!M.anchored && (M.flags & CONDUCT)) + step_towards(M,src) + for(var/mob/living/silicon/S in orange(2,src)) + if(istype(S, /mob/living/silicon/ai)) continue + step_towards(S,src) + for(var/mob/living/carbon/human/machine/M in orange(2,src)) + step_towards(M,src) + +/obj/item/clothing/suit/monkeysuit + name = "monkey suit" + desc = "A suit that looks like a primate" + icon_state = "monkeysuit" + item_state = "monkeysuit" + body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET|HANDS + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + + +/obj/item/clothing/suit/holidaypriest + name = "holiday priest" + desc = "This is a nice holiday my son." + icon_state = "holidaypriest" + item_state = "holidaypriest" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + flags_inv = HIDEJUMPSUIT + allowed = list(/obj/item/storage/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/emergency_oxygen) + +/obj/item/clothing/suit/cardborg + name = "cardborg suit" + desc = "An ordinary cardboard box with holes cut in the sides." + icon_state = "cardborg" + item_state = "cardborg" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + flags_inv = HIDEJUMPSUIT + species_disguise = "High-tech robot" + +/obj/item/clothing/suit/cardborg/equipped(mob/living/user, slot) + ..() + if(slot == slot_wear_suit) + disguise(user) + +/obj/item/clothing/suit/cardborg/dropped(mob/living/user) + ..() + user.remove_alt_appearance("standard_borg_disguise") + +/obj/item/clothing/suit/cardborg/proc/disguise(mob/living/carbon/human/H, obj/item/clothing/head/cardborg/borghead) + if(istype(H)) + if(!borghead) + borghead = H.head + if(istype(borghead, /obj/item/clothing/head/cardborg)) //why is this done this way? because equipped() is called BEFORE THE ITEM IS IN THE SLOT WHYYYY + var/image/I = image(icon = 'icons/mob/robots.dmi' , icon_state = "robot", loc = H) + I.override = 1 + I.overlays += image(icon = 'icons/mob/robots.dmi' , icon_state = "eyes-robot") //gotta look realistic + H.add_alt_appearance("standard_borg_disguise", I, GLOB.silicon_mob_list+H) //you look like a robot to robots! (including yourself because you're totally a robot) + +/obj/item/clothing/suit/snowman + name = "snowman outfit" + desc = "Two white spheres covered in white glitter. 'Tis the season." + icon_state = "snowman" + item_state = "snowman" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + flags_inv = HIDEJUMPSUIT + +/obj/item/clothing/suit/poncho + name = "poncho" + desc = "Your classic, non-racist poncho." + icon_state = "classicponcho" + item_state = "classicponcho" + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +/obj/item/clothing/suit/poncho/green + name = "green poncho" + desc = "Your classic, non-racist poncho. This one is green." + icon_state = "greenponcho" + item_state = "greenponcho" + +/obj/item/clothing/suit/poncho/red + name = "red poncho" + desc = "Your classic, non-racist poncho. This one is red." + icon_state = "redponcho" + item_state = "redponcho" + +/obj/item/clothing/suit/poncho/ponchoshame + name = "poncho of shame" + desc = "Forced to live on your shameful acting as a fake Mexican, you and your poncho have grown inseperable. Literally." + icon_state = "ponchoshame" + item_state = "ponchoshame" + flags = NODROP + +/obj/item/clothing/suit/hooded/carp_costume + name = "carp costume" + desc = "A costume made from 'synthetic' carp scales, it smells." + icon_state = "carp_casual" + item_state = "labcoat" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too + allowed = list(/obj/item/tank/emergency_oxygen) + hoodtype = /obj/item/clothing/head/hooded/carp_hood + +/obj/item/clothing/head/hooded/carp_hood + name = "carp hood" + desc = "A hood attached to a carp costume." + icon_state = "carp_casual" + body_parts_covered = HEAD + cold_protection = HEAD + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + flags = BLOCKHAIR + flags_inv = HIDEEARS + +/obj/item/clothing/suit/hooded/bee_costume // It's Hip! + name = "bee costume" + desc = "Bee the true Queen!" + icon_state = "bee" + item_state = "labcoat" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + flags = THICKMATERIAL + hoodtype = /obj/item/clothing/head/hooded/bee_hood + +/obj/item/clothing/head/hooded/bee_hood + name = "bee hood" + desc = "A hood attached to a bee costume." + icon_state = "bee" + body_parts_covered = HEAD + flags = THICKMATERIAL|BLOCKHAIR + flags_inv = HIDEEARS + +/obj/item/clothing/suit/bloated_human //OH MY GOD WHAT HAVE YOU DONE!?!?!? + name = "bloated human suit" + desc = "A horribly bloated suit made from human skins." + icon_state = "lingspacesuit" + item_state = "lingspacesuit" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + +/obj/item/clothing/suit/draculacoat // Bleh! + name = "transylvanian coat" + desc = "What is a spessman? A miserable little pile of secrets." + icon_state = "draculacoat" + item_state = "draculacoat" + +/* + * Winter Coats + */ + +/obj/item/clothing/suit/hooded/wintercoat + name = "winter coat" + desc = "A heavy jacket made from 'synthetic' animal furs." + icon_state = "wintercoat" + item_state = "coatwinter" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) + allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + + sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi') + +/obj/item/clothing/head/hooded/winterhood + name = "winter hood" + desc = "A hood attached to a heavy winter jacket." + icon_state = "winterhood" + body_parts_covered = HEAD + cold_protection = HEAD + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + flags = BLOCKHAIR + flags_inv = HIDEEARS + + sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi') + +/obj/item/clothing/suit/hooded/wintercoat/captain + name = "captain's winter coat" + icon_state = "wintercoat_captain" + item_state = "coatcaptain" + armor = list(melee = 25, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0) + allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic) + hoodtype = /obj/item/clothing/head/hooded/winterhood/captain + +/obj/item/clothing/head/hooded/winterhood/captain + icon_state = "winterhood_captain" + +/obj/item/clothing/suit/hooded/wintercoat/security + name = "security winter coat" + icon_state = "wintercoat_sec" + item_state = "coatsecurity" + armor = list(melee = 10, bullet = 10, laser = 10, energy = 5, bomb = 15, bio = 0, rad = 0) + allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic) + hoodtype = /obj/item/clothing/head/hooded/winterhood/security + +/obj/item/clothing/head/hooded/winterhood/security + icon_state = "winterhood_sec" + +/obj/item/clothing/suit/hooded/wintercoat/medical + name = "medical winter coat" + icon_state = "wintercoat_med" + item_state = "coatmedical" + allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0) + hoodtype = /obj/item/clothing/head/hooded/winterhood/medical + +/obj/item/clothing/head/hooded/winterhood/medical + icon_state = "winterhood_med" + +/obj/item/clothing/suit/hooded/wintercoat/science + name = "science winter coat" + icon_state = "wintercoat_sci" + item_state = "coatscience" + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0) + hoodtype = /obj/item/clothing/head/hooded/winterhood/science + +/obj/item/clothing/head/hooded/winterhood/science + icon_state = "winterhood_sci" + +/obj/item/clothing/suit/hooded/wintercoat/engineering + name = "engineering winter coat" + icon_state = "wintercoat_engi" + item_state = "coatengineer" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20) + allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/t_scanner, /obj/item/rcd) + hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering + +/obj/item/clothing/head/hooded/winterhood/engineering + icon_state = "winterhood_engi" + +/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos + name = "atmospherics winter coat" + icon_state = "wintercoat_atmos" + hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering/atmos + item_state = "coatatmos" + +/obj/item/clothing/head/hooded/winterhood/engineering/atmos + icon_state = "winterhood_atmos" + +/obj/item/clothing/suit/hooded/wintercoat/hydro + name = "hydroponics winter coat" + icon_state = "wintercoat_hydro" + item_state = "coathydro" + allowed = list(/obj/item/reagent_containers/spray, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/hatchet, /obj/item/storage/bag/plants) + hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro + +/obj/item/clothing/head/hooded/winterhood/hydro + icon_state = "winterhood_hydro" + +/obj/item/clothing/suit/hooded/wintercoat/cargo + name = "cargo winter coat" + icon_state = "wintercoat_cargo" + hoodtype = /obj/item/clothing/head/hooded/winterhood/cargo + item_state = "coatcargo" + +/obj/item/clothing/head/hooded/winterhood/cargo + icon_state = "winterhood_cargo" + +/obj/item/clothing/suit/hooded/wintercoat/miner + name = "mining winter coat" + icon_state = "wintercoat_miner" + item_state = "coatminer" + allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + hoodtype = /obj/item/clothing/head/hooded/winterhood/miner + +/obj/item/clothing/head/hooded/winterhood/miner + icon_state = "winterhood_miner" + + +/* + * Misc + */ + +//hoodies +/obj/item/clothing/suit/hooded/hoodie + name = "black hoodie" + desc = "It's a hoodie. It has a hood. Most hoodies do." + icon_state = "black_hoodie" + item_state = "blueshieldcoat" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen) + hoodtype = /obj/item/clothing/head/hooded/hood + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +/obj/item/clothing/head/hooded/hood + name = "black hood" + desc = "A hood attached to a hoodie." + icon_state = "blackhood" + body_parts_covered = HEAD + cold_protection = HEAD + flags = BLOCKHAIR + flags_inv = HIDEEARS + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi' + ) + +/obj/item/clothing/head/hooded/hood/blue + icon_state = "bluehood" + +/obj/item/clothing/head/hooded/hood/white + icon_state = "whitehood" + +/obj/item/clothing/suit/hooded/hoodie/blue + name = "blue hoodie" + icon_state = "blue_hoodie" + hoodtype = /obj/item/clothing/head/hooded/hood/blue + +/obj/item/clothing/suit/hooded/hoodie/mit + name = "Martian Institute of Technology hoodie" + desc = "A hoodie proudly worn by students and graduates alike, has the letters 'MIT' on the back." + icon_state = "mit_hoodie" + hoodtype = /obj/item/clothing/head/hooded/hood + +/obj/item/clothing/suit/hooded/hoodie/cut + name = "Canaan University of Technology hoodie" + desc = "A bright hoodie with the Canaan University of Technology logo on the front." + icon_state = "cut_hoodie" + hoodtype = /obj/item/clothing/head/hooded/hood/white + +/obj/item/clothing/suit/hooded/hoodie/lam + name = "Lunar Academy of Medicine hoodie" + desc = "A bright hoodie with the Lunar Academy of Medicine logo on the back." + icon_state = "lam_hoodie" + hoodtype = /obj/item/clothing/head/hooded/hood/white + +/obj/item/clothing/suit/hooded/hoodie/nt + name = "Nanotrasen hoodie" + desc = "A blue hoodie with the Nanotrasen logo on the back." + icon_state = "nt_hoodie" + hoodtype = /obj/item/clothing/head/hooded/hood/blue + +/obj/item/clothing/suit/hooded/hoodie/tp + name = "Tharsis Polytech hoodie" + desc = "A dark hoodie with the Tharsis Polytech logo on the back." + icon_state = "tp_hoodie" + hoodtype = /obj/item/clothing/head/hooded/hood + +/obj/item/clothing/suit/straight_jacket + name = "straight jacket" + desc = "A suit that completely restrains the wearer." + icon_state = "straight_jacket" + item_state = "straight_jacket" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL + flags_size = ONESIZEFITSALL + strip_delay = 60 + breakouttime = 3000 + +/obj/item/clothing/suit/ianshirt + name = "worn shirt" + desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it but it's pretty close. Good for sleeping in." + icon_state = "ianshirt" + item_state = "ianshirt" + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + + + +//pyjamas +//originally intended to be pinstripes >.> + +/obj/item/clothing/under/bluepyjamas + name = "blue pyjamas" + desc = "Slightly old-fashioned sleepwear." + icon_state = "blue_pyjamas" + item_state = "blue_pyjamas" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + +/obj/item/clothing/under/redpyjamas + name = "red pyjamas" + desc = "Slightly old-fashioned sleepwear." + icon_state = "red_pyjamas" + item_state = "red_pyjamas" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + +//coats + +/obj/item/clothing/suit/leathercoat + name = "leather coat" + desc = "A long, thick black leather coat." + icon_state = "leathercoat" + item_state = "leathercoat" + burn_state = FIRE_PROOF + +/obj/item/clothing/suit/browncoat + name = "brown leather coat" + desc = "A long, brown leather coat." + icon_state = "browncoat" + item_state = "browncoat" + +/obj/item/clothing/suit/neocoat + name = "black coat" + desc = "A flowing, black coat." + icon_state = "neocoat" + item_state = "neocoat" + +/obj/item/clothing/suit/browntrenchcoat + name = "brown trench coat" + desc = "It makes you stand out. Just the opposite of why it's typically worn. Nice try trying to blend in while wearing it." + icon_state = "brtrenchcoat" + item_state = "brtrenchcoat" + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +/obj/item/clothing/suit/blacktrenchcoat + name = "black trench coat" + desc = "That shade of black just makes you look a bit more evil. Good for those mafia types." + icon_state = "bltrenchcoat" + item_state = "bltrenchcoat" + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +//trackjackets + +/obj/item/clothing/suit/tracksuit + name = "black tracksuit" + desc = "Lightweight and stylish. What else could a man ask of his tracksuit?" + icon_state = "trackjacket_open" + item_state = "bltrenchcoat" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + ignore_suitadjust = 0 + suit_adjusted = 1 + actions_types = list(/datum/action/item_action/openclose) + adjust_flavour = "unzip" + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +/obj/item/clothing/suit/tracksuit/green + name = "green tracksuit" + icon_state = "trackjacketgreen_open" + +/obj/item/clothing/suit/tracksuit/red + name = "red tracksuit" + icon_state = "trackjacketred_open" + +/obj/item/clothing/suit/tracksuit/white + name = "white tracksuit" + icon_state = "trackjacketwhite_open" + +//actual suits + +/obj/item/clothing/suit/creamsuit + name = "cream suit" + desc = "A cream coloured, genteel suit." + icon_state = "creamsuit" + item_state = "creamsuit" + +/obj/item/clothing/under/stripper/mankini + name = "the mankini" + desc = "No honest man would wear this abomination" + icon_state = "mankini" + item_color = "mankini" + +/obj/item/clothing/suit/jacket/miljacket + name = "olive military jacket" + desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one comes in olive." + icon_state = "militaryjacket" + item_state = "militaryjacket" + ignore_suitadjust = 1 + actions_types = list() + adjust_flavour = null + allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter,/obj/item/gun/projectile/automatic/pistol,/obj/item/gun/projectile/revolver,/obj/item/gun/projectile/revolver/detective) + +/obj/item/clothing/suit/jacket/miljacket/navy + name = "navy military jacket" + desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one comes in navy blue." + icon_state = "navy_jacket" + +/obj/item/clothing/suit/jacket/miljacket/desert + name = "desert military jacket" + desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one comes in desert beige." + icon_state = "desert_jacket" + +/obj/item/clothing/suit/jacket/miljacket/white + name = "white military jacket" + desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one comes in snow white." + icon_state = "white_jacket" + +/obj/item/clothing/suit/xenos + name = "xenos suit" + desc = "A suit made out of chitinous alien hide." + icon_state = "xenos" + item_state = "xenos_helm" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags_size = ONESIZEFITSALL + +//swimsuit +/obj/item/clothing/under/swimsuit/ + +/obj/item/clothing/under/swimsuit/black + name = "black swimsuit" + desc = "An oldfashioned black swimsuit." + icon_state = "swim_black" + item_color = "swim_black" + +/obj/item/clothing/under/swimsuit/blue + name = "blue swimsuit" + desc = "An oldfashioned blue swimsuit." + icon_state = "swim_blue" + item_color = "swim_blue" + +/obj/item/clothing/under/swimsuit/purple + name = "purple swimsuit" + desc = "An oldfashioned purple swimsuit." + icon_state = "swim_purp" + item_color = "swim_purp" + +/obj/item/clothing/under/swimsuit/green + name = "green swimsuit" + desc = "An oldfashioned green swimsuit." + icon_state = "swim_green" + item_color = "swim_green" + +/obj/item/clothing/under/swimsuit/red + name = "red swimsuit" + desc = "An oldfashioned red swimsuit." + icon_state = "swim_red" + item_color = "swim_red" + +/obj/item/clothing/suit/storage/mercy_hoodie + name = "mercy robe" + desc = "A soft white robe made of a synthetic fiber that provides improved protection against biohazards. Possessing multiple overlapping layers, yet light enough to allow complete freedom of movement, it denotes its wearer as a master physician." + icon_state = "mercy_hoodie" + item_state = "mercy_hoodie" + w_class = WEIGHT_CLASS_BULKY + gas_transfer_coefficient = 0.01 + permeability_coefficient = 0.01 + flags_size = ONESIZEFITSALL + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/pen,/obj/item/flashlight/pen) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL + +/obj/item/clothing/head/mercy_hood + name = "Mercy Hood" + desc = "A soft white hood made of a synthetic fiber that provides improved protection against biohazards. Its elegant design allows a clear field of vision." + icon_state = "mercy_hood" + item_state = "mercy_hood" + permeability_coefficient = 0.01 + flags = BLOCKHAIR + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES + +/obj/item/clothing/suit/jacket + name = "bomber jacket" + desc = "Aviators not included." + icon_state = "bomber" + item_state = "bomber" + ignore_suitadjust = 0 + allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter) + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS + actions_types = list(/datum/action/item_action/zipper) + adjust_flavour = "unzip" + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +/obj/item/clothing/suit/jacket/pilot + name = "security bomber jacket" + desc = "A stylish and worn-in armoured black bomber jacket emblazoned with the NT Security crest on the left breast. Looks rugged." + icon_state = "bombersec" + item_state = "bombersec" + ignore_suitadjust = 0 + //Inherited from Security armour. + allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/flashlight/seclite,/obj/item/melee/classic_baton/telescopic,/obj/item/kitchen/knife/combat) + heat_protection = UPPER_TORSO|LOWER_TORSO + min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT + max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT + strip_delay = 60 + put_on_delay = 40 + flags_size = ONESIZEFITSALL + armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) + //End of inheritance from Security armour. + +/obj/item/clothing/suit/jacket/leather + name = "leather jacket" + desc = "Pompadour not included." + icon_state = "leatherjacket" + ignore_suitadjust = 1 + actions_types = list() + adjust_flavour = null + burn_state = FIRE_PROOF + +/obj/item/clothing/suit/jacket/leather/overcoat + name = "leather overcoat" + desc = "That's a damn fine coat." + icon_state = "leathercoat" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + +/obj/item/clothing/suit/officercoat + name = "Clown Officer's Coat" + desc = "A classy clown officer's overcoat, also designed by Hugo Boss." + icon_state = "officersuit" + item_state = "officersuit" + ignore_suitadjust = 0 + actions_types = list(/datum/action/item_action/button) + adjust_flavour = "unbutton" + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +/obj/item/clothing/suit/soldiercoat + name = "Clown Soldier's Coat" + desc = "An overcoat for the clown soldier, to keep him warm during those cold winter nights on the front." + icon_state = "soldiersuit" + item_state = "soldiersuit" + ignore_suitadjust = 0 + actions_types = list(/datum/action/item_action/button) + adjust_flavour = "unbutton" + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + +/obj/item/clothing/suit/toggle/owlwings + name = "owl cloak" + desc = "A soft brown cloak made of synthetic feathers. Soft to the touch, stylish, and a 2 meter wing span that will drive the ladies mad." + icon_state = "owl_wings" + item_state = "owl_wings" + body_parts_covered = ARMS + armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/flashlight/seclite) + actions_types = list(/datum/action/item_action/toggle_wings) + + +/obj/item/clothing/suit/toggle/owlwings/griffinwings + name = "griffon cloak" + desc = "A plush white cloak made of synthetic feathers. Soft to the touch, stylish, and a 2 meter wing span that will drive your captives mad." + icon_state = "griffin_wings" + item_state = "griffin_wings" + +/obj/item/clothing/suit/toggle/attack_self() + if(icon_state == initial(icon_state)) + icon_state = icon_state + "_t" + item_state = icon_state + "_t" + else + icon_state = initial(icon_state) + item_state = initial(item_state) + usr.update_inv_wear_suit() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/clothing/suit/lordadmiral + name = "Lord Admiral's Coat" + desc = "You'll be the Ruler of the King's Navy in no time." + icon_state = "lordadmiral" + item_state = "lordadmiral" + allowed = list (/obj/item/gun) + +/obj/item/clothing/suit/fluff/noble_coat + name = "noble coat" + desc = "The livid blues, purples and greens are awesome enough to evoke a visceral response in you; it is not dissimilar to indigestion." + icon_state = "noble_coat" + item_state = "noble_coat" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + + +///Advanced Protective Suit, AKA, God Mode in wearable form. + +/obj/item/clothing/suit/advanced_protective_suit + name = "Advanced Protective Suit" + desc = "An incredibly advanced and complex suit; it has so many buttons and dials as to be incomprehensible." + icon_state = "bomb" + item_state = "bomb" + actions_types = list(/datum/action/item_action/toggle) + gas_transfer_coefficient = 0.01 + permeability_coefficient = 0.01 + flags = STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD + armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100) + cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + heat_protection = UPPER_TORSO | LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + slowdown = -10 + siemens_coefficient = 0 + var/on = 0 + +/obj/item/clothing/suit/advanced_protective_suit/Destroy() + if(on) + on = 0 + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/clothing/suit/advanced_protective_suit/ui_action_click() + if(on) + on = 0 + to_chat(usr, "You turn the suit's special processes off.") + else + on = 1 + to_chat(usr, "You turn the suit's special processes on.") + START_PROCESSING(SSobj, src) + + +/obj/item/clothing/suit/advanced_protective_suit/IsReflect() + return (on) + +/obj/item/clothing/suit/advanced_protective_suit/process() + if(on) + var/mob/living/carbon/human/user = src.loc + if(user && ishuman(user) && (user.wear_suit == src)) + if(user.reagents.get_reagent_amount("stimulants") < 15) + user.reagents.add_reagent("stimulants", 15) + if(user.reagents.get_reagent_amount("adminordrazine") < 15) + user.reagents.add_reagent("adminordrazine", 15) + if(user.reagents.get_reagent_amount("nanites") < 15) + user.reagents.add_reagent("nanites", 15) + if(user.reagents.get_reagent_amount("syndicate_nanites") < 15) + user.reagents.add_reagent("syndicate_nanites", 15) + else + STOP_PROCESSING(SSobj, src) + +//Syndicate Chaplain Robe (WOLOLO!) +/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe + description_antag = "This robe is made of reinforced fibers, granting it superior protection. The robes also wirelessly generate power for the neurotransmitter in the linked missionary staff while being worn." + armor = list(melee = 10, bullet = 10, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 15) + var/obj/item/nullrod/missionary_staff/linked_staff = null + +/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/Destroy() + if(linked_staff) //delink on destruction + linked_staff.robes = null + linked_staff = null + STOP_PROCESSING(SSobj, src) //probably is cleared in a parent call already, but just in case we're gonna do it here + return ..() + +/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/equipped(mob/living/carbon/human/H, slot) + if(!istype(H) || slot != slot_wear_suit) + STOP_PROCESSING(SSobj, src) + return + else + START_PROCESSING(SSobj, src) + +/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/process() + if(!linked_staff) //if we don't have a linked staff, the rest of this is useless + return + + if(!ishuman(loc)) //if we somehow try to process while not on a human, remove ourselves from processing and return + STOP_PROCESSING(SSobj, src) + return + + var/mob/living/carbon/human/H = loc + + if(linked_staff.faith >= 100) //if the linked staff is fully recharged, do nothing + return + + if(!linked_staff in range(3, get_turf(src))) //staff won't charge at range (to prevent it from being handed off / stolen and used) + if(prob(10)) //10% chance per process should avoid being too spammy, can tweak if it ends up still being too frequent. + to_chat(H, "Your staff is unable to charge at this range. Get closer!") + return + + linked_staff.faith += 5 + if(linked_staff.faith >= 100) //if this charge puts the staff at or above full, notify the wearer + to_chat(H, "Faith renewed; ready to convert new followers.") + +/obj/item/clothing/suit/tailcoat + name = "victorian tailcoat" + desc = "A fancy victorian tailcoat." + icon_state = "tailcoat" + item_state = "tailcoat" + +/obj/item/clothing/suit/victcoat + name = "ladies victorian coat" + desc = "A fancy victorian coat." + icon_state = "ladiesvictoriancoat" + item_state = "ladiesvictoriancoat" + +/obj/item/clothing/suit/victcoat/red + name = "ladies red victorian coat" + icon_state = "ladiesredvictoriancoat" + item_state = "ladiesredvictoriancoat" + +//Mantles! +/obj/item/clothing/suit/mantle + name = "mantle" + desc = "A heavy quilted mantle, for keeping your shoulders warm and stylish." + icon_state = "mantle" + item_state = "mantle" + body_parts_covered = UPPER_TORSO|ARMS + cold_protection = UPPER_TORSO|ARMS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + +/obj/item/clothing/suit/mantle/regal + name = "regal shawl" + desc = "A fancy shawl for nobility, made from high quality materials." + icon_state = "regal_mantle" + item_state = "regal_mantle" + +/obj/item/clothing/suit/mantle/old + name = "old wrap" + desc = "A tattered fabric wrap, faded over the years. Smells faintly of cigars." + icon_state = "old_mantle" + item_state = "old_mantle" + diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 7f1ebfc101a..f3b06e30c83 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -33,7 +33,7 @@ /obj/item/clothing/suit/fire/firefighter icon_state = "firesuit" item_state = "firefighter" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -51,8 +51,8 @@ desc = "An expensive firesuit that protects against even the most deadly of station fires. Designed to protect even if the wearer is set aflame." icon_state = "atmos_firesuit" item_state = "firesuit_atmos" - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT - species_fit = list("Vox") + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -75,7 +75,7 @@ strip_delay = 70 put_on_delay = 70 burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', "Grey" = 'icons/mob/species/grey/head.dmi' @@ -101,7 +101,7 @@ strip_delay = 70 put_on_delay = 70 burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -129,7 +129,7 @@ strip_delay = 60 put_on_delay = 60 burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi', "Grey" = 'icons/mob/species/grey/head.dmi' @@ -152,7 +152,7 @@ strip_delay = 60 put_on_delay = 60 burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 6b08e2e4e49..96e174ed2dd 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -7,9 +7,10 @@ item_color = "bluetie" slot_flags = SLOT_TIE w_class = WEIGHT_CLASS_SMALL - var/slot = "decor" + var/slot = ACCESSORY_SLOT_DECOR var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to var/image/inv_overlay = null //overlay used when attached to clothing. + var/allow_duplicates = TRUE // Allow accessories of the same type. /obj/item/clothing/accessory/New() ..() @@ -117,7 +118,7 @@ icon_state = "waistcoat" item_state = "waistcoat" item_color = "waistcoat" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -181,34 +182,7 @@ materials = list(MAT_METAL=1000) burn_state = FIRE_PROOF -/obj/item/clothing/accessory/medal/conduct - name = "distinguished conduct medal" - desc = "A bronze medal awarded for distinguished conduct. Whilst a great honor, this is the most basic award given by Nanotrasen. It is often awarded by a captain to a member of his crew." - -/obj/item/clothing/accessory/medal/bronze_heart - name = "bronze heart medal" - desc = "A bronze heart-shaped medal awarded for sacrifice. It is often awarded posthumously or for severe injury in the line of duty." - icon_state = "bronze_heart" - -/obj/item/clothing/accessory/medal/nobel_science - name = "nobel sciences award" - desc = "A bronze medal which represents significant contributions to the field of science or engineering." - -/obj/item/clothing/accessory/medal/silver - name = "silver medal" - desc = "A silver medal." - icon_state = "silver" - item_color = "silver" - materials = list(MAT_SILVER=1000) - -/obj/item/clothing/accessory/medal/silver/valor - name = "medal of valor" - desc = "A silver medal awarded for acts of exceptional valor." - -/obj/item/clothing/accessory/medal/silver/security - name = "robust security award" - desc = "An award for distinguished combat and sacrifice in defence of Nanotrasen's commercial interests. Often awarded to security staff." - +// GOLD (awarded by centcom) /obj/item/clothing/accessory/medal/gold name = "gold medal" desc = "A prestigious golden medal." @@ -222,7 +196,61 @@ /obj/item/clothing/accessory/medal/gold/heroism name = "medal of exceptional heroism" - desc = "An extremely rare golden medal awarded only by CentComm. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders." + desc = "An extremely rare golden medal awarded only by CentComm. To recieve such a medal is the highest honor and as such, very few exist." + +// SILVER (awarded by Captain) + +/obj/item/clothing/accessory/medal/silver + name = "silver medal" + desc = "A silver medal." + icon_state = "silver" + item_color = "silver" + materials = list(MAT_SILVER=1000) + +/obj/item/clothing/accessory/medal/silver/valor + name = "medal of valor" + desc = "An award issued by Captains to crew members whose exceptional performance and service to the station has been commended by the station's top leadership." + +/obj/item/clothing/accessory/medal/silver/leadership + name = "medal of command" + desc = "An award issued by Captains to heads of department who do an excellent job managing their department. Made of pure silver." + + +// BRONZE (awarded by heads of department, except for the bronze heart) + + + +/obj/item/clothing/accessory/medal/security + name = "robust security medal" + desc = "An award issued by the HoS to security staff who excel at upholding the law." + +/obj/item/clothing/accessory/medal/science + name = "smart science medal" + desc = "An award issued by the RD to science staff who advance the frontiers of knowledge." + +/obj/item/clothing/accessory/medal/engineering + name = "excellent engineering medal" + desc = "An award issued by the CE to engineering staff whose dedication keep the station running at its best." + +/obj/item/clothing/accessory/medal/service + name = "superior service medal" + desc = "An award issued by the HoP to service staff who go above and beyond." + +/obj/item/clothing/accessory/medal/medical + name = "magnificient medical medal" + desc = "An award issued by the CMO to medical staff who excel at saving lives." + +/obj/item/clothing/accessory/medal/legal + name = "meritous legal medal" + desc = "An award issued by the Magistrate to legal staff who uphold the rule of law." + +/obj/item/clothing/accessory/medal/heart + name = "bronze heart medal" + desc = "A rarely-awarded medal for those who sacrifice themselves in the line of duty to save their fellow crew." + icon_state = "bronze_heart" + + + /* Holobadges are worn on the belt or neck, and can be used to show that the holder is an authorized @@ -378,6 +406,31 @@ item_color = "necklace" slot_flags = SLOT_TIE +/obj/item/clothing/accessory/necklace/dope + name = "gold necklace" + desc = "Damn, it feels good to be a gangster." + icon_state = "bling" + item_state = "bling" + item_color = "bling" + +/obj/item/clothing/accessory/necklace/skullcodpiece + name = "skull codpiece" + desc = "A skull shaped ornament, intended to protect the important things in life." + icon_state = "skull" + item_state = "skull" + item_color = "skull" + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5) + allow_duplicates = FALSE + +/obj/item/clothing/accessory/necklace/talisman + name = "bone talisman" + desc = "A hunter's talisman, some say the old gods smile on those who wear it." + icon_state = "talisman" + item_state = "talisman" + item_color = "talisman" + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5) + allow_duplicates = FALSE + /obj/item/clothing/accessory/necklace/locket name = "gold locket" desc = "A gold locket that seems to have space for a photo within." @@ -436,7 +489,7 @@ icon_state = "cowboyshirt" item_state = "cowboyshirt" item_color = "cowboyshirt" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -447,7 +500,7 @@ icon_state = "cowboyshirt_s" item_state = "cowboyshirt_s" item_color = "cowboyshirt_s" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -458,7 +511,7 @@ icon_state = "cowboyshirt_white" item_state = "cowboyshirt_white" item_color = "cowboyshirt_white" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -469,7 +522,7 @@ icon_state = "cowboyshirt_whites" item_state = "cowboyshirt_whites" item_color = "cowboyshirt_whites" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -480,7 +533,7 @@ icon_state = "cowboyshirt_pink" item_state = "cowboyshirt_pink" item_color = "cowboyshirt_pink" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -491,7 +544,7 @@ icon_state = "cowboyshirt_pinks" item_state = "cowboyshirt_pinks" item_color = "cowboyshirt_pinks" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -502,7 +555,7 @@ icon_state = "cowboyshirt_navy" item_state = "cowboyshirt_navy" item_color = "cowboyshirt_navy" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -513,7 +566,7 @@ icon_state = "cowboyshirt_navys" item_state = "cowboyshirt_navys" item_color = "cowboyshirt_navys" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -524,7 +577,7 @@ icon_state = "cowboyshirt_red" item_state = "cowboyshirt_red" item_color = "cowboyshirt_red" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -535,7 +588,7 @@ icon_state = "cowboyshirt_reds" item_state = "cowboyshirt_reds" item_color = "cowboyshirt_reds" - species_fit = list("Vox", "Drask", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi', "Drask" = 'icons/mob/species/drask/suit.dmi', @@ -574,7 +627,7 @@ /obj/item/clothing/accessory/petcollar/Destroy() QDEL_NULL(access_id) - processing_objects -= src + STOP_PROCESSING(SSobj, src) return ..() /obj/item/clothing/accessory/petcollar/attack_self(mob/user as mob) @@ -617,10 +670,10 @@ /obj/item/clothing/accessory/petcollar/equipped(mob/living/simple_animal/user) if(istype(user)) - processing_objects |= src + START_PROCESSING(SSobj, src) /obj/item/clothing/accessory/petcollar/dropped(mob/living/simple_animal/user) - processing_objects -= src + STOP_PROCESSING(SSobj, src) /obj/item/clothing/accessory/petcollar/process() var/mob/living/simple_animal/M = loc @@ -630,13 +683,13 @@ var/area/t = get_area(M) var/obj/item/radio/headset/a = new /obj/item/radio/headset(src) - if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) ) + if(istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite)) //give the syndicats a bit of stealth a.autosay("[M] has been vandalized in Space!", "[M]'s Death Alarm") else a.autosay("[M] has been vandalized in [t.name]!", "[M]'s Death Alarm") qdel(a) - processing_objects -= src + STOP_PROCESSING(SSobj, src) /proc/english_accessory_list(obj/item/clothing/under/U) if(!istype(U) || !U.accessories.len) diff --git a/code/modules/clothing/under/accessories/armband.dm b/code/modules/clothing/under/accessories/armband.dm index 90bcf90ec62..23a22fd77e7 100644 --- a/code/modules/clothing/under/accessories/armband.dm +++ b/code/modules/clothing/under/accessories/armband.dm @@ -3,7 +3,7 @@ desc = "A fancy red armband!" icon_state = "red" item_color = "red" - slot = "armband" + slot = ACCESSORY_SLOT_ARMBAND /obj/item/clothing/accessory/armband/sec name = "security armband" diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 1a1d5d1a98b..29b89e8418d 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -3,7 +3,7 @@ desc = "A handgun holster." icon_state = "holster" item_color = "holster" - slot = "utility" + slot = ACCESSORY_SLOT_UTILITY var/holster_allow = /obj/item/gun var/obj/item/gun/holstered = null actions_types = list(/datum/action/item_action/accessory/holster) diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 3b2e9c75a20..16eb1cd476a 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -3,7 +3,7 @@ desc = "Used to hold things when you don't have enough hands." icon_state = "webbing" item_color = "webbing" - slot = "utility" + slot = ACCESSORY_SLOT_UTILITY var/slots = 3 var/obj/item/storage/internal/hold actions_types = list(/datum/action/item_action/accessory/storage) @@ -78,7 +78,7 @@ desc = "Sturdy mess of synthcotton belts and buckles, ready to share your burden." icon_state = "webbing" item_color = "webbing" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm deleted file mode 100644 index b320237996e..00000000000 --- a/code/modules/clothing/under/chameleon.dm +++ /dev/null @@ -1,86 +0,0 @@ -/obj/item/clothing/under/chameleon -//starts off as black - name = "black jumpsuit" - icon_state = "black" - item_state = "bl_suit" - item_color = "black" - desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." - origin_tech = "syndicate=2" - var/list/clothing_choices = list() - burn_state = FIRE_PROOF - armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) - - New() - ..() - var/blocked = list(/obj/item/clothing/under/color/random, /obj/item/clothing/under/rank/centcom) // Stops random coloured jumpsuit and undefined centcomm suit appearing in the list. - for(var/U in subtypesof(/obj/item/clothing/under/color) - blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V - - for(var/U in subtypesof(/obj/item/clothing/under/rank) - blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V - return - - - attackby(obj/item/clothing/under/U as obj, mob/user as mob, params) - ..() - if(istype(U, /obj/item/clothing/under/chameleon)) - to_chat(user, "Nothing happens.") - return - if(istype(U, /obj/item/clothing/under)) - if(src.clothing_choices.Find(U)) - to_chat(user, "Pattern is already recognised by the suit.") - return - src.clothing_choices += U - to_chat(user, "Pattern absorbed by the suit.") - - - emp_act(severity) - name = "psychedelic" - desc = "Groovy!" - icon_state = "psyche" - item_color = "psyche" - usr.update_inv_w_uniform() - spawn(200) - name = initial(name) - icon_state = initial(icon_state) - item_color = initial(item_color) - desc = initial(desc) - usr.update_inv_w_uniform() - ..() - - - verb/change() - set name = "Change Color" - set category = "Object" - set src in usr - - if(icon_state == "psyche") - to_chat(usr, "Your suit is malfunctioning") - return - - var/obj/item/clothing/under/A - A = input("Select Colour to change it to", "BOOYEA", A) in clothing_choices - if(!A) - return - - desc = null - permeability_coefficient = 0.90 - - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - item_color = A.item_color - usr.update_inv_w_uniform() //so our overlays update. - - - -/obj/item/clothing/under/chameleon/all/New() - ..() - var/blocked = list(/obj/item/clothing/under/chameleon, /obj/item/clothing/under/chameleon/all) - //to prevent an infinite loop - for(var/U in typesof(/obj/item/clothing/under)-blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 08c7c403ff5..e7f29305929 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -120,7 +120,7 @@ desc = "Groovy!" icon_state = "psyche" item_color = "psyche" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/uniform.dmi' ) diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 4b1588f09cf..6bfd40ad0ad 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -217,6 +217,15 @@ item_color = "miner" flags_size = ONESIZEFITSALL +/obj/item/clothing/under/rank/miner/lavaland + desc = "A green uniform for operating in hazardous environments." + name = "shaft miner's jumpsuit" + icon_state = "explorer" + item_state = "explorer" + item_color = "explorer" + + sprite_sheets = list() + /obj/item/clothing/under/barber desc = "It's a barber's uniform." name = "barber's uniform" diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index da905dd1e75..cfd828aeab1 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -85,7 +85,7 @@ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) flags_size = ONESIZEFITSALL strip_delay = 50 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/uniform.dmi' ) diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 7147b64349c..91527f2dd19 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -204,7 +204,7 @@ cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT heat_protection = UPPER_TORSO | LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD - max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT slowdown = -10 siemens_coefficient = 0 burn_state = LAVA_PROOF @@ -381,6 +381,10 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS burn_state = FIRE_PROOF +/obj/item/clothing/under/gladiator/ash_walker + desc = "This gladiator uniform appears to be covered in ash and fairly dated." + has_sensor = FALSE + //dress /obj/item/clothing/under/dress/dress_fire @@ -802,6 +806,7 @@ lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi' righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi' flags = NODROP + flags_size = ONESIZEFITSALL has_sensor = 0 // HUNKE /obj/item/clothing/under/victdress @@ -852,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/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index 198a3e46de9..a6da9d4391e 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -16,4 +16,11 @@ icon_state = "tactifool" item_state = "bl_suit" item_color = "tactifool" - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) \ No newline at end of file + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + +/obj/item/clothing/under/syndicate/sniper + name = "Tactical turtleneck suit" + desc = "A double seamed tactical turtleneck disguised as a civilian grade silk suit. Intended for the most formal operator. The collar is really sharp." + icon_state = "really_black_suit" + item_state = "bl_suit" + item_color = "black_suit" \ No newline at end of file diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm index d860ba9c4cd..8769e5e321a 100644 --- a/code/modules/countdown/countdown.dm +++ b/code/modules/countdown/countdown.dm @@ -28,13 +28,13 @@ /obj/effect/countdown/proc/start() if(!started) - GLOB.fast_processing += src + START_PROCESSING(SSfastprocess, src) started = TRUE /obj/effect/countdown/proc/stop() if(started) maptext = null - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) started = FALSE /obj/effect/countdown/proc/get_value() @@ -57,7 +57,7 @@ /obj/effect/countdown/Destroy() attached_to = null - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) return ..() /obj/effect/countdown/ex_act(severity) //immune to explosions diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 5116abf32e6..1520e19dcfc 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -117,8 +117,8 @@ /datum/crafting_recipe/floorbot name = "Floorbot" result = /mob/living/simple_animal/bot/floorbot - reqs = list(/obj/item/storage/toolbox/mechanical = 1, - /obj/item/stack/tile/plasteel = 1, + reqs = list(/obj/item/storage/toolbox = 1, + /obj/item/stack/tile/plasteel = 10, /obj/item/assembly/prox_sensor = 1, /obj/item/robot_parts/r_arm = 1) time = 40 @@ -391,6 +391,85 @@ reqs = list(/obj/item/grown/log = 5) result = /obj/structure/bonfire category = CAT_PRIMAL + +/datum/crafting_recipe/boneaxe + name = "Bone Axe" + result = /obj/item/twohanded/fireaxe/boneaxe + time = 50 + reqs = list(/obj/item/stack/sheet/bone = 6, + /obj/item/stack/sheet/sinew = 3) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonespear + name = "Bone Spear" + result = /obj/item/twohanded/spear/bonespear + time = 30 + reqs = list(/obj/item/stack/sheet/bone = 4, + /obj/item/stack/sheet/sinew = 1) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonedagger + name = "Bone Dagger" + result = /obj/item/kitchen/knife/combat/survival/bone + time = 20 + reqs = list(/obj/item/stack/sheet/bone = 2) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonecodpiece + name = "Skull Codpiece" + result = /obj/item/clothing/accessory/necklace/skullcodpiece + time = 20 + reqs = list(/obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 1) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonetalisman + name = "Bone Talisman" + result = /obj/item/clothing/accessory/necklace/talisman + time = 20 + reqs = list(/obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/sinew = 1) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonearmor + name = "Bone Armor" + result = /obj/item/clothing/suit/armor/bone + time = 30 + reqs = list(/obj/item/stack/sheet/bone = 6) + category = CAT_PRIMAL + +/datum/crafting_recipe/skullhelm + name = "Skull Helmet" + result = /obj/item/clothing/head/skullhelmet + time = 30 + reqs = list(/obj/item/stack/sheet/bone = 4) + category = CAT_PRIMAL + +/datum/crafting_recipe/goliathcloak + name = "Goliath Cloak" + result = /obj/item/clothing/suit/hooded/goliath + time = 50 + reqs = list(/obj/item/stack/sheet/leather = 2, + /obj/item/stack/sheet/sinew = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 2) + category = CAT_PRIMAL + +/datum/crafting_recipe/drakecloak + name = "Ash Drake Armour" + result = /obj/item/clothing/suit/hooded/drake + time = 60 + reqs = list(/obj/item/stack/sheet/bone = 10, + /obj/item/stack/sheet/sinew = 2, + /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" diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index df20ebd06fa..3be36b0282e 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -154,7 +154,7 @@ /obj/item/fluff/rsik_katana/suicide_act(mob/user) user.visible_message("[user] tries to stab [src] into [user.p_their()] stomach! Except [src] shatters! [user.p_they(TRUE)] look[user.p_s()] as if [user.p_they()] might die from the shame.") - return(BRUTELOSS) + return BRUTELOSS /obj/item/crowbar/fluff/zelda_creedy_1 // Zomgponies: Griffin Rowley name = "Zelda's Crowbar" @@ -323,7 +323,6 @@ if(!has_action) new /datum/action/item_action/openclose(jacket)//this actually works jacket.adjust_flavour = "unbutton" - jacket.species_fit = null jacket.sprite_sheets = null user.update_inv_wear_suit() qdel(src) @@ -345,7 +344,6 @@ M.desc = "It looks heavily modified, but otherwise functions as a gas mask. The words “Property of Yon-Dale†can be seen on the inner band." M.icon = 'icons/obj/custom_items.dmi' M.icon_state = "gas_tariq" - M.species_fit = list("Vulpkanin") M.sprite_sheets = list( "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) @@ -760,10 +758,10 @@ /obj/item/clothing/head/pirate/fluff/stumpy/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/clothing/head/pirate/fluff/stumpy/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/clothing/head/pirate/fluff/stumpy/process() @@ -844,7 +842,6 @@ actions_types = list() ignore_suitadjust = 1 adjust_flavour = null - species_fit = null sprite_sheets = null /obj/item/clothing/suit/storage/labcoat/fluff/pulsecoat //ozewse : Daniel Harper : Donated to them by Runemeds, who is the original donor. @@ -934,7 +931,6 @@ desc = "A labcoat with a few markings denoting it as the labcoat of roboticist." icon = 'icons/obj/custom_items.dmi' icon_state = "aeneasrinil_open" - species_fit = null sprite_sheets = null /obj/item/clothing/suit/jacket/fluff/kidosvest // Anxipal: Kido Qasteth @@ -946,7 +942,6 @@ ignore_suitadjust = 1 actions_types = list() adjust_flavour = null - species_fit = null sprite_sheets = null /obj/item/clothing/suit/jacket/fluff/jacksvest // Anxipal: Jack Harper @@ -957,7 +952,6 @@ ignore_suitadjust = TRUE actions_types = list() adjust_flavour = null - species_fit = null sprite_sheets = null /obj/item/clothing/suit/fluff/kluys // Kluys: Cripty Pandaen @@ -997,7 +991,6 @@ desc = "A suit that protects against minor chemical spills. Has a red stripe on the shoulders and rolled up sleeves." icon = 'icons/obj/custom_items.dmi' icon_state = "labcoat_red_open" - species_fit = null sprite_sheets = null /obj/item/clothing/suit/storage/labcoat/fluff/ionward_labcoat // Ionward: Gemini @@ -1005,7 +998,6 @@ desc = "A thin, faded, carbon fiber labcoat. On the back, a Technocracy vessel's logo. Inside, the name 'Gemini' is printed on the collar." icon = 'icons/obj/custom_items.dmi' icon_state = "ionward_labcoat_open" - species_fit = null sprite_sheets = null /obj/item/clothing/suit/fluff/stobarico_greatcoat // Stobarico: F.U.R.R.Y @@ -1059,7 +1051,7 @@ desc = "A somewhat worn but well kept set of vox tactical webbing. It has a couple of pouches attached." icon = 'icons/obj/custom_items.dmi' icon_state = "k3_webbing" - species_fit = list("Vox") + sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi') ignore_suitadjust = 0 actions_types = list(/datum/action/item_action/toggle) @@ -1338,7 +1330,6 @@ ignore_suitadjust = TRUE actions_types = list() adjust_flavour = null - species_fit = null sprite_sheets = null /obj/item/clothing/under/fluff/fox @@ -1481,7 +1472,6 @@ icon = 'icons/obj/clothing/ties.dmi' icon_state = "vest_black" item_state = "vest_black" - species_fit = null sprite_sheets = null /obj/item/clothing/under/pants/fluff/combat @@ -1498,7 +1488,6 @@ item_state = "elliot_windbreaker_open" adjust_flavour = "unzip" suit_adjusted = 1 - species_fit = null sprite_sheets = null /obj/item/storage/backpack/fluff/syndiesatchel //SkeletalElite: Rawkkihiki @@ -1723,7 +1712,6 @@ icon = 'icons/obj/custom_items.dmi' lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi' righthand_file = 'icons/mob/inhands/fluff_righthand.dmi' - species_fit = list("Vox") sprite_sheets = list("Vox" = 'icons/mob/species/vox/uniform.dmi') icon_state = "kiaoutfit" item_state = "kiaoutfit" @@ -1747,7 +1735,6 @@ icon = 'icons/obj/custom_items.dmi' lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi' righthand_file = 'icons/mob/inhands/fluff_righthand.dmi' - species_fit = list("Vox") sprite_sheets = list("Vox" = 'icons/mob/species/vox/mask.dmi') icon_state = "kiamask" item_state = "kiamask" @@ -1773,4 +1760,15 @@ /obj/item/clothing/gloves/ring/fluff/benjaminfallout //Benjaminfallout: Pretzel Brassheart name = "Pretzel's Ring" desc = "A small platinum ring with a large light blue diamond. Engraved inside the band are the words: 'To my lovely Pristine Princess. Forever yours, Savinien.'" - icon_state = "benjaminfallout_ring" \ No newline at end of file + icon_state = "benjaminfallout_ring" + +/obj/item/clothing/under/fluff/voxbodysuit //Gangelwaefre: Kikeri + name = "Vox Bodysuit" + desc = "A shimmering bodysuit custom-fit to a vox. Has shorts sewn in." + lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi' + righthand_file = 'icons/mob/inhands/fluff_righthand.dmi' + icon = 'icons/mob/inhands/fluff_righthand.dmi' + icon_state = "voxbodysuit" + item_state = "voxbodysuit" + item_color = "voxbodysuit" + body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|ARMS diff --git a/code/modules/discord/accountlink.dm b/code/modules/discord/accountlink.dm deleted file mode 100644 index c65d7da1440..00000000000 --- a/code/modules/discord/accountlink.dm +++ /dev/null @@ -1,52 +0,0 @@ -// DONT TOUCH ANYTHING IN HERE UNLESS YOU KNOW WHAT YOU ARE DOING -affected -/client/verb/linkdiscord() - set category = "Special Verbs" - set name = "Link Discord Account" - set desc = "Link your discord account to your BYOND account." - var/user_ckey = sanitizeSQL(usr.ckey) // Probably not neccassary but better safe than sorry - if(!config.sql_enabled) - to_chat(src, "This is feature requires the SQL backend") - return - var/DBQuery/db_discord_id = dbcon.NewQuery("SELECT discord_id FROM [format_table_name("discord")] WHERE ckey = '[user_ckey]'") - if(!db_discord_id.Execute()) - var/err = db_discord_id.ErrorMsg() - log_game("SQL ERROR while selecting discord account. Error : \[[err]\]\n") - to_chat(src, "Error checking Discord account. Please inform an administrator") - return - var/stored_id - while(db_discord_id.NextRow()) - stored_id = db_discord_id.item[1] - if(!stored_id) // Not linked - var/know_how = alert("Do you know how to get a discord user ID? This ID is NOT your discord username and numbers!","Question","Yes","No") - if(know_how == "No") // Opens discord support on how to collect IDs - src << link("https://support.discordapp.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID") - var/entered_id = input("Please enter your Discord ID.", "Enter Discord ID", null, null) as text|null - var/sql_id = sanitizeSQL(entered_id) - var/DBQuery/store_discord_id = dbcon.NewQuery("INSERT INTO [format_table_name("discord")] (ckey, discord_id, notify) VALUES ('[user_ckey]', [sql_id], 0)") - if(!store_discord_id.Execute()) - var/err = db_discord_id.ErrorMsg() - log_game("SQL ERROR while linking discord account. Error : \[[err]\]\n") - to_chat(src, "Error linking Discord account. Please inform an administrator") - return - to_chat(src, "Successfully linked discord account [entered_id] to [user_ckey]") - else // Linked - var/choice = alert("You already have the Discord Account [stored_id] linked to [user_ckey]. Would you like to unlink or replace","Already Linked","Unlink","Replace") - switch(choice) - if("Unlink") - var/DBQuery/unlink_discord_id = dbcon.NewQuery("DELETE FROM [format_table_name("discord")] WHERE ckey = '[user_ckey]'") - if(!unlink_discord_id.Execute()) - var/err = unlink_discord_id.ErrorMsg() - log_game("SQL ERROR while unlinking discord account. Error : \[[err]\]\n") - to_chat(src, "Error unlinking Discord account. Please inform an administrator") - return - to_chat(src, "Successfully unlinked discord account") - if("Replace") - var/entered_id = input("Please enter your Discord ID. Instructions can be found at https://bit.ly/2AfUu40", "Enter Discord ID", null, null) as text|null - var/sql_id = sanitizeSQL(entered_id) - var/DBQuery/store_discord_id = dbcon.NewQuery("UPDATE [format_table_name("discord")] SET discord_id = '[sql_id]' WHERE ckey='[user_ckey]'") - if(!store_discord_id.Execute()) - var/err = db_discord_id.ErrorMsg() - to_chat(src, "Error replacing Discord account. Please inform an administrator") - log_game("SQL ERROR while linking discord account. Error : \[[err]\]\n") - return - to_chat(src, "Successfully linked discord account [entered_id] to [user_ckey]") diff --git a/code/modules/discord/notify.dm b/code/modules/discord/notify.dm deleted file mode 100644 index a5bfac04940..00000000000 --- a/code/modules/discord/notify.dm +++ /dev/null @@ -1,48 +0,0 @@ -// DONT TOUCH ANYTHING IN HERE UNLESS YOU KNOW WHAT YOU ARE DOING -affected -/client/verb/notify_restart() - set category = "Special Verbs" - set name = "Notify Restart" - set desc = "Notifies you on Discord when the server restarts." - if(!config.sql_enabled) - to_chat(src, "This is feature requires the SQL backend") - return - var/DBQuery/db_discord_id = dbcon.NewQuery("SELECT discord_id FROM [format_table_name("discord")] WHERE ckey = '[ckey]'") - if(!db_discord_id.Execute()) - var/err = db_discord_id.ErrorMsg() - log_game("SQL ERROR while selecting discord account. Error : \[[err]\]\n") - to_chat(src, "Error checking Discord account. Please inform an administrator") - return - var/stored_id - while(db_discord_id.NextRow()) - stored_id = db_discord_id.item[1] - if(!stored_id) // Not linked - to_chat(src, "This requires you to link your Discord account with the \"Link Discord Account\" verb.") - return - else // Linked - var/DBQuery/toggle_status = dbcon.NewQuery("SELECT notify FROM [format_table_name("discord")] WHERE ckey = '[ckey]'") - if(!toggle_status.Execute()) - var/err = toggle_status.ErrorMsg() - log_game("SQL ERROR while getting discord account. Error : \[[err]\]\n") - var/notify_status - while(toggle_status.NextRow()) - notify_status = toggle_status.item[1] - if(notify_status) // Data is there - switch(notify_status) - if("0") - var/DBQuery/update_notify = dbcon.NewQuery("UPDATE [format_table_name("discord")] SET notify = 1 WHERE ckey='[ckey]'") - if(!update_notify.Execute()) - var/err = db_discord_id.ErrorMsg() - to_chat(src, "Error updating notify status. Please inform an administrator") - log_game("SQL ERROR while updating notify status. Error : \[[err]\]\n") - return - to_chat(src, "You will now be notified on discord when the next round is starting") - if("1") - var/DBQuery/update_notify = dbcon.NewQuery("UPDATE [format_table_name("discord")] SET notify = 0 WHERE ckey='[ckey]'") - if(!update_notify.Execute()) - var/err = db_discord_id.ErrorMsg() - to_chat(src, "Error updating notify status. Please inform an administrator") - log_game("SQL ERROR while updating notify status. Error : \[[err]\]\n") - return - to_chat(src, "You will no longer be notified on discord when the next round is starting") - else // Oh fuck what the hell happened - to_chat(src, "Something has gone VERY wrong, or affected cant code.") diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index e99367cb8fd..16b1162e074 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -154,7 +154,6 @@ var/global/current_date_string if("toggle_suspension") if(detailed_account_view) detailed_account_view.suspended = !detailed_account_view.suspended - callHook("change_account_status", list(detailed_account_view)) if("finalise_create_account") var/account_name = href_list["holder_name"] diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index f9bb22fcda4..f3df3027780 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -116,7 +116,7 @@ else to_chat(usr, "[bicon(src)]Unable to connect to accounts database.") if("trans_purpose") - var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose", transaction_purpose) as text|null + var/purpose = clean_input("Enter reason for EFTPOS transaction", "Transaction purpose", transaction_purpose) if(purpose) transaction_purpose = purpose if("trans_value") diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index 18d75f3ef30..3c7dcc6496b 100644 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -13,11 +13,11 @@ if(candidates.len >= 2) //Oh god why we can't have static functions - var/number = ticker.mode.abductor_teams + 1 + var/number = SSticker.mode.abductor_teams + 1 var/datum/game_mode/abduction/temp - if(ticker.mode.config_tag == "abduction") - temp = ticker.mode + if(SSticker.mode.config_tag == "abduction") + temp = SSticker.mode else temp = new @@ -42,10 +42,10 @@ temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind) temp.post_setup_team(number) - ticker.mode.abductor_teams++ + SSticker.mode.abductor_teams++ - if(ticker.mode.config_tag != "abduction") - ticker.mode.abductors |= temp.abductors + if(SSticker.mode.config_tag != "abduction") + SSticker.mode.abductors |= temp.abductors processing = 1 //So it will get gc'd return 1 else diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index 7e4473cb0d2..590ff374ad6 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -27,8 +27,8 @@ GLOB.respawnable_list -= C.client var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) new_xeno.key = C.key - if(ticker && ticker.mode) - ticker.mode.xenos += new_xeno.mind + if(SSticker && SSticker.mode) + SSticker.mode.xenos += new_xeno.mind spawncount-- successSpawn = 1 diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index 29baf834bb5..a8f11681577 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -58,7 +58,8 @@ blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH" blueeffect.icon = 'icons/effects/effects.dmi' blueeffect.icon_state = "shieldsparkles" - blueeffect.layer = 17 + blueeffect.layer = FLASH_LAYER + blueeffect.plane = FULLSCREEN_PLANE blueeffect.mouse_opacity = MOUSE_OPACITY_TRANSPARENT M.client.screen += blueeffect sleep(20) diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm index 58302950b5e..62de79a19cb 100644 --- a/code/modules/events/aurora_caelus.dm +++ b/code/modules/events/aurora_caelus.dm @@ -17,10 +17,11 @@ We hope you enjoy the lights.", "Harmless ions approaching", new_sound = 'sound/ M.playsound_local(null, 'sound/ambience/aurora_caelus.ogg', 20, FALSE, pressure_affected = FALSE) /datum/event/aurora_caelus/start() - for(var/s in GLOB.station_level_space_turfs) - var/turf/space/S = s - S.set_light(S.light_range * 3, S.light_power * 0.5, aurora_colors[1]) - CHECK_TICK + for(var/area in GLOB.all_areas) + var/area/A = area + if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) + for(var/turf/space/S in A) + S.set_light(S.light_range * 3, S.light_power * 0.5) /datum/event/aurora_caelus/tick() if(aurora_progress >= aurora_colors.len) @@ -28,15 +29,18 @@ We hope you enjoy the lights.", "Harmless ions approaching", new_sound = 'sound/ if(activeFor % 5 == 0) aurora_progress++ var/aurora_color = aurora_colors[aurora_progress] - for(var/s in GLOB.station_level_space_turfs) - var/turf/space/S = s - S.set_light(l_color = aurora_color) - CHECK_TICK + for(var/area in GLOB.all_areas) + var/area/A = area + if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) + for(var/turf/space/S in A) + S.set_light(l_color = aurora_color) /datum/event/aurora_caelus/end() - for(var/s in GLOB.station_level_space_turfs) - var/turf/space/S = s - fade_to_black(S) + for(var/area in GLOB.all_areas) + var/area/A = area + if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) + for(var/turf/space/S in A) + fade_to_black(S) event_announcement.Announce("The Aurora Caelus event is now ending. Starlight conditions will slowly return to normal. \ When this has concluded, please return to your workplace and continue work as normal. \ Have a pleasant shift, [station_name()], and thank you for watching with us.", diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index 7ea71547123..54394411e73 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -6,21 +6,28 @@ event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') /datum/event/blob/start() + 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?", ROLE_BLOB, 1) + + 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.") - var/image/alert_overlay = image('icons/mob/blob.dmi', "blank_blob") - notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, alert_overlay = alert_overlay) \ No newline at end of file + 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/event.dm b/code/modules/events/event.dm index 0f5c43059e8..1186da902f0 100644 --- a/code/modules/events/event.dm +++ b/code/modules/events/event.dm @@ -105,7 +105,7 @@ //Do not override this proc, instead use the appropiate procs. //This proc will handle the calls to the appropiate procs. -/datum/event/proc/process() +/datum/event/process() if(!processing) return @@ -137,12 +137,12 @@ end() endedAt = world.time - event_manager.active_events -= src - event_manager.event_complete(src) + SSevents.active_events -= src + SSevents.event_complete(src) /datum/event/New(var/datum/event_meta/EM) // event needs to be responsible for this, as stuff like APLUs currently make their own events for curious reasons - event_manager.active_events += src + SSevents.active_events += src if(!EM) EM = new /datum/event_meta(EVENT_LEVEL_MAJOR, "Unknown, Most likely admin called", src.type) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 6cc12faf1b4..3f86b88924c 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -22,7 +22,7 @@ var/list/event_last_fired = list() var/last_world_time = 0 -/datum/event_container/proc/process() +/datum/event_container/process() if(!next_event_time) set_event_delay() diff --git a/code/modules/events/event_procs.dm b/code/modules/events/event_procs.dm new file mode 100644 index 00000000000..02ae1454597 --- /dev/null +++ b/code/modules/events/event_procs.dm @@ -0,0 +1,120 @@ + +/client/proc/forceEvent(var/type in SSevents.allEvents) + set name = "Trigger Event (Debug Only)" + set category = "Debug" + + if(!holder) + return + + if(ispath(type)) + new type(new /datum/event_meta(EVENT_LEVEL_MAJOR)) + message_admins("[key_name_admin(usr)] has triggered an event. ([type])", 1) + +/client/proc/event_manager_panel() + set name = "Event Manager Panel" + set category = "Event" + if(SSevents) + SSevents.Interact(usr) + feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + return + +/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in! + var/area/candidate = null + + var/list/safe_areas = list( + /area/turret_protected/ai, + /area/turret_protected/ai_upload, + /area/engine, + /area/solar, + /area/holodeck, + /area/shuttle/arrival, + /area/shuttle/escape, + /area/shuttle/escape_pod1/station, + /area/shuttle/escape_pod2/station, + /area/shuttle/escape_pod3/station, + /area/shuttle/escape_pod5/station, + /area/shuttle/specops/station, + /area/shuttle/prison/station, + /area/shuttle/administration/station + ) + + //These are needed because /area/engine has to be removed from the list, but we still want these areas to get fucked up. + var/list/danger_areas = list( + /area/engine/break_room, + /area/engine/chiefs_office) + + var/list/event_areas = list() + + for(var/areapath in the_station_areas) + event_areas += typesof(areapath) + for(var/areapath in safe_areas) + event_areas -= typesof(areapath) + for(var/areapath in danger_areas) + event_areas += typesof(areapath) + + while(event_areas.len > 0) + var/list/event_turfs = null + candidate = locate(pick_n_take(event_areas)) + event_turfs = get_area_turfs(candidate) + if(event_turfs.len > 0) + break + + return candidate + +// Returns how many characters are currently active(not logged out, not AFK for more than 10 minutes) +// with a specific role. +// Note that this isn't sorted by department, because e.g. having a roboticist shouldn't make meteors spawn. +/proc/number_active_with_role() + var/list/active_with_role = list() + active_with_role["Engineer"] = 0 + active_with_role["Medical"] = 0 + active_with_role["Security"] = 0 + active_with_role["Scientist"] = 0 + active_with_role["AI"] = 0 + active_with_role["Cyborg"] = 0 + active_with_role["Janitor"] = 0 + active_with_role["Botanist"] = 0 + active_with_role["Any"] = GLOB.player_list.len + + for(var/mob/M in GLOB.player_list) + if(!M.mind || !M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive + continue + + if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "engineering robot module") + active_with_role["Engineer"]++ + if(M.mind.assigned_role in list("Chief Engineer", "Station Engineer")) + active_with_role["Engineer"]++ + + if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "medical robot module") + active_with_role["Medical"]++ + if(M.mind.assigned_role in list("Chief Medical Officer", "Medical Doctor")) + active_with_role["Medical"]++ + + if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "security robot module") + active_with_role["Security"]++ + if(M.mind.assigned_role in security_positions) + active_with_role["Security"]++ + + if(M.mind.assigned_role in list("Research Director", "Scientist")) + active_with_role["Scientist"]++ + + if(M.mind.assigned_role == "AI") + active_with_role["AI"]++ + + if(M.mind.assigned_role == "Cyborg") + active_with_role["Cyborg"]++ + + if(M.mind.assigned_role == "Janitor") + active_with_role["Janitor"]++ + + if(M.mind.assigned_role == "Botanist") + active_with_role["Botanist"]++ + + return active_with_role + +/datum/event/proc/num_players() + var/players = 0 + for(var/mob/living/carbon/human/P in GLOB.player_list) + if(P.client) + players++ + return players diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index e63805d6a1d..a0aa17596fd 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -4,7 +4,7 @@ /datum/event/falsealarm/announce() var/weight = pickweight(list(EVENT_LEVEL_MUNDANE = 60, EVENT_LEVEL_MODERATE = 30, EVENT_LEVEL_MAJOR = 10)) - var/datum/event_container/container = event_manager.event_containers[weight] + var/datum/event_container/container = SSevents.event_containers[weight] var/datum/event/E = container.acquire_event() var/datum/event/Event = new E message_admins("False Alarm: [Event]") diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index 8c099f22a91..d8d1f46ad9b 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -1,12 +1,18 @@ /datum/event/grid_check //NOTE: Times are measured in master controller ticks! announceWhen = 5 - + /datum/event/grid_check/setup() endWhen = rand(30,120) /datum/event/grid_check/start() power_failure(0) - + var/sound/S = sound('sound/effects/powerloss.ogg') + for(var/mob/living/M in GLOB.player_list) + var/turf/T = get_turf(M) + if(!M.client || !is_station_level(T.z)) + continue + SEND_SOUND(M, S) + /datum/event/grid_check/announce() event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg') 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 7d52d7cd969..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) @@ -539,7 +539,7 @@ /obj/structure/spacevine_controller/New(loc, list/muts, potency, production) color = "#ffffff" spawn_spacevine_piece(loc, , muts) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) init_subtypes(/datum/spacevine_mutation/, mutations_list) if(potency != null && potency > 0) // 1 mutativeness at 10 potency @@ -567,7 +567,7 @@ return /obj/structure/spacevine_controller/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/structure/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/structure/spacevine/parent, list/muts) diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 9b1588e1161..29b0b44e721 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -23,7 +23,7 @@ "atrazine","banana","charcoal","space_drugs","methamphetamine","holywater","ethanol","hot_coco","facid", "blood","morphine","ether","fluorine","mutadone","mutagen","hydrocodone","fuel", "haloperidol","lsd","syndicate_nanites","lipolicide","frostoil","salglu_solution","beepskysmash", - "omnizine", "amanitin", "neurotoxin", "synaptizine") + "omnizine", "amanitin", "neurotoxin", "synaptizine", "rotatium") var/datum/reagents/R = new/datum/reagents(50) R.my_atom = vent R.add_reagent(pick(gunk), 50) diff --git a/code/modules/events/wizard/ghost.dm b/code/modules/events/wizard/ghost.dm new file mode 100644 index 00000000000..11529e3080d --- /dev/null +++ b/code/modules/events/wizard/ghost.dm @@ -0,0 +1,5 @@ +/datum/event/wizard/ghost //The spook is real + +/datum/event/wizard/ghost/start() + var/msg = "You suddenly feel extremely obvious..." + set_observer_default_invisibility(0, msg) diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index be145752671..811eed6b9de 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -34,7 +34,6 @@ qdel(O) wormholes.Cut() - /obj/effect/portal/wormhole name = "wormhole" desc = "It looks highly unstable; It could close at any moment." @@ -42,23 +41,26 @@ icon_state = "anom" failchance = 0 -/obj/effect/portal/wormhole/attack_hand(mob/user) - teleport(user) +/obj/effect/portal/wormhole/can_teleport(atom/movable/M) + . = ..() -/obj/effect/portal/wormhole/attackby(obj/item/I, mob/user, params) - teleport(user) + if(istype(M, /obj/singularity)) + . = FALSE /obj/effect/portal/wormhole/teleport(atom/movable/M) - if(istype(M, /obj/effect)) //sparks don't teleport - return - if(M.anchored && istype(M, /obj/mecha)) - return + if(!can_teleport(M)) + return FALSE - if(istype(M, /atom/movable)) - var/turf/target - if(GLOB.portals.len) - var/obj/effect/portal/P = pick(GLOB.portals) - if(P && isturf(P.loc)) - target = P.loc - if(!target) return - do_teleport(M, target, 1, 1, 0, 0) ///You will appear adjacent to the beacon + var/turf/target + if(GLOB.portals.len) + var/obj/effect/portal/P = pick(GLOB.portals) + if(P && isturf(P.loc)) + target = P.loc + + if(!target) + return FALSE + + if(!do_teleport(M, target, 1, TRUE)) ///You will appear adjacent to the beacon + return FALSE + + return TRUE diff --git a/code/modules/examine/descriptions/weapons.dm b/code/modules/examine/descriptions/weapons.dm index 98f60d01ac4..286391f1387 100644 --- a/code/modules/examine/descriptions/weapons.dm +++ b/code/modules/examine/descriptions/weapons.dm @@ -55,6 +55,11 @@ then click where you want to fire. After firing, you will need to pump the gun, by clicking on the gun in your hand. To reload, load more shotgun \ shells into the gun." +/obj/item/toy/russian_revolver/trick_revolver //oh no + description_info = "This is a ballistic weapon. To fire the weapon, have your gun mode set to 'fire', \ + then click where you want to fire. To reload, click the weapon in your hand to unload (if needed), then add the appropriate ammo. The description \ + will tell you what caliber you need." + //******* //*Melee* //******* diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm index 0956877d202..f39cb562ec8 100644 --- a/code/modules/examine/examine.dm +++ b/code/modules/examine/examine.dm @@ -60,12 +60,3 @@ stat(null,"[description_holders["fluff"]]") //Yellow, fluff-related text. if(description_holders["antag"]) stat(null,"[description_holders["antag"]]") //Red, malicious antag-related text - -//override examinate verb to update description holders when things are examined -/mob/examinate(atom/A as mob|obj|turf in view()) - if(..()) - return 1 - - var/is_antag = (isAntag(src) || isobserver(src)) //ghosts don't have minds - if(client) - client.update_description_holders(A, is_antag) diff --git a/code/modules/ext_scripts/irc.dm b/code/modules/ext_scripts/irc.dm index 0e8c72496d2..7f87413694a 100644 --- a/code/modules/ext_scripts/irc.dm +++ b/code/modules/ext_scripts/irc.dm @@ -19,20 +19,3 @@ if(config.admin_irc) send2irc(config.admin_irc, msg) return - -/hook/startup/proc/ircNotify() - var/people_to_ping = "" - var/DBQuery/pull_notify = dbcon.NewQuery("SELECT discord_id FROM [format_table_name("discord")] WHERE notify = 1") - if(!pull_notify.Execute()) - var/err = pull_notify.ErrorMsg() - log_game("SQL ERROR while pulling notify people. Error : \[[err]\]\n") - else - while(pull_notify.NextRow()) - people_to_ping += "<@" + pull_notify.item[1] + "> " - send2mainirc("Server starting up on [station_name()]. Connect to: "+people_to_ping, 7355608) - // Set notify to 0 so people arent pinged round after round - var/DBQuery/reset_notify = dbcon.NewQuery("UPDATE [format_table_name("discord")] SET notify = 0 WHERE notify = 1") - if(!reset_notify.Execute()) - var/err = reset_notify.ErrorMsg() - log_game("SQL ERROR while resetting notify status. Error : \[[err]\]\n") - return 1 diff --git a/code/modules/fish/fish_items.dm b/code/modules/fish/fish_items.dm index 63a4b668930..a0882ae5df8 100644 --- a/code/modules/fish/fish_items.dm +++ b/code/modules/fish/fish_items.dm @@ -25,9 +25,9 @@ throw_speed = 3 throw_range = 7 - suicide_act(mob/user) //"A tiny net is a death sentence: it's a net and it's tiny!" https://www.youtube.com/watch?v=FCI9Y4VGCVw - to_chat(viewers(user), "[user] places the [src.name] on top of [user.p_their()] head, [user.p_their()] fingers tangled in the netting! It looks like [user.p_theyre()] trying to commit suicide.") - return(OXYLOSS) +/obj/item/fish_net/suicide_act(mob/user) //"A tiny net is a death sentence: it's a net and it's tiny!" https://www.youtube.com/watch?v=FCI9Y4VGCVw + to_chat(viewers(user), "[user] places the [src.name] on top of [user.p_their()] head, [user.p_their()] fingers tangled in the netting! It looks like [user.p_theyre()] trying to commit suicide.") + return OXYLOSS /obj/item/fishfood name = "fish food can" @@ -51,9 +51,9 @@ throw_range = 7 attack_verb = list("scrubbed", "brushed", "scraped") - suicide_act(mob/user) - to_chat(viewers(user), "[user] is vigorously scrubbing [user.p_them()]self raw with the [name]! It looks like [user.p_theyre()] trying to commit suicide.") - return(BRUTELOSS|FIRELOSS) +/obj/item/tank_brush/suicide_act(mob/user) + to_chat(viewers(user), "[user] is vigorously scrubbing [user.p_them()]self raw with the [name]! It looks like [user.p_theyre()] trying to commit suicide.") + return BRUTELOSS|FIRELOSS ////////////////////////////////////////////// // Fish Items // diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 7dcb5301d43..af366683570 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -138,7 +138,7 @@ Gunshots/explosions/opening doors/less rare audio (done) if(target.client) target.client.images |= flood_images next_expand = world.time + FAKE_FLOOD_EXPAND_TIME - processing_objects += src + START_PROCESSING(SSobj, src) /obj/effect/hallucination/fake_flood/process() if(next_expand <= world.time) @@ -162,7 +162,7 @@ Gunshots/explosions/opening doors/less rare audio (done) target.client.images |= flood_images /obj/effect/hallucination/fake_flood/Destroy() - processing_objects -= src + STOP_PROCESSING(SSobj, src) flood_turfs.Cut() if(target.client) target.client.images.Remove(flood_images) @@ -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)) @@ -671,8 +671,8 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ /obj/item/gun/energy/kinetic_accelerator/crossbow,\ /obj/item/storage/box/syndicate, /obj/item/storage/box/emps,\ /obj/item/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ - /obj/item/clothing/shoes/syndigaloshes, /obj/item/card/id/syndicate,\ - /obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\ + /obj/item/clothing/shoes/chameleon/noslip, /obj/item/card/id/syndicate,\ + /obj/item/clothing/mask/chameleon, /obj/item/clothing/glasses/thermal,\ /obj/item/chameleon, /obj/item/card/emag,\ /obj/item/storage/toolbox/syndicate, /obj/item/aiModule,\ /obj/item/radio/headset/syndicate, /obj/item/grenade/plastic/c4,\ @@ -738,7 +738,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ for(var/mob/living/carbon/human/H in GLOB.living_mob_list) humans += H person = pick(humans) - target.hear_radio(message_to_multilingual(pick(radio_messages), pick(person.languages)), speaker = person, part_a = "\[[get_frequency_name(PUB_FREQ)]\] ", part_b = " ") + target.hear_radio(message_to_multilingual(pick(radio_messages), pick(person.languages)), speaker = person, part_a = "\[[get_frequency_name(PUB_FREQ)]\] ", part_b = " ") qdel(src) /obj/effect/hallucination/message diff --git a/code/modules/flufftext/TextFilters.dm b/code/modules/flufftext/TextFilters.dm index 7ff5a2fd0a5..02a02a6f5b2 100644 --- a/code/modules/flufftext/TextFilters.dm +++ b/code/modules/flufftext/TextFilters.dm @@ -64,9 +64,8 @@ proc/Ellipsis(original_msg, chance = 50) if(chance <= 0) return "..." if(chance >= 100) return original_msg - var/list - words = splittext(original_msg," ") - new_words = list() + var/list/words = splittext(original_msg," ") + var/list/new_words = list() var/new_msg = "" diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 52a4a9dcd35..41c5ff0bdf3 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -11,6 +11,7 @@ possible_transfer_amounts = list(5,10,15,20,25,30,50) volume = 50 burn_state = FIRE_PROOF + antable = FALSE /obj/item/reagent_containers/food/drinks/New() ..() @@ -353,31 +354,6 @@ icon_state = "goonbag" list_reagents = list("wine" = 70) -/obj/item/reagent_containers/food/drinks/waterbottle - name = "bottle of water" - desc = "A bottle of water filled at an old Earth bottling facility." - icon = 'icons/obj/drinks.dmi' - icon_state = "smallbottle" - item_state = "bottle" - list_reagents = list("water" = 49.5, "fluorine" = 0.5) //see desc, don't think about it too hard - materials = list(MAT_GLASS = 0) - volume = 50 - amount_per_transfer_from_this = 10 - -/obj/item/reagent_containers/food/drinks/waterbottle/empty - list_reagents = list() - -/obj/item/reagent_containers/food/drinks/waterbottle/large - desc = "A fresh commercial-sized bottle of water." - icon_state = "largebottle" - materials = list(MAT_GLASS = 0) - list_reagents = list("water" = 100) - volume = 100 - amount_per_transfer_from_this = 20 - -/obj/item/reagent_containers/food/drinks/waterbottle/large/empty - list_reagents = list() - /obj/item/reagent_containers/food/drinks/oilcan name = "oil can" desc = "Contains oil intended for use on cyborgs, robots, and other synthetics." 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/food.dm b/code/modules/food_and_drinks/food.dm index 0ecff55cba0..e931db813cf 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -13,10 +13,42 @@ var/transfer_efficiency = 1.0 var/instant_application = 0 //if we want to bypass the forcedfeed delay var/taste = TRUE//whether you can taste eating from this + var/antable = TRUE // Will ants come near it? + var/ant_location = null + var/ant_timer = null burn_state = FLAMMABLE container_type = INJECTABLE -/obj/item/reagent_containers/food/New() - ..() +/obj/item/reagent_containers/food/Initialize(mapload) + . = ..() pixel_x = rand(-5, 5) //Randomizes postion pixel_y = rand(-5, 5) + if(antable) + ant_location = get_turf(src) + ant_timer = addtimer(CALLBACK(src, .proc/check_for_ants), 3000, TIMER_STOPPABLE) + +/obj/item/reagent_containers/food/Destroy() + ant_location = null + if(ant_timer) + deltimer(ant_timer) + return ..() + +/obj/item/reagent_containers/food/proc/check_for_ants() + if(!antable) + return + var/turf/T = get_turf(src) + if(isturf(loc) && !locate(/obj/structure/table) in T) + if(ant_location == T) + if(prob(15)) + if(!locate(/obj/effect/decal/ants) in T) + new /obj/effect/decal/ants(T) + antable = FALSE + desc += " It appears to be infested with ants. Yuck!" + reagents.add_reagent("ants", 1) // Don't eat things with ants in i you weirdo. + if(ant_timer) + deltimer(ant_timer) + else + ant_location = T + if(ant_timer) + deltimer(ant_timer) + ant_timer = addtimer(CALLBACK(src, .proc/check_for_ants), 3000, TIMER_STOPPABLE) \ No newline at end of file diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index 64a585e9051..d512e3888a9 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -131,7 +131,7 @@ user.name = newname user.real_name = newname desc = "Salt. From dead crew, presumably." - return (TOXLOSS) + return TOXLOSS /obj/item/reagent_containers/food/condiment/peppermill name = "pepper mill" diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm index 0d57d3197cd..eb9569ad356 100644 --- a/code/modules/food_and_drinks/food/foods/meat.dm +++ b/code/modules/food_and_drinks/food/foods/meat.dm @@ -125,6 +125,17 @@ icon_state = "spidereggs" list_reagents = list("protein" = 2, "toxin" = 2) +/obj/item/reagent_containers/food/snacks/goliath + name = "goliath meat" + desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava." + icon_state = "goliathmeat" + list_reagents = list("protein" = 3, "toxin" = 5) + +/obj/item/reagent_containers/food/snacks/goliath/burn() + visible_message("[src] finishes cooking!") + new /obj/item/reagent_containers/food/snacks/goliath_steak(loc) + qdel(src) + ////////////////////// // Cooked Meat // ////////////////////// @@ -205,6 +216,13 @@ filling_color = "#43DE18" list_reagents = list("nutriment" = 6, "soysauce" = 5, "vitamin" = 2) +/obj/item/reagent_containers/food/snacks/goliath_steak + name = "goliath steak" + desc = "A delicious, lava cooked steak." + resistance_flags = LAVA_PROOF | FIRE_PROOF + icon_state = "goliathsteak" + trash = null + list_reagents = list("protein" = 6, "vitamin" = 2) ////////////////////// // Cubes // @@ -216,11 +234,13 @@ icon_state = "monkeycube" bitesize = 12 filling_color = "#ADAC7F" + var/faction var/datum/species/monkey_type = /datum/species/monkey list_reagents = list("nutriment" = 2) -/obj/item/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature) - if(volume >= 5) +/obj/item/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature, source, method = TOUCH) + . = ..() + if(volume >= 1) return Expand() /obj/item/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source) @@ -236,11 +256,16 @@ else log_game("Cube ([monkey_type]) inflated, last touched by: NO_DATA") var/mob/living/carbon/human/creature = new /mob/living/carbon/human(get_turf(src)) + if(faction) + creature.faction = faction if(LAZYLEN(fingerprintshidden)) creature.fingerprintshidden = fingerprintshidden.Copy() creature.set_species(monkey_type) qdel(src) +/obj/item/reagent_containers/food/snacks/monkeycube/syndicate + faction = list("neutral", "syndicate") + /obj/item/reagent_containers/food/snacks/monkeycube/farwacube name = "farwa cube" monkey_type = /datum/species/monkey/tajaran diff --git a/code/modules/food_and_drinks/food/foods/pasta.dm b/code/modules/food_and_drinks/food/foods/pasta.dm index 36c340656e3..77bfb0728ca 100644 --- a/code/modules/food_and_drinks/food/foods/pasta.dm +++ b/code/modules/food_and_drinks/food/foods/pasta.dm @@ -68,3 +68,10 @@ icon_state = "macncheese" filling_color = "#ffe45d" list_reagents = list("nutriment" = 5, "vitamin" = 2, "cheese" = 4) + +/obj/item/reagent_containers/food/snacks/lasagna + name = "Lasagna" + icon_state = "lasagna" + desc = "Tajarans loves to eat this, for some reason." + filling_color = "#E18712" + list_reagents = list("nutriment" = 10, "msg" = 3, "vitamin" = 4, "tomatojuice" = 10) diff --git a/code/modules/food_and_drinks/food/foods/pizza.dm b/code/modules/food_and_drinks/food/foods/pizza.dm index aabd47194ce..cbe7342b74b 100644 --- a/code/modules/food_and_drinks/food/foods/pizza.dm +++ b/code/modules/food_and_drinks/food/foods/pizza.dm @@ -224,7 +224,7 @@ if(istype(I, /obj/item/pen/)) if(open) return - var/t = input("Enter what you want to add to the tag:", "Write", null, null) as text + var/t = clean_input("Enter what you want to add to the tag:", "Write", null) var/obj/item/pizzabox/boxtotagto = src if(boxes.len > 0) boxtotagto = boxes[boxes.len] diff --git a/code/modules/food_and_drinks/food/foods/seafood.dm b/code/modules/food_and_drinks/food/foods/seafood.dm index d06f1eeb77b..9e4407d9602 100644 --- a/code/modules/food_and_drinks/food/foods/seafood.dm +++ b/code/modules/food_and_drinks/food/foods/seafood.dm @@ -97,6 +97,24 @@ bitesize = 3 list_reagents = list("nutriment" = 2) +/obj/item/reagent_containers/food/snacks/shrimp_skewer + name = "shrimp skewer" + desc = "Four shrimp lightly grilled on a skewer. Yummy!" + trash = /obj/item/stack/rods + icon = 'icons/obj/food/seafood.dmi' + icon_state = "shrimpskewer" + bitesize = 3 + list_reagents = list("nutriment" = 8) + +/obj/item/reagent_containers/food/snacks/fish_skewer + name = "fish skewer" + desc = "A whole fish battered and grilled on a skewer. Hope you're hungry!" + trash = /obj/item/stack/rods + icon = 'icons/obj/food/seafood.dmi' + icon_state = "fishskewer" + bitesize = 3 + list_reagents = list("protein" = 6, "vitamin" = 4) + /obj/item/reagent_containers/food/snacks/sliceable/Ebi_maki name = "ebi makiroll" desc = "A large unsliced roll of Ebi Sushi." diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index c5bcd22a885..edcb85e0d15 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -24,6 +24,18 @@ idle_power_usage = 2 active_power_usage = 500 +/obj/machinery/gibber/suicide_act(mob/user) + if(occupant || locked) + return FALSE + user.visible_message("[user] climbs into [src] and turns it on!") + user.Stun(10) + user.forceMove(src) + occupant = user + update_icon() + feedinTopanim() + addtimer(CALLBACK(src, .proc/startgibbing, user), 33) + return OBLITERATION + /obj/machinery/gibber/Destroy() if(contents.len) for(var/atom/movable/A in contents) @@ -145,7 +157,7 @@ set name = "Empty Gibber" set src in oview(1) - if(usr.stat != CONSCIOUS) + if(usr.incapacitated()) return go_out() diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 8283bbdad62..3cd95f37923 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -11,17 +11,15 @@ idle_power_usage = 5 active_power_usage = 100 var/max_n_of_items = 1500 - var/icon_on = "smartfridge" - var/icon_off = "smartfridge-off" - var/icon_panel = "smartfridge-panel" var/item_quants = list() - var/seconds_electrified = 0; - var/shoot_inventory = 0 - var/locked = 0 - var/scan_id = 1 - var/is_secure = 0 + var/seconds_electrified = 0 + var/shoot_inventory = FALSE + var/locked = FALSE + var/scan_id = TRUE + var/is_secure = FALSE var/can_dry = FALSE var/drying = FALSE + var/visible_contents = TRUE var/datum/wires/smartfridge/wires = null /obj/machinery/smartfridge/New() @@ -65,8 +63,6 @@ desc = "When you need seeds fast!" icon = 'icons/obj/vending.dmi' icon_state = "seeds" - icon_on = "seeds" - icon_off = "seeds-off" /obj/machinery/smartfridge/seeds/accept_check(obj/item/O) if(istype(O,/obj/item/seeds/)) @@ -77,7 +73,6 @@ name = "\improper Refrigerated Medicine Storage" desc = "A refrigerated storage unit for storing medicine and chemicals." icon_state = "smartfridge" //To fix the icon in the map editor. - icon_on = "smartfridge_chem" /obj/machinery/smartfridge/medbay/accept_check(obj/item/O) if(istype(O,/obj/item/reagent_containers/glass)) @@ -104,7 +99,6 @@ name = "\improper Secure Refrigerated Medicine Storage" desc = "A refrigerated storage unit for storing medicine and chemicals." icon_state = "smartfridge" //To fix the icon in the map editor. - icon_on = "smartfridge_chem" req_one_access_txt = "5;33" /obj/machinery/smartfridge/secure/medbay/accept_check(obj/item/O) @@ -122,7 +116,6 @@ name = "\improper Smart Chemical Storage" desc = "A refrigerated storage unit for medicine and chemical storage." icon_state = "smartfridge" //To fix the icon in the map editor. - icon_on = "smartfridge_chem" req_access_txt = "33" var/list/spawn_meds = list() @@ -139,18 +132,39 @@ item_quants[I.name] = 1 SSnanoui.update_uis(src) amount-- + update_icon() -/obj/machinery/smartfridge/chemistry/accept_check(obj/item/O) +/obj/machinery/smartfridge/secure/chemistry/accept_check(obj/item/O) if(istype(O,/obj/item/storage/pill_bottle) || istype(O,/obj/item/reagent_containers)) return 1 return 0 +/obj/machinery/smartfridge/secure/chemistry/preloaded + spawn_meds = list( + /obj/item/reagent_containers/food/pill/epinephrine = 12, + /obj/item/reagent_containers/food/pill/charcoal = 5, + /obj/item/reagent_containers/glass/bottle/epinephrine = 1, + /obj/item/reagent_containers/glass/bottle/charcoal = 1) + +/obj/machinery/smartfridge/secure/chemistry/preloaded/syndicate + req_access_txt = null + req_access = list(access_syndicate) + +/obj/machinery/smartfridge/disks + name = "disk compartmentalizer" + desc = "A machine capable of storing a variety of disks. Denoted by most as the DSU (disk storage unit)." + icon_state = "disktoaster" + pass_flags = PASSTABLE + visible_contents = FALSE + +/obj/machinery/smartfridge/disks/accept_check(obj/item/O) + return istype(O, /obj/item/disk) // ---------------------------- // 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, @@ -165,6 +179,20 @@ return 1 return 0 +/obj/machinery/smartfridge/secure/chemistry/virology/preloaded + spawn_meds = list( + /obj/item/reagent_containers/syringe/antiviral = 4, + /obj/item/reagent_containers/glass/bottle/cold = 1, + /obj/item/reagent_containers/glass/bottle/flu_virion = 1, + /obj/item/reagent_containers/glass/bottle/mutagen = 1, + /obj/item/reagent_containers/glass/bottle/plasma = 1, + /obj/item/reagent_containers/glass/bottle/reagent/synaptizine = 1, + /obj/item/reagent_containers/glass/bottle/reagent/formaldehyde = 1) + +/obj/machinery/smartfridge/secure/chemistry/virology/preloaded/syndicate + req_access_txt = null + req_access = list(access_syndicate) + /obj/machinery/smartfridge/drinks name = "\improper Drink Showcase" desc = "A refrigerated storage unit for tasty tasty alcohol." @@ -189,10 +217,19 @@ /obj/machinery/smartfridge/update_icon() if(stat & (BROKEN|NOPOWER)) - icon_state = icon_off + icon_state = "[initial(icon_state)]-off" + else if(visible_contents) + switch(contents.len) + if(0) + icon_state = "[initial(icon_state)]" + if(1 to 25) + icon_state = "[initial(icon_state)]1" + if(26 to 75) + icon_state = "[initial(icon_state)]2" + if(76 to INFINITY) + icon_state = "[initial(icon_state)]3" else - icon_state = icon_on - + icon_state = "[initial(icon_state)]" /******************* * Item Adding @@ -231,6 +268,7 @@ if(load(O, user)) user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].") SSnanoui.update_uis(src) + update_icon() else if(istype(O, /obj/item/storage/bag)) var/obj/item/storage/bag/P = O @@ -244,6 +282,7 @@ to_chat(user, "Some items are refused.") SSnanoui.update_uis(src) + update_icon() else if(!istype(O, /obj/item/card/emag)) to_chat(user, "\The [src] smartly refuses [O].") @@ -347,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") @@ -357,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"]) @@ -370,16 +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) - 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 @@ -413,13 +463,12 @@ name = "drying rack" desc = "A wooden contraption, used to dry plant products, food and leather." icon = 'icons/obj/hydroponics/equipment.dmi' - icon_state = "drying_rack_on" + icon_state = "drying_rack" use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 200 - icon_on = "drying_rack_on" - icon_off = "drying_rack" can_dry = TRUE + visible_contents = FALSE /obj/machinery/smartfridge/drying_rack/New() ..() @@ -477,6 +526,7 @@ /obj/machinery/smartfridge/drying_rack/update_icon() ..() + overlays.Cut() if(drying) overlays += "drying_rack_drying" diff --git a/code/modules/food_and_drinks/recipes/recipes_grill.dm b/code/modules/food_and_drinks/recipes/recipes_grill.dm index 921c2c86e99..83f9aea745f 100644 --- a/code/modules/food_and_drinks/recipes/recipes_grill.dm +++ b/code/modules/food_and_drinks/recipes/recipes_grill.dm @@ -226,3 +226,28 @@ /obj/item/reagent_containers/food/snacks/catfishmeat, ) result = /obj/item/reagent_containers/food/snacks/sushi_Tai + +/datum/recipe/grill/goliath + items = list( +/obj/item/reagent_containers/food/snacks/goliath + ) + result = /obj/item/reagent_containers/food/snacks/goliath_steak + +/datum/recipe/grill/shrimp_skewer + items = list( + /obj/item/reagent_containers/food/snacks/shrimp, + /obj/item/reagent_containers/food/snacks/shrimp, + /obj/item/reagent_containers/food/snacks/shrimp, + /obj/item/reagent_containers/food/snacks/shrimp, + /obj/item/stack/rods, + ) + result = /obj/item/reagent_containers/food/snacks/shrimp_skewer + +/datum/recipe/grill/fish_skewer + reagents = list("flour" = 10) + items = list( + /obj/item/reagent_containers/food/snacks/salmonmeat, + /obj/item/reagent_containers/food/snacks/salmonmeat, + /obj/item/stack/rods, + ) + result = /obj/item/reagent_containers/food/snacks/fish_skewer diff --git a/code/modules/food_and_drinks/recipes/recipes_microwave.dm b/code/modules/food_and_drinks/recipes/recipes_microwave.dm index 81fbe20e3d4..44c572b34e7 100644 --- a/code/modules/food_and_drinks/recipes/recipes_microwave.dm +++ b/code/modules/food_and_drinks/recipes/recipes_microwave.dm @@ -133,6 +133,13 @@ ) result = /obj/item/reagent_containers/food/snacks/baseballburger +/datum/recipe/microwave/cheeseburger + items = list( + /obj/item/reagent_containers/food/snacks/monkeyburger, + /obj/item/reagent_containers/food/snacks/cheesewedge, + ) + result = /obj/item/reagent_containers/food/snacks/cheeseburger + /datum/recipe/microwave/hotdog items = list( /obj/item/reagent_containers/food/snacks/bun, diff --git a/code/modules/food_and_drinks/recipes/recipes_oven.dm b/code/modules/food_and_drinks/recipes/recipes_oven.dm index 0a6072e51a9..a53ee6e75d9 100644 --- a/code/modules/food_and_drinks/recipes/recipes_oven.dm +++ b/code/modules/food_and_drinks/recipes/recipes_oven.dm @@ -467,3 +467,16 @@ /obj/item/reagent_containers/food/snacks/stuffing ) result = /obj/item/reagent_containers/food/snacks/sliceable/turkey + +/datum/recipe/oven/lasagna + items = list( + /obj/item/reagent_containers/food/snacks/meat, + /obj/item/reagent_containers/food/snacks/meat, + /obj/item/reagent_containers/food/snacks/cheesewedge, + /obj/item/reagent_containers/food/snacks/cheesewedge, + /obj/item/reagent_containers/food/snacks/cheesewedge, + /obj/item/reagent_containers/food/snacks/grown/tomato, + /obj/item/reagent_containers/food/snacks/grown/tomato, + /obj/item/reagent_containers/food/snacks/dough + ) + result = /obj/item/reagent_containers/food/snacks/lasagna diff --git a/code/modules/holiday/holiday.dm b/code/modules/holiday/holiday.dm index 414df7f7589..f87422e2ad1 100644 --- a/code/modules/holiday/holiday.dm +++ b/code/modules/holiday/holiday.dm @@ -345,9 +345,9 @@ if(!istype(H)) return H.celebrate() - if(!holiday_master.holidays) - holiday_master.holidays = list() - holiday_master.holidays[H.name] = H + if(!SSholiday.holidays) + SSholiday.holidays = list() + SSholiday.holidays[H.name] = H //update our hub status world.update_status() diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 7acd3efc961..21ba7cb89e2 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -8,35 +8,36 @@ /mob/proc/bee_friendly() - return 0 + return FALSE /mob/living/simple_animal/hostile/poison/bees/bee_friendly() - return 1 + return TRUE /mob/living/simple_animal/bot/bee_friendly() if(paicard) - return 0 - return 1 + return FALSE + return TRUE /mob/living/simple_animal/diona/bee_friendly() - return 1 + return TRUE /mob/living/carbon/human/bee_friendly() if(isdiona(src)) //bees pollinate plants, duh. - return 1 + return TRUE if((wear_suit && (wear_suit.flags & THICKMATERIAL)) && (head && (head.flags & THICKMATERIAL))) - return 1 - return 0 + return TRUE + return FALSE /obj/structure/beebox name = "apiary" - desc = "Dr Miles Manners is just your average Wasp themed super hero by day, but by night he becomes DR BEES!" + desc = "Dr. Miles Manners is just your average wasp-themed super hero by day, but by night he becomes DR. BEES!" icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "beebox" - anchored = 1 - density = 1 + anchored = TRUE + density = TRUE + max_integrity = 300 var/mob/living/simple_animal/hostile/poison/bees/queen/queen_bee = null var/list/bees = list() //bees owned by the box, not those inside it var/list/honeycombs = list() @@ -44,13 +45,13 @@ var/bee_resources = 0 -/obj/structure/beebox/New() - ..() - processing_objects.Add(src) +/obj/structure/beebox/Initialize(mapload) + . = ..() + START_PROCESSING(SSobj, src) /obj/structure/beebox/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) for(var/mob/living/simple_animal/hostile/poison/bees/B in bees) B.beehome = null bees.Cut() @@ -66,12 +67,11 @@ var/random_reagent = FALSE -/obj/structure/beebox/premade/New() - ..() - +/obj/structure/beebox/premade/Initialize(mapload) + . = ..() var/datum/reagent/R = null if(random_reagent) - R = get_random_reagent_id() + R = GLOB.chemical_reagents_list[get_random_reagent_id()] queen_bee = new(src) queen_bee.beehome = src @@ -83,7 +83,7 @@ honey_frames += HF for(var/i in 1 to get_max_bees()) - var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src) + var/mob/living/simple_animal/hostile/poison/bees/B = new(src) bees += B B.beehome = src B.assign_reagent(R) @@ -93,7 +93,7 @@ /obj/structure/beebox/process() - if(queen_bee && (!queen_bee.beegent || !queen_bee.beegent.can_synth)) + if(queen_bee) if(bee_resources >= BEE_RESOURCE_HONEYCOMB_COST) if(honeycombs.len < get_max_honeycomb()) bee_resources = max(bee_resources-BEE_RESOURCE_HONEYCOMB_COST, 0) @@ -109,7 +109,7 @@ if((bee_resources >= BEE_RESOURCE_NEW_BEE_COST && prob(BEE_PROB_NEW_BEE)) || freebee) if(!freebee) bee_resources = max(bee_resources - BEE_RESOURCE_NEW_BEE_COST, 0) - var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src) + var/mob/living/simple_animal/hostile/poison/bees/B = new(get_turf(src)) B.beehome = src B.assign_reagent(queen_bee.beegent) bees += B @@ -152,14 +152,16 @@ if(istype(I, /obj/item/honey_frame)) var/obj/item/honey_frame/HF = I if(honey_frames.len < BEEBOX_MAX_FRAMES) + if(!user.unEquip(HF)) + return visible_message("[user] adds a frame to the apiary.") - user.unEquip(HF) HF.forceMove(src) honey_frames += HF else to_chat(user, "There's no room for anymore frames in the apiary!") + return - if(istype(I, /obj/item/wrench)) + if(iswrench(I)) if(default_unfasten_wrench(user, I, time = 20)) return @@ -169,25 +171,27 @@ return var/obj/item/queen_bee/qb = I - user.unEquip(qb) if(!qb.queen.beegent || (qb.queen.beegent && qb.queen.beegent.can_synth)) + if(!user.unEquip(qb)) + return qb.queen.forceMove(src) bees += qb.queen queen_bee = qb.queen qb.queen = null else visible_message("The [qb] refuses to settle down. Maybe it's something to do with its reagent?") + return if(queen_bee) visible_message("[user] sets [qb] down inside the apiary, making it [user.p_their()] new home.") var/relocated = 0 for(var/b in bees) - var/mob/living/simple_animal/hostile/poison/bees/worker/B = b + var/mob/living/simple_animal/hostile/poison/bees/B = b if(B.reagent_incompatible(queen_bee)) bees -= B B.beehome = null if(B.loc == src) - B.forceMove(get_turf(src)) + B.forceMove(drop_location()) relocated++ if(relocated) to_chat(user, "This queen has a different reagent to some of the bees who live here, those bees will not return to this apiary!") @@ -196,6 +200,8 @@ to_chat(user, "The queen bee disappeared! bees disappearing has been in the news lately...") qdel(qb) + return + return ..() /obj/structure/beebox/attack_hand(mob/user) @@ -208,7 +214,7 @@ if(B.isqueen) continue if(B.loc == src) - B.forceMove(get_turf(src)) + B.forceMove(drop_location()) B.target = user bees = TRUE if(bees) @@ -254,3 +260,16 @@ QB.forceMove(get_turf(src)) visible_message("[user] removes the queen from the apiary.") queen_bee = null + +/obj/structure/beebox/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/wood(loc, 20) + for(var/mob/living/simple_animal/hostile/poison/bees/B in bees) + if(B.loc == src) + B.forceMove(drop_location()) + for(var/obj/item/honey_frame/HF in honey_frames) + HF.forceMove(drop_location()) + honey_frames -= HF + qdel(src) + +/obj/structure/beebox/unwrenched + anchored = FALSE \ No newline at end of file diff --git a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm index 2c492986f17..7f6bb3ebb10 100644 --- a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm +++ b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm @@ -13,5 +13,5 @@ icon_state = "beekeeper" item_state = "beekeeper" flags = THICKMATERIAL - allowed = list (/obj/item/reagent_containers/spray,/obj/item/plant_analyzer,/obj/item/seeds,/obj/item/reagent_containers/glass/bottle,/obj/item/cultivator) + allowed = list(/obj/item/melee/flyswatter, /obj/item/reagent_containers/spray, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/cultivator) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 67979b61dd7..52f188a9d1d 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -15,8 +15,8 @@ var/productivity = 0 var/max_items = 40 var/datum/research/files - var/list/show_categories = list("Food", "Botany Chemicals", "Leather and Cloth") - var/list/timesFiveCategories = list("Food", "Botany Chemicals") + var/list/show_categories = list("Food", "Botany Chemicals", "Organic Materials", "Leather and Cloth") + var/list/timesFiveCategories = list("Food", "Botany Chemicals", "Organic Materials") /obj/machinery/biogenerator/New() ..() @@ -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/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index e079ad710d6..a9511b00fcd 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -32,6 +32,16 @@ component_parts += new /obj/item/stock_parts/manipulator(null) RefreshParts() +/obj/machinery/plantgenes/upgraded/New() + ..() + component_parts = list() + component_parts += new /obj/item/circuitboard/plantgenes(null) + component_parts += new /obj/item/stock_parts/console_screen(null) + component_parts += new /obj/item/stock_parts/scanning_module/phasic(null) + component_parts += new /obj/item/stock_parts/micro_laser/ultra(null) + component_parts += new /obj/item/stock_parts/manipulator/pico(null) + RefreshParts() + /obj/machinery/plantgenes/Destroy() core_genes.Cut() reagent_genes.Cut() 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/banana.dm b/code/modules/hydroponics/grown/banana.dm index 4515b3ad75f..dd56ade79be 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -30,13 +30,13 @@ playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1) sleep(25) if(!user) - return (OXYLOSS) + return OXYLOSS user.say("BANG!") sleep(25) if(!user) - return (OXYLOSS) + return OXYLOSS user.visible_message("[user] laughs so hard [user.p_they()] begin[user.p_s()] to suffocate!") - return (OXYLOSS) + return OXYLOSS /obj/item/grown/bananapeel seed = /obj/item/seeds/banana @@ -52,7 +52,7 @@ /obj/item/grown/bananapeel/suicide_act(mob/user) user.visible_message("[user] is deliberately slipping on the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") playsound(loc, 'sound/misc/slip.ogg', 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS // Mimana - invisible sprites are totally a feature! diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index eea80e17e60..64b84649770 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -24,7 +24,7 @@ /obj/item/seeds/kudzu/suicide_act(mob/user) user.visible_message("[user] swallows the pack of kudzu seeds! It looks like [user.p_theyre()] trying to commit suicide..") plant(user) - return (BRUTELOSS) + return BRUTELOSS /obj/item/seeds/kudzu/proc/plant(mob/user) if(istype(user.loc, /turf/space)) diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index 8c4ed2b029c..444939ca861 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -45,7 +45,7 @@ /obj/item/grown/nettle/suicide_act(mob/user) user.visible_message("[user] is eating some of the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") - return (BRUTELOSS|TOXLOSS) + return BRUTELOSS|TOXLOSS /obj/item/grown/nettle/pickup(mob/living/user) ..() @@ -95,7 +95,8 @@ force = round((5 + seed.potency / 2.5), 1) /obj/item/grown/nettle/death/pickup(mob/living/carbon/user) - if(..() && ishuman(user)) // If the pickup succeeded and is humanoid + . = ..() + if(. && ishuman(user)) // If the pickup succeeded and is humanoid var/mob/living/carbon/human/H = user if(!H.gloves && prob(50)) user.Paralyse(5) diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 4ed9d963274..33ef72db471 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -112,6 +112,9 @@ var/burning = 0 var/fire_stack_strength = 5 +/obj/structure/bonfire/dense + density = TRUE + /obj/structure/bonfire/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/rods) && !can_buckle) var/obj/item/stack/rods/R = W @@ -151,13 +154,13 @@ burning = 1 set_light(6, l_color = "#ED9200") Burn() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/structure/bonfire/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() StartBurning() -/obj/structure/bonfire/Crossed(atom/movable/AM) +/obj/structure/bonfire/Crossed(atom/movable/AM, oldloc) if(burning) Burn() @@ -186,7 +189,7 @@ icon_state = "bonfire" burning = 0 set_light(0) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/structure/bonfire/buckle_mob(mob/living/M, force = 0) if(..()) 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/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index a3453585817..14080c62bba 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -34,7 +34,7 @@ /obj/item/reagent_containers/spray/weedspray/suicide_act(mob/user) user.visible_message("[user] is huffing the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") - return (TOXLOSS) + return TOXLOSS /obj/item/reagent_containers/spray/pestspray // -- Skie desc = "It's some pest eliminator spray! Do not inhale!" @@ -56,7 +56,7 @@ /obj/item/reagent_containers/spray/pestspray/suicide_act(mob/user) user.visible_message("[user] is huffing the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") - return (TOXLOSS) + return TOXLOSS /obj/item/cultivator name = "cultivator" @@ -91,7 +91,7 @@ /obj/item/hatchet/suicide_act(mob/user) user.visible_message("[user] is chopping at [user.p_them()]self with the [name]! It looks like [user.p_theyre()] trying to commit suicide.") playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/hatchet/unathiknife name = "duelling knife" @@ -126,7 +126,7 @@ if(affecting) affecting.droplimb(1, DROPLIMB_SHARP) playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'), 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/scythe/pre_attackby(atom/A, mob/living/user, params) if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user)) diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 2e95d21e10b..ef450f4a52f 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -234,14 +234,14 @@ /datum/plant_gene/trait/cell_charge/on_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/C) var/power = G.seed.potency*rate if(prob(power)) - C.electrocute_act(round(power), G, 1, 1) + C.electrocute_act(round(power), G, 1, TRUE) /datum/plant_gene/trait/cell_charge/on_squash(obj/item/reagent_containers/food/snacks/grown/G, atom/target) - if(iscarbon(target)) + if(isliving(target)) var/mob/living/carbon/C = target var/power = G.seed.potency*rate if(prob(power)) - C.electrocute_act(round(power), G, 1, 1) + C.electrocute_act(round(power), G, 1, TRUE) /datum/plant_gene/trait/cell_charge/on_consume(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/target) if(!G.reagents.total_volume) diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm index 107ec3c4f3f..57063b0d743 100644 --- a/code/modules/karma/karma.dm +++ b/code/modules/karma/karma.dm @@ -59,7 +59,7 @@ var/list/karma_spenders = list() if(config.disable_karma) to_chat(src, "Karma is disabled.") return FALSE - if(!ticker || !GLOB.player_list.len || (ticker.current_state == GAME_STATE_PREGAME)) + if(!SSticker || !GLOB.player_list.len || (SSticker.current_state == GAME_STATE_PREGAME)) to_chat(src, "You can't award karma until the game has started.") return FALSE if(client.karma_spent || (ckey in karma_spenders)) diff --git a/code/modules/keybindings/bindings_admin.dm b/code/modules/keybindings/bindings_admin.dm new file mode 100644 index 00000000000..695a5c6baef --- /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.invisimin() + return + if("F10") + user.get_dead_say() + return + ..() diff --git a/code/modules/keybindings/bindings_ai.dm b/code/modules/keybindings/bindings_ai.dm new file mode 100644 index 00000000000..b496f3521f9 --- /dev/null +++ b/code/modules/keybindings/bindings_ai.dm @@ -0,0 +1,6 @@ +/mob/living/silicon/ai/key_down(_key, client/user) + switch(_key) + if("4") + a_intent_change(INTENT_HOTKEY_LEFT) + return + return ..() \ No newline at end of file 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/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm index 10e747b4e31..638aaeee7c3 100644 --- a/code/modules/library/computers/checkout.dm +++ b/code/modules/library/computers/checkout.dm @@ -320,11 +320,11 @@ if(!bibledelay) var/obj/item/storage/bible/B = new /obj/item/storage/bible(src.loc) - if(ticker && ( ticker.Bible_icon_state && ticker.Bible_item_state) ) - B.icon_state = ticker.Bible_icon_state - B.item_state = ticker.Bible_item_state - B.name = ticker.Bible_name - B.deity_name = ticker.Bible_deity_name + if(SSticker && ( SSticker.Bible_icon_state && SSticker.Bible_item_state) ) + B.icon_state = SSticker.Bible_icon_state + B.item_state = SSticker.Bible_item_state + B.name = SSticker.Bible_name + B.deity_name = SSticker.Bible_deity_name bibledelay = 1 spawn(60) diff --git a/code/modules/library/random_books.dm b/code/modules/library/random_books.dm new file mode 100644 index 00000000000..f36e493ce3f --- /dev/null +++ b/code/modules/library/random_books.dm @@ -0,0 +1,85 @@ +/obj/item/book/manual/random + icon_state = "random_book" + +/obj/item/book/manual/random/New() + ..() + var/static/banned_books = list(/obj/item/book/manual/random, /obj/item/book/manual/nuclear) + var/newtype = pick(subtypesof(/obj/item/book/manual) - banned_books) + new newtype(loc) + qdel(src) + +/obj/item/book/random + icon_state = "random_book" + var/amount = 1 + var/category = null + +/obj/item/book/random/Initialize() + ..() + create_random_books(amount, src.loc, TRUE, category) + qdel(src) + +/obj/item/book/random/triple + amount = 3 + +/obj/structure/bookcase/random + var/category = null + var/book_count = 2 + icon_state = "random_bookcase" + anchored = TRUE + +/obj/structure/bookcase/random/New() + . = ..() + if(!book_count || !isnum(book_count)) + update_icon() + return + book_count += pick(-1,-1,0,1,1) + create_random_books(book_count, src, FALSE, category) + update_icon() + +/proc/create_random_books(amount = 2, location, fail_loud = FALSE, category = null) + . = list() + if(!isnum(amount) || amount<1) + return + if(!dbcon.IsConnected()) + if(fail_loud || prob(5)) + var/obj/item/paper/P = new(location) + P.info = "There once was a book from Nantucket
But the database failed us, so f*$! it.
I tried to be good to you
Now this is an I.O.U
If you're feeling entitled, well, stuff it!

~" + P.update_icon() + return + if(prob(25)) + category = null + var/c = category? " AND category='[sanitizeSQL(category)]'" :"" + var/DBQuery/query_get_random_books = dbcon.NewQuery("SELECT * FROM [format_table_name("library")] WHERE (isnull(flagged) OR flagged = 0)[c] GROUP BY title ORDER BY rand() LIMIT [amount];") + query_get_random_books.Execute() + while(query_get_random_books.NextRow()) + var/obj/item/book/B = new(location) + . += B + B.author = query_get_random_books.item[2] + B.title = query_get_random_books.item[3] + B.dat = query_get_random_books.item[4] + B.name = "Book: [B.title]" + B.icon_state= "book[rand(1,8)]" + +/obj/structure/bookcase/random/fiction + name = "bookcase (Fiction)" + category = "Fiction" +/obj/structure/bookcase/random/nonfiction + name = "bookcase (Non-Fiction)" + category = "Non-fiction" +/obj/structure/bookcase/random/religion + name = "bookcase (Religion)" + category = "Religion" +/obj/structure/bookcase/random/adult + name = "bookcase (Adult)" + category = "Adult" + +/obj/structure/bookcase/random/reference + name = "bookcase (Reference)" + category = "Reference" + var/ref_book_prob = 20 + +/obj/structure/bookcase/random/reference/Initialize(mapload) + . = ..() + while(book_count > 0 && prob(ref_book_prob)) + book_count-- + new /obj/item/book/manual/random(src) \ No newline at end of file diff --git a/code/modules/lighting/__lighting_docs.dm b/code/modules/lighting/__lighting_docs.dm index 8ef93935e9c..18041989910 100644 --- a/code/modules/lighting/__lighting_docs.dm +++ b/code/modules/lighting/__lighting_docs.dm @@ -54,7 +54,7 @@ turf: (lighting_turf.dm) - Create lighting overlays for this turf -atom/movable/lighting_overlay: (lighting_overlay.dm) +atom/movable/lighting_object: (lighting_object.dm) - var/lum_r, var/lum_g, var/lum_b; lumcounts of each colour - var/needs_update; set on update_lumcount, checked by lighting process diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm index 92923e6b0d5..77e955d10a6 100644 --- a/code/modules/lighting/lighting_area.dm +++ b/code/modules/lighting/lighting_area.dm @@ -1,9 +1,30 @@ /area luminosity = TRUE - var/dynamic_lighting = TRUE + var/dynamic_lighting = DYNAMIC_LIGHTING_ENABLED -/area/New() - . = ..() +/area/proc/set_dynamic_lighting(var/new_dynamic_lighting = DYNAMIC_LIGHTING_ENABLED) + if(new_dynamic_lighting == dynamic_lighting) + return FALSE - if(dynamic_lighting) - luminosity = FALSE \ No newline at end of file + dynamic_lighting = new_dynamic_lighting + + if(IS_DYNAMIC_LIGHTING(src)) + cut_overlay(/obj/effect/fullbright) + for (var/turf/T in src) + if(IS_DYNAMIC_LIGHTING(T)) + T.lighting_build_overlay() + + else + add_overlay(/obj/effect/fullbright) + for (var/turf/T in src) + if(T.lighting_object) + T.lighting_clear_overlay() + + return TRUE + +/area/vv_edit_var(var_name, var_value) + switch(var_name) + if("dynamic_lighting") + set_dynamic_lighting(var_value) + return TRUE + return ..() \ No newline at end of file diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 646fe0ba15d..ff4bc517979 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -1,14 +1,18 @@ + /atom - var/light_power = 1 // intensity of the light - var/light_range = 0 // range in tiles of the light - var/light_color // Hexadecimal RGB string representing the colour of the light + var/light_power = 1 // Intensity of the light. + var/light_range = 0 // Range in tiles of the light. + var/light_color // Hexadecimal RGB string representing the colour of the light. - var/datum/light_source/light - var/list/light_sources + var/tmp/datum/light_source/light // Our light source. Don't fuck with this directly unless you have a good reason! + var/tmp/list/light_sources // Any light sources that are "inside" of us, for example, if src here was a mob that's carrying a flashlight, that flashlight's light source would be part of this list. -// Nonsensical value for l_color default, so we can detect if it gets set to null. +// The proc you should always use to set the light of this atom. +// Nonesensical value for l_color default, so we can detect if it gets set to null. #define NONSENSICAL_VALUE -99999 -/atom/proc/set_light(l_range, l_power, l_color = NONSENSICAL_VALUE) +/atom/proc/set_light(var/l_range, var/l_power, var/l_color = NONSENSICAL_VALUE) + if(l_range > 0 && l_range < MINIMUM_USEFUL_LIGHT_RANGE) + l_range = MINIMUM_USEFUL_LIGHT_RANGE //Brings the range up to 1.4, which is just barely brighter than the soft lighting that surrounds players. if(l_power != null) light_power = l_power @@ -18,59 +22,48 @@ if(l_color != NONSENSICAL_VALUE) light_color = l_color + SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT, l_range, l_power, l_color) + update_light() #undef NONSENSICAL_VALUE +// Will update the light (duh). +// Creates or destroys it if needed, makes it update values, makes sure it's got the correct source turf... /atom/proc/update_light() set waitfor = FALSE + if(QDELETED(src)) + return - if(!light_power || !light_range) - if(light) - light.destroy() - light = null + if(!light_power || !light_range) // We won't emit light anyways, destroy the light source. + QDEL_NULL(light) else - if(!istype(loc, /atom/movable)) + if(!ismovableatom(loc)) // We choose what atom should be the top atom of the light here. . = src else . = loc - if(light) + if(light) // Update the light or create it if it does not exist. light.update(.) else - light = new /datum/light_source(src, .) + light = new/datum/light_source(src, .) /atom/proc/extinguish_light() return -/atom/Destroy() - if(light) - light.destroy() - light = null - return ..() - +// If we have opacity, make sure to tell (potentially) affected light sources. /atom/movable/Destroy() var/turf/T = loc - if(opacity && istype(T)) - T.reconsider_lights() - return ..() - -/atom/movable/Move() - var/turf/old_loc = loc . = ..() + if(opacity && istype(T)) + var/old_has_opaque_atom = T.has_opaque_atom + T.recalc_atom_opacity() + if(old_has_opaque_atom != T.has_opaque_atom) + T.reconsider_lights() - if(loc != old_loc) - for(var/datum/light_source/L in light_sources) - L.source_atom.update_light() - - var/turf/new_loc = loc - if(istype(old_loc) && opacity) - old_loc.reconsider_lights() - - if(istype(new_loc) && opacity) - new_loc.reconsider_lights() - -/atom/proc/set_opacity(new_opacity) +// Should always be used to change the opacity of an atom. +// It notifies (potentially) affected light sources so they can update (if needed). +/atom/proc/set_opacity(var/new_opacity) if(new_opacity == opacity) return @@ -88,14 +81,54 @@ if(old_has_opaque_atom != T.has_opaque_atom) T.reconsider_lights() -/obj/item/equipped() - . = ..() - update_light() -/obj/item/pickup() +/atom/movable/Moved(atom/OldLoc, Dir) . = ..() - update_light() + var/datum/light_source/L + var/thing + for (thing in light_sources) // Cycle through the light sources on this atom and tell them to update. + L = thing + L.source_atom.update_light() -/obj/item/dropped() - . = ..() - update_light() +/atom/vv_edit_var(var_name, var_value) + switch (var_name) + if("light_range") + set_light(l_range=var_value) + return TRUE + + if("light_power") + set_light(l_power=var_value) + return TRUE + + if("light_color") + set_light(l_color=var_value) + return TRUE + + return ..() + + +/atom/proc/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE) + return + +/turf/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE) + if(!_duration) + stack_trace("Lighting FX obj created on a turf without a duration") + new /obj/effect/dummy/lighting_obj (src, _color, _range, _power, _duration) + +/obj/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE) + var/temp_color + var/temp_power + var/temp_range + if(!_reset_lighting) //incase the obj already has a lighting color that you don't want cleared out after, ie computer monitors. + temp_color = light_color + temp_power = light_power + temp_range = light_range + set_light(_range, _power, _color) + addtimer(CALLBACK(src, /atom/proc/set_light, _reset_lighting ? initial(light_range) : temp_range, _reset_lighting ? initial(light_power) : temp_power, _reset_lighting ? initial(light_color) : temp_color), _duration, TIMER_OVERRIDE|TIMER_UNIQUE) + +/mob/living/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE) + mob_light(_color, _range, _power, _duration) + +/mob/living/proc/mob_light(_color, _range, _power, _duration) + var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj = new (src, _color, _range, _power, _duration) + return mob_light_obj diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 907e7aab8b5..d8b05d0c17f 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -1,15 +1,13 @@ -/var/total_lighting_corners = 0 -/var/datum/lighting_corner/dummy/dummy_lighting_corner = new -// Because we can control each corner of every lighting overlay. +// Because we can control each corner of every lighting object. // And corners get shared between multiple turfs (unless you're on the corners of the map, then 1 corner doesn't). // For the record: these should never ever ever be deleted, even if the turf doesn't have dynamic lighting. // This list is what the code that assigns corners listens to, the order in this list is the order in which corners are added to the /turf/corners list. -/var/list/LIGHTING_CORNER_DIAGONAL = list(NORTHEAST, SOUTHEAST, SOUTHWEST, NORTHWEST) +GLOBAL_LIST_INIT(LIGHTING_CORNER_DIAGONAL, list(NORTHEAST, SOUTHEAST, SOUTHWEST, NORTHWEST)) /datum/lighting_corner - var/list/turf/masters = list() - var/list/datum/light_source/affecting = list() // Light sources affecting us. + var/list/turf/masters + var/list/datum/light_source/affecting // Light sources affecting us. var/active = FALSE // TRUE if one of our masters has dynamic lighting. var/x = 0 @@ -27,13 +25,9 @@ var/cache_b = LIGHTING_SOFT_THRESHOLD var/cache_mx = 0 - var/update_gen = 0 - /datum/lighting_corner/New(var/turf/new_turf, var/diagonal) . = ..() - - total_lighting_corners++ - + masters = list() masters[new_turf] = turn(diagonal, 180) z = new_turf.z @@ -51,75 +45,99 @@ // Diagonal one is easy. T = get_step(new_turf, diagonal) - if (T) // In case we're on the map's border. - if (!T.corners) + if(T) // In case we're on the map's border. + if(!T.corners) T.corners = list(null, null, null, null) masters[T] = diagonal - i = LIGHTING_CORNER_DIAGONAL.Find(turn(diagonal, 180)) + i = GLOB.LIGHTING_CORNER_DIAGONAL.Find(turn(diagonal, 180)) T.corners[i] = src // Now the horizontal one. T = get_step(new_turf, horizontal) - if (T) // Ditto. - if (!T.corners) + if(T) // Ditto. + if(!T.corners) T.corners = list(null, null, null, null) masters[T] = ((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH) // Get the dir based on coordinates. - i = LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180)) + i = GLOB.LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180)) T.corners[i] = src // And finally the vertical one. T = get_step(new_turf, vertical) - if (T) - if (!T.corners) + if(T) + if(!T.corners) T.corners = list(null, null, null, null) masters[T] = ((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH) // Get the dir based on coordinates. - i = LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180)) + i = GLOB.LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180)) T.corners[i] = src update_active() /datum/lighting_corner/proc/update_active() active = FALSE - for (var/turf/T in masters) - if (T.lighting_overlay) + var/turf/T + var/thing + for (thing in masters) + T = thing + if(T.lighting_object) active = TRUE // God that was a mess, now to do the rest of the corner code! Hooray! /datum/lighting_corner/proc/update_lumcount(var/delta_r, var/delta_g, var/delta_b) + + if((abs(delta_r)+abs(delta_g)+abs(delta_b)) == 0) + return + lum_r += delta_r lum_g += delta_g lum_b += delta_b - if (!needs_update) + if(!needs_update) needs_update = TRUE - lighting_update_corners += src + GLOB.lighting_update_corners += src -/datum/lighting_corner/proc/update_overlays() - - // Cache these values a head of time so 4 individual lighting overlays don't all calculate them individually. - var/mx = max(lum_r, lum_g, lum_b) // Scale it so 1 is the strongest lum, if it is above 1. +/datum/lighting_corner/proc/update_objects() + // Cache these values a head of time so 4 individual lighting objects don't all calculate them individually. + var/lum_r = src.lum_r + var/lum_g = src.lum_g + var/lum_b = src.lum_b + var/mx = max(lum_r, lum_g, lum_b) // Scale it so one of them is the strongest lum, if it is above 1. . = 1 // factor - if (mx > 1) + if(mx > 1) . = 1 / mx - else if (mx < LIGHTING_SOFT_THRESHOLD) + #if LIGHTING_SOFT_THRESHOLD != 0 + else if(mx < LIGHTING_SOFT_THRESHOLD) . = 0 // 0 means soft lighting. - cache_r = lum_r * . || LIGHTING_SOFT_THRESHOLD - cache_g = lum_g * . || LIGHTING_SOFT_THRESHOLD - cache_b = lum_b * . || LIGHTING_SOFT_THRESHOLD - cache_mx = mx + cache_r = round(lum_r * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD + cache_g = round(lum_g * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD + cache_b = round(lum_b * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD + #else + cache_r = round(lum_r * ., LIGHTING_ROUND_VALUE) + cache_g = round(lum_g * ., LIGHTING_ROUND_VALUE) + cache_b = round(lum_b * ., LIGHTING_ROUND_VALUE) + #endif + cache_mx = round(mx, LIGHTING_ROUND_VALUE) for (var/TT in masters) var/turf/T = TT - if (T.lighting_overlay) - if (!T.lighting_overlay.needs_update) - T.lighting_overlay.needs_update = TRUE - lighting_update_overlays += T.lighting_overlay + if(T.lighting_object) + if(!T.lighting_object.needs_update) + T.lighting_object.needs_update = TRUE + GLOB.lighting_update_objects += T.lighting_object /datum/lighting_corner/dummy/New() return + + +/datum/lighting_corner/Destroy(var/force) + if(!force) + return QDEL_HINT_LETMELIVE + + stack_trace("Attempted qdel of a lighting corner.") + + return ..() \ No newline at end of file diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm new file mode 100644 index 00000000000..930e953d5eb --- /dev/null +++ b/code/modules/lighting/lighting_object.dm @@ -0,0 +1,148 @@ +/atom/movable/lighting_object + name = "" + + anchored = TRUE + + icon = LIGHTING_ICON + icon_state = "transparent" + color = LIGHTING_BASE_MATRIX + plane = LIGHTING_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + layer = LIGHTING_LAYER + invisibility = INVISIBILITY_LIGHTING + simulated = FALSE + + var/needs_update = FALSE + var/turf/myturf + +/atom/movable/lighting_object/Initialize(mapload) + . = ..() + verbs.Cut() + + myturf = loc + if(myturf.lighting_object) + qdel(myturf.lighting_object, force = TRUE) + myturf.lighting_object = src + myturf.luminosity = 0 + + for(var/turf/space/S in RANGE_TURFS(1, src)) //RANGE_TURFS is in code\__HELPERS\game.dm + S.update_starlight() + + needs_update = TRUE + GLOB.lighting_update_objects += src + +/atom/movable/lighting_object/Destroy(var/force) + if(force) + GLOB.lighting_update_objects -= src + if(loc != myturf) + var/turf/oldturf = get_turf(myturf) + var/turf/newturf = get_turf(loc) + stack_trace("A lighting object was qdeleted with a different loc then it is suppose to have ([COORD(oldturf)] -> [COORD(newturf)])") + if(isturf(myturf)) + myturf.lighting_object = null + myturf.luminosity = 1 + myturf = null + + return ..() + + else + return QDEL_HINT_LETMELIVE + +/atom/movable/lighting_object/proc/update() + if(loc != myturf) + if(loc) + var/turf/oldturf = get_turf(myturf) + var/turf/newturf = get_turf(loc) + warning("A lighting object realised it's loc had changed in update() ([myturf]\[[myturf ? myturf.type : "null"]]([COORD(oldturf)]) -> [loc]\[[ loc ? loc.type : "null"]]([COORD(newturf)]))!") + + qdel(src, TRUE) + return + + // To the future coder who sees this and thinks + // "Why didn't he just use a loop?" + // Well my man, it's because the loop performed like shit. + // And there's no way to improve it because + // without a loop you can make the list all at once which is the fastest you're gonna get. + // Oh it's also shorter line wise. + // Including with these comments. + + // See LIGHTING_CORNER_DIAGONAL in lighting_corner.dm for why these values are what they are. + var/static/datum/lighting_corner/dummy/dummy_lighting_corner = new + + var/list/corners = myturf.corners + var/datum/lighting_corner/cr = dummy_lighting_corner + var/datum/lighting_corner/cg = dummy_lighting_corner + var/datum/lighting_corner/cb = dummy_lighting_corner + var/datum/lighting_corner/ca = dummy_lighting_corner + if(corners) //done this way for speed + cr = corners[3] || dummy_lighting_corner + cg = corners[2] || dummy_lighting_corner + cb = corners[4] || dummy_lighting_corner + ca = corners[1] || dummy_lighting_corner + + var/max = max(cr.cache_mx, cg.cache_mx, cb.cache_mx, ca.cache_mx) + + var/rr = cr.cache_r + var/rg = cr.cache_g + var/rb = cr.cache_b + + var/gr = cg.cache_r + var/gg = cg.cache_g + var/gb = cg.cache_b + + var/br = cb.cache_r + var/bg = cb.cache_g + var/bb = cb.cache_b + + var/ar = ca.cache_r + var/ag = ca.cache_g + var/ab = ca.cache_b + + #if LIGHTING_SOFT_THRESHOLD != 0 + var/set_luminosity = max > LIGHTING_SOFT_THRESHOLD + #else + // Because of floating pointsâ„¢?, it won't even be a flat 0. + // This number is mostly arbitrary. + var/set_luminosity = max > 1e-6 + #endif + + if((rr & gr & br & ar) && (rg + gg + bg + ag + rb + gb + bb + ab == 8)) + //anything that passes the first case is very likely to pass the second, and addition is a little faster in this case + icon_state = "transparent" + color = null + else if(!set_luminosity) + icon_state = "dark" + color = null + else + icon_state = null + color = list( + rr, rg, rb, 00, + gr, gg, gb, 00, + br, bg, bb, 00, + ar, ag, ab, 00, + 00, 00, 00, 01 + ) + + luminosity = set_luminosity + +// Variety of overrides so the overlays don't get affected by weird things. + +/atom/movable/lighting_object/ex_act(severity) + return 0 + +/atom/movable/lighting_object/singularity_act() + return + +/atom/movable/lighting_object/singularity_pull() + return + +/atom/movable/lighting_object/blob_act() + return + +/atom/movable/lighting_object/onTransitZ() + return + +// Override here to prevent things accidentally moving around overlays. +/atom/movable/lighting_object/forceMove(atom/destination, var/no_tp=FALSE, var/harderforce = FALSE) + if(harderforce) + . = ..() \ No newline at end of file diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm deleted file mode 100644 index a8f87338ae8..00000000000 --- a/code/modules/lighting/lighting_overlay.dm +++ /dev/null @@ -1,89 +0,0 @@ -/var/total_lighting_overlays = 0 -/atom/movable/lighting_overlay - name = "" - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - simulated = 0 - anchored = 1 - icon = LIGHTING_ICON - layer = LIGHTING_LAYER - plane = LIGHTING_PLANE - invisibility = INVISIBILITY_LIGHTING - color = LIGHTING_BASE_MATRIX - icon_state = "light1" - blend_mode = BLEND_MULTIPLY - - var/lum_r = 0 - var/lum_g = 0 - var/lum_b = 0 - - var/needs_update = FALSE - -/atom/movable/lighting_overlay/New(var/atom/loc, var/no_update = FALSE) - . = ..() - verbs.Cut() - total_lighting_overlays++ - - var/turf/T = loc //If this runtimes atleast we'll know what's creating overlays outside of turfs. - T.lighting_overlay = src - T.luminosity = 0 - if(no_update) - return - update_overlay() - -/atom/movable/lighting_overlay/proc/update_overlay() - set waitfor = FALSE - var/turf/T = loc - - if(!istype(T)) - if(loc) - log_debug("A lighting overlay realised its loc was NOT a turf (actual loc: [loc][loc ? ", " + loc.type : "null"]) in update_overlay() and got qdel'ed!") - else - log_debug("A lighting overlay realised it was in nullspace in update_overlay() and got pooled!") - qdel(src) - return - - // To the future coder who sees this and thinks - // "Why didn't he just use a loop?" - // Well my man, it's because the loop performed like shit. - // And there's no way to improve it because - // without a loop you can make the list all at once which is the fastest you're gonna get. - // Oh it's also shorter line wise. - // Including with these comments. - - // See LIGHTING_CORNER_DIAGONAL in lighting_corner.dm for why these values are what they are. - // No I seriously cannot think of a more efficient method, fuck off Comic. - var/datum/lighting_corner/cr = T.corners[3] || dummy_lighting_corner - var/datum/lighting_corner/cg = T.corners[2] || dummy_lighting_corner - var/datum/lighting_corner/cb = T.corners[4] || dummy_lighting_corner - var/datum/lighting_corner/ca = T.corners[1] || dummy_lighting_corner - - var/max = max(cr.cache_mx, cg.cache_mx, cb.cache_mx, ca.cache_mx) - - color = list( - cr.cache_r, cr.cache_g, cr.cache_b, 0, - cg.cache_r, cg.cache_g, cg.cache_b, 0, - cb.cache_r, cb.cache_g, cb.cache_b, 0, - ca.cache_r, ca.cache_g, ca.cache_b, 0, - 0, 0, 0, 1 - ) - luminosity = max > LIGHTING_SOFT_THRESHOLD - - - -/atom/movable/lighting_overlay/singularity_act() - return - -/atom/movable/lighting_overlay/singularity_pull() - return - -/atom/movable/lighting_overlay/Destroy() - total_lighting_overlays-- - global.lighting_update_overlays -= src - global.lighting_update_overlays_old -= src - - var/turf/T = loc - if(istype(T)) - T.lighting_overlay = null - T.luminosity = 1 - - return ..() diff --git a/code/modules/lighting/lighting_setup.dm b/code/modules/lighting/lighting_setup.dm index 981de658649..ed8b7e71d6c 100644 --- a/code/modules/lighting/lighting_setup.dm +++ b/code/modules/lighting/lighting_setup.dm @@ -1,16 +1,12 @@ -/proc/create_all_lighting_overlays() - for(var/zlevel = 1 to world.maxz) - create_lighting_overlays_zlevel(zlevel) - -/proc/create_lighting_overlays_zlevel(var/zlevel) - ASSERT(zlevel) - - for(var/turf/T in block(locate(1, 1, zlevel), locate(world.maxx, world.maxy, zlevel))) - if(!T.dynamic_lighting) +/proc/create_all_lighting_objects() + for(var/area/A in GLOB.all_areas) + if(!IS_DYNAMIC_LIGHTING(A)) continue - var/area/A = T.loc - if(!A.dynamic_lighting) - continue + for(var/turf/T in A) + if(!IS_DYNAMIC_LIGHTING(T)) + continue - new /atom/movable/lighting_overlay(T, TRUE) + new/atom/movable/lighting_object(T) + CHECK_TICK + CHECK_TICK \ No newline at end of file diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index d878d8c4b6e..207a91d58b4 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -1,12 +1,12 @@ -/var/total_lighting_sources = 0 // This is where the fun begins. // These are the main datums that emit light. /datum/light_source - var/atom/top_atom // The atom we're emitting light from(for example a mob if we're from a flashlight that's being held). + var/atom/top_atom // The atom we're emitting light from (for example a mob if we're from a flashlight that's being held). var/atom/source_atom // The atom that we belong to. var/turf/source_turf // The turf under the above. + var/turf/pixel_turf // The turf the top_atom appears to over. var/light_power // Intensity of the emitter light. var/light_range // The range of the emitted light. var/light_color // The colour of the light, string, decomposed by parse_light_color() @@ -26,133 +26,80 @@ var/applied = FALSE // Whether we have applied our light yet or not. - var/vis_update // Whether we should smartly recalculate visibility. and then only update tiles that became(in)visible to us. - var/needs_update // Whether we are queued for an update. - var/destroyed // Whether we are destroyed and need to stop emitting light. - var/force_update + var/needs_update = LIGHTING_NO_UPDATE // Whether we are queued for an update. + /datum/light_source/New(var/atom/owner, var/atom/top) - total_lighting_sources++ source_atom = owner // Set our new owner. - if(!source_atom.light_sources) - source_atom.light_sources = list() - - source_atom.light_sources += src // Add us to the lights of our owner. + LAZYADD(source_atom.light_sources, src) top_atom = top if(top_atom != source_atom) - if(!top.light_sources) - top.light_sources = list() - - top_atom.light_sources += src + LAZYADD(top_atom.light_sources, src) source_turf = top_atom + pixel_turf = get_turf_pixel(top_atom) || source_turf + light_power = source_atom.light_power light_range = source_atom.light_range light_color = source_atom.light_color parse_light_color() - effect_str = list() - affecting_turfs = list() - update() - return ..() -// Kill ourselves. -/datum/light_source/proc/destroy() - total_lighting_sources-- - destroyed = TRUE - force_update() +/datum/light_source/Destroy(force) + remove_lum() if(source_atom) - if(!source_atom.light_sources) - log_runtime(EXCEPTION("Atom [source_atom] was a light source, but lacked a light source list!\n"), source_atom) - else - source_atom.light_sources -= src + LAZYREMOVE(source_atom.light_sources, src) if(top_atom) - top_atom.light_sources -= src + LAZYREMOVE(top_atom.light_sources, src) + + if(needs_update) + GLOB.lighting_update_lights -= src + + . = ..() + +// Yes this doesn't align correctly on anything other than 4 width tabs. +// If you want it to go switch everybody to elastic tab stops. +// Actually that'd be great if you could! +#define EFFECT_UPDATE(level) \ + if(needs_update == LIGHTING_NO_UPDATE) \ + GLOB.lighting_update_lights += src; \ + if(needs_update < level) \ + needs_update = level; \ -// Call it dirty, I don't care. -// This is here so there's no performance loss on non-instant updates from the fact that the engine can also do instant updates. -// If you're wondering what's with the "BYOND" argument: BYOND won't let me have a() macro that has no arguments :|. -#define effect_update(BYOND) \ - if(!needs_update) \ - { \ - lighting_update_lights += src; \ - needs_update = TRUE; \ - } // This proc will cause the light source to update the top atom, and add itself to the update queue. /datum/light_source/proc/update(var/atom/new_top_atom) // This top atom is different. if(new_top_atom && new_top_atom != top_atom) - if(top_atom != source_atom) // Remove ourselves from the light sources of that top atom. - top_atom.light_sources -= src + if(top_atom != source_atom && top_atom.light_sources) // Remove ourselves from the light sources of that top atom. + LAZYREMOVE(top_atom.light_sources, src) top_atom = new_top_atom if(top_atom != source_atom) - if(!top_atom.light_sources) - top_atom.light_sources = list() + LAZYADD(top_atom.light_sources, src) // Add ourselves to the light sources of our new top atom. - top_atom.light_sources += src // Add ourselves to the light sources of our new top atom. - - effect_update(null) + EFFECT_UPDATE(LIGHTING_CHECK_UPDATE) // Will force an update without checking if it's actually needed. /datum/light_source/proc/force_update() - force_update = 1 - - effect_update(null) + EFFECT_UPDATE(LIGHTING_FORCE_UPDATE) // Will cause the light source to recalculate turfs that were removed or added to visibility only. /datum/light_source/proc/vis_update() - vis_update = 1 - - effect_update(null) - -// Will check if we actually need to update, and update any variables that may need to be updated. -/datum/light_source/proc/check() - if(!source_atom || !light_range || !light_power) - destroy() - return 1 - - if(!top_atom) - top_atom = source_atom - . = 1 - - if(isturf(top_atom)) - if(source_turf != top_atom) - source_turf = top_atom - . = 1 - else if(top_atom.loc != source_turf) - source_turf = top_atom.loc - . = 1 - - if(source_atom.light_power != light_power) - light_power = source_atom.light_power - . = 1 - - if(source_atom.light_range != light_range) - light_range = source_atom.light_range - . = 1 - - if(light_range && light_power && !applied) - . = 1 - - if(source_atom.light_color != light_color) - light_color = source_atom.light_color - parse_light_color() - . = 1 + EFFECT_UPDATE(LIGHTING_VIS_UPDATE) // Decompile the hexadecimal colour into lumcounts of each perspective. /datum/light_source/proc/parse_light_color() if(light_color) - lum_r = GetRedPart (light_color) / 255 - lum_g = GetGreenPart(light_color) / 255 - lum_b = GetBluePart (light_color) / 255 + lum_r = GetRedPart (light_color) / 255 + lum_g = GetGreenPart (light_color) / 255 + lum_b = GetBluePart (light_color) / 255 else lum_r = 1 lum_g = 1 @@ -163,128 +110,189 @@ // If you're wondering what's with the backslashes, the backslashes cause BYOND to not automatically end the line. // As such this all gets counted as a single line. // The braces and semicolons are there to be able to do this on a single line. +#define LUM_FALLOFF(C, T) (1 - CLAMP01(sqrt((C.x - T.x) ** 2 + (C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range))) -#define APPLY_CORNER(C) \ - . = LUM_FALLOFF(C, source_turf); \ - \ - . *= light_power; \ - \ - effect_str[C] = .; \ - \ - C.update_lumcount \ - ( \ - . * applied_lum_r, \ - . * applied_lum_g, \ - . * applied_lum_b \ +#define APPLY_CORNER(C) \ + . = LUM_FALLOFF(C, pixel_turf); \ + . *= light_power; \ + var/OLD = effect_str[C]; \ + effect_str[C] = .; \ + \ + C.update_lumcount \ + ( \ + (. * lum_r) - (OLD * applied_lum_r), \ + (. * lum_g) - (OLD * applied_lum_g), \ + (. * lum_b) - (OLD * applied_lum_b) \ ); -// I don't need to explain what this does, do I? -#define REMOVE_CORNER(C) \ - . = -effect_str[C]; \ - C.update_lumcount \ - ( \ - . * applied_lum_r, \ - . * applied_lum_g, \ - . * applied_lum_b \ +#define REMOVE_CORNER(C) \ + . = -effect_str[C]; \ + C.update_lumcount \ + ( \ + . * applied_lum_r, \ + . * applied_lum_g, \ + . * applied_lum_b \ ); // This is the define used to calculate falloff. -#define LUM_FALLOFF(C, T)(1 - CLAMP01(sqrt((C.x - T.x) ** 2 +(C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range))) -/datum/light_source/proc/apply_lum() - var/static/update_gen = 1 - applied = 1 +/datum/light_source/proc/remove_lum() + applied = FALSE + var/thing + for (thing in affecting_turfs) + var/turf/T = thing + LAZYREMOVE(T.affecting_lights, src) + + affecting_turfs = null + + var/datum/lighting_corner/C + for (thing in effect_str) + C = thing + REMOVE_CORNER(C) + + LAZYREMOVE(C.affecting, src) + + effect_str = null + +/datum/light_source/proc/recalc_corner(var/datum/lighting_corner/C) + LAZYINITLIST(effect_str) + if(effect_str[C]) // Already have one. + REMOVE_CORNER(C) + effect_str[C] = 0 + + APPLY_CORNER(C) + UNSETEMPTY(effect_str) + +/datum/light_source/proc/update_corners() + var/update = FALSE + var/atom/source_atom = src.source_atom + + if(QDELETED(source_atom)) + qdel(src) + return + + if(source_atom.light_power != light_power) + light_power = source_atom.light_power + update = TRUE + + if(source_atom.light_range != light_range) + light_range = source_atom.light_range + update = TRUE + + if(!top_atom) + top_atom = source_atom + update = TRUE + + if(!light_range || !light_power) + qdel(src) + return + + if(isturf(top_atom)) + if(source_turf != top_atom) + source_turf = top_atom + pixel_turf = source_turf + update = TRUE + else if(top_atom.loc != source_turf) + source_turf = top_atom.loc + pixel_turf = get_turf_pixel(top_atom) + update = TRUE + else + var/P = get_turf_pixel(top_atom) + if(P != pixel_turf) + pixel_turf = P + update = TRUE + + if(!isturf(source_turf)) + if(applied) + remove_lum() + return + + if(light_range && light_power && !applied) + update = TRUE + + if(source_atom.light_color != light_color) + light_color = source_atom.light_color + parse_light_color() + update = TRUE + + else if(applied_lum_r != lum_r || applied_lum_g != lum_g || applied_lum_b != lum_b) + update = TRUE + + if(update) + needs_update = LIGHTING_CHECK_UPDATE + applied = TRUE + else if(needs_update == LIGHTING_CHECK_UPDATE) + return //nothing's changed + + var/list/datum/lighting_corner/corners = list() + var/list/turf/turfs = list() + var/thing + var/datum/lighting_corner/C + var/turf/T + if(source_turf) + var/oldlum = source_turf.luminosity + source_turf.luminosity = CEILING(light_range, 1) + for(T in view(CEILING(light_range, 1), source_turf)) + for (thing in T.get_corners(source_turf)) + C = thing + corners[C] = 0 + turfs += T + source_turf.luminosity = oldlum + + LAZYINITLIST(affecting_turfs) + var/list/L = turfs - affecting_turfs // New turfs, add us to the affecting lights of them. + affecting_turfs += L + for (thing in L) + T = thing + LAZYADD(T.affecting_lights, src) + + L = affecting_turfs - turfs // Now-gone turfs, remove us from the affecting lights. + affecting_turfs -= L + for (thing in L) + T = thing + LAZYREMOVE(T.affecting_lights, src) + + LAZYINITLIST(effect_str) + if(needs_update == LIGHTING_VIS_UPDATE) + for (thing in corners - effect_str) // New corners + C = thing + LAZYADD(C.affecting, src) + if(!C.active) + effect_str[C] = 0 + continue + APPLY_CORNER(C) + else + L = corners - effect_str + for (thing in L) // New corners + C = thing + LAZYADD(C.affecting, src) + if(!C.active) + effect_str[C] = 0 + continue + APPLY_CORNER(C) + + for (thing in corners - L) // Existing corners + C = thing + if(!C.active) + effect_str[C] = 0 + continue + APPLY_CORNER(C) + + L = effect_str - corners + for (thing in L) // Old, now gone, corners. + C = thing + REMOVE_CORNER(C) + LAZYREMOVE(C.affecting, src) + effect_str -= L - // Keep track of the last applied lum values so that the lighting can be reversed applied_lum_r = lum_r applied_lum_g = lum_g applied_lum_b = lum_b - FOR_DVIEW(var/turf/T, light_range, source_turf, INVISIBILITY_LIGHTING) - if(!T.lighting_corners_initialised) - T.generate_missing_corners() + UNSETEMPTY(effect_str) + UNSETEMPTY(affecting_turfs) - for(var/datum/lighting_corner/C in T.get_corners()) - if(C.update_gen == update_gen) - continue - - C.update_gen = update_gen - C.affecting += src - - if(!C.active) - effect_str[C] = 0 - continue - - APPLY_CORNER(C) - - if(!T.affecting_lights) - T.affecting_lights = list() - - T.affecting_lights += src - affecting_turfs += T - - update_gen++ - -/datum/light_source/proc/remove_lum() - applied = FALSE - - for(var/turf/T in affecting_turfs) - if(!T.affecting_lights) - T.affecting_lights = list() - else - T.affecting_lights -= src - - affecting_turfs.Cut() - - for(var/datum/lighting_corner/C in effect_str) - REMOVE_CORNER(C) - - C.affecting -= src - - effect_str.Cut() - -/datum/light_source/proc/recalc_corner(var/datum/lighting_corner/C) - if(effect_str.Find(C)) // Already have one. - REMOVE_CORNER(C) - - APPLY_CORNER(C) - -/datum/light_source/proc/smart_vis_update() - var/list/datum/lighting_corner/corners = list() - var/list/turf/turfs = list() - FOR_DVIEW(var/turf/T, light_range, source_turf, 0) - if(!T.lighting_corners_initialised) - T.generate_missing_corners() - corners |= T.get_corners() - turfs += T - - var/list/L = turfs - affecting_turfs // New turfs, add us to the affecting lights of them. - affecting_turfs += L - for(var/turf/T in L) - if(!T.affecting_lights) - T.affecting_lights = list(src) - else - T.affecting_lights += src - - L = affecting_turfs - turfs // Now-gone turfs, remove us from the affecting lights. - affecting_turfs -= L - for(var/turf/T in L) - T.affecting_lights -= src - - for(var/datum/lighting_corner/C in corners - effect_str) // New corners - C.affecting += src - if(!C.active) - effect_str[C] = 0 - continue - - APPLY_CORNER(C) - - for(var/datum/lighting_corner/C in effect_str - corners) // Old, now gone, corners. - REMOVE_CORNER(C) - C.affecting -= src - effect_str -= C - -#undef effect_update +#undef EFFECT_UPDATE #undef LUM_FALLOFF #undef REMOVE_CORNER -#undef APPLY_CORNER +#undef APPLY_CORNER \ No newline at end of file diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index ddb934aed61..c2198cea650 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -5,98 +5,131 @@ var/tmp/lighting_corners_initialised = FALSE var/tmp/list/datum/light_source/affecting_lights // List of light sources affecting this turf. - var/tmp/atom/movable/lighting_overlay/lighting_overlay // Our lighting overlay. + var/tmp/atom/movable/lighting_object/lighting_object // Our lighting object. var/tmp/list/datum/lighting_corner/corners var/tmp/has_opaque_atom = FALSE // Not to be confused with opacity, this will be TRUE if there's any opaque atom on the tile. -/turf/New() - . = ..() - - if(opacity) - has_opaque_atom = TRUE - // Causes any affecting light sources to be queued for a visibility update, for example a door got opened. /turf/proc/reconsider_lights() - for(var/datum/light_source/L in affecting_lights) + var/datum/light_source/L + var/thing + for (thing in affecting_lights) + L = thing L.vis_update() /turf/proc/lighting_clear_overlay() - if(lighting_overlay) - qdel(lighting_overlay) + if(lighting_object) + qdel(lighting_object, TRUE) - for(var/datum/lighting_corner/C in corners) + var/datum/lighting_corner/C + var/thing + for (thing in corners) + if(!thing) + continue + C = thing C.update_active() -// Builds a lighting overlay for us, but only if our area is dynamic. +// Builds a lighting object for us, but only if our area is dynamic. /turf/proc/lighting_build_overlay() - if(lighting_overlay) - return + if(lighting_object) + qdel(lighting_object,force=TRUE) //Shitty fix for lighting objects persisting after death var/area/A = loc - if(A.dynamic_lighting) - if(!lighting_corners_initialised) - generate_missing_corners() + if(!IS_DYNAMIC_LIGHTING(A) && !light_sources) + return - new /atom/movable/lighting_overlay(src) + if(!lighting_corners_initialised) + generate_missing_corners() - for(var/datum/lighting_corner/C in corners) - if(!C.active) // We would activate the corner, calculate the lighting for it. - for(var/L in C.affecting) - var/datum/light_source/S = L - S.recalc_corner(C) + new/atom/movable/lighting_object(src) - C.active = TRUE + var/thing + var/datum/lighting_corner/C + var/datum/light_source/S + for (thing in corners) + if(!thing) + continue + C = thing + if(!C.active) // We would activate the corner, calculate the lighting for it. + for (thing in C.affecting) + S = thing + S.recalc_corner(C) + C.active = TRUE // Used to get a scaled lumcount. /turf/proc/get_lumcount(var/minlum = 0, var/maxlum = 1) - if(!lighting_overlay) + if(!lighting_object) return 1 var/totallums = 0 - for(var/datum/lighting_corner/L in corners) - totallums += max(L.lum_r, L.lum_g, L.lum_b) + var/thing + var/datum/lighting_corner/L + for (thing in corners) + if(!thing) + continue + L = thing + totallums += L.lum_r + L.lum_b + L.lum_g - totallums /= 4 // 4 corners, max channel selected, return the average + totallums /= 12 // 4 corners, each with 3 channels, get the average. - totallums =(totallums - minlum) /(maxlum - minlum) + totallums = (totallums - minlum) / (maxlum - minlum) return CLAMP01(totallums) +// Returns a boolean whether the turf is on soft lighting. +// Soft lighting being the threshold at which point the overlay considers +// itself as too dark to allow sight and see_in_dark becomes useful. +// So basically if this returns true the tile is unlit black. +/turf/proc/is_softly_lit() + if(!lighting_object) + return FALSE + + return !lighting_object.luminosity + // Can't think of a good name, this proc will recalculate the has_opaque_atom variable. /turf/proc/recalc_atom_opacity() - has_opaque_atom = FALSE - for(var/atom/A in src.contents + src) // Loop through every movable atom on our tile PLUS ourselves (we matter too...) - if(A.opacity) - has_opaque_atom = TRUE + has_opaque_atom = opacity + if(!has_opaque_atom) + for (var/atom/A in src.contents) // Loop through every movable atom on our tile PLUS ourselves (we matter too...) + if(A.opacity) + has_opaque_atom = TRUE + break -// If an opaque movable atom moves around we need to potentially update visibility. -/turf/Entered(var/atom/movable/Obj, var/atom/OldLoc) - . = ..() - - if(Obj && Obj.opacity) - has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. - reconsider_lights() - -/turf/Exited(var/atom/movable/Obj, var/atom/newloc) +/turf/Exited(atom/movable/Obj, atom/newloc) . = ..() if(Obj && Obj.opacity) recalc_atom_opacity() // Make sure to do this before reconsider_lights(), incase we're on instant updates. reconsider_lights() +/turf/proc/change_area(var/area/old_area, var/area/new_area) + if(SSlighting.initialized) + if(new_area.dynamic_lighting != old_area.dynamic_lighting) + if(new_area.dynamic_lighting) + lighting_build_overlay() + else + lighting_clear_overlay() + /turf/proc/get_corners() + if(!IS_DYNAMIC_LIGHTING(src) && !light_sources) + return null + if(!lighting_corners_initialised) + generate_missing_corners() if(has_opaque_atom) return null // Since this proc gets used in a for loop, null won't be looped though. return corners /turf/proc/generate_missing_corners() + if(!IS_DYNAMIC_LIGHTING(src) && !light_sources) + return lighting_corners_initialised = TRUE if(!corners) corners = list(null, null, null, null) - for(var/i = 1 to 4) + for (var/i = 1 to 4) if(corners[i]) // Already have a corner on this direction. continue - corners[i] = new /datum/lighting_corner(src, LIGHTING_CORNER_DIAGONAL[i]) + corners[i] = new/datum/lighting_corner(src, GLOB.LIGHTING_CORNER_DIAGONAL[i]) + diff --git a/code/modules/lighting/~lighting_undefs.dm b/code/modules/lighting/~lighting_undefs.dm deleted file mode 100644 index 2de3f9dbe26..00000000000 --- a/code/modules/lighting/~lighting_undefs.dm +++ /dev/null @@ -1,7 +0,0 @@ -#undef LIGHTING_FALLOFF -#undef LIGHTING_LAMBERTIAN -#undef LIGHTING_HEIGHT - -#undef LIGHTING_ICON - -#undef LIGHTING_BASE_MATRIX diff --git a/code/modules/logic/logic_base.dm b/code/modules/logic/logic_base.dm index 519c47c408b..952001e87f7 100644 --- a/code/modules/logic/logic_base.dm +++ b/code/modules/logic/logic_base.dm @@ -42,7 +42,7 @@ if(tamperproof) //doing this during New so we don't have to worry about forgetting to set these vars during editting / defining unacidable = 1 ..() - if(radio_controller) + if(SSradio) set_frequency(frequency) component_parts = list() var/obj/item/circuitboard/logic_gate/LG = new(null) @@ -55,14 +55,14 @@ set_frequency(frequency) /obj/machinery/logic_gate/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_LOGIC) + radio_connection = SSradio.add_object(src, frequency, RADIO_LOGIC) return /obj/machinery/logic_gate/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() diff --git a/code/modules/martial_arts/cqc.dm b/code/modules/martial_arts/cqc.dm index 54f9ac97cd9..b57e7fc4f98 100644 --- a/code/modules/martial_arts/cqc.dm +++ b/code/modules/martial_arts/cqc.dm @@ -1,4 +1,4 @@ -#define SLAM_COMBO "HG" +#define SLAM_COMBO "GH" #define KICK_COMBO "HH" #define RESTRAIN_COMBO "GG" #define PRESSURE_COMBO "DG" @@ -8,15 +8,24 @@ name = "CQC" help_verb = /mob/living/carbon/human/proc/CQC_help block_chance = 75 + var/just_a_cook = FALSE + var/static/list/areas_under_siege = typecacheof(list(/area/crew_quarters/kitchen, + /area/crew_quarters/cafeteria, + /area/crew_quarters/bar)) -/datum/martial_art/cqc/can_use(mob/living/carbon/human/H) - if(istype(H.gloves, /obj/item/clothing/gloves/fingerless/rapid)) - return FALSE - return ..() +/datum/martial_art/cqc/under_siege + name = "Close Quarters Cooking" + just_a_cook = TRUE /datum/martial_art/cqc/proc/drop_restraining() restraining = FALSE +/datum/martial_art/cqc/can_use(mob/living/carbon/human/H) + var/area/A = get_area(H) + if(just_a_cook && !(is_type_in_typecache(A, areas_under_siege))) + return FALSE + return ..() + /datum/martial_art/cqc/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) return FALSE @@ -44,22 +53,23 @@ /datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) return FALSE - if(!D.stat || !D.weakened) + if(!D.weakened && !D.resting && !D.lying) D.visible_message("[A] slams [D] into the ground!", \ "[A] slams you into the ground!") playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1) D.apply_damage(10, BRUTE) D.Weaken(6) add_attack_logs(A, D, "Melee attacked with martial-art [src] : Slam", ATKLOG_ALL) - else //if target can't be slammed, do a regular grab attack then clear the streak - streak = "" - grab_act(A, D) - streak = "" + return TRUE + streak = "" + harm_act(A, D) + streak = "" return TRUE /datum/martial_art/cqc/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) return FALSE + var/success = FALSE if(!D.stat || !D.weakened) D.visible_message("[A] kicks [D] back!", \ "[A] kicks you back!") @@ -68,17 +78,20 @@ D.throw_at(throw_target, 1, 14, A) D.apply_damage(10, BRUTE) add_attack_logs(A, D, "Melee attacked with martial-art [src] : Kick", ATKLOG_ALL) - if(D.weakened && !D.stat) - D.visible_message("[A] kicks [D]'s head, knocking [D.p_them()] out!", \ - "[A] kicks your head, knocking you out!") - playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1) - D.SetSleeping(15) - D.adjustBrainLoss(15, 150) - add_attack_logs(A, D, "Knocked out with martial-art [src] : Kick", ATKLOG_ALL) - else //if target can't be kicked, do a regular harm attack then clear the streak - streak = "" - harm_act(A, D) - streak = "" + success = TRUE + if(D.weakened && !D.stat) + D.visible_message("[A] kicks [D]'s head, knocking [D.p_them()] out!", \ + "[A] kicks your head, knocking you out!") + playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1) + D.SetSleeping(15) + D.adjustBrainLoss(15) + add_attack_logs(A, D, "Knocked out with martial-art [src] : Kick", ATKLOG_ALL) + success = TRUE + if(success) + return TRUE + streak = "" + harm_act(A, D) + streak = "" return TRUE /datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -103,6 +116,10 @@ restraining = TRUE addtimer(CALLBACK(src, .proc/drop_restraining), 50, TIMER_UNIQUE) add_attack_logs(A, D, "Melee attacked with martial-art [src] : Restrain", ATKLOG_ALL) + return TRUE + streak = "" + harm_act(A, D) + streak = "" return TRUE /datum/martial_art/cqc/proc/Consecutive(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -118,10 +135,10 @@ D.adjustStaminaLoss(50) D.apply_damage(25, BRUTE) add_attack_logs(A, D, "Melee attacked with martial-art [src] : Consecutive", ATKLOG_ALL) - else //if target can't be hit, do a regular harm attack then clear the streak - streak = "" - harm_act(A, D) - streak = "" + return TRUE + streak = "" + harm_act(A, D) + streak = "" return TRUE /datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -133,6 +150,8 @@ var/obj/item/grab/G = D.grabbedby(A, 1) if(G) G.state = GRAB_AGGRESSIVE //Instant aggressive grab + add_attack_logs(A, D, "Melee attacked with martial-art [src] : aggressively grabbed", ATKLOG_ALL) + return TRUE /datum/martial_art/cqc/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -141,8 +160,9 @@ add_to_streak("H", D) if(check_streak(A, D)) return TRUE + add_attack_logs(A, D, "Melee attacked with martial-art [src]", ATKLOG_ALL) A.do_attack_animation(D) - var/picked_hit_type = pick("CQC'd", "neck chopped", "gut punched") + var/picked_hit_type = pick("CQC'd", "neck chopped", "gut punched", "Big Bossed") var/bonus_damage = 13 if(D.weakened || D.resting || D.lying) bonus_damage += 5 @@ -154,7 +174,7 @@ playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) D.visible_message("[A] [picked_hit_type] [D]!", \ "[A] [picked_hit_type] you!") - add_attack_logs(A, D, "Melee attacked with martial-art [src]", ATKLOG_ALL) + add_attack_logs(A, D, "Melee attacked with martial-art [src] : [picked_hit_type]", ATKLOG_ALL) if(A.resting && !D.stat && !D.weakened) D.visible_message("[A] leg sweeps [D]!", \ "[A] leg sweeps you!") @@ -168,24 +188,36 @@ if(!can_use(A)) return FALSE add_to_streak("D", D) + var/obj/item/I = null if(check_streak(A, D)) return TRUE - if(!restraining) - D.visible_message("[A] strikes [D]'s jaw with their hand!", \ - "[A] strikes your jaw, disorienting you!") - playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - D.Jitter(2) - D.apply_damage(5, BRUTE) - add_attack_logs(A, D, "Melee attacked with martial-art [src] : Disarm", ATKLOG_ALL) - if(restraining) + var/obj/item/grab/G = A.get_inactive_hand() + if(restraining && istype(G) && G.affecting == D) D.visible_message("[A] puts [D] into a chokehold!", \ "[A] puts you into a chokehold!") D.SetSleeping(20) restraining = FALSE - add_attack_logs(A, D, "Knocked out with martial-art [src] : Choke hold", ATKLOG_ALL) + if(G.state < GRAB_NECK) + G.state = GRAB_NECK + return TRUE else restraining = FALSE - return FALSE + + if(prob(65)) + if(!D.stat || !D.weakened || !restraining) + I = D.get_active_hand() + D.visible_message("[A] strikes [D]'s jaw with their hand!", \ + "[A] strikes your jaw, disorienting you!") + playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) + if(I && D.drop_item()) + A.put_in_hands(I) + D.Jitter(2) + D.apply_damage(5, BRUTE) + else + D.visible_message("[A] attempted to disarm [D]!", "[A] attempted to disarm [D]!") + playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + + add_attack_logs(A, D, "Melee attacked with martial-art [src] : Disarmed [I ? " grabbing \the [I]" : ""]", ATKLOG_ALL) return TRUE /mob/living/carbon/human/proc/CQC_help() @@ -194,11 +226,10 @@ set category = "CQC" to_chat(usr, "You try to remember some of the basics of CQC.") - to_chat(usr, "Slam: Harm Grab. Slam opponent into the ground, knocking them down.") + to_chat(usr, "Slam: Grab, switch hands, Harm. Slam opponent into the ground, knocking them down.") to_chat(usr, "CQC Kick: Harm Harm. Knocks opponent away. Knocks out stunned or knocked down opponents.") - to_chat(usr, "Restrain: Grab Switch Hand Grab. Locks opponent into a restraining position, stunning them.") - to_chat(usr, "Choke Hold: Restrain Disarm. Knocks out an opponent you have restrained.") + to_chat(usr, "Restrain: Grab, switch hands, Grab. Locks opponents into a restraining position, disarm to knock them out with a choke hold.") to_chat(usr, "Pressure: Disarm Grab. Decent stamina damage.") to_chat(usr, "Consecutive CQC: Disarm Disarm Harm. Mainly offensive move, huge damage and decent stamina damage.") - to_chat(usr, "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter melee attacks done to you.") \ No newline at end of file + to_chat(usr, "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you.") \ No newline at end of file diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm index aed823b372b..2940e810ade 100644 --- a/code/modules/martial_arts/martial.dm +++ b/code/modules/martial_arts/martial.dm @@ -267,7 +267,7 @@ H.Weaken(4) if(H.staminaloss && !H.sleeping) var/total_health = (H.health - H.staminaloss) - if(total_health <= config.health_threshold_crit && !H.stat) + if(total_health <= HEALTH_THRESHOLD_CRIT && !H.stat) H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking [H.p_them()] out cold!", \ "[user] knocks you unconscious!") H.SetSleeping(30) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index a413c328870..e96fd0e867b 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -151,7 +151,7 @@ /obj/structure/closet/crate/secure/loot/attack_hand(mob/user) if(locked) to_chat(user, "The crate is locked with a Deca-code lock.") - var/input = input(usr, "Enter [codelen] digits.", "Deca-Code Lock", "") as text + var/input = clean_input("Enter [codelen] digits.", "Deca-Code Lock", "") if(in_range(src, user)) if(input == code) to_chat(user, "The crate unlocks!") diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm new file mode 100644 index 00000000000..3a31e59cd55 --- /dev/null +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -0,0 +1,138 @@ +/*****************Marker Beacons**************************/ +GLOBAL_LIST_INIT(marker_beacon_colors, list( +"Random" = FALSE, //not a true color, will pick a random color +"Burgundy" = LIGHT_COLOR_FLARE, +"Bronze" = LIGHT_COLOR_ORANGE, +"Yellow" = LIGHT_COLOR_YELLOW, +"Lime" = LIGHT_COLOR_SLIME_LAMP, +"Olive" = LIGHT_COLOR_GREEN, +"Jade" = LIGHT_COLOR_BLUEGREEN, +"Teal" = LIGHT_COLOR_LIGHT_CYAN, +"Cerulean" = LIGHT_COLOR_BLUE, +"Indigo" = LIGHT_COLOR_DARK_BLUE, +"Purple" = LIGHT_COLOR_PURPLE, +"Violet" = LIGHT_COLOR_LAVENDER, +"Fuchsia" = LIGHT_COLOR_PINK)) + +/obj/item/stack/marker_beacon + name = "marker beacon" + singular_name = "marker beacon" + desc = "Prism-brand path illumination devices. Used by miners to mark paths and warn of danger." + icon = 'icons/obj/lighting.dmi' + icon_state = "marker" + merge_type = /obj/item/stack/marker_beacon + max_amount = 100 + var/picked_color = "random" + +/obj/item/stack/marker_beacon/ten //miners start with 10 of these + amount = 10 + +/obj/item/stack/marker_beacon/thirty //and they're bought in stacks of 1, 10, or 30 + amount = 30 + +/obj/item/stack/marker_beacon/Initialize(mapload) + . = ..() + update_icon() + +/obj/item/stack/marker_beacon/examine(mob/user) + ..() + to_chat(user, "Use in-hand to place a [singular_name].") + to_chat(user, "Alt-click to select a color. Current color is [picked_color].") + +/obj/item/stack/marker_beacon/update_icon() + icon_state = "[initial(icon_state)][lowertext(picked_color)]" + +/obj/item/stack/marker_beacon/attack_self(mob/user) + if(!isturf(user.loc)) + to_chat(user, "You need more space to place a [singular_name] here.") + return + if(locate(/obj/structure/marker_beacon) in user.loc) + to_chat(user, "There is already a [singular_name] here.") + return + if(use(1)) + to_chat(user, "You activate and anchor [amount ? "a":"the"] [singular_name] in place.") + playsound(user, 'sound/machines/click.ogg', 50, 1) + var/obj/structure/marker_beacon/M = new(user.loc, picked_color) + transfer_fingerprints_to(M) + +/obj/item/stack/marker_beacon/AltClick(mob/living/user) + if(!istype(user) || CanUseTopic(user, physical_state) != STATUS_INTERACTIVE) + return + var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors + if(!istype(user) || CanUseTopic(user, physical_state) != STATUS_INTERACTIVE) + return + if(input_color) + picked_color = input_color + update_icon() + +/obj/structure/marker_beacon + name = "marker beacon" + desc = "A Prism-brand path illumination device. It is anchored in place and glowing steadily." + icon = 'icons/obj/lighting.dmi' + icon_state = "marker" + layer = BELOW_OPEN_DOOR_LAYER + armor = list("melee" = 50, "bullet" = 75, "laser" = 75, "energy" = 75, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 25, "acid" = 0) + max_integrity = 50 + anchored = TRUE + light_range = 2 + light_power = 3 + var/remove_speed = 15 + var/picked_color + +/obj/structure/marker_beacon/Initialize(mapload, set_color) + . = ..() + picked_color = set_color + update_icon() + +/obj/structure/marker_beacon/deconstruct(disassembled = TRUE) + if(can_deconstruct) + var/obj/item/stack/marker_beacon/M = new(loc) + M.picked_color = picked_color + M.update_icon() + qdel(src) + +/obj/structure/marker_beacon/examine(mob/user) + ..() + to_chat(user, "Alt-click to select a color. Current color is [picked_color].") + +/obj/structure/marker_beacon/update_icon() + while(!picked_color || !GLOB.marker_beacon_colors[picked_color]) + picked_color = pick(GLOB.marker_beacon_colors) + icon_state = "[initial(icon_state)][lowertext(picked_color)]-on" + set_light(light_range, light_power, GLOB.marker_beacon_colors[picked_color]) + +/obj/structure/marker_beacon/attack_hand(mob/living/user) + . = ..() + if(.) + return + to_chat(user, "You start picking [src] up...") + if(do_after(user, remove_speed, target = src)) + var/obj/item/stack/marker_beacon/M = new(loc) + M.picked_color = picked_color + M.update_icon() + transfer_fingerprints_to(M) + if(user.put_in_hands(M, TRUE)) //delete the beacon if it fails + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + qdel(src) //otherwise delete us + +/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/stack/marker_beacon)) + var/obj/item/stack/marker_beacon/M = I + to_chat(user, "You start picking [src] up...") + if(do_after(user, remove_speed, target = src) && M.amount + 1 <= M.max_amount) + M.add(1) + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + qdel(src) + return + return ..() + +/obj/structure/marker_beacon/AltClick(mob/living/user) + ..() + if(!istype(user) || CanUseTopic(user, physical_state) != STATUS_INTERACTIVE) + return + var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors + if(!istype(user) || CanUseTopic(user, physical_state) != STATUS_INTERACTIVE) + return + if(input_color) + picked_color = input_color + update_icon() \ No newline at end of file diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm new file mode 100644 index 00000000000..9a88dd50259 --- /dev/null +++ b/code/modules/mining/equipment/survival_pod.dm @@ -0,0 +1,360 @@ +/area/survivalpod + name = "\improper Emergency Shelter" + icon_state = "away" + requires_power = FALSE + has_gravity = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/obj/item/survivalcapsule + name = "bluespace shelter capsule" + desc = "An emergency shelter stored within a pocket of bluespace." + icon_state = "capsule" + icon = 'icons/obj/mining.dmi' + w_class = WEIGHT_CLASS_TINY + origin_tech = "engineering=3;bluespace=3" + var/template_id = "shelter_alpha" + var/datum/map_template/shelter/template + var/used = FALSE + +/obj/item/survivalcapsule/proc/get_template() + if(template) + return + template = shelter_templates[template_id] + if(!template) + log_runtime("Shelter template ([template_id]) not found!", src) + qdel(src) + +/obj/item/survivalcapsule/examine(mob/user) + . = ..() + get_template() + to_chat(user, "This capsule has the [template.name] stored.") + to_chat(user, template.description) + +/obj/item/survivalcapsule/attack_self() + // Can't grab when capsule is New() because templates aren't loaded then + get_template() + if(used == FALSE) + loc.visible_message("[src] begins to shake. Stand back!") + used = TRUE + sleep(50) + var/turf/deploy_location = get_turf(src) + var/status = template.check_deploy(deploy_location) + switch(status) + if(SHELTER_DEPLOY_BAD_AREA) + loc.visible_message("[src] will not function in this area.") + if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS) + var/width = template.width + var/height = template.height + loc.visible_message("[src] doesn't have room to deploy! You need to clear a [width]x[height] area!") + + if(status != SHELTER_DEPLOY_ALLOWED) + used = FALSE + return + + playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1) + + var/turf/T = deploy_location + if(!is_mining_level(T.z))//only report capsules away from the mining/lavaland level + message_admins("[key_name_admin(usr)] ([ADMIN_QUE(usr,"?")]) ([ADMIN_FLW(usr,"FLW")]) activated a bluespace capsule away from the mining level! (JMP)") + log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]") + template.load(deploy_location, centered = TRUE) + new /obj/effect/particle_effect/smoke(get_turf(src)) + qdel(src) + +/obj/item/survivalcapsule/luxury + name = "luxury bluespace shelter capsule" + desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace." + origin_tech = "engineering=3;bluespace=4" + template_id = "shelter_beta" + +//Pod turfs and objects + +//Window +/obj/structure/window/shuttle/survival_pod + name = "pod window" + icon = 'icons/obj/smooth_structures/pod_window.dmi' + icon_state = "smooth" + dir = FULLTILE_WINDOW_DIR + max_integrity = 100 + fulltile = TRUE + reinf = TRUE + heat_resistance = 1600 + armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100) + smooth = SMOOTH_MORE + canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod) + explosion_block = 3 + level = 3 + glass_type = /obj/item/stack/sheet/titaniumglass + glass_amount = 2 + +/obj/structure/window/reinforced/survival_pod + name = "pod window" + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "pwindow" + +//Floors +/turf/simulated/floor/pod + name = "pod floor" + icon_state = "podfloor" + icon_regular_floor = "podfloor" + floor_tile = /obj/item/stack/tile/pod + +/turf/simulated/floor/pod/light + icon_state = "podfloor_light" + icon_regular_floor = "podfloor_light" + floor_tile = /obj/item/stack/tile/pod/light + +/turf/simulated/floor/pod/dark + icon_state = "podfloor_dark" + icon_regular_floor = "podfloor_dark" + floor_tile = /obj/item/stack/tile/pod/dark + +//Door +/obj/machinery/door/airlock/survival_pod + icon = 'icons/obj/doors/airlocks/survival/survival.dmi' + overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_pod + +/obj/machinery/door/airlock/survival_pod/glass + opacity = FALSE + glass = TRUE + +/obj/structure/door_assembly/door_assembly_pod + name = "pod airlock assembly" + icon = 'icons/obj/doors/airlocks/survival/survival.dmi' + base_name = "pod airlock" + overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi' + airlock_type = /obj/machinery/door/airlock/survival_pod + glass_type = /obj/machinery/door/airlock/survival_pod/glass + +//Windoor +/obj/machinery/door/window/survival_pod + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "windoor" + base_state = "windoor" + +//Table +/obj/structure/table/survival_pod + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "table" + smooth = SMOOTH_FALSE + +//Sleeper +/obj/machinery/sleeper/survival_pod + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "sleeper-open" + density = FALSE + +/obj/machinery/sleeper/survival_pod/New() + ..() + component_parts = list() + component_parts += new /obj/item/circuitboard/sleeper/survival(null) + var/obj/item/stock_parts/matter_bin/B = new(null) + B.rating = initial_bin_rating + component_parts += B + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/console_screen(null) + component_parts += new /obj/item/stock_parts/console_screen(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + RefreshParts() + +//NanoMed +/obj/machinery/vending/wallmed1/survival_pod + name = "survival pod medical supply" + desc = "Wall-mounted Medical Equipment dispenser. This one seems just a tiny bit smaller." + req_access = list() + refill_canister = null + + products = list(/obj/item/reagent_containers/food/pill/patch/styptic = 5, + /obj/item/reagent_containers/food/pill/patch/silver_sulf = 5, + /obj/item/reagent_containers/food/pill/charcoal = 2, + /obj/item/stack/medical/bruise_pack/advanced = 1, + /obj/item/stack/medical/ointment/advanced = 1, + /obj/item/reagent_containers/hypospray/autoinjector = 2, + /obj/item/stack/medical/splint = 1) + contraband = list(/obj/item/reagent_containers/food/pill/tox = 2, + /obj/item/reagent_containers/food/pill/morphine = 2) + +//Computer +/obj/item/gps/computer + name = "pod computer" + icon_state = "pod_computer" + icon = 'icons/obj/lavaland/pod_computer.dmi' + anchored = 1 + density = 1 + pixel_y = -32 + +/obj/item/gps/computer/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/wrench)) + playsound(loc, W.usesound, 50, 1) + user.visible_message("[user] disassembles the gps.", \ + "You start to disassemble the gps...", "You hear clanking and banging noises.") + if(do_after(user, 20 * W.toolspeed, target = src)) + new /obj/item/gps(loc) + qdel(src) + return ..() + +/obj/item/gps/computer/attack_hand(mob/user) + attack_self(user) + +//Bed +/obj/structure/bed/pod + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "bed" + +//Survival Storage Unit +/obj/machinery/smartfridge/survival_pod + name = "survival pod storage" + desc = "A heated storage unit." + icon_state = "donkvendor" + icon = 'icons/obj/lavaland/donkvendor.dmi' + light_range = 8 + light_power = 1.2 + light_color = "#DDFFD3" + max_n_of_items = 10 + pixel_y = -4 + can_deconstruct = FALSE + var/empty = FALSE + +/obj/machinery/smartfridge/survival_pod/Initialize(mapload) + . = ..() + + if(empty) + return + + for(var/i in 1 to 5) + var/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak/W = new(src) + load(W) + if(prob(50)) + var/obj/item/storage/pill_bottle/dice/D = new(src) + load(D) + else + var/obj/item/instrument/guitar/G = new(src) + load(G) + +/obj/machinery/smartfridge/survival_pod/update_icon() + return + +/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." + empty = TRUE + +//Fans +/obj/structure/fans + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "fans" + name = "environmental regulation system" + desc = "A large machine releasing a constant gust of air." + anchored = 1 + density = 1 + var/arbitraryatmosblockingvar = 1 + var/buildstacktype = /obj/item/stack/sheet/metal + var/buildstackamount = 5 + +/obj/structure/fans/Initialize(loc) + ..() + air_update_turf(1) + +/obj/structure/fans/Destroy() + arbitraryatmosblockingvar = 0 + air_update_turf(1) + return ..() + +/obj/structure/fans/CanAtmosPass(turf/T) + return !arbitraryatmosblockingvar + +/obj/structure/fans/deconstruct() + if(buildstacktype) + new buildstacktype(loc, buildstackamount) + qdel(src) + +/obj/structure/fans/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/wrench)) + playsound(loc, W.usesound, 50, 1) + user.visible_message("[user] disassembles the fan.", \ + "You start to disassemble the fan...", "You hear clanking and banging noises.") + if(do_after(user, 20 * W.toolspeed, target = src)) + deconstruct() + return ..() + +/obj/structure/fans/tiny + name = "tiny fan" + desc = "A tiny fan, releasing a thin gust of air." + layer = TURF_LAYER+0.1 + density = 0 + icon_state = "fan_tiny" + buildstackamount = 2 + +/obj/structure/fans/tiny/invisible + name = "air flow blocker" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF + unacidable = TRUE + invisibility = INVISIBILITY_ABSTRACT + +//Signs +/obj/structure/sign/mining + name = "nanotrasen mining corps sign" + desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims." + icon = 'icons/turf/walls/survival_pod_walls.dmi' + icon_state = "ntpod" + +/obj/structure/sign/mining/survival + name = "shelter sign" + desc = "A high visibility sign designating a safe shelter." + icon = 'icons/turf/walls/survival_pod_walls.dmi' + icon_state = "survival" + +//Fluff +/obj/structure/tubes + icon_state = "tubes" + icon = 'icons/obj/lavaland/survival_pod.dmi' + name = "tubes" + anchored = 1 + layer = MOB_LAYER - 0.2 + density = 0 + +/obj/structure/tubes/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/wrench)) + playsound(loc, W.usesound, 50, 1) + user.visible_message("[user] disassembles [src].", \ + "You start to disassemble [src]...", "You hear clanking and banging noises.") + if(do_after(user, 20 * W.toolspeed, target = src)) + new /obj/item/stack/rods(loc) + qdel(src) + return ..() + +/obj/item/fakeartefact + name = "expensive forgery" + icon = 'icons/mob/screen_gen.dmi' + icon_state = "x2" + var/possible = list(/obj/item/ship_in_a_bottle, + /obj/item/gun/energy/pulse, + /obj/item/sleeping_carp_scroll, + /obj/item/shield/changeling, + /obj/item/lava_staff, + /obj/item/katana/energy, + /obj/item/hierophant_staff, + /obj/item/storage/toolbox/green/memetic, + /obj/item/gun/projectile/automatic/l6_saw, + /obj/item/gun/magic/staff/chaos, + /obj/item/gun/magic/staff/spellblade, + /obj/item/gun/magic/wand/death, + /obj/item/gun/magic/wand/fireball, + /obj/item/stack/telecrystal/twenty, + /obj/item/banhammer) + +/obj/item/fakeartefact/New() + . = ..() + var/obj/item/I = pick(possible) + name = initial(I.name) + icon = initial(I.icon) + desc = initial(I.desc) + icon_state = initial(I.icon_state) + item_state = initial(I.item_state) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index b0eafcbc8bb..1001a2aa514 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -401,44 +401,53 @@ anchored = 1.0 var/obj/item/card/id/inserted_id var/list/prize_list = list( - new /datum/data/mining_equipment("Stimpack", /obj/item/reagent_containers/hypospray/autoinjector/stimpack, 50), - new /datum/data/mining_equipment("Teporone MediPen", /obj/item/reagent_containers/hypospray/autoinjector/teporone, 50), - new /datum/data/mining_equipment("MediPen Bundle", /obj/item/storage/box/autoinjector/utility, 200), - new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100), - new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), - new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200), - new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300), - new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), - new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 400), - new /datum/data/mining_equipment("Hivelord Stabilizer", /obj/item/hivelordstabilizer, 400), - new /datum/data/mining_equipment("Mining Drone", /obj/item/mining_drone_cube, 500), - new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/mine_bot_upgrade, 400), - new /datum/data/mining_equipment("Drone Health Upgrade",/obj/item/mine_bot_upgrade/health, 400), - new /datum/data/mining_equipment("Drone Ranged Upgrade",/obj/item/mine_bot_upgrade/cooldown, 600), - new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/mining_hammer, 750), - new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000), - new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500), - new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600), - new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 600), - new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), - new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800), - new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000), - new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000), - new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800), - new /datum/data/mining_equipment("Lazarus Capsule belt",/obj/item/storage/belt/lazarus, 200), - new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000), - new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000), - new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000), - new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), - new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100), + new /datum/data/mining_equipment("Stimpack", /obj/item/reagent_containers/hypospray/autoinjector/stimpack, 50), + new /datum/data/mining_equipment("Teporone MediPen", /obj/item/reagent_containers/hypospray/autoinjector/teporone, 50), + new /datum/data/mining_equipment("MediPen Bundle", /obj/item/storage/box/autoinjector/utility, 200), + new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100), + new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), + new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200), + new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300), + new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), + new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 400), + new /datum/data/mining_equipment("Hivelord Stabilizer", /obj/item/hivelordstabilizer, 400), + new /datum/data/mining_equipment("Mining Drone", /obj/item/mining_drone_cube, 500), + new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/mine_bot_upgrade, 400), + new /datum/data/mining_equipment("Drone Health Upgrade", /obj/item/mine_bot_upgrade/health, 400), + new /datum/data/mining_equipment("Drone Ranged Upgrade", /obj/item/mine_bot_upgrade/cooldown, 600), + new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/kinetic_crusher, 750), + new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400), + new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), + new /datum/data/mining_equipment("Explorer\'s Webbing", /obj/item/storage/belt/mining, 500), + new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000), + new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500), + new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600), + new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 600), + new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), + new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800), + new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000), + new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000), + new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800), + new /datum/data/mining_equipment("Lazarus Capsule belt", /obj/item/storage/belt/lazarus, 200), + new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000), + new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000), + new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000), + new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), + new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), + new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/storage/box/mininghardsuit, 2000), + new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), + new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100), + new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300), + new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100), new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150), - new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250), - new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300), - new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), - new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), - new /datum/data/mining_equipment("KA Cooldown Decrease",/obj/item/borg/upgrade/modkit/cooldown, 1000), - new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), - new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500), + new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250), + new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300), + new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), + new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), + new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), + new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), + new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500), + new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1000), ) /obj/machinery/mineral/equipment_vendor/golem @@ -465,18 +474,20 @@ new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500), new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000), new /datum/data/mining_equipment("KA Trigger Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1000), + new /datum/data/mining_equipment("Shuttle Console Board", /obj/item/circuitboard/shuttle/golem_ship, 2000), new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000) + ) -/datum/data/mining_equipment/ +/datum/data/mining_equipment var/equipment_name = "generic" var/equipment_path = null var/cost = 0 -/datum/data/mining_equipment/New(name, path, cost) - src.equipment_name = name - src.equipment_path = path - src.cost = cost +/datum/data/mining_equipment/New(name, path, equipment_cost) + equipment_name = name + equipment_path = path + cost = equipment_cost /obj/machinery/mineral/equipment_vendor/New() ..() @@ -588,20 +599,33 @@ ..() /obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer) - var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Kinetic Accelerator", "Resonator", "Mining Drone", "Advanced Scanner", "Crusher") - if(!selection || !Adjacent(redeemer) || voucher.loc != redeemer) + var/items = list("Kinetic Accelerator", "Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Crusher Kit", "Mining Conscription Kit", "Advanced Scanner") + + var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in items + if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer) return + + var/drop_location = loc switch(selection) if("Kinetic Accelerator") - new /obj/item/gun/energy/kinetic_accelerator(src.loc) - if("Resonator") - new /obj/item/resonator(src.loc) - if("Mining Drone") - new /obj/item/storage/box/drone_kit(src.loc) + new /obj/item/gun/energy/kinetic_accelerator(drop_location) + if("Survival Capsule and Explorer's Webbing") + new /obj/item/storage/belt/mining(drop_location) + if("Resonator Kit") + new /obj/item/extinguisher/mini(drop_location) + new /obj/item/resonator(drop_location) + if("Minebot Kit") + new /obj/item/mining_drone_cube(drop_location) + new /obj/item/weldingtool/hugetank(drop_location) + new /obj/item/clothing/head/welding(drop_location) + if("Crusher Kit") + new /obj/item/extinguisher/mini(drop_location) + new /obj/item/twohanded/required/kinetic_crusher(drop_location) + if("Mining Conscription Kit") + new /obj/item/storage/backpack/duffel/mining_conscript(drop_location) if("Advanced Scanner") - new /obj/item/t_scanner/adv_mining_scanner(src.loc) - if("Crusher") - new /obj/item/twohanded/required/mining_hammer(loc) + new /obj/item/t_scanner/adv_mining_scanner(drop_location) + qdel(voucher) /obj/machinery/mineral/equipment_vendor/ex_act(severity, target) @@ -643,11 +667,41 @@ ..(user) to_chat(user, "There's [points] points on the card.") +/**********************Conscription Kit**********************/ + +/obj/item/card/id/mining_access_card + name = "mining access card" + desc = "A small card, that when used on any ID, will add mining access." + icon_state = "data_1" + +/obj/item/card/id/mining_access_card/afterattack(atom/movable/AM, mob/user, proximity) + . = ..() + if(istype(AM, /obj/item/card/id) && proximity) + var/obj/item/card/id/I = AM + I.access |= list(access_mining, access_mining_station, access_mineral_storeroom, access_cargo) + to_chat(user, "You upgrade [I] with mining access.") + qdel(src) + +/obj/item/storage/backpack/duffel/mining_conscript + 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/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) + new /obj/item/card/id/mining_access_card(src) + /**********************Jaunter**********************/ /obj/item/wormhole_jaunter name = "wormhole jaunter" - desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to blue space for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least." + desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to bluespace for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least.\nThanks to modifications provided by the Free Golems, this jaunter can be worn on the belt to provide protection from chasms." icon = 'icons/obj/items.dmi' icon_state = "Jaunter" item_state = "electronic" @@ -656,56 +710,71 @@ throw_speed = 3 throw_range = 5 origin_tech = "bluespace=2" + slot_flags = SLOT_BELT /obj/item/wormhole_jaunter/attack_self(mob/user) + user.visible_message("[user.name] activates the [name]!") + activate(user, TRUE) + +/obj/item/wormhole_jaunter/proc/turf_check(mob/user) var/turf/device_turf = get_turf(user) if(!device_turf || !is_teleport_allowed(device_turf.z)) - to_chat(user, "You're having difficulties getting the [src.name] to work.") - return - else - user.visible_message("[user.name] activates the [src.name]!") - var/list/L = list() - for(var/obj/item/radio/beacon/B in world) - var/turf/T = get_turf(B) - if(is_station_level(T.z)) - L += B - if(!L.len) - to_chat(user, "The [src.name] failed to create a wormhole.") - return - var/chosen_beacon = pick(L) - var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon, lifespan=100) - try_move_adjacent(J) - playsound(src,'sound/effects/sparks4.ogg',50,1) - qdel(src) + to_chat(user, "You're having difficulties getting the [name] to work.") + return FALSE + return TRUE -/obj/effect/portal/wormhole/jaunt_tunnel +/obj/item/wormhole_jaunter/proc/get_destinations(mob/user) + var/list/destinations = list() + + for(var/obj/item/radio/beacon/B in world) + var/turf/T = get_turf(B) + if(is_station_level(T.z)) + destinations += B + + return destinations + +/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent) + if(!turf_check(user)) + return + + var/list/L = get_destinations(user) + if(!L.len) + to_chat(user, "The [name] found no beacons in the world to anchor a wormhole to.") + return + var/chosen_beacon = pick(L) + var/obj/effect/portal/jaunt_tunnel/J = new(get_turf(src), get_turf(chosen_beacon), src, 100) + if(adjacent) + try_move_adjacent(J) + else + J.teleport(user) + playsound(src,'sound/effects/sparks4.ogg',50,1) + qdel(src) + +/obj/item/wormhole_jaunter/proc/chasm_react(mob/user) + if(user.get_item_by_slot(slot_belt) == src) + to_chat(user, "Your [name] activates, saving you from the chasm!") + activate(user, FALSE) + else + to_chat(user, "[src] is not attached to your belt, preventing it from saving you from the chasm. RIP.
") + +/obj/effect/portal/jaunt_tunnel name = "jaunt tunnel" icon = 'icons/effects/effects.dmi' icon_state = "bhole3" desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon." + failchance = 0 -/obj/effect/portal/wormhole/jaunt_tunnel/teleport(atom/movable/M) - if(istype(M, /obj/effect)) - return - if(istype(M, /atom/movable)) - if(do_teleport(M, target, 6)) - if(isliving(M)) - var/mob/living/L = M - L.Weaken(3) - if(ishuman(L)) - shake_camera(L, 20, 1) - var/mob/living/carbon/human/H = L - spawn(20) - if(H && H.check_has_mouth()) - H.visible_message("[L.name] vomits from travelling through the [src.name]!", "You throw up from travelling through the [src.name]!") - H.nutrition -= 20 - H.adjustToxLoss(-3) - var/turf/T = get_turf(H) - T.add_vomit_floor(H) - playsound(H, 'sound/effects/splat.ogg', 50, 1) - else - visible_message("[src] flickers and fails, due to bluespace interference!") - qdel(src) +/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M) + . = ..() + if(.) + // KERPLUNK + playsound(M,'sound/weapons/resonator_blast.ogg', 50, 1) + if(iscarbon(M)) + var/mob/living/carbon/L = M + L.Weaken(6) + if(ishuman(L)) + shake_camera(L, 20, 1) + addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20) /**********************Resonator**********************/ @@ -823,21 +892,6 @@ new /mob/living/simple_animal/hostile/mining_drone(get_turf(src)) qdel(src) -/**********************Mining drone kit**********************/ - -/obj/item/storage/box/drone_kit - name = "Drone Kit" - desc = "A boxed kit that includes one mining drone cube and a welding tool with an increased capacity." - icon_state = "implant" - max_w_class = WEIGHT_CLASS_NORMAL - storage_slots = 2 - can_hold = list(/obj/item/mining_drone_cube, /obj/item/weldingtool/hugetank) - -/obj/item/storage/box/drone_kit/New() - ..() - new /obj/item/mining_drone_cube(src) - new /obj/item/weldingtool/hugetank(src) - /**********************Lazarus Injector**********************/ /obj/item/lazarus_injector @@ -853,6 +907,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) @@ -860,6 +915,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() @@ -1058,7 +1116,7 @@ qdel(src) /*********************Mining Hammer****************/ -/obj/item/twohanded/required/mining_hammer +/obj/item/twohanded/required/kinetic_crusher icon = 'icons/obj/mining.dmi' icon_state = "mining_hammer1" item_state = "mining_hammer1" @@ -1092,7 +1150,7 @@ damage_type = BRUTE flag = "bomb" range = 6 - var/obj/item/twohanded/required/mining_hammer/hammer_synced = null + var/obj/item/twohanded/required/kinetic_crusher/hammer_synced = null /obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0, hit_zone) if(hammer_synced) @@ -1115,7 +1173,7 @@ M.gets_drilled(firer) ..() -/obj/item/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/twohanded/required/kinetic_crusher/afterattack(atom/target, mob/user, proximity_flag) if(!proximity_flag && charged)//Mark a target, or mine a tile. var/turf/proj_turf = get_turf(src) if(!istype(proj_turf, /turf)) @@ -1150,7 +1208,7 @@ else L.apply_damage(50, BRUTE, blocked = def_check) -/obj/item/twohanded/required/mining_hammer/proc/Recharge() +/obj/item/twohanded/required/kinetic_crusher/proc/Recharge() if(!charged) charged = 1 icon_state = "mining_hammer1" diff --git a/code/modules/mining/explorer_gear.dm b/code/modules/mining/explorer_gear.dm new file mode 100644 index 00000000000..a9464efe959 --- /dev/null +++ b/code/modules/mining/explorer_gear.dm @@ -0,0 +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 + 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/laborminerals.dm b/code/modules/mining/laborcamp/laborminerals.dm deleted file mode 100644 index 6d963bcd773..00000000000 --- a/code/modules/mining/laborcamp/laborminerals.dm +++ /dev/null @@ -1,6 +0,0 @@ -/turf/simulated/mineral/random/labormineral - mineralSpawnChanceList = list("Uranium" = 1, "Iron" = 100, "Diamond" = 1, "Gold" = 1, "Silver" = 1, "Plasma" = 1) - -/turf/simulated/mineral/random/labormineral/New() - icon_state = "rock" - ..() \ 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 0e0d248d8b7..d9747a3a1f4 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -4,6 +4,7 @@ icon_state = "l_mushroom" name = "large mushrooms" desc = "A number of large mushrooms, covered in a faint layer of ash and what can only be spores." + anchored = TRUE var/harvested_name = "shortened mushrooms" var/harvested_desc = "Some quickly regrowing mushrooms, formerly known to be quite large." var/needs_sharp_harvest = TRUE @@ -26,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 @@ -136,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/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index f657fa6ec5f..4f8f01498d0 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -35,14 +35,14 @@ /obj/item/melee/ghost_sword/New() ..() spirits = list() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) GLOB.poi_list |= src /obj/item/melee/ghost_sword/Destroy() for(var/mob/dead/observer/G in spirits) G.invisibility = initial(G.invisibility) spirits.Cut() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) GLOB.poi_list -= src . = ..() @@ -72,7 +72,7 @@ var/mob/dead/observer/current_spirits = list() for(var/mob/dead/observer/O in GLOB.player_list) - if(is_type_in_list(O.following, contents)) + if((O.following in contents)) ghost_counter++ O.invisibility = 0 current_spirits |= O @@ -161,9 +161,9 @@ hitsound = 'sound/weapons/sear.ogg' burn_state = LAVA_PROOF | FIRE_PROOF unacidable = 1 - var/turf_type = /turf/unsimulated/floor/lava // /turf/simulated/floor/plating/lava/smooth once Lavaland turfs are added + var/turf_type = /turf/simulated/floor/plating/lava/smooth var/transform_string = "lava" - var/reset_turf_type = /turf/simulated/floor/plating/airless/asteroid // /turf/simulated/floor/plating/asteroid/basalt once Lavaland turfs are added + var/reset_turf_type = /turf/simulated/floor/plating/asteroid/basalt var/reset_string = "basalt" var/create_cooldown = 100 var/create_delay = 30 @@ -198,7 +198,7 @@ user.visible_message("[user] turns \the [T] into [transform_string]!") message_admins("[key_name_admin(user)] fired the lava staff at [get_area(target)] (JMP).") log_game("[key_name(user)] fired the lava staff at [get_area(target)] ([T.x], [T.y], [T.z]).") - T.ChangeTurf(turf_type) + T.TerraformTurf(turf_type, keep_icon = FALSE) timer = world.time + create_cooldown qdel(L) else @@ -207,7 +207,7 @@ return else user.visible_message("[user] turns \the [T] into [reset_string]!") - T.ChangeTurf(reset_turf_type) + T.TerraformTurf(reset_turf_type, keep_icon = FALSE) timer = world.time + reset_cooldown playsound(T,'sound/magic/fireball.ogg', 200, 1) diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index 311d7387614..2490f6f48db 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -5,8 +5,6 @@ desc = "A completely indestructible chunk of crystal, rumoured to predate the start of this universe. It looks like you could store things inside it." icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "blackbox" - icon_on = "blackbox" - icon_off = "blackbox" luminosity = 8 max_n_of_items = INFINITY unacidable = 1 @@ -38,7 +36,7 @@ /obj/machinery/smartfridge/black_box/process() ..() - if(!memory_saved && ticker.current_state == GAME_STATE_FINISHED) + if(!memory_saved && SSticker.current_state == GAME_STATE_FINISHED) WriteMemory() /obj/machinery/smartfridge/black_box/proc/WriteMemory() @@ -165,7 +163,7 @@ var/mob/living/carbon/human/H = user for(var/obj/item/W in H) H.unEquip(W) - var/datum/job/clown/C = job_master.GetJob("Clown") + var/datum/job/clown/C = SSjobs.GetJob("Clown") C.equip(H) affected_targets.Add(H) @@ -189,7 +187,7 @@ terrain_theme = pick("lavaland","winter","jungle","alien") switch(terrain_theme) if("lavaland")//Depressurizes the place... and free cult metal, I guess. - NewTerrainFloors = /turf/simulated/floor/basalt // Needs to be updated after turf update + NewTerrainFloors = /turf/simulated/floor/plating/asteroid/basalt // Needs to be updated after turf update NewTerrainWalls = /turf/simulated/wall/cult NewFlora = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) florachance = 1 @@ -436,7 +434,7 @@ ..() if(isanimal(loc)) holder_animal = loc - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/structure/closet/stasis/Entered(atom/A) if(isliving(A) && holder_animal) @@ -450,7 +448,7 @@ holder_animal.verbs -= /mob/living/verb/pulled /obj/structure/closet/stasis/dump_contents(var/kill = 1) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) for(var/mob/living/L in src) L.disabilities &= ~MUTE L.status_flags &= ~GODMODE diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index 878a3951202..c8579fbec65 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -126,12 +126,13 @@ icon = 'icons/obj/lavaland/dragonboat.dmi' keytype = /obj/item/oar burn_state = LAVA_PROOF | FIRE_PROOF + resistance_flags = LAVA_PROOF | FIRE_PROOF /obj/vehicle/lavaboat/relaymove(mob/user, direction) var/turf/next = get_step(src, direction) var/turf/current = get_turf(src) - if(istype(next, /turf/unsimulated/floor/lava) || istype(current, /turf/unsimulated/floor/lava)) //We can move from land to lava, or lava to land, but not from land to land + if(istype(next, /turf/simulated/floor/plating/lava/smooth) || istype(current, /turf/simulated/floor/plating/lava/smooth)) //We can move from land to lava, or lava to land, but not from land to land ..() else to_chat(user, "Boats don't go on land!") @@ -168,6 +169,7 @@ desc = "A tiny ship inside a bottle." icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "ship_bottle" + resistance_flags = LAVA_PROOF | FIRE_PROOF /obj/item/ship_in_a_bottle/attack_self(mob/user) to_chat(user, "You're not sure how they get the ships in these things, but you're pretty sure you know how to get it out.") @@ -184,42 +186,52 @@ generic_pixel_x = 1 vehicle_move_delay = 1 -// Wisp Lantern +//Wisp Lantern /obj/item/wisp_lantern name = "spooky lantern" desc = "This lantern gives off no light, but is home to a friendly wisp." icon = 'icons/obj/lighting.dmi' icon_state = "lantern-blue" + item_state = "lantern" + light_range = 7 var/obj/effect/wisp/wisp + var/sight_flags = SEE_MOBS + var/lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE /obj/item/wisp_lantern/attack_self(mob/user) if(!wisp) to_chat(user, "The wisp has gone missing!") - return - if(wisp.loc == src) - to_chat(user, "You release the wisp. It begins to bob around your head.") - user.sight |= SEE_MOBS icon_state = "lantern" - wisp.orbit(user, 20, forceMove = TRUE) + return + + if(wisp.loc == src) + RegisterSignal(user, COMSIG_MOB_UPDATE_SIGHT, .proc/update_user_sight) + + to_chat(user, "You release the wisp. It begins to bob around your head.") + icon_state = "lantern" + wisp.orbit(user, 20) + set_light(0) + + user.update_sight() + to_chat(user, "The wisp enhances your vision.") + feedback_add_details("wisp_lantern","F") // freed - else + UnregisterSignal(user, COMSIG_MOB_UPDATE_SIGHT) + to_chat(user, "You return the wisp to the lantern.") - - if(wisp.orbiting) - var/atom/A = wisp.orbiting - if(isliving(A)) - var/mob/living/M = A - M.sight &= ~SEE_MOBS - to_chat(M, "Your vision returns to normal.") - wisp.stop_orbit() - wisp.loc = src + wisp.forceMove(src) + set_light(initial(light_range)) + + user.update_sight() + to_chat(user, "Your vision returns to normal.") + icon_state = "lantern-blue" feedback_add_details("wisp_lantern","R") // returned -/obj/item/wisp_lantern/New() - ..() +/obj/item/wisp_lantern/Initialize(mapload) + . = ..() wisp = new(src) /obj/item/wisp_lantern/Destroy() @@ -230,17 +242,20 @@ wisp.visible_message("[wisp] has a sad feeling for a moment, then it passes.") return ..() +/obj/item/wisp_lantern/proc/update_user_sight(mob/user) + user.sight |= sight_flags + if(!isnull(lighting_alpha)) + user.lighting_alpha = min(user.lighting_alpha, lighting_alpha) + /obj/effect/wisp name = "friendly wisp" desc = "Happy to light your way." icon = 'icons/obj/lighting.dmi' icon_state = "orb" - layer = ABOVE_ALL_MOB_LAYER - light_power = 1 light_range = 7 + layer = ABOVE_ALL_MOB_LAYER //Red/Blue Cubes - /obj/item/warp_cube name = "blue cube" desc = "A mysterious blue cube." diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 573ff630350..7eed5577aeb 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) @@ -30,13 +34,12 @@ if(6) new /obj/item/pickaxe/diamond(src) if(7) - new /obj/item/clothing/head/culthood(src) new /obj/item/clothing/suit/hooded/cultrobes(src) new /obj/item/bedsheet/cult(src) if(8) new /obj/item/organ/internal/brain/xeno(src) if(9) - new /obj/item/organ/internal/heart/cursed(src) + new /obj/item/organ/internal/heart/cursed/wizard(src) if(10) new /obj/item/ship_in_a_bottle(src) if(11) @@ -69,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/machine_processing.dm b/code/modules/mining/machine_processing.dm index 860692673a5..03b8404b1f0 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -20,18 +20,27 @@ anchored = TRUE var/obj/machinery/mineral/processing_unit/machine = null var/machinedir = EAST + speed_process = TRUE -/obj/machinery/mineral/processing_unit_console/New() - ..() +/obj/machinery/mineral/processing_unit_console/Initialize(mapload) + . = ..() machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir)) if(machine) machine.CONSOLE = src else - qdel(src) + return INITIALIZE_HINT_QDEL + +/obj/machinery/mineral/processing_unit_console/attack_ghost(mob/user) + return ui_interact(user) /obj/machinery/mineral/processing_unit_console/attack_hand(mob/user) if(..()) - return + return TRUE + + return ui_interact(user) + +/obj/machinery/mineral/processing_unit_console/ui_interact(mob/user) + . = ..() if(!machine) return @@ -43,7 +52,8 @@ /obj/machinery/mineral/processing_unit_console/Topic(href, href_list) if(..()) - return + return TRUE + usr.set_machine(src) add_fingerprint(usr) @@ -59,15 +69,14 @@ machine.on = (href_list["set_on"] == "on") updateUsrDialog() + return TRUE /obj/machinery/mineral/processing_unit_console/Destroy() machine = null return ..() - /**********************Mineral processing unit**************************/ - /obj/machinery/mineral/processing_unit name = "furnace" icon = 'icons/obj/machines/mining_machines.dmi' @@ -81,8 +90,8 @@ var/datum/research/files speed_process = TRUE -/obj/machinery/mineral/processing_unit/New() - ..() +/obj/machinery/mineral/processing_unit/Initialize(mapload) + . = ..() AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, TRUE, /obj/item/stack) files = new /datum/research/smelter(src) @@ -99,6 +108,7 @@ for(var/obj/item/stack/ore/O in T) process_ore(O) CHECK_TICK + if(on) if(selected_material) smelt_ore() @@ -106,11 +116,9 @@ else if(selected_alloy) smelt_alloy() - if(CONSOLE) CONSOLE.updateUsrDialog() - /obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/stack/ore/O) GET_COMPONENT(materials, /datum/component/material_container) var/material_amount = materials.get_item_material_amount(O) @@ -167,7 +175,6 @@ var/out = get_step(src, output_dir) materials.retrieve_sheets(sheets_to_remove, selected_material, out) - /obj/machinery/mineral/processing_unit/proc/smelt_alloy() var/datum/design/alloy = files.FindDesignByID(selected_alloy) //check if it's a valid design if(!alloy) diff --git a/code/modules/mining/mine_areas.dm b/code/modules/mining/mine_areas.dm deleted file mode 100644 index 5781bb06bbe..00000000000 --- a/code/modules/mining/mine_areas.dm +++ /dev/null @@ -1,75 +0,0 @@ -/**********************Mine areas**************************/ - -/area/mine - icon_state = "mining" - -/area/mine/dangerous/explored - name = "Mine" - icon_state = "explored" - music = null - always_unpowered = 1 - requires_power = 1 - poweralm = 0 - power_environ = 0 - power_equip = 0 - power_light = 0 - outdoors = 1 - ambientsounds = list('sound/ambience/ambimine.ogg') - -/area/mine/dangerous/explored/golem - name = "Small Asteroid" - -/area/mine/dangerous/unexplored - name = "Mine" - icon_state = "unexplored" - music = null - always_unpowered = 1 - requires_power = 1 - poweralm = 0 - power_environ = 0 - power_equip = 0 - power_light = 0 - outdoors = 1 - ambientsounds = list('sound/ambience/ambimine.ogg') - -/area/mine/lobby - name = "Mining Station" - -/area/mine/storage - name = "Mining Station Storage" - -/area/mine/production - name = "Mining Station Starboard Wing" - icon_state = "mining_production" - -/area/mine/abandoned - name = "Abandoned Mining Station" - -/area/mine/living_quarters - name = "Mining Station Port Wing" - icon_state = "mining_living" - -/area/mine/eva - name = "Mining Station EVA" - icon_state = "mining_eva" - -/area/mine/maintenance - name = "Mining Station Communications" - -/area/mine/cafeteria - name = "Mining Station Cafeteria" - -/area/mine/hydroponics - name = "Mining Station Hydroponics" - -/area/mine/sleeper - name = "Mining Station Emergency Sleeper" - -/area/mine/north_outpost - name = "North Mining Outpost" - -/area/mine/west_outpost - name = "West Mining Outpost" - -/area/mine/podbay - name = "Mining Podbay" \ No newline at end of file diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index c3c276a5766..f10b78dc526 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -32,6 +32,21 @@ new /obj/item/clothing/gloves/fingerless(src) new /obj/item/clothing/gloves/fingerless(src) +/obj/structure/closet/wardrobe/miner/lavaland + +/obj/structure/closet/wardrobe/miner/lavaland/New() + ..() + contents = list() + new /obj/item/storage/backpack/duffel(src) + new /obj/item/storage/backpack/explorer(src) + new /obj/item/storage/backpack/explorer(src) + new /obj/item/clothing/under/rank/miner/lavaland(src) + new /obj/item/clothing/under/rank/miner/lavaland(src) + new /obj/item/clothing/under/rank/miner/lavaland(src) + new /obj/item/clothing/shoes/workboots/mining(src) + new /obj/item/clothing/shoes/workboots/mining(src) + new /obj/item/clothing/shoes/workboots/mining(src) + /obj/structure/closet/secure_closet/miner name = "miner's equipment" icon_state = "miningsec1" @@ -50,6 +65,8 @@ new /obj/item/t_scanner/adv_mining_scanner/lesser(src) new /obj/item/storage/bag/ore(src) new /obj/item/clothing/glasses/meson(src) + new /obj/item/survivalcapsule(src) + new /obj/item/stack/marker_beacon/ten /**********************Shuttle Computer**************************/ @@ -65,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 @@ -76,12 +94,11 @@ icon_state = "pickaxe" flags = CONDUCT slot_flags = SLOT_BELT - force = 15.0 - throwforce = 10.0 + force = 15 + throwforce = 10 item_state = "pickaxe" w_class = WEIGHT_CLASS_BULKY materials = list(MAT_METAL=2000) //one sheet, but where can you make them? - var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO origin_tech = "materials=2;engineering=3" attack_verb = list("hit", "pierced", "sliced", "attacked") var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg') @@ -94,11 +111,21 @@ /obj/item/pickaxe/proc/playDigSound() playsound(src, pick(digsound),20,1) +/obj/item/pickaxe/emergency + name = "emergency disembarkation tool" + desc = "For extracting yourself from rough landings." + +/obj/item/pickaxe/safety + name = "safety pickaxe" + desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon." + force = 1 + throwforce = 1 + attack_verb = list("ineffectively hit") + /obj/item/pickaxe/silver name = "silver-plated pickaxe" icon_state = "spickaxe" item_state = "spickaxe" - digspeed = 30 //mines faster than a normal pickaxe, bought from mining vendor origin_tech = "materials=3;engineering=4" desc = "A silver-plated pickaxe that mines slightly faster than standard-issue." toolspeed = 0.75 @@ -107,7 +134,6 @@ name = "golden pickaxe" icon_state = "gpickaxe" item_state = "gpickaxe" - digspeed = 20 origin_tech = "materials=4;engineering=4" desc = "A gold-plated pickaxe that mines faster than standard-issue." toolspeed = 0.6 @@ -116,7 +142,6 @@ name = "diamond-tipped pickaxe" icon_state = "dpickaxe" item_state = "dpickaxe" - digspeed = 20 //mines twice as fast as a normal pickaxe, bought from mining vendor origin_tech = "materials=5;engineering=4" desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt." toolspeed = 0.5 @@ -125,7 +150,6 @@ name = "mining drill" icon_state = "handdrill" item_state = "jackhammer" - digspeed = 25 //available from roundstart, faster than a pickaxe. digsound = list('sound/weapons/drill.ogg') hitsound = 'sound/weapons/drill.ogg' usesound = 'sound/weapons/drill.ogg' @@ -141,7 +165,6 @@ /obj/item/pickaxe/drill/diamonddrill name = "diamond-tipped mining drill" icon_state = "diamonddrill" - digspeed = 10 origin_tech = "materials=6;powerstorage=4;engineering=4" desc = "Yours is the drill that will pierce the heavens!" toolspeed = 0.25 @@ -156,14 +179,12 @@ /obj/item/pickaxe/drill/cyborg/diamond //This is the BORG version! name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics. icon_state = "diamonddrill" - digspeed = 10 toolspeed = 0.25 /obj/item/pickaxe/drill/jackhammer name = "sonic jackhammer" icon_state = "jackhammer" item_state = "jackhammer" - digspeed = 5 //the epitome of powertools. extremely fast mining, laughs at puny walls origin_tech = "materials=6;powerstorage=4;engineering=5;magnets=4" digsound = list('sound/weapons/sonic_jackhammer.ogg') hitsound = 'sound/weapons/sonic_jackhammer.ogg' @@ -180,8 +201,8 @@ icon_state = "shovel" flags = CONDUCT slot_flags = SLOT_BELT - force = 8.0 - throwforce = 4.0 + force = 8 + throwforce = 4 item_state = "shovel" w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL=50) @@ -195,11 +216,17 @@ desc = "A small tool for digging and moving dirt." icon_state = "spade" item_state = "spade" - force = 5.0 - throwforce = 7.0 + force = 5 + throwforce = 7 w_class = WEIGHT_CLASS_SMALL toolspeed = 2 +/obj/item/shovel/safety + name = "safety shovel" + desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon." + force = 1 + throwforce = 1 + attack_verb = list("ineffectively hit") /**********************Mining car (Crate like thing, not the rail car)**************************/ @@ -266,331 +293,3 @@ colorindex = 0 icon_state = "mobcap[colorindex]" update_icon() - -/*****************************Survival Pod********************************/ - - -/area/survivalpod - name = "\improper Emergency Shelter" - icon_state = "away" - requires_power = 0 - has_gravity = 1 - -/obj/item/survivalcapsule - name = "bluespace shelter capsule" - desc = "An emergency shelter stored within a pocket of bluespace." - icon_state = "capsule" - icon = 'icons/obj/mining.dmi' - w_class = WEIGHT_CLASS_TINY - origin_tech = "engineering=3;bluespace=3" - var/template_id = "shelter_alpha" - var/datum/map_template/shelter/template - var/used = FALSE - -/obj/item/survivalcapsule/proc/get_template() - if(template) - return - template = shelter_templates[template_id] - if(!template) - log_runtime("Shelter template ([template_id]) not found!", src) - qdel(src) - -/obj/item/survivalcapsule/examine(mob/user) - . = ..() - get_template() - to_chat(user, "This capsule has the [template.name] stored.") - to_chat(user, template.description) - -/obj/item/survivalcapsule/attack_self() - // Can't grab when capsule is New() because templates aren't loaded then - get_template() - if(used == FALSE) - loc.visible_message("[src] begins to shake. Stand back!") - used = TRUE - sleep(50) - var/turf/deploy_location = get_turf(src) - var/status = template.check_deploy(deploy_location) - switch(status) - if(SHELTER_DEPLOY_BAD_AREA) - loc.visible_message("[src] will not function in this area.") - if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS) - var/width = template.width - var/height = template.height - loc.visible_message("[src] doesn't have room to deploy! You need to clear a [width]x[height] area!") - - if(status != SHELTER_DEPLOY_ALLOWED) - used = FALSE - return - - playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1) - - var/turf/T = deploy_location - if(!is_mining_level(T.z))//only report capsules away from the mining/lavaland level - message_admins("[key_name_admin(usr)] ([ADMIN_QUE(usr,"?")]) ([ADMIN_FLW(usr,"FLW")]) activated a bluespace capsule away from the mining level! (JMP)") - log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]") - template.load(deploy_location, centered = TRUE) - new /obj/effect/particle_effect/smoke(get_turf(src)) - qdel(src) - -/obj/item/survivalcapsule/luxury - name = "luxury bluespace shelter capsule" - desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace." - origin_tech = "engineering=3;bluespace=4" - template_id = "shelter_beta" - -//Pod turfs and objects - -//Window -/obj/structure/window/shuttle/survival_pod - name = "pod window" - icon = 'icons/obj/smooth_structures/pod_window.dmi' - icon_state = "smooth" - dir = FULLTILE_WINDOW_DIR - max_integrity = 100 - fulltile = TRUE - reinf = TRUE - heat_resistance = 1600 - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100) - smooth = SMOOTH_MORE - canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod) - explosion_block = 3 - level = 3 - glass_type = /obj/item/stack/sheet/titaniumglass - glass_amount = 2 - -/obj/structure/window/reinforced/survival_pod - name = "pod window" - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "pwindow" - -//Floors -/turf/simulated/floor/pod - name = "pod floor" - icon_state = "podfloor" - icon_regular_floor = "podfloor" - floor_tile = /obj/item/stack/tile/pod - -//Door -/obj/machinery/door/airlock/survival_pod - icon = 'icons/obj/doors/airlocks/survival/survival.dmi' - overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_pod - -/obj/machinery/door/airlock/survival_pod/glass - opacity = FALSE - glass = TRUE - -/obj/structure/door_assembly/door_assembly_pod - name = "pod airlock assembly" - icon = 'icons/obj/doors/airlocks/survival/survival.dmi' - base_name = "pod airlock" - overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi' - airlock_type = /obj/machinery/door/airlock/survival_pod - glass_type = /obj/machinery/door/airlock/survival_pod/glass - -//Windoor -/obj/machinery/door/window/survival_pod - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "windoor" - base_state = "windoor" - -//Table -/obj/structure/table/survival_pod - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "table" - smooth = SMOOTH_FALSE - -//Sleeper -/obj/machinery/sleeper/survival_pod - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "sleeper-open" - density = 0 - -/obj/machinery/sleeper/survival_pod/New() - ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/sleeper/survival(null) - var/obj/item/stock_parts/matter_bin/B = new(null) - B.rating = initial_bin_rating - component_parts += B - component_parts += new /obj/item/stock_parts/manipulator(null) - component_parts += new /obj/item/stock_parts/console_screen(null) - component_parts += new /obj/item/stock_parts/console_screen(null) - component_parts += new /obj/item/stack/cable_coil(null, 1) - RefreshParts() - -//Computer -/obj/item/gps/computer - name = "pod computer" - icon_state = "pod_computer" - icon = 'icons/obj/lavaland/pod_computer.dmi' - anchored = 1 - density = 1 - pixel_y = -32 - -/obj/item/gps/computer/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) - playsound(loc, W.usesound, 50, 1) - user.visible_message("[user] disassembles the gps.", \ - "You start to disassemble the gps...", "You hear clanking and banging noises.") - if(do_after(user, 20 * W.toolspeed, target = src)) - new /obj/item/gps(loc) - qdel(src) - return ..() - -/obj/item/gps/computer/attack_hand(mob/user) - attack_self(user) - -//Bed -/obj/structure/bed/pod - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "bed" - -//Survival Storage Unit -/obj/machinery/smartfridge/survival_pod - name = "survival pod storage" - desc = "A heated storage unit." - icon_state = "donkvendor" - icon = 'icons/obj/lavaland/donkvendor.dmi' - icon_on = "donkvendor" - icon_off = "donkvendor" - light_range = 8 - max_n_of_items = 10 - pixel_y = -4 - -/obj/item/circuitboard/smartfridge/survival - name = "circuit board (Smartfridge Survival)" - build_path = /obj/machinery/smartfridge/survival_pod - -/obj/item/circuitboard/smartfridge/attackby(obj/item/I, mob/user, params) - return - -/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O) - if(istype(O, /obj/item)) - return 1 - return 0 - -/obj/machinery/smartfridge/survival_pod/New() - ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/smartfridge/survival(null) - component_parts += new /obj/item/stock_parts/matter_bin(null) - RefreshParts() - -/obj/machinery/smartfridge/survival_pod/loaded/New() - ..() - for(var/i in 1 to 5) - var/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak/W = new(src) - load(W) - if(prob(50)) - var/obj/item/storage/pill_bottle/dice/D = new(src) - load(D) - else - var/obj/item/instrument/guitar/G = new(src) - load(G) - -//Fans -/obj/structure/fans - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "fans" - name = "environmental regulation system" - desc = "A large machine releasing a constant gust of air." - anchored = 1 - density = 1 - var/arbitraryatmosblockingvar = 1 - var/buildstacktype = /obj/item/stack/sheet/metal - var/buildstackamount = 5 - -/obj/structure/fans/deconstruct() - if(buildstacktype) - new buildstacktype(loc, buildstackamount) - qdel(src) - -/obj/structure/fans/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) - playsound(loc, W.usesound, 50, 1) - user.visible_message("[user] disassembles the fan.", \ - "You start to disassemble the fan...", "You hear clanking and banging noises.") - if(do_after(user, 20 * W.toolspeed, target = src)) - deconstruct() - return ..() - -/obj/structure/fans/tiny - name = "tiny fan" - desc = "A tiny fan, releasing a thin gust of air." - layer = TURF_LAYER+0.1 - density = 0 - icon_state = "fan_tiny" - buildstackamount = 2 - -/obj/structure/fans/Initialize(loc) - ..() - air_update_turf(1) - -/obj/structure/fans/Destroy() - arbitraryatmosblockingvar = 0 - air_update_turf(1) - return ..() - -/obj/structure/fans/CanAtmosPass(turf/T) - return !arbitraryatmosblockingvar - -//Signs -/obj/structure/sign/mining - name = "nanotrasen mining corps sign" - desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims." - icon = 'icons/turf/walls/survival_pod_walls.dmi' - icon_state = "ntpod" - -/obj/structure/sign/mining/survival - name = "shelter sign" - desc = "A high visibility sign designating a safe shelter." - icon = 'icons/turf/walls/survival_pod_walls.dmi' - icon_state = "survival" - -//Fluff -/obj/structure/tubes - icon_state = "tubes" - icon = 'icons/obj/lavaland/survival_pod.dmi' - name = "tubes" - anchored = 1 - layer = MOB_LAYER - 0.2 - density = 0 - -/obj/structure/tubes/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) - playsound(loc, W.usesound, 50, 1) - user.visible_message("[user] disassembles [src].", \ - "You start to disassemble [src]...", "You hear clanking and banging noises.") - if(do_after(user, 20 * W.toolspeed, target = src)) - new /obj/item/stack/rods(loc) - qdel(src) - return ..() - -/obj/item/fakeartefact - name = "expensive forgery" - icon = 'icons/mob/screen_gen.dmi' - icon_state = "x2" - var/possible = list(/obj/item/ship_in_a_bottle, - /obj/item/gun/energy/pulse, - /obj/item/sleeping_carp_scroll, - /obj/item/shield/changeling, - /obj/item/lava_staff, - /obj/item/katana/energy, - /obj/item/storage/toolbox/green/memetic, - /obj/item/gun/projectile/automatic/l6_saw, - /obj/item/gun/magic/staff/chaos, - /obj/item/gun/magic/staff/spellblade, - /obj/item/gun/magic/wand/death, - /obj/item/gun/magic/wand/fireball, - /obj/item/stack/telecrystal, - /obj/item/banhammer) - -/obj/item/fakeartefact/New() - . = ..() - var/obj/item/I = pick(possible) - name = initial(I.name) - icon = initial(I.icon) - desc = initial(I.desc) - icon_state = initial(I.icon_state) - item_state = initial(I.item_state) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm deleted file mode 100644 index 0670c87e20d..00000000000 --- a/code/modules/mining/mine_turfs.dm +++ /dev/null @@ -1,672 +0,0 @@ -/**********************Mineral deposits**************************/ - -#define NORTH_EDGING "north" -#define SOUTH_EDGING "south" -#define EAST_EDGING "east" -#define WEST_EDGING "west" - -var/global/list/rockTurfEdgeCache = list( - NORTH_EDGING = image('icons/turf/mining.dmi', "rock_side_n", layer = 6), - SOUTH_EDGING = image('icons/turf/mining.dmi', "rock_side_s"), - EAST_EDGING = image('icons/turf/mining.dmi', "rock_side_e", layer = 6), - WEST_EDGING = image('icons/turf/mining.dmi', "rock_side_w", layer = 6)) - -/turf/simulated/mineral //wall piece - name = "Rock" - icon = 'icons/turf/mining.dmi' - icon_state = "rock_nochance" - oxygen = 0 - nitrogen = 0 - opacity = 1 - density = 1 - blocks_air = 1 - temperature = TCMB - var/mineralType = null - var/mineralAmt = 3 - var/mineralName = null - var/spread = 0 //will the seam spread? - var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles - var/last_act = 0 - var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner - var/hidden = 1 - - //start xenoarch vars - var/datum/geosample/geologic_data - var/excavation_level = 0 - var/list/finds - var/next_rock = 0 - var/archaeo_overlay = "" - var/excav_overlay = "" - var/obj/item/last_find - var/datum/artifact_find/artifact_find - //end xenaorch vars - -/turf/simulated/mineral/ex_act(severity, target) - ..() - switch(severity) - if(3.0) - if(prob(75)) - src.gets_drilled(null, 1) - if(2.0) - if(prob(90)) - src.gets_drilled(null, 1) - if(1.0) - src.gets_drilled(null, 1) - return - -/turf/simulated/mineral/New() - ..() - GLOB.mineral_turfs += src - - if(mineralType && mineralAmt && spread && spreadChance) - for(var/dir in cardinal) - if(prob(spreadChance)) - var/turf/T = get_step(src, dir) - if(istype(T, /turf/simulated/mineral/random)) - Spread(T) - - HideRock() - -/turf/simulated/mineral/proc/HideRock() - if(hidden) - name = "rock" - icon_state = "rock" - return - -/turf/simulated/mineral/proc/Spread(var/turf/T) - new src.type(T) - -/hook/startup/proc/add_mineral_edges() - var/watch = start_watch() - log_startup_progress("Reticulating splines...") - for(var/turf/simulated/mineral/M in GLOB.mineral_turfs) - M.add_edges() - log_startup_progress(" Splines reticulated in [stop_watch(watch)]s.") - return 1 - -/turf/simulated/mineral/proc/add_edges() - var/turf/T - if((istype(get_step(src, NORTH), /turf/simulated/floor)) || (istype(get_step(src, NORTH), /turf/space))) - T = get_step(src, NORTH) - if(T) - T.overlays += rockTurfEdgeCache[SOUTH_EDGING] - if((istype(get_step(src, SOUTH), /turf/simulated/floor)) || (istype(get_step(src, SOUTH), /turf/space))) - T = get_step(src, SOUTH) - if(T) - T.overlays += rockTurfEdgeCache[NORTH_EDGING] - if((istype(get_step(src, EAST), /turf/simulated/floor)) || (istype(get_step(src, EAST), /turf/space))) - T = get_step(src, EAST) - if(T) - T.overlays += rockTurfEdgeCache[WEST_EDGING] - if((istype(get_step(src, WEST), /turf/simulated/floor)) || (istype(get_step(src, WEST), /turf/space))) - T = get_step(src, WEST) - if(T) - T.overlays += rockTurfEdgeCache[EAST_EDGING] - -/turf/simulated/mineral/random - name = "mineral deposit" - icon_state = "rock" - var/mineralSpawnChanceList = list( - "Uranium" = 5, "Diamond" = 1, "Gold" = 10, - "Silver" = 12, "Plasma" = 20, "Iron" = 40, - "Gibtonite" = 4, "Cave" = 2, "BScrystal" = 1, - "Titanium" = 11) - var/mineralChance = 13 - -/turf/simulated/mineral/random/New() - ..() - if(prob(mineralChance)) - var/mName = pickweight(mineralSpawnChanceList) //temp mineral name - - if(mName) - var/turf/simulated/mineral/M - switch(mName) - if("Uranium") - M = new/turf/simulated/mineral/uranium(src) - if("Iron") - M = new/turf/simulated/mineral/iron(src) - if("Diamond") - M = new/turf/simulated/mineral/diamond(src) - if("Gold") - M = new/turf/simulated/mineral/gold(src) - if("Silver") - M = new/turf/simulated/mineral/silver(src) - if("Plasma") - M = new/turf/simulated/mineral/plasma(src) - if("Cave") - new/turf/simulated/floor/plating/airless/asteroid/cave(src) - if("Gibtonite") - M = new/turf/simulated/mineral/gibtonite(src) - if("Bananium") - M = new/turf/simulated/mineral/clown(src) - if("Tranquillite") - M = new/turf/simulated/mineral/mime(src) - if("Titanium") - M = new/turf/simulated/mineral/titanium(src) - if("BScrystal") - M = new/turf/simulated/mineral/bscrystal(src) - if(M) - M.mineralAmt = rand(1, 5) - src = M - M.levelupdate() - return - - -/turf/simulated/mineral/random/high_chance - icon_state = "rock_highchance" - mineralChance = 25 - mineralSpawnChanceList = list( - "Uranium" = 35, "Diamond" = 30, "Gold" = 45, - "Silver" = 50, "Plasma" = 50, "BScrystal" = 20, - "Titanium" = 45) - - -/turf/simulated/mineral/random/high_chance_clown - mineralChance = 40 - mineralSpawnChanceList = list( - "Uranium" = 35, "Diamond" = 2, - "Gold" = 5, "Silver" = 5, "Plasma" = 25, - "Iron" = 30, "Bananium" = 15, "Tranquillite" = 15, "BScrystal" = 10) - -/turf/simulated/mineral/random/high_chance/New() - icon_state = "rock" - ..() - -/turf/simulated/mineral/random/low_chance - icon_state = "rock_lowchance" - mineralChance = 6 - mineralSpawnChanceList = list( - "Uranium" = 2, "Diamond" = 1, "Gold" = 4, - "Silver" = 6, "Plasma" = 15, "Iron" = 40, - "Gibtonite" = 2, "BScrystal" = 1, "Titanium" = 4) - -/turf/simulated/mineral/random/low_chance/New() - icon_state = "rock" - ..() - -/turf/simulated/mineral/iron - name = "iron deposit" - icon_state = "rock_Iron" - mineralType = /obj/item/stack/ore/iron - mineralName = "Iron" - spreadChance = 20 - spread = 1 - hidden = 0 - -/turf/simulated/mineral/uranium - name = "uranium deposit" - mineralType = /obj/item/stack/ore/uranium - mineralName = "Uranium" - spreadChance = 5 - spread = 1 - hidden = 1 - scan_state = "rock_Uranium" - -/turf/simulated/mineral/diamond - name = "diamond deposit" - mineralType = /obj/item/stack/ore/diamond - mineralName = "Diamond" - spreadChance = 0 - spread = 1 - hidden = 1 - scan_state = "rock_Diamond" - -/turf/simulated/mineral/gold - name = "gold deposit" - mineralType = /obj/item/stack/ore/gold - mineralName = "Gold" - spreadChance = 5 - spread = 1 - hidden = 1 - scan_state = "rock_Gold" - -/turf/simulated/mineral/silver - name = "silver deposit" - mineralType = /obj/item/stack/ore/silver - mineralName = "Silver" - spreadChance = 5 - spread = 1 - hidden = 1 - scan_state = "rock_Silver" - -/turf/simulated/mineral/titanium - name = "titanium deposit" - mineralType = /obj/item/stack/ore/titanium - spreadChance = 5 - spread = 1 - hidden = 1 - scan_state = "rock_Titanium" - -/turf/simulated/mineral/plasma - name = "plasma deposit" - icon_state = "rock_Plasma" - mineralType = /obj/item/stack/ore/plasma - mineralName = "Plasma" - spreadChance = 8 - spread = 1 - hidden = 1 - scan_state = "rock_Plasma" - -/turf/simulated/mineral/clown - name = "bananium deposit" - icon_state = "rock_Clown" - mineralType = /obj/item/stack/ore/bananium - mineralName = "Bananium" - mineralAmt = 3 - spreadChance = 0 - spread = 0 - hidden = 0 - -/turf/simulated/mineral/mime - name = "tranquillite deposit" - icon_state = "rock_Mime" - mineralType = /obj/item/stack/ore/tranquillite - mineralAmt = 3 - spreadChance = 0 - spread = 0 - hidden = 0 - -/turf/simulated/mineral/bscrystal - name = "bluespace crystal deposit" - icon_state = "rock_BScrystal" - mineralType = /obj/item/stack/ore/bluespace_crystal - mineralName = "Bluespace crystal" - mineralAmt = 1 - spreadChance = 0 - spread = 0 - hidden = 1 - scan_state = "rock_BScrystal" - -////////////////////////////////Gibtonite -/turf/simulated/mineral/gibtonite - name = "gibtonite deposit" - icon_state = "rock_Gibtonite" - mineralAmt = 1 - mineralName = "Gibtonite" - spreadChance = 0 - spread = 0 - hidden = 1 - scan_state = "rock_Gibtonite" - var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it - var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction - var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes - var/activated_name = null - -/turf/simulated/mineral/gibtonite/New() - det_time = rand(8,10) //So you don't know exactly when the hot potato will explode - ..() - -/turf/simulated/mineral/gibtonite/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner) && stage == 1) - user.visible_message("You use [I] to locate where to cut off the chain reaction and attempt to stop it...") - defuse() - ..() - -/turf/simulated/mineral/gibtonite/proc/explosive_reaction(var/mob/user = null, triggered_by_explosion = 0) - if(stage == 0) - icon_state = "rock_Gibtonite_active" - name = "gibtonite deposit" - desc = "An active gibtonite reserve. Run!" - stage = 1 - visible_message("There was gibtonite inside! It's going to explode!") - var/turf/bombturf = get_turf(src) - var/area/A = get_area(bombturf) - - var/notify_admins = 0 - if(z != 5) - notify_admins = 1 - if(!triggered_by_explosion) - message_admins("[key_name_admin(user)] has triggered a gibtonite deposit reaction at [A.name] (JMP).") - else - message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] (JMP).") - - if(!triggered_by_explosion) - log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] ([A.x], [A.y], [A.z]).") - else - log_game("An explosion has triggered a gibtonite deposit reaction at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") - - countdown(notify_admins) - -/turf/simulated/mineral/gibtonite/proc/countdown(notify_admins = 0) - spawn(0) - while(stage == 1 && det_time > 0 && mineralAmt >= 1) - det_time-- - sleep(5) - if(stage == 1 && det_time <= 0 && mineralAmt >= 1) - var/turf/bombturf = get_turf(src) - mineralAmt = 0 - explosion(bombturf,1,3,5, adminlog = notify_admins) - if(stage == 0 || stage == 2) - return - -/turf/simulated/mineral/gibtonite/proc/defuse() - if(stage == 1) - icon_state = "rock_Gibtonite_inactive" - desc = "An inactive gibtonite reserve. The ore can be extracted." - stage = 2 - if(det_time < 0) - det_time = 0 - visible_message("The chain reaction was stopped! The gibtonite had [src.det_time] reactions left till the explosion!") - -/turf/simulated/mineral/gibtonite/gets_drilled(var/mob/user, triggered_by_explosion = 0) - if(stage == 0 && mineralAmt >= 1) //Gibtonite deposit is activated - playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1) - explosive_reaction(user, triggered_by_explosion) - return - if(stage == 1 && mineralAmt >= 1) //Gibtonite deposit goes kaboom - var/turf/bombturf = get_turf(src) - mineralAmt = 0 - explosion(bombturf,1,2,5, adminlog = 0) - if(stage == 2) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore. - var/obj/item/twohanded/required/gibtonite/G = new /obj/item/twohanded/required/gibtonite/(src) - if(det_time <= 0) - G.quality = 3 - G.icon_state = "Gibtonite ore 3" - if(det_time >= 1 && det_time <= 2) - G.quality = 2 - G.icon_state = "Gibtonite ore 2" - var/turf/simulated/floor/plating/airless/asteroid/gibtonite_remains/G = ChangeTurf(/turf/simulated/floor/plating/airless/asteroid/gibtonite_remains) - G.fullUpdateMineralOverlays() - -/turf/simulated/floor/plating/airless/asteroid/gibtonite_remains - var/det_time = 0 - var/stage = 0 - -////////////////////////////////End Gibtonite - -/turf/simulated/mineral/attackby(var/obj/item/pickaxe/P as obj, mob/user as mob, params) - - if(!user.IsAdvancedToolUser()) - to_chat(usr, "You don't have the dexterity to do this!") - return - - if(istype(P, /obj/item/pickaxe)) - var/turf/T = user.loc - if(!( istype(T, /turf) )) - return - - if(last_act+P.digspeed > world.time)//prevents message spam - return - last_act = world.time - to_chat(user, "You start picking...") - P.playDigSound() - - if(do_after(user, P.digspeed, target = src)) - if(istype(src, /turf/simulated/mineral)) //sanity check against turf being deleted during digspeed delay - to_chat(user, "You finish cutting into the rock.") - P.update_icon() - gets_drilled(user) - feedback_add_details("pick_used_mining","[P.name]") - else - return attack_hand(user) - return - -/turf/simulated/mineral/proc/gets_drilled() - if(mineralType && (src.mineralAmt > 0) && (src.mineralAmt < 11)) - var/i - for(i=0;iAn old dusty crate was buried within!
") - new /obj/structure/closet/crate/secure/loot(src) - - return - -/turf/simulated/mineral/attack_animal(mob/living/simple_animal/user as mob) - if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS)) - gets_drilled() - ..() - -/turf/simulated/mineral/attack_alien(var/mob/living/carbon/alien/M) - to_chat(M, "You start digging into the rock...") - playsound(src, 'sound/effects/break_stone.ogg', 50, 1) - if(do_after(M, 40, target = src)) - to_chat(M, "You tunnel into the rock.") - gets_drilled() - -/turf/simulated/mineral/Bumped(AM as mob|obj) - . = ..() - if(istype(AM,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = AM - if((istype(H.l_hand,/obj/item/pickaxe)) && (!H.hand)) - attackby(H.l_hand,H) - else if((istype(H.r_hand,/obj/item/pickaxe)) && H.hand) - attackby(H.r_hand,H) - - else if(istype(AM,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = AM - if(istype(R.module_active,/obj/item/pickaxe)) - attackby(R.module_active,R) - - else if(istype(AM,/obj/mecha)) - var/obj/mecha/M = AM - if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/drill)) - M.selected.action(src) - - -/**********************Asteroid**************************/ - -/turf/simulated/floor/plating/airless/asteroid - name = "Asteroid" - icon_state = "asteroid" - icon_plating = "asteroid" - var/dug = 0 //0 = has not yet been dug, 1 = has already been dug - oxygen = 0.01 - nitrogen = 0.01 - temperature = TCMB - -/turf/simulated/floor/plating/airless/asteroid/New() - var/proper_name = name - ..() - name = proper_name - if(prob(20)) - icon_state = "asteroid[rand(0,12)]" - -/turf/simulated/floor/plating/airless/asteroid/ex_act(severity, target) - switch(severity) - if(3.0) - return - if(2.0) - if(prob(20)) - src.gets_dug() - if(1.0) - src.gets_dug() - return - -/turf/simulated/floor/plating/airless/asteroid/attackby(obj/item/W, mob/user, params) - //note that this proc does not call ..() - if(!W || !user) - return 0 - - if((istype(W, /obj/item/shovel))) - var/turf/T = get_turf(user) - if(!istype(T)) - return - - if(dug) - to_chat(user, "This area has already been dug!") - return - - to_chat(user, "You start digging...") - if(do_after(user, 20 * W.toolspeed, target = src)) - to_chat(user, "You dig a hole.") - gets_dug() - return - - if((istype(W, /obj/item/pickaxe))) - var/obj/item/pickaxe/P = W - var/turf/T = get_turf(user) - if(!istype(T)) - return - - if(dug) - to_chat(user, "This area has already been dug!") - return - - to_chat(user, "You start digging...") - - if(do_after(user, P.digspeed, target = src)) - to_chat(user, "You dig a hole.") - gets_dug() - return - - if(istype(W,/obj/item/storage/bag/ore)) - var/obj/item/storage/bag/ore/S = W - if(S.collection_mode == 1) - for(var/obj/item/stack/ore/O in src.contents) - O.attackby(W,user) - return - - if(istype(W, /obj/item/stack/tile/plasteel) && isarea(loc)) - var/area/A = loc - if(A.outdoors) - to_chat(user, "You must define a room as part of the station using blueprints or an equivalent item first.") - return - playsound(src, 'sound/weapons/genhit.ogg', 50, 1) - make_plating() - icon_plating = "plating" - icon_state = "plating" - update_icon() - -/turf/simulated/floor/plating/airless/asteroid/gets_drilled() - if(!dug) - gets_dug() - else - ..() - -/turf/simulated/floor/plating/airless/asteroid/proc/gets_dug() - if(dug) - return - new/obj/item/stack/ore/glass(src, 5) - dug = 1 - playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) //FUCK YO RUSTLE I GOT'S THE DIGS SOUND HERE - icon_plating = "asteroid_dug" - icon_state = "asteroid_dug" - return - -/turf/proc/updateMineralOverlays() - src.overlays.Cut() - - if(istype(get_step(src, NORTH), /turf/simulated/mineral)) - src.overlays += rockTurfEdgeCache[NORTH_EDGING] - if(istype(get_step(src, SOUTH), /turf/simulated/mineral)) - src.overlays += rockTurfEdgeCache[SOUTH_EDGING] - if(istype(get_step(src, EAST), /turf/simulated/mineral)) - src.overlays += rockTurfEdgeCache[EAST_EDGING] - if(istype(get_step(src, WEST), /turf/simulated/mineral)) - src.overlays += rockTurfEdgeCache[WEST_EDGING] - -/turf/simulated/mineral/updateMineralOverlays() - return - -/turf/simulated/wall/updateMineralOverlays() - return - -/turf/proc/fullUpdateMineralOverlays() - for(var/turf/t in range(1,src)) - t.updateMineralOverlays() - -/turf/simulated/floor/plating/airless/asteroid/cave - var/length = 100 - var/mob_spawn_list = list("Goldgrub" = 1, "Goliath" = 5, "Basilisk" = 4, "Hivelord" = 3) - var/sanity = 1 - -/turf/simulated/floor/plating/airless/asteroid/cave/New(loc, var/length, var/go_backwards = 1, var/exclude_dir = -1) - - // If length (arg2) isn't defined, get a random length; otherwise assign our length to the length arg. - if(!length) - src.length = rand(25, 50) - else - src.length = length - - // Get our directiosn - var/forward_cave_dir = pick(alldirs - exclude_dir) - // Get the opposite direction of our facing direction - var/backward_cave_dir = angle2dir(dir2angle(forward_cave_dir) + 180) - - // Make our tunnels - make_tunnel(forward_cave_dir) - if(go_backwards) - make_tunnel(backward_cave_dir) - // Kill ourselves by replacing ourselves with a normal floor. - SpawnFloor(src) - ..() - -/turf/simulated/floor/plating/airless/asteroid/cave/proc/make_tunnel(var/dir) - - var/turf/simulated/mineral/tunnel = src - var/next_angle = pick(45, -45) - - for(var/i = 0; i < length; i++) - if(!sanity) - break - - var/list/L = list(45) - if(IsOdd(dir2angle(dir))) // We're going at an angle and we want thick angled tunnels. - L += -45 - - // Expand the edges of our tunnel - for(var/edge_angle in L) - var/turf/simulated/mineral/edge = get_step(tunnel, angle2dir(dir2angle(dir) + edge_angle)) - if(istype(edge)) - SpawnFloor(edge) - - // Move our tunnel forward - tunnel = get_step(tunnel, dir) - - if(istype(tunnel)) - // Small chance to have forks in our tunnel; otherwise dig our tunnel. - if(i > 3 && prob(20)) - new src.type(tunnel, rand(10, 15), 0, dir) - else - SpawnFloor(tunnel) - else //if(!istype(tunnel, src.parent)) // We hit space/normal/wall, stop our tunnel. - break - - // Chance to change our direction left or right. - if(i > 2 && prob(33)) - // We can't go a full loop though - next_angle = -next_angle - dir = angle2dir(dir2angle(dir) + next_angle) - -/turf/simulated/floor/plating/airless/asteroid/cave/proc/SpawnFloor(var/turf/T) - for(var/turf/S in range(2,T)) - if(istype(S, /turf/space) || istype(S.loc, /area/mine/dangerous/explored)) - sanity = 0 - break - if(!sanity) - return - - SpawnMonster(T) - var/turf/simulated/floor/t = new /turf/simulated/floor/plating/airless/asteroid(T) - spawn(2) - t.fullUpdateMineralOverlays() - -/turf/simulated/floor/plating/airless/asteroid/cave/proc/SpawnMonster(var/turf/T) - if(prob(30)) - if(istype(loc, /area/mine/dangerous/explored)) - return - for(var/atom/A in range(15,T))//Lowers chance of mob clumps - if(istype(A, /mob/living/simple_animal/hostile/asteroid)) - return - var/randumb = pickweight(mob_spawn_list) - switch(randumb) - if("Goliath") - new /mob/living/simple_animal/hostile/asteroid/goliath(T) - if("Goldgrub") - new /mob/living/simple_animal/hostile/asteroid/goldgrub(T) - if("Basilisk") - new /mob/living/simple_animal/hostile/asteroid/basilisk(T) - if("Hivelord") - new /mob/living/simple_animal/hostile/asteroid/hivelord(T) - return - -#undef NORTH_EDGING -#undef SOUTH_EDGING -#undef EAST_EDGING -#undef WEST_EDGING diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index cf8b897104c..5b20aad5047 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -69,7 +69,7 @@ visible_message("[src] crackles and buzzes violently!") /mob/living/simple_animal/hostile/mining_drone/sentience_act() - AIStatus = AI_OFF + ..() check_friendly_fire = 0 /mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params) @@ -184,28 +184,6 @@ mode = MINEDRONE_COLLECT SetCollectBehavior() - -/mob/living/simple_animal/hostile/mining_drone/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - return - - if(mesons_active) - sight |= SEE_TURFS - see_invisible = SEE_INVISIBLE_MINIMUM - else - sight &= ~SEE_TURFS - see_invisible = SEE_INVISIBLE_LIVING - - see_in_dark = initial(see_in_dark) - - if(client.eye != src) - var/atom/A = client.eye - if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. - return - //Actions for sentient minebots /datum/action/innate/minedrone @@ -229,13 +207,26 @@ /datum/action/innate/minedrone/toggle_meson_vision name = "Toggle Meson Vision" button_icon_state = "meson" + var/sight_flags = SEE_TURFS + var/lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE /datum/action/innate/minedrone/toggle_meson_vision/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - user.mesons_active = !user.mesons_active - user.update_sight() + var/mob/living/user = owner + var/is_active = user.sight & SEE_TURFS - to_chat(user, "You toggle your meson vision [(user.mesons_active) ? "on" : "off"].") + if(is_active) + UnregisterSignal(user, COMSIG_MOB_UPDATE_SIGHT) + user.update_sight() + else + RegisterSignal(user, COMSIG_MOB_UPDATE_SIGHT, .proc/update_user_sight) + user.update_sight() + + to_chat(user, "You toggle your meson vision [!is_active ? "on" : "off"].") + +/datum/action/innate/minedrone/toggle_meson_vision/proc/update_user_sight(mob/living/user) + user.sight |= sight_flags + if(!isnull(lighting_alpha)) + user.lighting_alpha = min(user.lighting_alpha, lighting_alpha) /datum/action/innate/minedrone/toggle_mode name = "Toggle Mode" diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index dda5fb47f78..236bcec1231 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -19,7 +19,7 @@ pixel_x = rand(0, 16) - 8 pixel_y = rand(0, 8) - 8 if(is_mining_level(z)) - score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining asteroid (No Clown Planet) + score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining level (No Clown Planet) /obj/item/stack/ore/attackby(obj/item/I, mob/user, params) ..() @@ -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) @@ -48,8 +48,14 @@ if(istype(thing, /obj/item/storage/bag/ore)) OB = thing break - if(OB && istype(F, /turf/simulated/floor/plating/airless/asteroid)) + if(OB && istype(F, /turf/simulated/floor/plating/asteroid)) F.attackby(OB, AM) + // Then, if the user is dragging an ore box, empty the satchel + // into the box. + var/mob/living/L = AM + if(istype(L.pulling, /obj/structure/ore_box)) + var/obj/structure/ore_box/box = L.pulling + box.attackby(OB, AM) return ..() /obj/item/stack/ore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 0edb81c8321..43bc1b57226 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -83,6 +83,9 @@ obj/structure/ore_box/ex_act(severity, target) O.forceMove(loc) CHECK_TICK +/obj/structure/ore_box/onTransitZ() + return + /obj/structure/ore_box/verb/empty_box() set name = "Empty Ore Box" set category = "Object" diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index a5bfcb02e4b..df6fd57423d 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -7,14 +7,10 @@ move_resist = INFINITY status_flags = GODMODE // You can't damage it. mouse_opacity = MOUSE_OPACITY_TRANSPARENT - see_in_dark = 7 + see_in_dark = 8 invisibility = 101 // No one can see us sight = SEE_SELF move_on_shuttle = 0 /mob/camera/experience_pressure_difference() return - -/mob/camera/Login() - ..() - update_interface() diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 922f3181c27..c7eb3357618 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -1,23 +1,33 @@ +/mob/dead/Login() + . = ..() + var/turf/T = get_turf(src) + if (isturf(T)) + update_z(T.z) + +/mob/dead/Logout() + update_z(null) + return ..() + /mob/dead/forceMove(atom/destination) - // Overriden from code/game/atoms_movable.dm#141 to prevent things like mice squeaking when ghosts walk on them. - // Same as parent, except that it does not include Uncrossed or Crossed calls. - var/turf/old_loc = loc + var/turf/old_turf = get_turf(src) + var/turf/new_turf = get_turf(destination) + if (old_turf?.z != new_turf?.z) + onTransitZ(old_turf?.z, new_turf?.z) + var/oldloc = loc loc = destination + Moved(oldloc, NONE, TRUE) - if(old_loc) - old_loc.Exited(src, destination) +/mob/dead/onTransitZ(old_z,new_z) + ..() + update_z(new_z) - if(destination) - destination.Entered(src) - - if(isturf(destination) && opacity) - var/turf/new_loc = destination - new_loc.reconsider_lights() - - if(isturf(old_loc) && opacity) - old_loc.reconsider_lights() - - for(var/datum/light_source/L in light_sources) - L.source_atom.update_light() - - return 1 +/mob/dead/proc/update_z(new_z) // 1+ to register, null to unregister + if (registered_z != new_z) + if (registered_z) + SSmobs.dead_players_by_zlevel[registered_z] -= src + if (client) + if (new_z) + SSmobs.dead_players_by_zlevel[new_z] += src + registered_z = new_z + else + registered_z = null \ No newline at end of file diff --git a/code/modules/mob/dead/observer/login.dm b/code/modules/mob/dead/observer/login.dm index 0990b085264..b44d8421b80 100644 --- a/code/modules/mob/dead/observer/login.dm +++ b/code/modules/mob/dead/observer/login.dm @@ -7,5 +7,3 @@ if(GLOB.non_respawnable_keys[ckey]) can_reenter_corpse = 0 GLOB.respawnable_list -= src - - update_interface() \ No newline at end of file diff --git a/code/modules/mob/dead/observer/logout.dm b/code/modules/mob/dead/observer/logout.dm index aa72e364aa0..93094d5ff30 100644 --- a/code/modules/mob/dead/observer/logout.dm +++ b/code/modules/mob/dead/observer/logout.dm @@ -1,6 +1,6 @@ /mob/dead/observer/Logout() if(client) - client.images -= ghost_darkness_images + client.images -= ghost_images ..() spawn(0) if(src && !key) //we've transferred to another mob. This ghost should be deleted. diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index e91c79e46c9..731f53c7838 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,33 +1,38 @@ #define GHOST_CAN_REENTER 1 #define GHOST_IS_OBSERVER 2 -var/list/image/ghost_darkness_images = list() //this is a list of images for things ghosts should still be able to see when they toggle darkness +var/list/image/ghost_images = list() + +GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) /mob/dead/observer name = "ghost" desc = "It's a g-g-g-g-ghooooost!" //jinkies! icon = 'icons/mob/mob.dmi' icon_state = "ghost" - layer = 4 + layer = GHOST_LAYER stat = DEAD - density = 0 - canmove = 0 + density = FALSE + canmove = FALSE alpha = 127 move_resist = INFINITY // don't get pushed around invisibility = INVISIBILITY_OBSERVER var/can_reenter_corpse - var/bootime = 0 + var/bootime = FALSE var/started_as_observer //This variable is set to 1 when you enter the game as an observer. //If you died in the game and are a ghsot - this will remain as null. //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. - universal_speak = 1 + universal_speak = TRUE var/atom/movable/following = null var/image/ghostimage = null //this mobs ghost image, for deleting and stuff - var/ghostvision = 1 //is the ghost able to see things humans can't? - var/seedarkness = 1 + var/ghostvision = TRUE //is the ghost able to see things humans can't? + var/seedarkness = TRUE var/data_hud_seen = FALSE //this should one of the defines in __DEFINES/hud.dm + var/ghost_orbit = GHOST_ORBIT_CIRCLE /mob/dead/observer/New(var/mob/body=null, var/flags=1) + set_invisibility(GLOB.observer_default_invisibility) + sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF see_invisible = SEE_INVISIBLE_OBSERVER_AI_EYE see_in_dark = 100 @@ -49,7 +54,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi T = get_turf(body) //Where is the body located? attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - var/mutable_appearance/MA = copy_appearance(body) + var/mutable_appearance/MA = copy_appearance(body) if(body.mind && body.mind.name) MA.name = body.mind.name else if(body.real_name) @@ -69,7 +74,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi ghostimage.appearance_flags |= KEEP_TOGETHER ghostimage.alpha = alpha appearance_flags |= KEEP_TOGETHER - ghost_darkness_images |= ghostimage + ghost_images |= ghostimage updateallghostimages() if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position forceMove(T) @@ -85,11 +90,16 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi M.following_mobs -= src following = null if(ghostimage) - ghost_darkness_images -= ghostimage + ghost_images -= ghostimage QDEL_NULL(ghostimage) updateallghostimages() return ..() +/mob/dead/observer/examine(mob/user) + ..() + if(!invisibility) + to_chat(user, "It seems extremely obvious.") + // This seems stupid, but it's the easiest way to avoid absolutely ridiculous shit from happening // Copying an appearance directly from a mob includes it's verb list, it's invisibility, it's alpha, and it's density // You might recognize these things as "fucking ridiculous to put in an appearance" @@ -139,15 +149,14 @@ Works together with spawning an observer, noted above. var/client/C = U.client for(var/mob/living/carbon/human/target in target_list) C.images += target.hud_list[SPECIALROLE_HUD] - //C.images += target.hud_list[NATIONS_HUD] for(var/mob/living/silicon/target in target_list) C.images += target.hud_list[SPECIALROLE_HUD] - //C.images += target.hud_list[NATIONS_HUD] - return 1 /mob/proc/ghostize(var/flags = GHOST_CAN_REENTER) if(key) + if(player_logged) //if they have disconnected we want to remove their SSD overlay + overlays -= image('icons/effects/effects.dmi', icon_state = "zzz_glow") if(GLOB.non_respawnable_keys[ckey]) flags &= ~GHOST_CAN_REENTER var/mob/dead/observer/ghost = new(src, flags) //Transfer safety to observer spawning proc. @@ -177,30 +186,44 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(P) if(TOO_EARLY_TO_GHOST) warningmsg = "It's too early in the shift to enter cryo" - // If it's not too early, we'll skip straight to ghosting out without penalty else if(suiciding && TOO_EARLY_TO_GHOST) warningmsg = "You have committed suicide too early in the round" else if(stat != DEAD) warningmsg = "You are alive" + if(isAI(src)) + warningmsg = "You are a living AI! You should probably use OOC -> Wipe Core instead." else if(GLOB.non_respawnable_keys[ckey]) warningmsg = "You have lost your right to respawn" - if(!warningmsg) - ghostize(1) - else + if(warningmsg) var/response var/alertmsg = "Are you -sure- you want to ghost?\n([warningmsg]. If you ghost now, you probably won't be able to rejoin the round! You can't change your mind, so choose wisely!)" response = alert(src, alertmsg,"Are you sure you want to ghost?","Stay in body","Ghost") if(response != "Ghost") - return //didn't want to ghost after-all - StartResting() - var/mob/dead/observer/ghost = ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. + return + + if(stat == CONSCIOUS) + if(!is_admin_level(z)) + player_ghosted = 1 + if(mind && mind.special_role) + message_admins("[key_name_admin(src)] has ghosted while alive, with special_role: [mind.special_role]") + + if(warningmsg) + // Not respawnable + var/mob/dead/observer/ghost = ghostize(0) // 0 parameter stops them re-entering their body + ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. + else + // Respawnable + ghostize(1) + + // If mob in morgue tray, update tray var/obj/structure/morgue/Morgue = locate() in M.loc if(istype(M.loc, /obj/structure/morgue)) Morgue = M.loc if(Morgue) Morgue.update() + + // If mob in cryopod, despawn mob if(P) if(!P.control_computer) P.find_control_computer(urgent=1) @@ -208,32 +231,31 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp P.despawn_occupant() return +// Ghosts have no momentum, being massless ectoplasm +/mob/dead/observer/Process_Spacemove(movement_dir) + return 1 /mob/dead/observer/Move(NewLoc, direct) following = null - dir = direct - ghostimage.dir = dir + setDir(direct) + ghostimage.setDir(dir) + + var/oldloc = loc + if(NewLoc) forceMove(NewLoc) - return - forceMove(get_turf(src)) //Get out of closets and such as a ghost - if((direct & NORTH) && y < world.maxy) - y++ - else if((direct & SOUTH) && y > 1) - y-- - if((direct & EAST) && x < world.maxx) - x++ - else if((direct & WEST) && x > 1) - x-- + else + forceMove(get_turf(src)) //Get out of closets and such as a ghost + if((direct & NORTH) && y < world.maxy) + y++ + else if((direct & SOUTH) && y > 1) + y-- + if((direct & EAST) && x < world.maxx) + x++ + else if((direct & WEST) && x > 1) + x-- - for(var/obj/effect/step_trigger/S in locate(x, y, z)) //<-- this is dumb - S.Crossed(src) - - var/area/A = get_area(src) - if(A) - A.Entered(src) - - ..() + Moved(oldloc, direct) /mob/dead/observer/can_use_hands() return 0 @@ -241,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"]") @@ -371,7 +392,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(usr, "AntagHud Toggled OFF") M.antagHUD = 0 -/mob/dead/observer/proc/dead_tele(A in ghostteleportlocs) +/mob/dead/observer/proc/dead_tele() set category = "Ghost" set name = "Teleport" set desc= "Teleport to a location" @@ -380,12 +401,12 @@ 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 - usr.verbs -= /mob/dead/observer/proc/dead_tele - spawn(30) - usr.verbs += /mob/dead/observer/proc/dead_tele + var/datum/async_input/A = input_autocomplete_async(usr, "Area to jump to: ", ghostteleportlocs) + A.on_close(CALLBACK(src, .proc/teleport)) - var/area/thearea = ghostteleportlocs[A] - if(!thearea) return +/mob/dead/observer/proc/teleport(area/thearea) + if(!thearea || !isobserver(usr)) + return var/list/L = list() for(var/turf/T in get_area_turfs(thearea.type)) @@ -393,22 +414,23 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!L || !L.len) to_chat(usr, "No area available.") + return - usr.forceMove(pick(L)) + forceMove(pick(L)) following = null -/mob/dead/observer/verb/follow(input in getmobs()) +/mob/dead/observer/verb/follow() set category = "Ghost" - set name = "Follow" // "Haunt" - set desc = "Follow and haunt a mob." + set name = "Orbit" // "Haunt" + set desc = "Follow and orbit a mob." - var/target = getmobs()[input] - if(!target) return - ManualFollow(target) + var/list/mobs = getpois(skip_mindless=1) + 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) - if(!target) + if(!target || !isobserver(usr)) return if(!get_turf(target)) @@ -417,22 +439,37 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(target != src) if(following && following == target) return + + var/icon/I = icon(target.icon,target.icon_state,target.dir) + + var/orbitsize = (I.Width()+I.Height())*0.5 + + if(orbitsize == 0) + orbitsize = 40 + + orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) + + var/rot_seg + + switch(ghost_orbit) + if(GHOST_ORBIT_TRIANGLE) + rot_seg = 3 + if(GHOST_ORBIT_SQUARE) + rot_seg = 4 + if(GHOST_ORBIT_PENTAGON) + rot_seg = 5 + if(GHOST_ORBIT_HEXAGON) + rot_seg = 6 + else //Circular + rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle + following = target to_chat(src, "Now following [target]") - if(ismob(target)) - forceMove(get_turf(target)) - var/mob/M = target - M.following_mobs += src - else - spawn(0) - while(target && following == target && client) - var/turf/T = get_turf(target) - if(!T) - break - // To stop the ghost flickering. - if(loc != T) - forceMove(T) - sleep(15) + orbit(target,orbitsize, FALSE, 20, rot_seg) + +/mob/dead/observer/orbit() + setDir(2)//reset dir so the right directional sprites show up + return ..() /mob/proc/update_following() . = get_turf(src) @@ -456,25 +493,26 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp update_following() return ..() -/mob/dead/observer/verb/jumptomob(target in getmobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak +/mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak set category = "Ghost" set name = "Jump to Mob" set desc = "Teleport to a mob" - if(istype(usr, /mob/dead/observer)) //Make sure they're an observer! + 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)) - if(!target)//Make sure we actually have a target - return - else - var/mob/M = getmobs()[target] //Destination 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. - forceMove(T) - following = null - else - to_chat(src, "This mob is not located in the game world.") +/mob/dead/observer/proc/jump_to_mob(mob/M) + if(!M || !isobserver(usr)) + 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() @@ -638,14 +676,32 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" set category = "Ghost" ghostvision = !(ghostvision) - updateghostsight() + update_sight() to_chat(usr, "You [(ghostvision?"now":"no longer")] have ghost vision.") /mob/dead/observer/verb/toggle_darkness() set name = "Toggle Darkness" set category = "Ghost" - seedarkness = !(seedarkness) - updateghostsight() + switch(lighting_alpha) + if (LIGHTING_PLANE_ALPHA_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + else + lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + + update_sight() + +/mob/dead/observer/update_sight() + if (!ghostvision) + see_invisible = SEE_INVISIBLE_LIVING + else + see_invisible = SEE_INVISIBLE_OBSERVER + + updateghostimages() + . = ..() /mob/dead/observer/proc/updateghostsight() if(!seedarkness) @@ -653,7 +709,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else see_invisible = SEE_INVISIBLE_OBSERVER if(!ghostvision) - see_invisible = SEE_INVISIBLE_LIVING; + see_invisible = SEE_INVISIBLE_LIVING + updateghostimages() /proc/updateallghostimages() @@ -664,10 +721,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!client) return if(seedarkness || !ghostvision) - client.images -= ghost_darkness_images + client.images -= ghost_images else //add images for the 60inv things ghosts can normally see when darkness is enabled so they can see them now - client.images |= ghost_darkness_images + client.images |= ghost_images if(ghostimage) client.images -= ghostimage //remove ourself @@ -714,6 +771,26 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/is_literate() return TRUE + +/mob/dead/observer/proc/set_invisibility(value) + invisibility = value + if(!value) + set_light(1, 2) + else + set_light(0, 0) + +/mob/dead/observer/vv_edit_var(var_name, var_value) + . = ..() + if(var_name == "invisibility") + set_invisibility(invisibility) // updates light + +/proc/set_observer_default_invisibility(amount, message=null) + for(var/mob/dead/observer/G in GLOB.player_list) + G.set_invisibility(amount) + if(message) + to_chat(G, message) + GLOB.observer_default_invisibility = amount + /mob/dead/observer/proc/open_spawners_menu() set name = "Mob spawners menu" set desc = "See all currently available ghost spawners" diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index ab47a84ee76..41c1d89f603 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -17,7 +17,7 @@ . = src.say_dead(message) -/mob/dead/observer/emote(var/act, var/type, var/message) +/mob/dead/observer/emote(act, type, message, force) message = sanitize(copytext(message, 1, MAX_MESSAGE_LEN)) if(!message) diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/spells.dm index 620c1854e73..e890098b29b 100644 --- a/code/modules/mob/dead/observer/spells.dm +++ b/code/modules/mob/dead/observer/spells.dm @@ -1,6 +1,4 @@ - - -var/global/list/boo_phrases=list( +GLOBAL_LIST_INIT(boo_phrases, list( "You feel a chill run down your spine.", "You think you see a figure in your peripheral vision.", "What was that?", @@ -9,16 +7,18 @@ var/global/list/boo_phrases=list( "Something doesn't feel right...", "You feel a presence in the room.", "It feels like someone's standing behind you.", -) +)) /obj/effect/proc_holder/spell/aoe_turf/boo name = "Boo!" desc = "Fuck with the living." - ghost = 1 + ghost = TRUE + action_icon_state = "boo" school = "transmutation" charge_max = 600 + starts_charged = FALSE clothes_req = 0 stat_allowed = 1 invocation = "" @@ -27,26 +27,4 @@ var/global/list/boo_phrases=list( /obj/effect/proc_holder/spell/aoe_turf/boo/cast(list/targets, mob/user = usr) for(var/turf/T in targets) - for(var/atom/A in T.contents) - - // Bug humans - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(H && H.client) - to_chat(H, "[pick(boo_phrases)]") - - // Flicker unblessed lights in range - if(istype(A,/obj/machinery/light)) - var/obj/machinery/light/L = A - if(L) - L.flicker() - - // OH GOD BLUE APC (single animation cycle) - if(istype(A, /obj/machinery/power/apc)) - A:spookify() - - if(istype(A, /obj/machinery/status_display)) - A:spookymode=1 - - if(istype(A, /obj/machinery/ai_status_display)) - A:spookymode=1 \ No newline at end of file + T.get_spooked() diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 0ec193c69e8..304bdc419a2 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -2,15 +2,20 @@ //Emote Cooldown System (it's so simple!) /mob/proc/handle_emote_CD(cooldown = EMOTE_COOLDOWN) - if(emote_cd == 2) return 1 // Cooldown emotes were disabled by an admin, prevent use - if(src.emote_cd == 1) return 1 // Already on CD, prevent use + if(emote_cd == 3) //Spam those emotes + return FALSE + if(emote_cd == 2) // Cooldown emotes were disabled by an admin, prevent use + return TRUE + if(emote_cd == 1) // Already on CD, prevent use + return TRUE - src.emote_cd = 1 // Starting cooldown + emote_cd = TRUE // Starting cooldown spawn(cooldown) - if(emote_cd == 2) return 1 // Don't reset if cooldown emotes were disabled by an admin during the cooldown - src.emote_cd = 0 // Cooldown complete, ready for more! + if(emote_cd == 2) + return TRUE // Don't reset if cooldown emotes were disabled by an admin during the cooldown + emote_cd = FALSE // Cooldown complete, ready for more! + return FALSE // Proceed with emote - return 0 // Proceed with emote //--FalseIncarnate /mob/proc/handle_emote_param(var/target, var/not_self, var/vicinity, var/return_mob) //Only returns not null if the target param is valid. @@ -53,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/holder.dm b/code/modules/mob/holder.dm index 3a6c4d22a67..ee9a3c3cca2 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -7,10 +7,10 @@ /obj/item/holder/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/holder/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/holder/process() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index e53e3c9fd4d..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() @@ -35,11 +43,11 @@ /mob/proc/put_in_l_hand(var/obj/item/W) if(!put_in_hand_check(W)) return 0 - if(!l_hand) + if(!l_hand && has_left_hand()) W.forceMove(src) //TODO: move to equipped? l_hand = W - W.layer = 20 //TODO: move to equipped? - W.plane = HUD_PLANE //TODO: move to equipped? + W.layer = ABOVE_HUD_LAYER //TODO: move to equipped? + W.plane = ABOVE_HUD_PLANE //TODO: move to equipped? W.equipped(src,slot_l_hand) if(pulling == W) stop_pulling() @@ -51,11 +59,11 @@ /mob/proc/put_in_r_hand(var/obj/item/W) if(!put_in_hand_check(W)) return 0 - if(!r_hand) + if(!r_hand && has_right_hand()) W.forceMove(src) r_hand = W - W.layer = 20 - W.plane = HUD_PLANE + W.layer = ABOVE_HUD_LAYER + W.plane = ABOVE_HUD_PLANE W.equipped(src,slot_r_hand) if(pulling == W) stop_pulling() @@ -245,8 +253,13 @@ /mob/proc/get_item_by_slot(slot_id) switch(slot_id) + if(slot_wear_mask) + return wear_mask + if(slot_back) + return back if(slot_l_hand) return l_hand if(slot_r_hand) return r_hand return null + diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 8a7c017818a..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,9 +523,12 @@ 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) + if(speaker.mind && speaker.mind.special_role == SPECIAL_ROLE_SHADOWLING) + ..(speaker,"[message]", "([speaker.mind.special_role]) [speaker]") + else if(speaker.mind && speaker.mind.special_role) ..(speaker, message, "([speaker.mind.special_role]) [speaker]") else ..(speaker, message) @@ -537,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) @@ -565,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 @@ -588,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) @@ -634,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" @@ -645,7 +652,7 @@ exclaim_verb = "declares" key = "]" flags = RESTRICTED - follow = 1 + follow = TRUE syllables = list ("beep", "boop") /datum/language/swarmer @@ -657,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/_defines.dm b/code/modules/mob/living/carbon/_defines.dm index 483502965da..a5a524f86ed 100644 --- a/code/modules/mob/living/carbon/_defines.dm +++ b/code/modules/mob/living/carbon/_defines.dm @@ -1,6 +1,5 @@ -//NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick! -#define HUMAN_MAX_OXYLOSS 3 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. -#define HUMAN_CRIT_MAX_OXYLOSS ( (tickerProcess.getLastTickerTimeDuration()) / 3) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 100HP to get through, so (1/3)*last_tick_duration per second. Breaths however only happen every 4 ticks. +//NOTE: Breathing happens once EVERY OTHER TICK. +#define HUMAN_MAX_OXYLOSS 5 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. #define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 9c87b04b0e5..69a2e1160b0 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -5,18 +5,21 @@ icon = 'icons/mob/alien.dmi' gender = NEUTER dna = null - alien_talk_understand = 1 - nightvision = 1 + alien_talk_understand = TRUE + + var/nightvision = FALSE + see_in_dark = 4 + var/obj/item/card/id/wear_id = null // Fix for station bounced radios -- Skie - var/has_fine_manipulation = 0 - var/move_delay_add = 0 // movement delay to add + var/has_fine_manipulation = FALSE + var/move_delay_add = FALSE // movement delay to add status_flags = CANPARALYSE|CANPUSH var/heal_rate = 5 - var/large = 0 + var/large = FALSE var/heat_protection = 0.5 - var/leaping = 0 + var/leaping = FALSE ventcrawler = 2 var/list/alien_organs = list() var/death_message = "lets out a waning guttural screech, green blood bubbling from its maw..." @@ -70,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) @@ -149,15 +156,17 @@ if(!nightvision) see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - nightvision = 1 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + nightvision = TRUE usr.hud_used.nightvisionicon.icon_state = "nightvision1" - else if(nightvision == 1) - see_in_dark = 4 - see_invisible = 45 - nightvision = 0 + else if(nightvision) + see_in_dark = initial(see_in_dark) + lighting_alpha = initial(lighting_alpha) + nightvision = FALSE usr.hud_used.nightvisionicon.icon_state = "nightvision0" + update_sight() + /mob/living/carbon/alien/assess_threat(var/mob/living/simple_animal/bot/secbot/judgebot, var/lasercolor) if(judgebot.emagged == 2) @@ -264,3 +273,36 @@ Des: Removes all infected images from the alien. return pick("xltrails_1", "xltrails_2") else return pick("xttrails_1", "xttrails_2") + +/mob/living/carbon/alien/update_sight() + if(!client) + return + if(stat == DEAD) + grant_death_vision() + return + + see_invisible = initial(see_invisible) + sight = SEE_MOBS + if(nightvision) + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + else + see_in_dark = initial(see_in_dark) + lighting_alpha = initial(lighting_alpha) + + if(client.eye != src) + var/atom/A = client.eye + if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. + return + + for(var/obj/item/organ/internal/cyberimp/eyes/E in internal_organs) + sight |= E.vision_flags + if(E.see_in_dark) + see_in_dark = max(see_in_dark, E.see_in_dark) + if(E.see_invisible) + see_invisible = min(see_invisible, E.see_invisible) + if(!isnull(E.lighting_alpha)) + lighting_alpha = min(lighting_alpha, E.lighting_alpha) + + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index ec2d96ed880..5eb8f5766e4 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -6,7 +6,7 @@ As such, they can either help or harm other aliens. Help works like the human he In all, this is a lot like the monkey code. /N */ /mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M) - if(!ticker) + if(!SSticker) to_chat(M, "You cannot attack people before the game has started.") return diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index a6454111397..fd8d4445717 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -85,13 +85,8 @@ Doesn't work on other aliens/AI.*/ return // TURF CHECK else if(istype(O, /turf/simulated)) - var/turf/T = O - // R WALL - if(istype(T, /turf/simulated/wall/r_wall)) - to_chat(src, "You cannot dissolve this object.") - return - // R FLOOR - if(istype(T, /turf/simulated/floor/engine)) + var/turf/simulated/T = O + if(T.unacidable) to_chat(src, "You cannot dissolve this object.") return else// Not a type we can acid. @@ -159,7 +154,7 @@ Doesn't work on other aliens/AI.*/ for(var/mob/M in src) if(M in stomach_contents) stomach_contents.Remove(M) - M.loc = loc + M.forceMove(loc) //Paralyse(10) src.visible_message("[src] hurls out the contents of [p_their()] stomach!") return 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/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index f159abebbe4..7412120cff0 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/alien/humanoid/emote(var/act,var/m_type=1,var/message = null) +/mob/living/carbon/alien/humanoid/emote(act, m_type = 1, message = null, force) var/param = null if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) @@ -25,7 +25,7 @@ if("flip") on_CD = handle_emote_CD() - if(on_CD) + if(!force && on_CD == 1) return switch(act) @@ -138,4 +138,4 @@ playsound(src.loc, 'sound/voice/hiss1.ogg', 30, 1, 1) if(act == "gnarl") playsound(src.loc, 'sound/voice/hiss4.ogg', 30, 1, 1) - ..(act, m_type, message) \ No newline at end of file + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm index 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/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 6012a8fb7f3..3af2250bbbd 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -46,13 +46,13 @@ if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP SetSilence(0) else //ALIVE. LIGHTS ARE ON - if(health < config.health_threshold_dead || !get_int_organ(/obj/item/organ/internal/brain)) + if(health < HEALTH_THRESHOLD_DEAD && check_death_method() || !get_int_organ(/obj/item/organ/internal/brain)) death() SetSilence(0) return 1 //UNCONSCIOUS. NO-ONE IS HOME - if((getOxyLoss() > 50) || (config.health_threshold_crit >= health)) + if((getOxyLoss() > 50) || (HEALTH_THRESHOLD_CRIT >= health && check_death_method())) if(health <= 20 && prob(1)) emote("gasp") if(!reagents.has_reagent("epinephrine")) 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/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index 44287493718..bdc2ee31f77 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -18,7 +18,7 @@ if(stat == DEAD) //If we mostly took damage from fire - if(fireloss > 125) + if(getFireLoss() > 125) icon_state = "alien[caste]_husked" pixel_y = 0 else diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm index 82ebcf943f6..3b18889176b 100644 --- a/code/modules/mob/living/carbon/alien/larva/emote.dm +++ b/code/modules/mob/living/carbon/alien/larva/emote.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/alien/larva/emote(var/act,var/m_type=1,var/message = null) +/mob/living/carbon/alien/larva/emote(act, m_type = 1, message = null, force) var/param = null if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index a64750ad93d..5ebaaffac0c 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -93,6 +93,9 @@ /mob/living/carbon/alien/larva/show_inv(mob/user as mob) return +/mob/living/carbon/alien/larva/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) + return FALSE + /* Commented out because it's duplicated in life.dm /mob/living/carbon/alien/larva/proc/grow() // Larvae can grow into full fledged Xenos if they survive long enough -- TLE if(icon_state == "larva_l" && !canmove) // This is a shit death check. It is made of shit and death. Fix later. diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index a4b783e08fb..a0668db8327 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -19,7 +19,7 @@ return 1 //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 25) || (config.health_threshold_crit >= health) ) + if((getOxyLoss() > 25) || (HEALTH_THRESHOLD_CRIT >= health && check_death_method())) //if( health <= 20 && prob(1) ) // spawn(0) // emote("gasp") diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index f1076721cf1..27837dc7cf5 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -7,8 +7,8 @@ if(stat != CONSCIOUS) return - if(layer != TURF_LAYER+0.2) - layer = TURF_LAYER+0.2 + if(layer != ABOVE_NORMAL_TURF_LAYER) + layer = ABOVE_NORMAL_TURF_LAYER visible_message("[src] scurries to the ground!", "You are now hiding.") else layer = MOB_LAYER diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index d3ecc9e3e1c..a584f66dc97 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -28,33 +28,3 @@ //BREATH TEMPERATURE handle_breath_temperature(breath) - -/mob/living/carbon/alien/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - return - - sight = SEE_MOBS - if(nightvision) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - else - see_in_dark = 4 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - - if(client.eye != src) - var/atom/A = client.eye - if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. - return - - for(var/obj/item/organ/internal/cyberimp/eyes/E in internal_organs) - sight |= E.vision_flags - if(E.dark_view) - see_in_dark = max(see_in_dark, E.dark_view) - if(E.see_invisible) - see_invisible = min(see_invisible, E.see_invisible) - - if(see_override) - see_invisible = see_override diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 3a752e61619..0addea8d4b6 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -93,8 +93,8 @@ spawn(6) var/mob/living/carbon/alien/larva/new_xeno = new(owner.drop_location()) new_xeno.key = C.key - if(ticker && ticker.mode) - ticker.mode.xenos += new_xeno.mind + if(SSticker && SSticker.mode) + SSticker.mode.xenos += new_xeno.mind new_xeno.mind.name = new_xeno.name new_xeno.mind.assigned_role = SPECIAL_ROLE_XENOMORPH new_xeno.mind.special_role = SPECIAL_ROLE_XENOMORPH 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/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 2e4d3e8efd6..6b194315f1d 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -44,7 +44,7 @@ visible_message("[user] sticks \a [O] into \the [src].") brainmob = B.brainmob B.brainmob = null - brainmob.loc = src + brainmob.forceMove(src) brainmob.container = src brainmob.stat = CONSCIOUS GLOB.respawnable_list -= brainmob @@ -152,7 +152,7 @@ held_brain.name = "\the [brainmob.name]'s [initial(held_brain.name)]" brainmob.container = null//Reset brainmob mmi var. - brainmob.loc = held_brain//Throw mob into brain. + brainmob.forceMove(held_brain) //Throw mob into brain. GLOB.respawnable_list += brainmob GLOB.living_mob_list -= brainmob//Get outta here held_brain.brainmob = brainmob//Set the brain to use the brainmob diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 0f7d4230587..8d17b84c724 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -67,10 +67,10 @@ /mob/living/carbon/brain/on_forcemove(atom/newloc) if(container) - container.loc = newloc + container.forceMove(newloc) else //something went very wrong. CRASH("Brainmob without container.") - loc = container + forceMove(container) /* This will return true if the brain has a container that leaves it less helpless than a naked brain @@ -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/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 03675f282e5..af1d7680aca 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -1,7 +1,7 @@ /obj/item/organ/internal/brain name = "brain" health = 400 //They need to live awhile longer than other organs. - max_damage = 200 + max_damage = 120 icon_state = "brain2" force = 1.0 w_class = WEIGHT_CLASS_SMALL @@ -48,7 +48,6 @@ H.mind.transfer_to(brainmob) to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a [initial(src.name)].") - callHook("debrain", list(brainmob)) /obj/item/organ/internal/brain/examine(mob/user) // -- TLE ..(user) @@ -100,6 +99,19 @@ log_debug("Multibrain shenanigans at ([target.x],[target.y],[target.z]), mob '[target]'") ..(target, special = special) +/obj/item/organ/internal/brain/receive_damage(amount, silent = 0) //brains are special; if they receive damage by other means, we really just want the damage to be passed ot the owner and back onto the brain. + if(owner) + owner.adjustBrainLoss(amount) + +/obj/item/organ/internal/brain/necrotize(update_sprite = TRUE) //Brain also has special handling for when it necrotizes + damage = max_damage + status |= ORGAN_DEAD + STOP_PROCESSING(SSobj, src) + if(dead_icon && !is_robotic()) + icon_state = dead_icon + if(owner && vital) + owner.setBrainLoss(120) + /obj/item/organ/internal/brain/prepare_eat() return // Too important to eat. diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index bf7962464da..dd1876e223f 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/brain/emote(var/act,var/m_type=1,var/message = null) +/mob/living/carbon/brain/emote(act,m_type = 1, message = null, force) if(!(container && istype(container, /obj/item/mmi)))//No MMI, no emotes return @@ -48,4 +48,4 @@ to_chat(src, "alarm, alert, notice, flash,blink, whistle, beep, boop") if(message && !stat) - ..(act, m_type, message) \ No newline at end of file + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 2ac3b3c4d6b..d0cf06f1bf7 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -32,7 +32,7 @@ . = ..() if(.) - if(!container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life))) + if(!container && (health < HEALTH_THRESHOLD_DEAD && check_death_method() || ((world.time - timeofhostdeath) > config.revival_brain_life))) death() return 0 diff --git a/code/modules/mob/living/carbon/brain/robotic_brain.dm b/code/modules/mob/living/carbon/brain/robotic_brain.dm index c294a11c999..6528d9c252e 100644 --- a/code/modules/mob/living/carbon/brain/robotic_brain.dm +++ b/code/modules/mob/living/carbon/brain/robotic_brain.dm @@ -161,7 +161,7 @@ if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept")) to_chat(O, "You are job banned from this role.") return - to_chat(O., "You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer.") + to_chat(O, "You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer.") ghost_volunteers.Add(O) diff --git a/code/modules/mob/living/carbon/brain/update_status.dm b/code/modules/mob/living/carbon/brain/update_status.dm index 431d1eea0c3..6fec51bb07b 100644 --- a/code/modules/mob/living/carbon/brain/update_status.dm +++ b/code/modules/mob/living/carbon/brain/update_status.dm @@ -3,12 +3,12 @@ return // if(health <= min_health) if(stat == DEAD) - if(container && health > config.health_threshold_dead) + if(container && health > HEALTH_THRESHOLD_DEAD) update_revive() create_debug_log("revived, trigger reason: [reason]") return else - if(!container || health <= config.health_threshold_dead) + if(!container || health <= HEALTH_THRESHOLD_DEAD && check_death_method()) // Considered "dead" without any external apparatus death() create_debug_log("died, trigger reason: [reason]") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index d72e5b6e2af..a8dbaa7ac2f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -72,7 +72,7 @@ if(prob(src.getBruteLoss() - 50)) for(var/atom/movable/A in stomach_contents) - A.loc = loc + A.forceMove(drop_location()) stomach_contents.Remove(A) src.gib() @@ -109,7 +109,7 @@ adjustBruteLoss(3) else if(T) - T.add_vomit_floor(src) + T.add_vomit_floor() nutrition -= lost_nutrition if(stun) adjustToxLoss(-3) @@ -134,43 +134,48 @@ M.forceMove(get_turf(src)) visible_message("[M] bursts out of [src]!") -/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, override = 0, tesla_shock = 0) +/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE) + SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage) if(status_flags & GODMODE) //godmode - return 0 + return FALSE if(NO_SHOCK in mutations) //shockproof - return 0 + return FALSE if(tesla_shock && tesla_ignore) return FALSE shock_damage *= siemens_coeff - if(shock_damage<1 && !override) - return 0 + if(dna && dna.species) + shock_damage *= dna.species.siemens_coeff + if(shock_damage < 1 && !override) + return FALSE if(reagents.has_reagent("teslium")) shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging! - take_overall_damage(0,shock_damage, TRUE, used_weapon = "Electrocution") - shock_internal_organs(shock_damage) + if(illusion) + adjustStaminaLoss(shock_damage) + else + take_overall_damage(0, shock_damage, TRUE, used_weapon = "Electrocution") + shock_internal_organs(shock_damage) visible_message( - "[src] was shocked by \the [source]!", \ - "You feel a powerful shock coursing through your body!", \ - "You hear a heavy electrical crack." \ - ) + "[src] was shocked by \the [source]!", + "You feel a powerful shock coursing through your body!", + "You hear a heavy electrical crack.") AdjustJitter(1000) //High numbers for violent convulsions do_jitter_animation(jitteriness) AdjustStuttering(2) - if(!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) + if((!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) && stun) Stun(2) spawn(20) AdjustJitter(-1000, bound_lower = 10) //Still jittery, but vastly less - if(!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) + if((!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) && stun) Stun(3) Weaken(3) if(shock_damage > 200) src.visible_message( - "[src] was arc flashed by the [source]!", \ - "The [source] arc flashes and electrocutes you!", \ - "You hear a lightning-like crack!" \ - ) + "[src] was arc flashed by the [source]!", + "The [source] arc flashes and electrocutes you!", + "You hear a lightning-like crack!") playsound(loc, 'sound/effects/eleczap.ogg', 50, 1, -1) - explosion(src.loc,-1,0,2,2) + explosion(loc, -1, 0, 2, 2) + if(override) return override else @@ -209,58 +214,9 @@ /mob/living/carbon/proc/help_shake_act(mob/living/carbon/M) add_attack_logs(M, src, "Shaked", ATKLOG_ALL) - if(health >= config.health_threshold_crit) + 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.", \ @@ -303,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() @@ -318,8 +326,8 @@ return var/extra_darkview = 0 - if(E.dark_view) - extra_darkview = max(E.dark_view - 2, 0) + if(E.see_in_dark) + extra_darkview = max(E.see_in_dark - 2, 0) extra_damage = extra_darkview var/light_amount = 10 // assume full brightness @@ -707,17 +715,18 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, return back if(slot_wear_mask) return wear_mask - if(slot_handcuffed) - return handcuffed - if(slot_legcuffed) - return legcuffed + if(slot_wear_suit) + return wear_suit if(slot_l_hand) return l_hand if(slot_r_hand) return r_hand + if(slot_handcuffed) + return handcuffed + if(slot_legcuffed) + return legcuffed return null - //generates realistic-ish pulse output based on preset levels /mob/living/carbon/proc/get_pulse(var/method) //method 0 is for hands, 1 is for machines, more accurate var/temp = 0 //see setup.dm:694 @@ -828,7 +837,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, to_chat(src, "You successfully remove [I].") if(I == handcuffed) - handcuffed.loc = loc + handcuffed.forceMove(drop_location()) handcuffed.dropped(src) handcuffed = null if(buckled && buckled.buckle_requires_restraints) @@ -836,7 +845,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, update_handcuffed() return if(I == legcuffed) - legcuffed.loc = loc + legcuffed.forceMove(drop_location()) legcuffed.dropped() legcuffed = null update_inv_legcuffed() @@ -930,7 +939,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(client) client.screen -= W if(W) - W.loc = loc + W.forceMove(drop_location()) W.dropped(src) if(W) W.layer = initial(W.layer) @@ -942,7 +951,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(client) client.screen -= W if(W) - W.loc = loc + W.forceMove(drop_location()) W.dropped(src) if(W) W.layer = initial(W.layer) @@ -966,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 @@ -1124,4 +1134,39 @@ so that different stomachs can handle things in different ways VB*/ /mob/living/carbon/proc/shock_internal_organs(intensity) for(var/obj/item/organ/O in internal_organs) - O.shock_organ(intensity) \ No newline at end of file + O.shock_organ(intensity) + +/mob/living/carbon/update_sight() + if(!client) + return + + if(stat == DEAD) + grant_death_vision() + return + + see_invisible = initial(see_invisible) + see_in_dark = initial(see_in_dark) + sight = initial(sight) + lighting_alpha = initial(lighting_alpha) + + for(var/obj/item/organ/internal/cyberimp/eyes/E in internal_organs) + sight |= E.vision_flags + if(E.see_in_dark) + see_in_dark = max(see_in_dark, E.see_in_dark) + if(E.see_invisible) + see_invisible = min(see_invisible, E.see_invisible) + if(!isnull(E.lighting_alpha)) + lighting_alpha = min(lighting_alpha, E.lighting_alpha) + + if(client.eye != src) + var/atom/A = client.eye + if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. + return + + if(XRAY in mutations) + sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index d4cafa847fd..7b8790076ce 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -14,11 +14,10 @@ return TRUE ..() -/mob/living/carbon/water_act(volume, temperature, source) +/mob/living/carbon/water_act(volume, temperature, source, method = TOUCH) + . = ..() if(volume > 10) //anything over 10 volume will make the mob wetter. wetlevel = min(wetlevel + 1,5) - ..() - /mob/living/carbon/attackby(obj/item/I, mob/user, params) if(lying && surgeries.len) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 5d816ed625e..4ecd81e1338 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -22,9 +22,8 @@ var/wetlevel = 0 //how wet the mob is - var/failed_last_breath = FALSE //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. var/co2overloadtime = null var/dreaming = 0 //How many dream images we have left to send var/nightmare = 0 - blood_volume = BLOOD_VOLUME_NORMAL + blood_volume = BLOOD_VOLUME_NORMAL \ No newline at end of file diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 473715367b4..c0dba9b77e5 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -4,22 +4,15 @@ if(!iscarbon(target)) //something is bypassing the give arguments, no clue what, adding a sanity check JIC to_chat(usr, "Wait a second... \the [target] HAS NO HANDS! AHH!")//cheesy messages ftw + return + if(target.incapacitated() || usr.incapacitated() || target.client == null) return - if(target.stat == 2 || usr.stat == 2|| target.client == null) - return - var/obj/item/I - if(!usr.hand && usr.r_hand == null) - to_chat(usr, " You don't have anything in your right hand to give to [target.name]") - return - if(usr.hand && usr.l_hand == null) - to_chat(usr, " You don't have anything in your left hand to give to [target.name]") - return - if(usr.hand) - I = usr.l_hand - else if(!usr.hand) - I = usr.r_hand + + var/obj/item/I = get_active_hand() + if(!I) + to_chat(usr, " You don't have anything in your hand to give to [target.name]") return if((I.flags & NODROP) || (I.flags & ABSTRACT)) to_chat(usr, "That's not exactly something you can give.") @@ -29,35 +22,30 @@ if("Yes") if(!I) return + if(target.incapacitated() || usr.incapacitated()) + return if(!Adjacent(target)) to_chat(usr, " You need to stay in reaching distance while giving an object.") to_chat(target, " [usr.name] moved too far away.") return - if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I)) + if((I.flags & NODROP) || (I.flags & ABSTRACT)) + to_chat(usr, "[I] stays stuck to your hand when you try to give it!") + to_chat(target, "[I] stays stuck to [usr.name]'s hand when you try to take it!") + return + if(I != get_active_hand()) to_chat(usr, " You need to keep the item in your active hand.") - to_chat(target, " [usr.name] seem to have given up on giving \the [I.name] to you.") + to_chat(target, " [usr.name] seem to have given up on giving [I] to you.") return if(target.r_hand != null && target.l_hand != null) to_chat(target, " Your hands are full.") to_chat(usr, " Their hands are full.") return - else - usr.drop_item() - if(target.r_hand == null) - target.r_hand = I - else - target.l_hand = I - I.loc = target - I.layer = 20 - I.plane = HUD_PLANE + usr.unEquip(I) + target.put_in_hands(I) I.add_fingerprint(target) - src.update_inv_l_hand() - src.update_inv_r_hand() - target.update_inv_l_hand() - target.update_inv_r_hand() - target.visible_message(" [usr.name] handed \the [I.name] to [target.name].") + target.visible_message(" [usr.name] handed [I] to [target.name].") I.on_give(usr, target) if("No") - target.visible_message(" [usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.") + target.visible_message(" [usr.name] tried to hand [I] to [target.name] but [target.name] didn't want it.") else to_chat(usr, " [target.name]'s hands are full.") diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 7259a455154..64d06dac4db 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -93,7 +93,7 @@ /mob/living/carbon/human/death(gibbed) if(can_die() && !gibbed && deathgasp_on_death) - emote("deathgasp") //let the world KNOW WE ARE DEAD + emote("deathgasp", force = TRUE) //let the world KNOW WE ARE DEAD // Only execute the below if we successfully died . = ..(gibbed) @@ -112,7 +112,7 @@ if(H.mind) H.mind.kills += "[key_name(src)]" - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) // log_world("k") sql_report_death(src) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 3e1c874a067..219ba9ca9eb 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null,var/force) +/mob/living/carbon/human/emote(act, m_type = 1, message = null, force) if((stat == DEAD) || (status_flags & FAKEDEATH)) return // No screaming bodies @@ -13,22 +13,22 @@ if(muzzled) var/obj/item/clothing/mask/muzzle/M = wear_mask if(M.mute == MUZZLE_MUTE_NONE) - muzzled = 0 //Not all muzzles block sound + muzzled = FALSE //Not all muzzles block sound if(!can_speak()) - muzzled = 1 + muzzled = TRUE //var/m_type = 1 for(var/obj/item/implant/I in src) if(I.implanted) - I.trigger(act, src) + I.trigger(act, src, force) - var/miming = 0 + var/miming = FALSE if(mind) miming = mind.miming //Emote Cooldown System (it's so simple!) - // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] - var/on_CD = 0 + //handle_emote_CD() located in [code\modules\mob\emote.dm] + var/on_CD = FALSE act = lowertext(act) switch(act) //Cooldown-inducing emotes @@ -61,16 +61,16 @@ else return if("squish", "squishes") - var/found_slime_bodypart = 0 + var/found_slime_bodypart = FALSE if(isslimeperson(src)) //Only Slime People can squish on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm' - found_slime_bodypart = 1 + found_slime_bodypart = TRUE else for(var/obj/item/organ/external/L in bodyparts) // if your limbs are squishy you can squish too! if(istype(L.dna.species, /datum/species/slime)) on_CD = handle_emote_CD() - found_slime_bodypart = 1 + found_slime_bodypart = TRUE break if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt @@ -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") @@ -118,9 +124,9 @@ on_CD = handle_emote_CD() //Everything else, including typos of the above emotes else - on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown + on_CD = FALSE //If it doesn't induce the cooldown, we won't check for the cooldown - if(on_CD == 1) // Check if we need to suppress the emote attempt. + if(!force && on_CD == 1) // Check if we need to suppress the emote attempt. return // Suppress emote, you're still cooling off. switch(act) @@ -206,9 +212,13 @@ if("hiss", "hisses") var/M = handle_emote_param(param) - message = "[src] hisses[M ? " at [M]" : ""]." - playsound(loc, 'sound/effects/unathihiss.ogg', 50, 0) //Credit to Jamius (freesound.org) for the sound. - m_type = 2 + if(!muzzled) + message = "[src] hisses[M ? " at [M]" : ""]." + playsound(loc, 'sound/effects/unathihiss.ogg', 50, 0) //Credit to Jamius (freesound.org) for the sound. + m_type = 2 + else + message = "[src] makes a weak hissing noise." + m_type = 2 if("quill", "quills") var/M = handle_emote_param(param) @@ -217,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) @@ -654,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 @@ -680,6 +697,14 @@ message = "[src] trembles." m_type = 1 + if("shudder", "shudders") + message = "[src] shudders." + m_type = 1 + + if("bshake", "bshakes") + message = "[src] shakes." + m_type = 1 + if("sneeze", "sneezes") if(miming) message = "[src] sneezes." @@ -892,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" @@ -919,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/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 03726353022..4aef44444e9 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -30,6 +30,7 @@ msg += "[name]" var/displayed_species = dna.species.name + var/examine_color = dna.species.flesh_color for(var/obj/item/clothing/C in src) //Disguise checks if(C == src.head || C == src.wear_suit || C == src.wear_mask || C == src.w_uniform || C == src.belt || C == src.back) if(C.species_disguise) @@ -37,11 +38,11 @@ if(skipjumpsuit && skipface || (NO_EXAMINE in dna.species.species_traits)) //either obscured or on the nospecies list msg += "!\n" //omit the species when examining else if(displayed_species == "Slime People") //snowflakey because Slime People are defined as a plural - msg += ", a slime person!\n" + msg += ", a slime person!\n" else if(displayed_species == "Unathi") //DAMN YOU, VOWELS - msg += ", a unathi!\n" + msg += ", a unathi!\n" else - msg += ", \a [lowertext(displayed_species)]!\n" + msg += ", a [lowertext(displayed_species)]!\n" //uniform if(w_uniform && !skipjumpsuit && !(w_uniform.flags & ABSTRACT)) @@ -315,15 +316,7 @@ msg += "[p_they(TRUE)] [p_have()] a stupid expression on [p_their()] face.\n" if(get_int_organ(/obj/item/organ/internal/brain)) - if(istype(src, /mob/living/carbon/human/interactive)) - var/mob/living/carbon/human/interactive/auto = src - if(auto.showexaminetext) - msg += "[p_they(TRUE)] [p_are()] appears to be some sort of sick automaton, [p_their()] eyes are glazed over and [p_their()] mouth is slightly agape.\n" - if(auto.debugexamine) - var/dodebug = auto.doing2string(auto.doing) - var/interestdebug = auto.interest2string(auto.interest) - msg += "[p_they(TRUE)] [p_are()] appears to be [interestdebug] and [dodebug].\n" - else if(dna.species.show_ssd) + if(dna.species.show_ssd) if(!key) msg += "[p_they(TRUE)] [p_are()] totally catatonic. The stresses of life in deep-space must have been too much for [p_them()]. Any recovery is unlikely.\n" else if(!client) @@ -345,41 +338,23 @@ msg += "[p_they(TRUE)] [p_are()] mostly dessicated now, with only bones remaining of what used to be a person.\n" if(hasHUD(user,"security")) - var/perpname = "wot" + var/perpname = get_visible_name(TRUE) var/criminal = "None" - if(wear_id) - var/obj/item/card/id/I = wear_id.GetID() - if(I) - perpname = I.registered_name - else - perpname = name - else - perpname = name - if(perpname) for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.security) if(R.fields["id"] == E.fields["id"]) criminal = R.fields["criminal"] - var/criminal_status = hasHUD(user, "read_only_security") ? "\[[criminal]\]" : "\[[criminal]\]" + var/criminal_status = hasHUD(user, "read_only_security") ? "\[[criminal]\]" : "\[[criminal]\]" msg += "Criminal status: [criminal_status]\n" msg += "Security records: \[View\] \[Add comment\]\n" if(hasHUD(user,"medical")) - var/perpname = "wot" + var/perpname = get_visible_name(TRUE) var/medical = "None" - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name - for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.general) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5550378984a..c0e4d8570a1 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") @@ -198,12 +196,6 @@ stat("Total Blood", "[mind.vampire.bloodtotal]") stat("Usable Blood", "[mind.vampire.bloodusable]") - if(mind.nation) - stat("Nation Name", "[mind.nation.current_name ? "[mind.nation.current_name]" : "[mind.nation.default_name]"]") - stat("Nation Leader", "[mind.nation.current_leader ? "[mind.nation.current_leader]" : "None"]") - stat("Nation Heir", "[mind.nation.heir ? "[mind.nation.heir]" : "None"]") - - if(istype(loc, /obj/spacepod)) // Spacdpods! var/obj/spacepod/S = loc stat("Spacepod Charge", "[istype(S.battery) ? "[(S.battery.charge / S.battery.maxcharge) * 100]" : "No cell detected"]") @@ -420,8 +412,22 @@ if(has_breathable_mask && istype(belt, /obj/item/tank)) dat += " [internal ? "Disable Internals" : "Set Internals"]" dat += "
 ↳Pockets:[(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "Left (Empty)"]" - dat += " [(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "Right (Empty)"]
 ↳Pockets:" + if(l_store && internal && l_store == internal) + dat += "[l_store]" + else if(l_store && !(l_store.flags&ABSTRACT)) + dat += "Left (Full)" + else + dat += "Left (Empty)" + dat += " " + if(r_store && internal && r_store == internal) + dat += "[r_store]" + else if(r_store && !(r_store.flags&ABSTRACT)) + dat += "Right (Full)" + else + dat += "Right (Empty)" + dat += "
 ↳ID:[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Empty"]
 ↳PDA:[(wear_pda && !(wear_pda.flags&ABSTRACT)) ? wear_pda : "Empty"]
" - for(var/mob/living/simple_animal/bot/Bot in GLOB.simple_animal_list) + 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 += "" @@ -1076,7 +1074,7 @@ var/list/ai_verbs_default = list( set desc = "Change the message that's transmitted when a new crew member arrives on station." set category = "AI Commands" - var/newmsg = input("What would you like the arrival message to be? List of options: $name, $rank, $species, $gender, $age", "Change Arrival Message", arrivalmsg) as text + var/newmsg = clean_input("What would you like the arrival message to be? List of options: $name, $rank, $species, $gender, $age", "Change Arrival Message", arrivalmsg) if(newmsg != arrivalmsg) arrivalmsg = newmsg to_chat(usr, "The arrival message has been successfully changed.") @@ -1113,7 +1111,7 @@ var/list/ai_verbs_default = list( user.visible_message("\The [user] decides not to unbolt \the [src].") return user.visible_message("\The [user] finishes unfastening \the [src]!") - anchored = 0 + anchored = FALSE return else user.visible_message("\The [user] starts to bolt \the [src] to the plating...") @@ -1121,7 +1119,7 @@ var/list/ai_verbs_default = list( user.visible_message("\The [user] decides not to bolt \the [src].") return user.visible_message("\The [user] finishes fastening down \the [src]!") - anchored = 1 + anchored = TRUE return else return ..() @@ -1292,4 +1290,27 @@ var/list/ai_verbs_default = list( return FALSE /mob/living/silicon/ai/ExtinguishMob() - return \ No newline at end of file + return + + +/mob/living/silicon/ai/update_sight() + if(!client) + return + + if(stat == DEAD) + grant_death_vision() + return + + see_invisible = initial(see_invisible) + see_in_dark = initial(see_in_dark) + sight = initial(sight) + lighting_alpha = initial(lighting_alpha) + + if(aiRestorePowerRoutine) + sight = sight &~ SEE_TURFS + sight = sight &~ SEE_MOBS + sight = sight &~ SEE_OBJS + see_in_dark = 0 + + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 6d32c24bb0a..c8ffebc6647 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -1,5 +1,5 @@ /mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M) - if(!ticker) + if(!SSticker) to_chat(M, "You cannot attack people before the game has started.") return ..() diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 2771725a96d..290a3c64e6e 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -101,7 +101,7 @@ var/datum/cameranet/cameranet = new() /datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) - if(!ticker || (opacity_check && !A.opacity)) + if(!SSticker || (opacity_check && !A.opacity)) return majorChunkChange(A, 2) @@ -184,7 +184,7 @@ var/datum/cameranet/cameranet = new() /* /datum/cameranet/proc/stat_entry() if(!statclick) - statclick = new/obj/effect/statclick/debug("Initializing...", src) + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) stat(name, statclick.update("Cameras: [cameranet.cameras.len] | Chunks: [cameranet.chunks.len]")) */ diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index ec2fd378ed5..4b124c364c2 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -116,7 +116,8 @@ var/turf/t = turf if(obscuredTurfs[t]) if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, null, 15) + t.obscured = image('icons/effects/cameravis.dmi', t, null, BYOND_LIGHTING_LAYER + 0.1) + t.obscured.plane = BYOND_LIGHTING_PLANE + 1 obscured += t.obscured for(var/eye in seenby) @@ -169,7 +170,8 @@ for(var/turf in obscuredTurfs) var/turf/t = turf if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15) + t.obscured = image('icons/effects/cameravis.dmi', t, "black", BYOND_LIGHTING_LAYER + 0.1) + t.obscured.plane = BYOND_LIGHTING_PLANE + 1 obscured += t.obscured -#undef UPDATE_BUFFER \ No newline at end of file +#undef UPDATE_BUFFER diff --git a/code/modules/mob/living/silicon/ai/latejoin.dm b/code/modules/mob/living/silicon/ai/latejoin.dm index c364c8d21b9..513b26ee558 100644 --- a/code/modules/mob/living/silicon/ai/latejoin.dm +++ b/code/modules/mob/living/silicon/ai/latejoin.dm @@ -27,14 +27,14 @@ var/global/list/empty_playable_ai_cores = list() //Handle job slot/tater cleanup. var/job = mind.assigned_role - job_master.FreeRole(job) + SSjobs.FreeRole(job) if(mind.objectives.len) mind.objectives.Cut() mind.special_role = null else - if(ticker.mode.name == "AutoTraitor") - var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode + if(SSticker.mode.name == "AutoTraitor") + var/datum/game_mode/traitor/autotraitor/current_mode = SSticker.mode current_mode.possible_traitors.Remove(src) // Ghost the current player and disallow them to return to the body diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 3700f83f0a9..06043025f7c 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -133,9 +133,6 @@ process_queued_alarms() - if(get_nations_mode()) - process_nations_ai() - /mob/living/silicon/ai/updatehealth(reason = "none given") if(status_flags & GODMODE) health = 100 @@ -155,22 +152,3 @@ /mob/living/silicon/ai/rejuvenate() ..() add_ai_verbs(src) - -/mob/living/silicon/ai/proc/process_nations_ai() - if(client) - var/client/C = client - for(var/mob/living/carbon/human/H in view(eyeobj, 14)) - C.images += H.hud_list[NATIONS_HUD] - -/mob/living/silicon/ai/update_sight() - see_invisible = initial(see_invisible) - see_in_dark = initial(see_in_dark) - sight = initial(sight) - if(aiRestorePowerRoutine) - sight = sight&~SEE_TURFS - sight = sight&~SEE_MOBS - sight = sight&~SEE_OBJS - see_in_dark = 0 - - if(see_override) - see_invisible = see_override diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index e44ba0741be..36f248cd2c2 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -99,7 +99,7 @@ var/const/VOX_PATH = "sound/vox_fem/" to_chat(src, "Please wait [round((announcing_vox - world.time) / 10)] seconds.") return - var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", last_announcement) as text|null + var/message = clean_input("WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", last_announcement, src) last_announcement = message diff --git a/code/modules/mob/living/silicon/ai/update_status.dm b/code/modules/mob/living/silicon/ai/update_status.dm index 18a35534db8..fd001956c67 100644 --- a/code/modules/mob/living/silicon/ai/update_status.dm +++ b/code/modules/mob/living/silicon/ai/update_status.dm @@ -2,7 +2,7 @@ if(status_flags & GODMODE) return if(stat != DEAD) - if(health <= config.health_threshold_dead) + if(health <= HEALTH_THRESHOLD_DEAD && check_death_method()) death() create_debug_log("died of damage, trigger reason: [reason]") return diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 2f662169551..63b206debba 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -42,3 +42,9 @@ animation.icon = 'icons/mob/mob.dmi' animation.master = src QDEL_IN(animation, 15) + +/mob/living/silicon/death(gibbed) + . = ..() + if(!gibbed) + if(death_sound) + playsound(get_turf(src), death_sound, 200, 1) diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm index 3385c4ce622..1b1ee4f7f48 100644 --- a/code/modules/mob/living/silicon/emote.dm +++ b/code/modules/mob/living/silicon/emote.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/emote(var/act, var/m_type=1, var/message = null) +/mob/living/silicon/emote(act, m_type=1, message = null, force) var/param = null if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) @@ -6,7 +6,7 @@ act = copytext(act, 1, t1) //Emote Cooldown System (it's so simple!) - // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] + //handle_emote_CD() located in [code\modules\mob\emote.dm] var/on_CD = 0 act = lowertext(act) switch(act) @@ -20,7 +20,7 @@ else on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown - if(on_CD == 1) // Check if we need to suppress the emote attempt. + if(!force && on_CD == 1) // Check if we need to suppress the emote attempt. return // Suppress emote, you're still cooling off. //--FalseIncarnate @@ -78,4 +78,4 @@ if("help") to_chat(src, "yes, no, beep, ping, buzz, scream, buzz2") - ..(act, m_type, message) + ..() diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 01240adf942..4892441b804 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -1,12 +1,12 @@ /mob/living/silicon/Login() SetSleeping(0) - if(mind && ticker && ticker.mode) - ticker.mode.remove_revolutionary(mind, 1) - ticker.mode.remove_cultist(mind, 1) - ticker.mode.remove_wizard(mind) - ticker.mode.remove_changeling(mind) - ticker.mode.remove_vampire(mind) - ticker.mode.remove_thrall(mind, 0) - ticker.mode.remove_shadowling(mind) - ticker.mode.remove_abductor(mind) - ..() + if(mind && SSticker && SSticker.mode) + SSticker.mode.remove_revolutionary(mind, 1) + SSticker.mode.remove_cultist(mind, 1) + SSticker.mode.remove_wizard(mind) + SSticker.mode.remove_changeling(mind) + SSticker.mode.remove_vampire(mind) + SSticker.mode.remove_thrall(mind, 0) + SSticker.mode.remove_shadowling(mind) + SSticker.mode.remove_abductor(mind) + ..() diff --git a/code/modules/mob/living/silicon/pai/emote.dm b/code/modules/mob/living/silicon/pai/emote.dm deleted file mode 100644 index a418c0972d5..00000000000 --- a/code/modules/mob/living/silicon/pai/emote.dm +++ /dev/null @@ -1,2 +0,0 @@ -/mob/living/silicon/pai/emote(var/act, var/m_type=1, var/message = null) - ..(act, m_type, message) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index fec27db5df8..b2828070ad3 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -28,7 +28,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates if(candidate) if(!istype(candidate)) - message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate is not a pAI)") + message_admins("Warning: possible href exploit by [key_name_admin(usr)] (paiController/Topic, candidate is not a pAI)") log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate is not a pAI)") return @@ -50,18 +50,12 @@ var/datum/paiController/paiController // Global handler for pAI candidates card.setPersonality(pai) card.looking_for_personality = 0 - ticker.mode.update_cult_icons_removed(card.pai.mind) - ticker.mode.update_rev_icons_removed(card.pai.mind) + SSticker.mode.update_cult_icons_removed(card.pai.mind) + SSticker.mode.update_rev_icons_removed(card.pai.mind) pai_candidates -= candidate usr << browse(null, "window=findPai") - - - if(candidate) - if(candidate.key && usr.key && candidate.key != usr.key) - message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)") - log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)") - return + return if("signup" in href_list) var/mob/dead/observer/O = locate(href_list["signup"]) @@ -75,6 +69,11 @@ var/datum/paiController/paiController // Global handler for pAI candidates recruitWindow(O) return + if(candidate) + if(candidate.key && usr.key && candidate.key != usr.key) + message_admins("Warning: possible href exploit by [key_name_admin(usr)] (paiController/Topic, candidate and usr have different keys)") + log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr have different keys)") + return if(href_list["new"]) var/option = href_list["option"] diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 90af0fba3c4..84c467b1549 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -619,12 +619,14 @@ /datum/pai_software/flashlight/toggle(mob/living/silicon/pai/user) var/atom/movable/actual_location = istype(user.loc, /obj/item/paicard) ? user.loc : user - if(user.flashlight_on) + if(!user.flashlight_on) actual_location.set_light(2) user.card.set_light(2) - return - actual_location.set_light(2) - user.card.set_light(0) + else + actual_location.set_light(0) + user.card.set_light(0) + + user.flashlight_on = !user.flashlight_on /datum/pai_software/flashlight/is_active(mob/living/silicon/pai/user) return user.flashlight_on diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index d81b76e2e76..d584d5a50f5 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -22,8 +22,11 @@ /datum/robot_component/proc/install() go_online() + owner.updatehealth("component '[src]' installed") + /datum/robot_component/proc/uninstall() go_offline() + owner.updatehealth("component '[src]' removed") /datum/robot_component/proc/destroy() if(wrapped) @@ -102,12 +105,6 @@ external_type = /obj/item/robot_parts/robot_component/actuator max_damage = 50 -/datum/robot_component/actuator/go_online() - owner.update_stat() - -/datum/robot_component/actuator/go_offline() - owner.update_stat() - /datum/robot_component/cell name = "power cell" max_damage = 50 @@ -115,12 +112,6 @@ /datum/robot_component/cell/is_powered() return ..() && owner.cell -/datum/robot_component/cell/go_online() - owner.update_stat() - -/datum/robot_component/cell/go_offline() - owner.update_stat() - /datum/robot_component/cell/destroy() ..() owner.cell = null @@ -264,19 +255,25 @@ if(M.timeofdeath && M.stat == DEAD) to_chat(user, "Time of Disable: [station_time_timestamp("hh:mm:ss", M.timeofdeath)]") var/mob/living/silicon/robot/H = M - var/list/damaged = H.get_damaged_components(1,1,1) + var/list/damaged = H.get_damaged_components(TRUE, TRUE, TRUE) // Get all except the missing ones + var/list/missing = H.get_missing_components() to_chat(user, "Localized Damage:") - if(length(damaged)>0) - for(var/datum/robot_component/org in damaged) - user.show_message(text("\t []: [][] - [] - [] - []", \ - capitalize(org.name), \ - (org.installed == -1) ? "DESTROYED " :"",\ - (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \ - (org.brute_damage > 0) ? "[org.brute_damage]" :0, \ - (org.toggled) ? "Toggled ON" : "Toggled OFF",\ - (org.powered) ? "Power ON" : "Power OFF"),1) - else + if(!LAZYLEN(damaged) && !LAZYLEN(missing)) to_chat(user, "\t Components are OK.") + else + if(LAZYLEN(damaged)) + for(var/datum/robot_component/org in damaged) + user.show_message(text("\t []: [][] - [] - [] - []", \ + capitalize(org.name), \ + (org.installed == -1) ? "DESTROYED " :"",\ + (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \ + (org.brute_damage > 0) ? "[org.brute_damage]" :0, \ + (org.toggled) ? "Toggled ON" : "Toggled OFF",\ + (org.powered) ? "Power ON" : "Power OFF"),1) + if(LAZYLEN(missing)) + for(var/datum/robot_component/org in missing) + user.show_message("\t [capitalize(org.name)]: MISSING") + if(H.emagged && prob(5)) to_chat(user, "\t ERROR: INTERNAL SYSTEMS COMPROMISED") @@ -287,22 +284,22 @@ to_chat(user, "External prosthetics:") var/organ_found - if(H.internal_organs.len) + if(LAZYLEN(H.internal_organs)) for(var/obj/item/organ/external/E in H.bodyparts) if(!E.is_robotic()) continue - organ_found = 1 + organ_found = TRUE to_chat(user, "[E.name]: [E.brute_dam] [E.burn_dam]") if(!organ_found) to_chat(user, "No prosthetics located.") to_chat(user, "
") to_chat(user, "Internal prosthetics:") organ_found = null - if(H.internal_organs.len) + if(LAZYLEN(H.internal_organs)) for(var/obj/item/organ/internal/O in H.internal_organs) if(!O.is_robotic()) continue - organ_found = 1 + organ_found = TRUE to_chat(user, "[capitalize(O.name)]: [O.damage]") if(!organ_found) to_chat(user, "No prosthetics located.") diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 21a09eed8a8..7402c4a65c9 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -50,7 +50,7 @@ /mob/living/silicon/robot/death(gibbed) if(can_die()) if(!gibbed && deathgasp_on_death) - emote("deathgasp") + emote("deathgasp", force = TRUE) if(module) module.handle_death(gibbed) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 80014c44f8b..3985bfce50e 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -182,7 +182,7 @@ to_chat(user, "You swipe the sequencer across [src]'s interface and watch its eyes flicker.") if(jobban_isbanned(src, ROLE_SYNDICATE)) - ticker.mode.replace_jobbanned_player(src, ROLE_SYNDICATE) + SSticker.mode.replace_jobbanned_player(src, ROLE_SYNDICATE) to_chat(src, "You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script. You sense you have five minutes before the drone server detects this and automatically shuts you down.") @@ -248,9 +248,9 @@ death() /mob/living/silicon/robot/drone/proc/full_law_reset() - clear_supplied_laws() - clear_inherent_laws() - clear_ion_laws() + clear_supplied_laws(TRUE) + clear_inherent_laws(TRUE) + clear_ion_laws(TRUE) laws = new /datum/ai_laws/drone //Reboot procs. diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 9bf388fe5fe..35bbad68b6a 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -27,7 +27,7 @@ /obj/machinery/drone_fabricator/process() - if(ticker.current_state < GAME_STATE_PLAYING) + if(SSticker.current_state < GAME_STATE_PLAYING) return if(stat & NOPOWER || !produce_drones) @@ -98,7 +98,7 @@ to_chat(usr, "You are banned from playing drones and cannot spawn as a drone.") return - if(!ticker || ticker.current_state < 3) + if(!SSticker || SSticker.current_state < 3) to_chat(src, "You can't join as a drone before the game starts!") return diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 9c130780d81..bec1e1ae668 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/robot/emote(var/act, var/m_type=1, var/message = null) +/mob/living/silicon/robot/emote(act, m_type=1, message = null, force) var/param = null if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) @@ -6,7 +6,7 @@ act = copytext(act, 1, t1) //Emote Cooldown System (it's so simple!) - //proc/handle_emote_CD() located in [code\modules\mob\emote.dm] + //handle_emote_CD() located in [code\modules\mob\emote.dm] var/on_CD = 0 act = lowertext(act) switch(act) @@ -17,7 +17,7 @@ else on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown - if(on_CD == 1) // Check if we need to suppress the emote attempt. + if(!force && on_CD == 1) // Check if we need to suppress the emote attempt. return // Suppress emote, you're still cooling off. //--FalseIncarnate @@ -160,7 +160,7 @@ if("help") to_chat(src, "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitches, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look,\n law, halt") - ..(act, m_type, message) + ..() /mob/living/silicon/robot/verb/powerwarn() set category = "Robot Commands" diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 8eb8bb80763..7695145300e 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -55,24 +55,24 @@ if(!module_state_1) O.mouse_opacity = initial(O.mouse_opacity) module_state_1 = O - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE O.screen_loc = inv1.screen_loc contents += O set_actions(O) else if(!module_state_2) O.mouse_opacity = initial(O.mouse_opacity) module_state_2 = O - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE O.screen_loc = inv2.screen_loc contents += O set_actions(O) else if(!module_state_3) O.mouse_opacity = initial(O.mouse_opacity) module_state_3 = O - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE O.screen_loc = inv3.screen_loc contents += O set_actions(O) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 5f37177f674..bf09191ecf2 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -88,40 +88,6 @@ return 1 -/mob/living/silicon/robot/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - return - - see_invisible = initial(see_invisible) - see_in_dark = initial(see_in_dark) - sight = initial(sight) - - if(client.eye != src) - var/atom/A = client.eye - if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. - return - - if(sight_mode & BORGMESON) - sight |= SEE_TURFS - see_invisible = min(see_invisible, SEE_INVISIBLE_MINIMUM) - see_in_dark = 1 - - if(sight_mode & BORGXRAY) - sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) - see_invisible = SEE_INVISIBLE_LIVING - see_in_dark = 8 - - if(sight_mode & BORGTHERM) - sight |= SEE_MOBS - see_invisible = min(see_invisible, SEE_INVISIBLE_LIVING) - see_in_dark = 8 - - if(see_override) - see_invisible = see_override - /mob/living/silicon/robot/handle_hud_icons() update_items() update_cell() diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index 2dd61d9a2ce..cf55cdd5f91 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -1,6 +1,4 @@ /mob/living/silicon/robot/Login() ..() - if(client) - client.hotkeytype = "Cyborg" regenerate_icons() show_laws(0) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 05e3e0b16af..b9ed81f7180 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -93,7 +93,7 @@ var/list/robot_verbs_default = list( var/updating = 0 //portable camera camerachunk update - hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, NATIONS_HUD) + hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD) var/magpulse = 0 var/ionpulse = 0 // Jetpack-like effect. @@ -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) @@ -114,7 +117,9 @@ var/list/robot_verbs_default = list( robot_modules_background = new() robot_modules_background.icon_state = "block" - robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it. + robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer 20, UI should be just below it. + robot_modules_background.plane = HUD_PLANE + ident = rand(1, 999) rename_character(null, get_default_name()) update_icons() @@ -157,6 +162,7 @@ var/list/robot_verbs_default = list( var/datum/robot_component/cell_component = components["power cell"] cell_component.wrapped = cell cell_component.installed = 1 + cell_component.install() diag_hud_set_borgcell() scanner = new(src) @@ -286,12 +292,8 @@ var/list/robot_verbs_default = list( if(islist(force_modules) && force_modules.len) modules = force_modules.Copy() if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis) - to_chat(src, "Crisis mode active. Combat module available.") + to_chat(src, "Crisis mode active. The combat module is now available.") modules += "Combat" - if(ticker && ticker.mode && ticker.mode.name == "nations") - var/datum/game_mode/nations/N = ticker.mode - if(N.kickoff) - modules = list("Nations") if(mmi != null && mmi.alien) modules = list("Hunter") modtype = input("Please, select a module!", "Robot", null, null) as null|anything in modules @@ -390,11 +392,6 @@ var/list/robot_verbs_default = list( module.channels = list("Security" = 1) icon_state = "droidcombat" - if("Nations") - module = new /obj/item/robot_module/nations(src) - module.channels = list() - icon_state = "droidpeace" - if("Hunter") module = new /obj/item/robot_module/alien/hunter(src) icon_state = "xenoborg-state-a" @@ -415,7 +412,7 @@ var/list/robot_verbs_default = list( feedback_inc("cyborg_[lowertext(modtype)]",1) rename_character(real_name, get_default_name()) - if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Nations") + if(modtype == "Medical" || modtype == "Security" || modtype == "Combat") status_flags &= ~CANPUSH choose_icon(6,module_sprites) @@ -423,6 +420,31 @@ var/list/robot_verbs_default = list( radio.config(module.channels) notify_ai(2) +/mob/living/silicon/robot/proc/reset_module() + notify_ai(2) + + uneq_all() + sight_mode = null + hands.icon_state = "nomod" + icon_state = "robot" + module.remove_subsystems_and_actions(src) + QDEL_NULL(module) + + camera.network.Remove(list("Engineering", "Medical", "Mining Outpost")) + rename_character(real_name, get_default_name("Default")) + languages = list() + speech_synthesizer_langs = list() + + update_icons() + update_headlamp() + + speed = 0 // Remove upgrades. + ionpulse = FALSE + magpulse = FALSE + add_language("Robot Talk", 1) + + status_flags |= CANPUSH + //for borg hotkeys, here module refers to borg inv slot, not core module /mob/living/silicon/robot/verb/cmd_toggle_module(module as num) set name = "Toggle Module" @@ -447,8 +469,10 @@ var/list/robot_verbs_default = list( var/dat = "[src.name] Self-Diagnosis Report\n" for(var/V in components) var/datum/robot_component/C = components[V] - dat += "[C.name]

Name

Status

Location

Control

[Bot.hacked ? "(!) [Bot.name]" : Bot.name] ([Bot.model])
Brute Damage:[C.brute_damage]
Electronics Damage:[C.electronics_damage]
Powered:[C.is_powered() ? "Yes" : "No"]
Toggled:[ C.toggled ? "Yes" : "No"]

" - + if(C.installed == 0) + dat += "[C.name]
MISSING
" + else + dat += "[C.name][C.installed == -1 ? "
DESTROYED" : ""]
Brute Damage:[C.brute_damage]
Electronics Damage:[C.electronics_damage]
Powered:[C.is_powered() ? "Yes" : "No"]
Toggled:[ C.toggled ? "Yes" : "No"]

" return dat /mob/living/silicon/robot/verb/self_diagnosis_verb() @@ -552,6 +576,8 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/restrained() return 0 +/mob/living/silicon/robot/InCritical() + return low_power_mode /mob/living/silicon/robot/ex_act(severity) switch(severity) @@ -600,6 +626,9 @@ var/list/robot_verbs_default = list( if(!getBruteLoss()) to_chat(user, "Nothing to fix!") return + else if(!getBruteLoss(TRUE)) + to_chat(user, "The damaged components are beyond saving!") + return var/obj/item/weldingtool/WT = W user.changeNext_move(CLICK_CD_MELEE) if(WT.remove_fuel(0)) @@ -612,11 +641,14 @@ var/list/robot_verbs_default = list( return - else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone))) + else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src, /mob/living/silicon/robot/drone))) user.changeNext_move(CLICK_CD_MELEE) if(!getFireLoss()) to_chat(user, "Nothing to fix!") return + else if(!getFireLoss(TRUE)) + to_chat(user, "The damaged components are beyond saving!") + return var/obj/item/stack/cable_coil/coil = W adjustFireLoss(-30) updatehealth() @@ -663,10 +695,10 @@ var/list/robot_verbs_default = list( I.burn = C.electronics_damage I.loc = src.loc - - if(C.installed == 1) - C.uninstall() + var/was_installed = C.installed C.installed = 0 + if(was_installed == 1) + C.uninstall() else if(locked) @@ -891,7 +923,7 @@ var/list/robot_verbs_default = list( else overlays += "[panelprefix]-openpanel -c" - var/combat = list("Combat","Nations") + var/combat = list("Combat") if(modtype in combat) if(base_icon == "") base_icon = icon_state @@ -1349,31 +1381,13 @@ var/list/robot_verbs_default = list( mind.special_role = SPECIAL_ROLE_ERT if(cyborg_unlock) crisis = 1 - if(!(mind in ticker.minds)) - ticker.minds += mind - ticker.mode.ert += mind + if(!(mind in SSticker.minds)) + SSticker.minds += mind + SSticker.mode.ert += mind /mob/living/silicon/robot/ert/gamma crisis = 1 -/mob/living/silicon/robot/nations - base_icon = "droidpeace" - icon_state = "droidpeace" - modtype = "Nations" - designation = "Nations" - -/mob/living/silicon/robot/nations/init() - ..() - module = new /obj/item/robot_module/nations(src) - //languages - module.add_languages(src) - //subsystems - module.add_subsystems_and_actions(src) - - status_flags &= ~CANPUSH - - notify_ai(2) - /mob/living/silicon/robot/emp_act(severity) ..() switch(severity) @@ -1389,7 +1403,7 @@ var/list/robot_verbs_default = list( ..() var/brute = 1000 var/burn = 1000 - var/list/datum/robot_component/borked_parts = get_damaged_components(brute,burn,1) + var/list/datum/robot_component/borked_parts = get_damaged_components(TRUE, TRUE, TRUE, TRUE) for(var/datum/robot_component/borked_part in borked_parts) brute = borked_part.brute_damage burn = borked_part.electronics_damage @@ -1410,3 +1424,38 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/check_ear_prot() return ear_protection + +/mob/living/silicon/robot/update_sight() + if(!client) + return + + if(stat == DEAD) + grant_death_vision() + return + + see_invisible = initial(see_invisible) + see_in_dark = initial(see_in_dark) + sight = initial(sight) + lighting_alpha = initial(lighting_alpha) + + if(client.eye != src) + var/atom/A = client.eye + if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. + return + + if(sight_mode & BORGMESON) + sight |= SEE_TURFS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + + if(sight_mode & BORGXRAY) + sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + see_invisible = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + see_in_dark = 8 + + if(sight_mode & BORGTHERM) + sight |= SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() + diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index e2a93fa0167..81700464ac0 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -8,18 +8,20 @@ handle_hud_icons_health() diag_hud_set_health() -/mob/living/silicon/robot/getBruteLoss() +/mob/living/silicon/robot/getBruteLoss(repairable_only = FALSE) var/amount = 0 for(var/V in components) var/datum/robot_component/C = components[V] - if(C.installed != 0) amount += C.brute_damage + if(C.installed != 0 && (!repairable_only || C.installed != -1)) // Installed ones only and if repair only remove the borked ones + amount += C.brute_damage return amount -/mob/living/silicon/robot/getFireLoss() +/mob/living/silicon/robot/getFireLoss(repairable_only = FALSE) var/amount = 0 for(var/V in components) var/datum/robot_component/C = components[V] - if(C.installed != 0) amount += C.electronics_damage + if(C.installed != 0 && (!repairable_only || C.installed != -1)) // Installed ones only and if repair only remove the borked ones + amount += C.electronics_damage return amount /mob/living/silicon/robot/adjustBruteLoss(amount, updating_health = TRUE) @@ -36,11 +38,19 @@ heal_overall_damage(0, -amount, updating_health) return STATUS_UPDATE_HEALTH -/mob/living/silicon/robot/proc/get_damaged_components(var/brute, var/burn, var/get_all) +/mob/living/silicon/robot/proc/get_damaged_components(get_brute, get_burn, get_borked = FALSE, get_missing = FALSE) var/list/datum/robot_component/parts = list() for(var/V in components) var/datum/robot_component/C = components[V] - if(C.installed == 1 || get_all) if((brute && C.brute_damage) || (burn && C.electronics_damage)) + if((C.installed == 1 || (get_borked && C.installed == -1) || (get_missing && C.installed == 0)) && ((get_brute && C.brute_damage) || (get_burn && C.electronics_damage))) + parts += C + return parts + +/mob/living/silicon/robot/proc/get_missing_components() + var/list/datum/robot_component/parts = list() + for(var/V in components) + var/datum/robot_component/C = components[V] + if(C.installed == 0) parts += C return parts @@ -48,41 +58,43 @@ var/list/rval = new for(var/V in components) var/datum/robot_component/C = components[V] - if(C.installed == 1) rval += C + if(C.installed == 1) + rval += C return rval /mob/living/silicon/robot/proc/get_armour() - - if(!components.len) return 0 + if(!LAZYLEN(components)) + return 0 var/datum/robot_component/C = components["armour"] if(C && C.installed == 1) return C return 0 /mob/living/silicon/robot/heal_organ_damage(brute, burn, updating_health = TRUE) - var/list/datum/robot_component/parts = get_damaged_components(brute,burn) - if(!parts.len) return + var/list/datum/robot_component/parts = get_damaged_components(brute, burn) + if(!LAZYLEN(parts)) + return var/datum/robot_component/picked = pick(parts) - picked.heal_damage(brute,burn, updating_health) + picked.heal_damage(brute, burn, updating_health) /mob/living/silicon/robot/take_organ_damage(brute = 0, burn = 0, updating_health = TRUE, sharp = 0, edge = 0) var/list/components = get_damageable_components() - if(!components.len) + if(!LAZYLEN(components)) return //Combat shielding absorbs a percentage of damage directly into the cell. var/obj/item/borg/combat/shield/shield - if(module_state_1 && istype(module_state_1,/obj/item/borg/combat/shield)) + if(module_state_1 && istype(module_state_1, /obj/item/borg/combat/shield)) shield = module_state_1 - else if(module_state_2 && istype(module_state_2,/obj/item/borg/combat/shield)) + else if(module_state_2 && istype(module_state_2, /obj/item/borg/combat/shield)) shield = module_state_2 - else if(module_state_3 && istype(module_state_3,/obj/item/borg/combat/shield)) + else if(module_state_3 && istype(module_state_3, /obj/item/borg/combat/shield)) shield = module_state_3 if(shield) //Shields absorb a certain percentage of damage based on their power setting. - var/absorb_brute = brute*shield.shield_level - var/absorb_burn = burn*shield.shield_level - var/cost = (absorb_brute+absorb_burn)*100 + var/absorb_brute = brute * shield.shield_level + var/absorb_burn = burn * shield.shield_level + var/cost = (absorb_brute+absorb_burn) * 100 cell.charge -= cost if(cell.charge <= 0) @@ -102,9 +114,9 @@ C.take_damage(brute, burn, sharp, updating_health) /mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn, updating_health = TRUE) - var/list/datum/robot_component/parts = get_damaged_components(brute,burn) + var/list/datum/robot_component/parts = get_damaged_components(brute, burn) - while(parts.len && (brute>0 || burn>0) ) + while(LAZYLEN(parts) && (brute > 0 || burn > 0) ) var/datum/robot_component/picked = pick(parts) var/brute_was = picked.brute_damage @@ -112,8 +124,8 @@ picked.heal_damage(brute,burn, updating_health) - brute -= (brute_was-picked.brute_damage) - burn -= (burn_was-picked.electronics_damage) + brute -= (brute_was - picked.brute_damage) + burn -= (burn_was - picked.electronics_damage) parts -= picked @@ -126,17 +138,17 @@ //Combat shielding absorbs a percentage of damage directly into the cell. var/obj/item/borg/combat/shield/shield - if(module_state_1 && istype(module_state_1,/obj/item/borg/combat/shield)) + if(module_state_1 && istype(module_state_1, /obj/item/borg/combat/shield)) shield = module_state_1 - else if(module_state_2 && istype(module_state_2,/obj/item/borg/combat/shield)) + else if(module_state_2 && istype(module_state_2, /obj/item/borg/combat/shield)) shield = module_state_2 - else if(module_state_3 && istype(module_state_3,/obj/item/borg/combat/shield)) + else if(module_state_3 && istype(module_state_3, /obj/item/borg/combat/shield)) shield = module_state_3 if(shield) //Shields absorb a certain percentage of damage based on their power setting. - var/absorb_brute = brute*shield.shield_level - var/absorb_burn = burn*shield.shield_level - var/cost = (absorb_brute+absorb_burn)*100 + var/absorb_brute = brute * shield.shield_level + var/absorb_burn = burn * shield.shield_level + var/cost = (absorb_brute+absorb_burn) * 100 cell.charge -= cost if(cell.charge <= 0) @@ -152,7 +164,7 @@ A.take_damage(brute, burn, sharp) return - while(parts.len && (brute>0 || burn>0) ) + while(LAZYLEN(parts) && (brute > 0 || burn > 0) ) var/datum/robot_component/picked = pick(parts) var/brute_was = picked.brute_damage diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 161b81e3cd2..85cc2ad5786 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -46,7 +46,9 @@ user.put_in_active_hand(cell) to_chat(user, "You remove \the [cell].") cell = null - update_stat() + var/datum/robot_component/C = components["power cell"] + C.installed = 0 + C.uninstall() diag_hud_set_borgcell() if(!opened) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 5cbdf9f3fa8..699376c927f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -144,6 +144,7 @@ modules += new /obj/item/robotanalyzer(src) modules += new /obj/item/reagent_scanner/adv(src) modules += new /obj/item/borg_defib(src) + modules += new /obj/item/handheld_defibrillator(src) modules += new /obj/item/roller_holder(src) modules += new /obj/item/reagent_containers/borghypo(src) modules += new /obj/item/reagent_containers/glass/beaker/large(src) @@ -412,6 +413,7 @@ modules += new /obj/item/reagent_scanner/adv(src) modules += new /obj/item/bodyanalyzer/borg/syndicate(src) modules += new /obj/item/borg_defib(src) + modules += new /obj/item/handheld_defibrillator(src) modules += new /obj/item/roller_holder(src) modules += new /obj/item/reagent_containers/borghypo/syndicate(src) modules += new /obj/item/extinguisher/mini(src) @@ -427,6 +429,7 @@ modules += new /obj/item/bonesetter(src) modules += new /obj/item/surgicaldrill(src) modules += new /obj/item/gripper/medical(src) + modules += new /obj/item/gun/medbeam(src) modules += new /obj/item/melee/energy/sword/cyborg/saw(src) //Energy saw -- primary weapon modules += new /obj/item/card/emag(src) modules += new /obj/item/crowbar/cyborg(src) @@ -494,22 +497,6 @@ fix_modules() -/obj/item/robot_module/nations - name = "nations robot module" - module_type = "Malf" - -/obj/item/robot_module/nations/New() - ..() - modules += new /obj/item/restraints/handcuffs/cable/zipties/cyborg(src) - modules += new /obj/item/gun/energy/gun/cyborg(src) - modules += new /obj/item/pickaxe/drill/jackhammer(src) - modules += new /obj/item/borg/combat/shield(src) - modules += new /obj/item/borg/combat/mobility(src) - modules += new /obj/item/wrench/cyborg(src) - emag = new /obj/item/gun/energy/lasercannon/cyborg(src) - - fix_modules() - /obj/item/robot_module/alien/hunter name = "alien hunter module" module_type = "Standard" diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm index 48179e8d374..cc5fe804a36 100644 --- a/code/modules/mob/living/silicon/robot/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/syndicate.dm @@ -70,12 +70,17 @@ /mob/living/silicon/robot/syndicate/saboteur/init() ..() module = new /obj/item/robot_module/syndicate_saboteur(src) + var/obj/item/borg/upgrade/selfrepair/SR = new /obj/item/borg/upgrade/selfrepair(src) SR.cyborg = src SR.icon_state = "selfrepair_off" - var/datum/action/A = new /datum/action/item_action/toggle(SR) - A.Grant(src) + var/datum/action/self_repair = new /datum/action/item_action/toggle(SR) + self_repair.Grant(src) + + var/datum/action/thermals = new /datum/action/innate/robot_sight/thermal() + thermals.Grant(src) + /mob/living/silicon/robot/syndicate/saboteur/verb/modify_name() set name = "Modify Name" set desc = "Change your systems' registered name to fool Nanotrasen systems. No cost." diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 17a7e67adf7..8092947919f 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -103,7 +103,7 @@ return return 1 -/mob/living/silicon/ai/emote(var/act, var/type, var/message) +/mob/living/silicon/ai/emote(act, type, message, force) var/obj/machinery/hologram/holopad/T = current if(istype(T) && T.masters[src])//Is the AI using a holopad? src.holopad_emote(message) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 20b363051de..bac58d8f124 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -19,13 +19,14 @@ var/speak_exclamation = "declares" var/speak_query = "queries" var/pose //Yes, now AIs can pose too. + var/death_sound = 'sound/voice/borg_deathsound.ogg' //var/sensor_mode = 0 //Determines the current HUD. var/next_alarm_notice var/list/datum/alarm/queued_alarms = new() - hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD,NATIONS_HUD) + hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD) var/med_hud = DATA_HUD_MEDICAL_ADVANCED //Determines the med hud to use @@ -71,6 +72,9 @@ /mob/living/silicon/drop_item() return +/mob/living/silicon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE) + return FALSE //So borgs they don't die trying to fix wiring + /mob/living/silicon/emp_act(severity) switch(severity) if(1) @@ -94,7 +98,7 @@ return 0 /mob/living/silicon/IsAdvancedToolUser() - return 1 + return TRUE /mob/living/silicon/bullet_act(var/obj/item/projectile/Proj) @@ -152,7 +156,6 @@ /mob/living/silicon/Stat() ..() if(statpanel("Status")) - show_stat_station_time() show_stat_emergency_shuttle_eta() show_system_integrity() @@ -334,4 +337,5 @@ /////////////////////////////////// EAR DAMAGE //////////////////////////////////// /mob/living/silicon/can_hear() - . = TRUE \ No newline at end of file + . = TRUE + diff --git a/code/modules/mob/living/silicon/subsystems.dm b/code/modules/mob/living/silicon/subsystems.dm index fa3dcfd2cfa..8f7c2316768 100644 --- a/code/modules/mob/living/silicon/subsystems.dm +++ b/code/modules/mob/living/silicon/subsystems.dm @@ -41,7 +41,7 @@ if(!register_alarms) return - var/list/register_to = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) + var/list/register_to = list(SSalarms.atmosphere_alarm, SSalarms.burglar_alarm, SSalarms.camera_alarm, SSalarms.fire_alarm, SSalarms.motion_alarm, SSalarms.power_alarm) for(var/datum/alarm_handler/AH in register_to) AH.register(src, /mob/living/silicon/proc/receive_alarm) queued_alarms[AH] = list() // Makes sure alarms remain listed in consistent order diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index a0b6652f883..4793b91dee6 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -156,8 +156,8 @@ bot_core = new bot_core_type(src) spawn(30) - if(radio_controller && bot_filter) - radio_controller.add_object(bot_core, control_freq, bot_filter) + if(SSradio && bot_filter) + SSradio.add_object(bot_core, control_freq, bot_filter) prepare_huds() for(var/datum/atom_hud/data/diagnostic/diag_hud in huds) @@ -197,8 +197,8 @@ if(reset_access_timer_id) deltimer(reset_access_timer_id) reset_access_timer_id = null - if(radio_controller && bot_filter) - radio_controller.remove_object(bot_core, control_freq) + if(SSradio && bot_filter) + SSradio.remove_object(bot_core, control_freq) QDEL_NULL(bot_core) return ..() @@ -747,7 +747,7 @@ Pass a positive integer as an argument to override a bot's default speed. /mob/living/simple_animal/bot/proc/post_signal_multiple(var/freq, var/list/keyval) if(z != 1) //Bot control will only work on station. return - var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) + var/datum/radio_frequency/frequency = SSradio.return_frequency(freq) if(!frequency) return diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 2737781bd08..5feebb53059 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -210,23 +210,29 @@ var/robot_arm = /obj/item/robot_parts/l_arm throw_range = 5 w_class = WEIGHT_CLASS_NORMAL var/created_name = "Floorbot" + var/toolbox = /obj/item/storage/toolbox/mechanical + var/toolbox_color = "" //Blank for blue, r for red, y for yellow, etc. -/obj/item/toolbox_tiles_sensor +/obj/item/toolbox_tiles/sensor desc = "It's a toolbox with tiles sticking out the top and a sensor attached" name = "tiles, toolbox and sensor arrangement" - icon = 'icons/obj/aibots.dmi' icon_state = "toolbox_tiles_sensor" - force = 3 - throwforce = 10 - throw_speed = 2 - throw_range = 5 - w_class = WEIGHT_CLASS_NORMAL - var/created_name = "Floorbot" -/obj/item/storage/toolbox/mechanical/attackby(obj/item/stack/tile/plasteel/T, mob/user, params) +/obj/item/storage/toolbox/attackby(obj/item/stack/tile/plasteel/T, mob/user, params) + var/list/allowed_toolbox = list(/obj/item/storage/toolbox/emergency, //which toolboxes can be made into floorbots + /obj/item/storage/toolbox/electrical, + /obj/item/storage/toolbox/mechanical, + /obj/item/storage/toolbox/green, + /obj/item/storage/toolbox/syndicate, + /obj/item/storage/toolbox/fakesyndi) + if(!istype(T, /obj/item/stack/tile/plasteel)) ..() return + if(!is_type_in_list(src, allowed_toolbox)) + return + if(type == /obj/item/storage/toolbox/green/memetic) + return if(contents.len >= 1) to_chat(user, "They won't fit in, as there is already stuff inside.") return @@ -234,6 +240,23 @@ var/robot_arm = /obj/item/robot_parts/l_arm if(user.s_active) user.s_active.close(user) var/obj/item/toolbox_tiles/B = new /obj/item/toolbox_tiles + B.toolbox = type + switch(B.toolbox) + if(/obj/item/storage/toolbox/mechanical/old) + B.toolbox_color = "ob" + if(/obj/item/storage/toolbox/emergency) + B.toolbox_color = "r" + if(/obj/item/storage/toolbox/emergency/old) + B.toolbox_color = "or" + if(/obj/item/storage/toolbox/electrical) + B.toolbox_color = "y" + if(/obj/item/storage/toolbox/green) + B.toolbox_color = "g" + if(/obj/item/storage/toolbox/syndicate) + B.toolbox_color = "s" + if(/obj/item/storage/toolbox/fakesyndi) + B.toolbox_color = "s" + B.icon_state = "[B.toolbox_color]toolbox_tiles" user.put_in_hands(B) to_chat(user, "You add the tiles into the empty toolbox. They protrude from the top.") user.unEquip(src, 1) @@ -246,8 +269,10 @@ var/robot_arm = /obj/item/robot_parts/l_arm ..() if(isprox(W)) qdel(W) - var/obj/item/toolbox_tiles_sensor/B = new /obj/item/toolbox_tiles_sensor() + var/obj/item/toolbox_tiles/sensor/B = new /obj/item/toolbox_tiles/sensor() B.created_name = created_name + B.toolbox_color = src.toolbox_color + B.icon_state = "[B.toolbox_color]toolbox_tiles_sensor" user.put_in_hands(B) to_chat(user, "You add the sensor to the toolbox and tiles.") user.unEquip(src, 1) @@ -263,12 +288,11 @@ var/robot_arm = /obj/item/robot_parts/l_arm created_name = t log_game("[key_name(user)] has renamed a robot to [t]") -/obj/item/toolbox_tiles_sensor/attackby(obj/item/W, mob/user, params) +/obj/item/toolbox_tiles/sensor/attackby(obj/item/W, mob/user, params) ..() if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm)) qdel(W) - var/turf/T = get_turf(user.loc) - var/mob/living/simple_animal/bot/floorbot/A = new /mob/living/simple_animal/bot/floorbot(T) + var/mob/living/simple_animal/bot/floorbot/A = new(drop_location(), toolbox_color) A.name = created_name A.robot_arm = W.type to_chat(user, "You add the robot arm to the odd looking toolbox assembly. Boop beep!") @@ -287,10 +311,9 @@ var/robot_arm = /obj/item/robot_parts/l_arm //Medbot Assembly /obj/item/storage/firstaid/attackby(obj/item/I, mob/user, params) if(!istype(I, /obj/item/robot_parts/l_arm) && !istype(I, /obj/item/robot_parts/r_arm)) - return ..() + return ..() else robot_arm = I.type - //Making a medibot! if(contents.len) @@ -298,7 +321,7 @@ var/robot_arm = /obj/item/robot_parts/l_arm return var/obj/item/firstaid_arm_assembly/A = new /obj/item/firstaid_arm_assembly(loc, med_bot_skin) - + A.req_one_access = req_one_access A.syndicate_aligned = syndicate_aligned A.treatment_oxy = treatment_oxy @@ -492,7 +515,7 @@ var/robot_arm = /obj/item/robot_parts/l_arm //General Griefsky - else if((istype(I, /obj/item/wrench)) && (build_step == 3)) + else if((istype(I, /obj/item/wrench)) && (build_step == 3)) var/obj/item/griefsky_assembly/A = new /obj/item/griefsky_assembly user.put_in_hands(A) to_chat(user, "You adjust the arm slots for extra weapons!.") @@ -516,12 +539,12 @@ var/robot_arm = /obj/item/robot_parts/l_arm build_step++ to_chat(user, "You add an energy sword to [src]!.") qdel(I) - + else if((istype(I, /obj/item/melee/energy/sword)) && (build_step == 3)) if(!user.unEquip(I)) return to_chat(user, "You complete General Griefsky!.") - var/mob/living/simple_animal/bot/secbot/griefsky/S = new /mob/living/simple_animal/bot/secbot/griefsky + var/mob/living/simple_animal/bot/secbot/griefsky/S = new /mob/living/simple_animal/bot/secbot/griefsky S.forceMove(get_turf(src)) qdel(I) qdel(src) @@ -537,7 +560,7 @@ var/robot_arm = /obj/item/robot_parts/l_arm if(!user.unEquip(I)) return to_chat(user, "You complete Genewul Giftskee!.") - var/mob/living/simple_animal/bot/secbot/griefsky/toy/S = new /mob/living/simple_animal/bot/secbot/griefsky/toy + var/mob/living/simple_animal/bot/secbot/griefsky/toy/S = new /mob/living/simple_animal/bot/secbot/griefsky/toy S.forceMove(get_turf(src)) qdel(I) qdel(src) @@ -571,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" @@ -602,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/emote.dm b/code/modules/mob/living/simple_animal/bot/emote.dm index eb6a18e8657..c59e044cc67 100644 --- a/code/modules/mob/living/simple_animal/bot/emote.dm +++ b/code/modules/mob/living/simple_animal/bot/emote.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/bot/emote(act, m_type=1, message = null) +/mob/living/simple_animal/bot/emote(act, m_type = 1, message = null, force) var/param = null if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) @@ -9,7 +9,7 @@ act = copytext(act,1,length(act)) //Emote Cooldown System (it's so simple!) - //proc/handle_emote_CD() located in [code\modules\mob\emote.dm] + //handle_emote_CD() located in [code\modules\mob\emote.dm] var/on_CD = 0 act = lowertext(act) switch(act) @@ -22,7 +22,7 @@ else on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown - if(on_CD == 1) // Check if we need to suppress the emote attempt. + if(!force && on_CD == 1) // Check if we need to suppress the emote attempt. return // Suppress emote, you're still cooling off. //--FalseIncarnate @@ -71,4 +71,4 @@ if("help") to_chat(src, "scream(s), yes, no, beep, buzz, ping") - ..(act, m_type, message) + ..() diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index c22d37eed19..21967bd202b 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/aibots.dmi' icon_state = "floorbot0" density = 0 - anchored = 0 + anchored = FALSE health = 25 maxHealth = 25 @@ -32,6 +32,7 @@ var/max_targets = 50 var/turf/target var/oldloc = null + var/toolbox_color = "" #define HULL_BREACH 1 #define BRIDGE_MODE 2 @@ -40,12 +41,16 @@ #define REPLACE_TILE 5 #define TILE_EMAG 6 -/mob/living/simple_animal/bot/floorbot/New() +/mob/living/simple_animal/bot/floorbot/New(mapload, new_toolbox_color) ..() + toolbox_color = new_toolbox_color update_icon() var/datum/job/engineer/J = new/datum/job/engineer access_card.access += J.get_access() prev_access = access_card.access + if(toolbox_color == "s") + health = 50 + maxHealth = 50 /mob/living/simple_animal/bot/floorbot/bot_reset() ..() @@ -53,7 +58,7 @@ oldloc = null ignore_list = list() nagged = 0 - anchored = 0 + anchored = FALSE update_icon() /mob/living/simple_animal/bot/floorbot/set_custom_texts() @@ -235,7 +240,7 @@ repair(target) else if(emagged == 2 && istype(target,/turf/simulated/floor)) var/turf/simulated/floor/F = target - anchored = 1 + anchored = TRUE mode = BOT_REPAIRING if(prob(90)) F.break_tile_to_plating() @@ -244,7 +249,7 @@ audible_message("[src] makes an excited booping sound.") spawn(50) amount ++ - anchored = 0 + anchored = FALSE mode = BOT_IDLE target = null path = list() @@ -272,11 +277,11 @@ if(HULL_BREACH) //The most common job, patching breaches in the station's hull. if(is_hull_breach(scan_target)) //Ensure that the targeted space turf is actually part of the station, and not random space. result = scan_target - anchored = 1 //Prevent the floorbot being blown off-course while trying to reach a hull breach. + anchored = TRUE //Prevent the floorbot being blown off-course while trying to reach a hull breach. if(BRIDGE_MODE) //Only space turfs in our chosen direction are considered. if(get_dir(src, scan_target) == targetdirection) result = scan_target - anchored = 1 + anchored = TRUE if(REPLACE_TILE) F = scan_target if(istype(F, /turf/simulated/floor/plating)) //The floor must not already have a tile. @@ -306,9 +311,10 @@ mode = BOT_IDLE target = null return - anchored = 1 - icon_state = "floorbot-c" + anchored = TRUE + icon_state = "[toolbox_color]floorbot-c" if(istype(target_turf, /turf/space/)) //If we are fixing an area not part of pure space, it is + icon_state = "[toolbox_color]floorbot-c" visible_message("[targetdirection ? "[src] begins installing a bridge plating." : "[src] begins to repair the hole."] ") mode = BOT_REPAIRING spawn(50) @@ -320,11 +326,12 @@ mode = BOT_IDLE amount -= 1 update_icon() - anchored = 0 + anchored = FALSE target = null else var/turf/simulated/floor/F = target_turf mode = BOT_REPAIRING + icon_state = "[toolbox_color]floorbot-c" visible_message("[src] begins repairing the floor.") spawn(50) if(mode == BOT_REPAIRING) @@ -334,7 +341,7 @@ mode = BOT_IDLE amount -= 1 update_icon() - anchored = 0 + anchored = FALSE target = null /mob/living/simple_animal/bot/floorbot/proc/eattile(obj/item/stack/tile/plasteel/T) @@ -380,9 +387,9 @@ /mob/living/simple_animal/bot/floorbot/update_icon() if(amount > 0) - icon_state = "floorbot[on]" + icon_state = "[toolbox_color]floorbot[on]" else - icon_state = "floorbot[on]e" + icon_state = "[toolbox_color]floorbot[on]e" /mob/living/simple_animal/bot/floorbot/explode() on = 0 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 a6fcf4b5a20..d5fabe96be4 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -29,21 +29,21 @@ /mob/living/simple_animal/hostile/construct/New() ..() - if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way + if(!SSticker.mode)//work around for maps with runes and cultdat is not loaded all the way name = "[const_type] ([rand(1, 1000)])" real_name = const_type icon_living = const_type icon_state = const_type else - name = "[ticker.cultdat.get_name(const_type)] ([rand(1, 1000)])" - real_name = ticker.cultdat.get_name(const_type) - icon_living = ticker.cultdat.get_icon(const_type) - icon_state = ticker.cultdat.get_icon(const_type) + name = "[SSticker.cultdat.get_name(const_type)] ([rand(1, 1000)])" + real_name = SSticker.cultdat.get_name(const_type) + icon_living = SSticker.cultdat.get_icon(const_type) + icon_state = SSticker.cultdat.get_icon(const_type) for(var/spell in construct_spells) AddSpell(new spell(null)) - if(ticker.cultdat.theme == "blood") + if(SSticker.cultdat.theme == "blood") updateglow() /mob/living/simple_animal/hostile/construct/examine(mob/user) @@ -85,6 +85,9 @@ /mob/living/simple_animal/hostile/construct/narsie_act() return +/mob/living/simple_animal/hostile/construct/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE) + return FALSE + /////////////////Juggernaut/////////////// @@ -110,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." @@ -165,10 +168,10 @@ melee_damage_lower = 25 melee_damage_upper = 25 attacktext = "slashes" - see_in_dark = 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." @@ -199,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, @@ -308,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/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index a55b3cdae16..cd82b39d27f 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -112,4 +112,4 @@ uniform = /obj/item/clothing/under/color/lightpurple suit = /obj/item/clothing/suit/wizrobe shoes = /obj/item/clothing/shoes/sandal - head = /obj/item/clothing/head/wizard \ No newline at end of file + head = /obj/item/clothing/head/wizard diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 9532daabab8..4dea368ad5e 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -16,8 +16,8 @@ turns_per_move = 5 see_in_dark = 6 mob_size = MOB_SIZE_SMALL - simplespecies = /mob/living/simple_animal/pet/cat - childtype = /mob/living/simple_animal/pet/cat/kitten + animal_species = /mob/living/simple_animal/pet/cat + childtype = list(/mob/living/simple_animal/pet/cat/kitten) butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 3) response_help = "pets" response_disarm = "gently pushes aside" @@ -48,9 +48,9 @@ ..() /mob/living/simple_animal/pet/cat/Runtime/Life(seconds, times_fired) - if(!cats_deployed && ticker.current_state >= GAME_STATE_SETTING_UP) + if(!cats_deployed && SSticker.current_state >= GAME_STATE_SETTING_UP) Deploy_The_Cats() - if(!stat && ticker.current_state == GAME_STATE_FINISHED && !memory_saved) + if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) Write_Memory() ..() @@ -117,13 +117,17 @@ //MICE! if(eats_mice && isturf(loc) && !incapacitated()) - for(var/mob/living/simple_animal/mouse/M in view(1,src)) + for(var/mob/living/simple_animal/mouse/M in view(1, src)) if(!M.stat && Adjacent(M)) custom_emote(1, "splats \the [M]!") M.splat() movement_target = null stop_automated_movement = 0 break + for(var/obj/item/toy/cattoy/T in view(1, src)) + if(T.cooldown < (world.time - 400)) + custom_emote(1, "bats \the [T] around with its paw!") + T.cooldown = world.time make_babies() /mob/living/simple_animal/pet/cat/handle_automated_movement() @@ -147,7 +151,7 @@ stop_automated_movement = 1 walk_to(src,movement_target,0,3) -/mob/living/simple_animal/pet/cat/emote(act, m_type=1, message = null) +/mob/living/simple_animal/pet/cat/emote(act, m_type = 1, message = null, force) if(stat != CONSCIOUS) return @@ -163,9 +167,9 @@ else on_CD = 0 - if(on_CD == 1) + if(!force && on_CD == 1) return - + switch(act) if("meow") message = "[src] [pick(emote_hear)]!" @@ -225,9 +229,9 @@ maxHealth = 50 harm_intent_damage = 10 butcher_results = list( - /obj/item/organ/internal/brain = 1, - /obj/item/organ/internal/heart = 1, - /obj/item/reagent_containers/food/snacks/birthdaycakeslice = 3, + /obj/item/organ/internal/brain = 1, + /obj/item/organ/internal/heart = 1, + /obj/item/reagent_containers/food/snacks/birthdaycakeslice = 3, /obj/item/reagent_containers/food/snacks/meat/slab = 2 ) response_harm = "takes a bite out of" diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index e92174bd6c2..b52140922f1 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -18,13 +18,13 @@ ventcrawler = 2 gold_core_spawnable = 2 var/squish_chance = 50 - loot = list(/obj/effect/decal/cleanable/deadcockroach) + loot = list(/obj/effect/decal/cleanable/insectguts) del_on_death = 1 /mob/living/simple_animal/cockroach/can_die() - return ..() && !ticker.cinematic //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. + return ..() && !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) @@ -40,10 +40,3 @@ /mob/living/simple_animal/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach. return -/obj/effect/decal/cleanable/deadcockroach - name = "cockroach guts" - desc = "One bug squashed. Four more will rise in its place." - icon = 'icons/effects/blood.dmi' - icon_state = "xfloor1" - random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") - anchored = 1 diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 832d92c9d8f..90ed82ff395 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -22,8 +22,8 @@ response_disarm = "bops" response_harm = "kicks" see_in_dark = 5 - childtype = /mob/living/simple_animal/pet/corgi/puppy - simplespecies = /mob/living/simple_animal/pet/corgi + childtype = list(/mob/living/simple_animal/pet/corgi) + animal_species = /mob/living/simple_animal/pet/corgi gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY var/shaved = 0 var/obj/item/inventory_head @@ -368,7 +368,7 @@ name = "Definitely Not [real_name]" desc = "That's Definitely Not [real_name]" valid = 1 - + if(/obj/item/clothing/head/beret/centcom/officer, /obj/item/clothing/head/beret/centcom/officer/navy) name = "Blueshield [real_name]" desc = "Will stand by you until the bitter end." @@ -407,7 +407,7 @@ playsound(src, yelp_sound, 75, 1) ..() -/mob/living/simple_animal/pet/corgi/emote(act, m_type=1, message = null) +/mob/living/simple_animal/pet/corgi/emote(act, m_type = 1, message = null, force) if(stat != CONSCIOUS) return @@ -421,9 +421,9 @@ else on_CD = 0 - if(on_CD == 1) + if(!force && on_CD == 1) return - + switch(act) if("bark") message = "[src] [pick(src.speak_emote)]!" @@ -451,7 +451,7 @@ response_harm = "kicks" gold_core_spawnable = CHEM_MOB_SPAWN_INVALID -/mob/living/simple_animal/pet/corgi/Ian/process_ai() +/mob/living/simple_animal/pet/corgi/Ian/Life() ..() //Feeding, chasing food, FOOOOODDDD @@ -578,7 +578,7 @@ return ..() -/mob/living/simple_animal/pet/corgi/Lisa/process_ai() +/mob/living/simple_animal/pet/corgi/Lisa/Life() ..() make_babies() diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm index 07a5fcf0131..355d756288b 100644 --- a/code/modules/mob/living/simple_animal/friendly/diona.dm +++ b/code/modules/mob/living/simple_animal/friendly/diona.dm @@ -60,7 +60,7 @@ /datum/action/innate/diona/merge/Activate() var/mob/living/simple_animal/diona/user = owner user.merge() - + /datum/action/innate/diona/evolve name = "Evolve" icon_icon = 'icons/obj/cloning.dmi' @@ -109,7 +109,7 @@ forceMove(M) else get_scooped(M) - else + else ..() /mob/living/simple_animal/diona/proc/merge() @@ -151,7 +151,7 @@ to_chat(loc, "You feel a pang of loss as [src] splits away from your biomass.") to_chat(src, "You wiggle out of the depths of [loc]'s biomass and plop to the ground.") forceMove(T) - + var/hasMobs = FALSE for(var/atom/A in D.contents) if(istype(A, /mob/) || istype(A, /obj/item/holder)) @@ -163,9 +163,9 @@ return TRUE /mob/living/simple_animal/diona/proc/evolve() - if(stat != CONSCIOUS) + if(stat != CONSCIOUS) return FALSE - + if(donors.len < evolve_donors) to_chat(src, "You need more blood in order to ascend to a new state of consciousness...") return FALSE @@ -176,7 +176,7 @@ if(isdiona(loc) && !split()) //if it's merged with diona, needs to able to split before evolving return FALSE - + visible_message("[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.") var/mob/living/carbon/human/diona/adult = new(get_turf(loc)) @@ -202,14 +202,14 @@ qdel(src) return TRUE -/mob/living/simple_animal/diona/proc/steal_blood() - if(stat != CONSCIOUS) +/mob/living/simple_animal/diona/proc/steal_blood() + if(stat != CONSCIOUS) return FALSE - + var/list/choices = list() for(var/mob/living/carbon/human/H in oview(1,src)) if(Adjacent(H) && H.dna && !(NO_BLOOD in H.dna.species.species_traits)) - choices += H + choices += H if(!choices.len) to_chat(src, "No suitable blood donors nearby.") @@ -260,7 +260,7 @@ to_chat(src, "You don't have any hands!") return -/mob/living/simple_animal/diona/emote(act, m_type=1, message = null) +/mob/living/simple_animal/diona/emote(act, m_type = 1, message = null, force) if(stat != CONSCIOUS) return @@ -272,7 +272,7 @@ else on_CD = 0 - if(on_CD == 1) + if(!force && on_CD == 1) return switch(act) //IMPORTANT: Emotes MUST NOT CONFLICT anywhere along the chain. @@ -283,4 +283,4 @@ if("help") to_chat(src, "scream, chirp") - ..(act, m_type, message) \ No newline at end of file + ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 03f353754fe..bdb479997dc 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -25,20 +25,21 @@ melee_damage_lower = 1 melee_damage_upper = 2 stop_automated_movement_when_pulled = 1 - var/milk_content = 0 can_collar = 1 blood_volume = BLOOD_VOLUME_NORMAL + var/obj/item/udder/udder = null + +/mob/living/simple_animal/hostile/retaliate/goat/New() + udder = new() + . = ..() + +/mob/living/simple_animal/hostile/retaliate/goat/Destroy() + qdel(udder) + udder = null + return ..() /mob/living/simple_animal/hostile/retaliate/goat/handle_automated_movement() ..() - if(!pulledby) - for(var/direction in shuffle(list(1,2,4,8,5,6,9,10))) - var/step = get_step(src, direction) - if(step) - if(locate(/obj/structure/spacevine) in step) - Move(step, get_dir(src, step)) - -/mob/living/simple_animal/hostile/retaliate/goat/handle_automated_action() //chance to go crazy and start wacking stuff if(!enemies.len && prob(1)) Retaliate() @@ -46,44 +47,59 @@ if(enemies.len && prob(10)) enemies = list() LoseTarget() - src.visible_message("[src] calms down.") + visible_message("[src] calms down.") - var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc - if(SV) - SV.eat(src) + if(stat == CONSCIOUS) + eat_plants() + if(!pulledby) + for(var/direction in shuffle(list(1,2,4,8,5,6,9,10))) + var/step = get_step(src, direction) + if(step) + if(locate(/obj/structure/spacevine) in step || locate(/obj/structure/glowshroom) in step) + Move(step, get_dir(src, step)) /mob/living/simple_animal/hostile/retaliate/goat/Life(seconds, times_fired) . = ..() - if(stat == CONSCIOUS && prob(5)) - milk_content = min(50, milk_content+rand(5, 10)) - + if(stat == CONSCIOUS) + udder.generateMilk() /mob/living/simple_animal/hostile/retaliate/goat/Retaliate() ..() - src.visible_message("[src] gets an evil-looking gleam in their eye.") + visible_message("[src] gets an evil-looking gleam in their eye.") /mob/living/simple_animal/hostile/retaliate/goat/Move() - ..() + . = ..() if(!stat) - var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc - if(SV) - SV.eat(src) + eat_plants() /mob/living/simple_animal/hostile/retaliate/goat/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass)) - user.changeNext_move(CLICK_CD_MELEE) - var/obj/item/reagent_containers/glass/G = O - var/transfered = min(milk_content, rand(5,10), (G.volume - G.reagents.total_volume)) - if(transfered > 0) - user.visible_message("[user] milks [src] using \the [O].") - G.reagents.add_reagent("milk", transfered) - milk_content -= transfered - else if(G.reagents.total_volume >= G.volume) - to_chat(user, "\The [O] is full.") - else - to_chat(user, "The udder is dry. Wait a bit longer...") + udder.milkAnimal(O, user) else - ..() + return ..() + +/mob/living/simple_animal/hostile/retaliate/goat/proc/eat_plants() + var/eaten = FALSE + var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc + if(SV) + SV.eat(src) + eaten = TRUE + + var/obj/structure/glowshroom/GS = locate(/obj/structure/glowshroom) in loc + if(GS) + qdel(GS) + eaten = TRUE + + if(eaten && prob(10)) + say("Nom") + +/mob/living/simple_animal/hostile/retaliate/goat/AttackingTarget() + ..() + if(isdiona(target)) + var/mob/living/carbon/human/H = target + var/obj/item/organ/external/NB = pick(H.bodyparts) + H.visible_message("[src] takes a big chomp out of [H]!", "[src] takes a big chomp out of your [NB.name]!") + NB.droplimb() //cow /mob/living/simple_animal/cow @@ -108,34 +124,31 @@ attack_sound = 'sound/weapons/punch1.ogg' health = 50 maxHealth = 50 - var/milk_content = 0 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY blood_volume = BLOOD_VOLUME_NORMAL + var/obj/item/udder/udder = null -/mob/living/simple_animal/cow/New() - ..() +/mob/living/simple_animal/cow/Initialize() + udder = new() + . = ..() -/mob/living/simple_animal/cow/attackby(var/obj/item/O as obj, var/mob/user as mob, params, params) +/mob/living/simple_animal/cow/Destroy() + qdel(udder) + udder = null + return ..() + +/mob/living/simple_animal/cow/attackby(obj/item/O, mob/user, params) if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass)) - user.changeNext_move(CLICK_CD_MELEE) - var/obj/item/reagent_containers/glass/G = O - var/transfered = min(milk_content, rand(5,10), (G.volume - G.reagents.total_volume)) - if(transfered > 0) - user.visible_message("[user] milks [src] using \the [O].") - G.reagents.add_reagent("milk", transfered) - milk_content -= transfered - else if(G.reagents.total_volume >= G.volume) - to_chat(user, "\The [O] is full.") - else - to_chat(user, "The udder is dry. Wait a bit longer...") + udder.milkAnimal(O, user) + return 1 else - ..() + return ..() /mob/living/simple_animal/cow/Life(seconds, times_fired) . = ..() - if(stat == CONSCIOUS && prob(5)) - milk_content = min(50, milk_content+rand(5, 10)) + if(stat == CONSCIOUS) + udder.generateMilk() /mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M as mob) if(!stat && M.a_intent == INTENT_DISARM && icon_state != icon_dead) @@ -280,7 +293,7 @@ var/global/chicken_count = 0 E.pixel_y = rand(-6,6) if(eggsFertile) if(chicken_count < MAX_CHICKENS && prob(25)) - processing_objects.Add(E) + START_PROCESSING(SSobj, E) /obj/item/reagent_containers/food/snacks/egg/var/amount_grown = 0 /obj/item/reagent_containers/food/snacks/egg/process() @@ -289,10 +302,10 @@ var/global/chicken_count = 0 if(amount_grown >= 100) visible_message("[src] hatches with a quiet cracking sound.") new /mob/living/simple_animal/chick(get_turf(src)) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) qdel(src) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /mob/living/simple_animal/pig @@ -412,3 +425,26 @@ var/global/chicken_count = 0 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY blood_volume = BLOOD_VOLUME_NORMAL + +/obj/item/udder + name = "udder" + +/obj/item/udder/New() + create_reagents(50) + reagents.add_reagent("milk", 20) + . = ..() + +/obj/item/udder/proc/generateMilk() + if(prob(5)) + reagents.add_reagent("milk", rand(5, 10)) + +/obj/item/udder/proc/milkAnimal(obj/O, mob/user) + var/obj/item/reagent_containers/glass/G = O + if(G.reagents.total_volume >= G.volume) + to_chat(user, "[O] is full.") + return + var/transfered = reagents.trans_to(O, rand(5,10)) + if(transfered) + user.visible_message("[user] milks [src] using \the [O].", "You milk [src] using \the [O].") + else + to_chat(user, "The udder is dry. Wait a bit longer...") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index c84947c7363..cbc125beeab 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -35,8 +35,9 @@ can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY -/mob/living/simple_animal/mouse/Initialize() +/mob/living/simple_animal/mouse/Initialize(mapload) . = ..() + AddComponent(/datum/component/squeak, list('sound/creatures/mousesqueak.ogg' = 1), 100) /mob/living/simple_animal/mouse/handle_automated_speech() ..() @@ -54,10 +55,9 @@ else if(prob(5)) emote("snuffles") -/mob/living/simple_animal/mouse/process_ai() +/mob/living/simple_animal/mouse/Life() ..() - - if(prob(0.5)) + if(prob(0.5) && !ckey) stat = UNCONSCIOUS icon_state = "mouse_[mouse_color]_sleep" wander = 0 @@ -91,12 +91,11 @@ 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 == CONSCIOUS) + if(!stat) var/mob/M = AM to_chat(M, "[bicon(src)] Squeek!") - SEND_SOUND(M, squeak_sound) ..() /mob/living/simple_animal/mouse/death(gibbed) @@ -109,7 +108,7 @@ if(client) client.time_died_as_mouse = world.time -/mob/living/simple_animal/mouse/emote(act, m_type=1, message = null) +/mob/living/simple_animal/mouse/emote(act, m_type = 1, message = null, force) if(stat != CONSCIOUS) return @@ -121,7 +120,7 @@ else on_CD = 0 - if(on_CD == 1) + if(!force && on_CD == 1) return switch(act) @@ -221,4 +220,4 @@ response_harm = "stamps on" gold_core_spawnable = CHEM_MOB_SPAWN_INVALID can_collar = 0 - butcher_results = list(/obj/item/stack/sheet/metal = 1) \ No newline at end of file + butcher_results = list(/obj/item/stack/sheet/metal = 1) diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm index 545866858ca..d408045a923 100644 --- a/code/modules/mob/living/simple_animal/friendly/penguin.dm +++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm @@ -16,6 +16,10 @@ turns_per_move = 10 icon = 'icons/mob/penguins.dmi' +/mob/living/simple_animal/pet/penguin/Initialize(mapload) + . = ..() + AddComponent(/datum/component/waddling) + /mob/living/simple_animal/pet/penguin/emperor name = "Emperor penguin" real_name = "penguin" diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm index e1e16ef42b2..36ce34094a0 100644 --- a/code/modules/mob/living/simple_animal/friendly/pug.dm +++ b/code/modules/mob/living/simple_animal/friendly/pug.dm @@ -19,7 +19,7 @@ see_in_dark = 5 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY -/mob/living/simple_animal/pet/pug/process_ai() +/mob/living/simple_animal/pet/pug/Life() ..() if(!resting && !buckled) diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm index 13e7c893d86..ac913170c86 100644 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ b/code/modules/mob/living/simple_animal/friendly/slime.dm @@ -12,8 +12,8 @@ response_disarm = "shoos" response_harm = "stomps on" emote_see = list("jiggles", "bounces in place") - var/colour = "grey" pass_flags = PASSTABLE + var/colour = "grey" /mob/living/simple_animal/slime/adult health = 200 @@ -24,3 +24,37 @@ /mob/living/simple_animal/slime/New() ..() overlays += "aslime-:33" + +/mob/living/simple_animal/slime/updatehealth(reason) + . = ..() + update_health_hud() + +/mob/living/simple_animal/slime/proc/update_health_hud() + if(hud_used) + var/severity = 0 + var/healthpercent = (health/maxHealth) * 100 + switch(healthpercent) + if(100 to INFINITY) + healths.icon_state = "slime_health0" + if(80 to 100) + healths.icon_state = "slime_health1" + severity = 1 + if(60 to 80) + healths.icon_state = "slime_health2" + severity = 2 + if(40 to 60) + healths.icon_state = "slime_health3" + severity = 3 + if(20 to 40) + healths.icon_state = "slime_health4" + severity = 4 + if(1 to 20) + healths.icon_state = "slime_health5" + severity = 5 + else + healths.icon_state = "slime_health7" + severity = 6 + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 6ba407c8a90..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" @@ -30,7 +30,7 @@ status_flags = CANPUSH minbodytemp = 0 see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE death_sound = 'sound/voice/hiss6.ogg' deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..." @@ -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/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 4516a44a935..8b814076720 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -11,7 +11,7 @@ /mob/living/simple_animal/hostile/poison/bees name = "bee" - desc = "buzzy buzzy bee, stingy sti- Ouch!" + desc = "Buzzy buzzy bee, stingy sti- Ouch!" icon_state = "" icon_living = "" icon = 'icons/mob/bees.dmi' @@ -33,25 +33,28 @@ environment_smash = 0 mouse_opacity = MOUSE_OPACITY_OPAQUE pass_flags = PASSTABLE | PASSGRILLE | PASSMOB - flying = 1 - search_objects = 1 //have to find those plant trays! - density = 0 + density = FALSE mob_size = MOB_SIZE_TINY + flying = TRUE + search_objects = TRUE //have to find those plant trays! //Spaceborn beings don't get hurt by space 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 - del_on_death = 1 + del_on_death = TRUE var/datum/reagent/beegent = null //hehe, beegent var/obj/structure/beebox/beehome = null - var/isqueen = FALSE var/idle = 0 + var/isqueen = FALSE + var/bee_syndicate = FALSE var/icon_base = "bee" var/static/list/bee_icons = list() + var/static/beehometypecache = typecacheof(/obj/structure/beebox) + var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics) /mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0) - return 1 + return TRUE /mob/living/simple_animal/hostile/poison/bees/New() ..() @@ -65,6 +68,20 @@ beehome = null return ..() +/mob/living/simple_animal/hostile/poison/bees/death(gibbed) + . = ..() + if(!.) + return + if(beehome) + if(beehome.bees) + beehome.bees.Remove(src) + beehome = null + +/mob/living/simple_animal/hostile/poison/bees/examine(mob/user) + ..() + if(!bee_syndicate && !beehome) + to_chat(user, "This bee is homeless!") + /mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals() overlays.Cut() @@ -94,21 +111,45 @@ //We don't attack beekeepers/people dressed as bees//Todo: bee costume /mob/living/simple_animal/hostile/poison/bees/CanAttack(atom/the_target) . = ..() - return . + if(!.) + return FALSE + if(!bee_syndicate && isliving(the_target)) + var/mob/living/H = the_target + return !H.bee_friendly() /mob/living/simple_animal/hostile/poison/bees/Found(atom/A) if(isliving(A)) - var/mob/living/L = A - return !L.bee_friendly() - return 0 + var/mob/living/H = A + return !H.bee_friendly() + if(istype(A, /obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/Hydro = A + if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit) + wanted_objects |= hydroponicstypecache //so we only hunt them while they're alive/seeded/not visisted + return TRUE + return FALSE /mob/living/simple_animal/hostile/poison/bees/AttackingTarget() - if(beegent && isliving(target)) - var/mob/living/L = target - if(!isnull(target.reagents)) - beegent.reaction_mob(L, INGEST) - L.reagents.add_reagent(beegent.id, rand(1,5)) - target.attack_animal(src) + //Pollinate + if(istype(target, /obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/Hydro = target + pollinate(Hydro) + else if(istype(target, /obj/structure/beebox)) + if(target == beehome) + var/obj/structure/beebox/BB = target + forceMove(BB) + target = null + wanted_objects -= beehometypecache //so we don't attack beeboxes when not going home + return //no don't attack the goddamm box + else + ..() + if(isliving(target) && (!client || a_intent == INTENT_HARM)) + var/mob/living/L = target + if(L.reagents) + if(beegent) + beegent.reaction_mob(L, INGEST) + L.reagents.add_reagent(beegent.id, rand(1, 5)) + else + L.reagents.add_reagent("spidertoxin", 5) /mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R) if(istype(R)) @@ -116,81 +157,13 @@ name = "[initial(name)] ([R.name])" generate_bee_visuals() -/mob/living/simple_animal/hostile/poison/bees/handle_automated_action() - . = ..() - if(!.) - return - -/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B) - if(!B) - return 0 - if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent) - return 1 - return 0 - -//Botany Worker Bees -/mob/living/simple_animal/hostile/poison/bees/worker - //Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee) - - -/mob/living/simple_animal/hostile/poison/bees/worker/Destroy() - if(beehome) - if(beehome.bees) - beehome.bees.Remove(src) - beehome = null - return ..() - -/mob/living/simple_animal/hostile/poison/bees/worker/death(gibbed) - . = ..() - if(!.) - return - if(beehome) - if(beehome.bees) - beehome.bees.Remove(src) - beehome = null - -/mob/living/simple_animal/hostile/poison/bees/worker/examine(mob/user) - ..() - - if(!beehome) - to_chat(user, "This bee is homeless!") - -/mob/living/simple_animal/hostile/poison/bees/worker/Found(atom/A) - if(istype(A, /obj/machinery/hydroponics)) - var/obj/machinery/hydroponics/Hydro = A - if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit && !Hydro.lid_state) - wanted_objects |= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered - return 1 - ..() - -/mob/living/simple_animal/hostile/poison/bees/worker/CanAttack(atom/the_target) - . = ..() - if(!.) - return 0 - if(isliving(the_target)) //Should ignore ghosts and camera mobs already, but just in case - var/mob/living/L = the_target - return !L.bee_friendly() - -/mob/living/simple_animal/hostile/poison/bees/worker/AttackingTarget() - //Pollinate - if(istype(target, /obj/machinery/hydroponics)) - var/obj/machinery/hydroponics/Hydro = target - pollinate(Hydro) - else if(target == beehome) - var/obj/structure/beebox/BB = target - forceMove(BB) - target = null - wanted_objects -= /obj/structure/beebox //so we don't attack beeboxes when not going home - else - ..() - -/mob/living/simple_animal/hostile/poison/bees/worker/proc/pollinate(obj/machinery/hydroponics/Hydro) +/mob/living/simple_animal/hostile/poison/bees/proc/pollinate(obj/machinery/hydroponics/Hydro) if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit || Hydro.lid_state) target = null return target = null //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity - wanted_objects -= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered + wanted_objects -= hydroponicstypecache //so we only hunt them while they're alive/seeded/not visisted Hydro.recent_bee_visit = TRUE spawn(BEE_TRAY_RECENT_VISIT) if(Hydro) @@ -210,68 +183,79 @@ if(beehome) beehome.bee_resources = min(beehome.bee_resources + growth, 100) -/mob/living/simple_animal/hostile/poison/bees/worker/handle_automated_action() +/mob/living/simple_animal/hostile/poison/bees/handle_automated_action() . = ..() if(!.) return - if(!isqueen) - if(loc == beehome) - idle = min(100, ++idle) - if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM)) - forceMove(get_turf(beehome)) - else - idle = max(0, --idle) - if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME)) - if(!FindTarget()) - wanted_objects += /obj/structure/beebox //so we don't attack beeboxes when not going home - target = beehome - if(!beehome) //add outselves to a beebox (of the same reagent) if we have no home - for(var/obj/structure/beebox/BB in view(vision_range, src)) - if(reagent_incompatible(BB.queen_bee) || BB.bees.len >= BB.get_max_bees()) - continue - BB.bees |= src - beehome = BB - + if(!bee_syndicate) + if(!isqueen) + if(loc == beehome) + idle = min(100, ++idle) + if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM)) + forceMove(beehome.drop_location()) + else + idle = max(0, --idle) + if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME)) + if(!FindTarget()) + wanted_objects |= beehometypecache //so we don't attack beeboxes when not going home + target = beehome + if(!beehome) //add ourselves to a beebox (of the same reagent) if we have no home + for(var/obj/structure/beebox/BB in view(vision_range, src)) + if(reagent_incompatible(BB.queen_bee) || BB.bees.len >= BB.get_max_bees()) + continue + BB.bees |= src + beehome = BB + break // End loop after the first compatible find. //Botany Queen Bee /mob/living/simple_animal/hostile/poison/bees/queen name = "queen bee" - desc = "she's the queen of bees, BZZ BZZ" + desc = "She's the queen of bees, BZZ BZZ" icon_base = "queen" isqueen = TRUE - //the Queen doesn't leave the box on her own, and she CERTAINLY doesn't pollinate by herself +//the Queen doesn't leave the box on her own, and she CERTAINLY doesn't pollinate by herself /mob/living/simple_animal/hostile/poison/bees/queen/Found(atom/A) - return 0 + return FALSE + +//leave pollination for the peasent bees +/mob/living/simple_animal/hostile/poison/bees/queen/AttackingTarget() + ..() + if(beegent && isliving(target)) + var/mob/living/L = target + beegent.reaction_mob(L, TOUCH) + L.reagents.add_reagent(beegent.id, rand(1, 5)) + +//PEASENT BEES +/mob/living/simple_animal/hostile/poison/bees/queen/pollinate() + return + +/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B) + if(!B) + return FALSE + if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent) + return TRUE + return FALSE -/mob/living/simple_animal/hostile/poison/bees/queen/CanAttack(atom/the_target) - . = ..() - if(!.) - return 0 - if(isliving(the_target)) //Should ignore ghosts and camera mobs already, but just in case - var/mob/living/L = the_target - return !L.bee_friendly() /obj/item/queen_bee name = "queen bee" - desc = "she's the queen of bees, BZZ BZZ" + desc = "She's the queen of bees, BZZ BZZ" icon_state = "queen_item" item_state = "" icon = 'icons/mob/bees.dmi' var/mob/living/simple_animal/hostile/poison/bees/queen/queen + /obj/item/queen_bee/attackby(obj/item/I, mob/user, params) - if(istype(I,/obj/item/reagent_containers/syringe)) + if(istype(I, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/syringe/S = I if(S.reagents.has_reagent("royal_bee_jelly")) //checked twice, because I really don't want royal bee jelly to be duped - if(S.reagents.has_reagent("royal_bee_jelly",5)) + if(S.reagents.has_reagent("royal_bee_jelly", 5)) S.reagents.remove_reagent("royal_bee_jelly", 5) - if(!queen.beegent.can_synth) - to_chat(user, "You inject [src] with the royal bee jelly. It's ineffective! Maybe it's something to do with the [src] reagent.") - return - var/obj/item/queen_bee/qb = new(get_turf(user)) + var/obj/item/queen_bee/qb = new(user.drop_location()) qb.queen = new(qb) if(queen && queen.beegent) qb.queen.assign_reagent(queen.beegent) //Bees use the global singleton instances of reagents, so we don't need to worry about one bee being deleted and her copies losing their reagents. @@ -282,16 +266,17 @@ else var/datum/reagent/R = GLOB.chemical_reagents_list[S.reagents.get_master_reagent_id()] if(R && S.reagents.has_reagent(R.id, 5)) - S.reagents.remove_reagent(R.id,5) + S.reagents.remove_reagent(R.id, 5) queen.assign_reagent(R) - user.visible_message("[user] injects [src]'s genome with [R.name], mutating it's DNA!","You inject [src]'s genome with [R.name], mutating it's DNA!") + user.visible_message("[user] injects [src]'s genome with [R.name], mutating its DNA!", "You inject [src]'s genome with [R.name], mutating its DNA!") name = queen.name else to_chat(user, "You don't have enough units of that chemical to modify the bee's DNA!") - ..() + else + return ..() -/obj/item/queen_bee/bought/New() - ..() +/obj/item/queen_bee/bought/Initialize(mapload) + . = ..() queen = new(src) /obj/item/queen_bee/Destroy() @@ -299,7 +284,6 @@ return ..() - //Syndicate Bees /mob/living/simple_animal/hostile/poison/bees/syndi name = "syndi-bee" @@ -309,10 +293,14 @@ maxHealth = 25 health = 25 faction = list("hostile", "syndicate") - search_objects = 0 //these bees don't care about trivial things like plants, especially when there is havoc to sow - beegent = new /datum/reagent/facid() //prepare to die + search_objects = FALSE //these bees don't care about trivial things like plants, especially when there is havoc to sow + bee_syndicate = TRUE var/list/master_and_friends = list() +/mob/living/simple_animal/hostile/poison/bees/syndi/New() + beegent = GLOB.chemical_reagents_list["facid"] //Prepare to die + ..() + /mob/living/simple_animal/hostile/poison/bees/syndi/Destroy() master_and_friends.Cut() return ..() @@ -320,24 +308,27 @@ /mob/living/simple_animal/hostile/poison/bees/syndi/assign_reagent(datum/reagent/R) return -/mob/living/simple_animal/hostile/poison/bees/syndi/Found(atom/A) - return CanAttack(A) +/mob/living/simple_animal/hostile/poison/bees/syndi/pollinate() // No Pollination + return + +/mob/living/simple_animal/hostile/poison/bees/syndi/Found(atom/A) //Typical usual hostile mob targeting list + return /mob/living/simple_animal/hostile/poison/bees/syndi/CanAttack(atom/the_target) . = ..() if(!.) - return 0 + return FALSE if(isliving(the_target)) var/mob/living/L = the_target if(ishuman(L)) var/mob/living/carbon/human/H = L if(H in master_and_friends) - return 0 - return 1 + return FALSE + return TRUE /mob/living/simple_animal/hostile/poison/bees/syndi/AttackingTarget() ..() if(target && isliving(target)) var/mob/living/L = target if(L.stat) - LoseTarget() + LoseTarget() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 5139f187494..299677804e2 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -1,11 +1,8 @@ - - /mob/living/simple_animal/hostile/carp name = "space carp" desc = "A ferocious, fang-bearing creature that resembles a fish." + icon = 'icons/mob/carp.dmi' icon_state = "carp" - icon_living = "carp" - icon_dead = "carp_dead" icon_gib = "carp_gib" speak_chance = 0 turns_per_move = 5 @@ -16,7 +13,6 @@ speed = 0 maxHealth = 25 health = 25 - harm_intent_damage = 8 obj_damage = 50 melee_damage_lower = 15 @@ -30,12 +26,27 @@ minbodytemp = 0 maxbodytemp = 1500 - - faction = list("carp") flying = 1 gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE + var/carp_color = "carp" //holder for icon set + var/list/icon_sets = list("carp", "blue", "yellow", "grape", "rust", "teal", "purple") + +/mob/living/simple_animal/hostile/carp/Initialize(mapload) + . = ..() + carp_randomify() + update_icons() + +/mob/living/simple_animal/hostile/carp/proc/carp_randomify() + if(prob(1)) + carp_color = pick("white", "black") + else + carp_color = pick(icon_sets) + icon_state = "[carp_color]" + icon_living = "[carp_color]" + icon_dead = "[carp_color]_dead" + /mob/living/simple_animal/hostile/carp/Process_Spacemove(var/movement_dir = 0) return 1 //No drifting in space for space carp! //original comments do not steal @@ -50,7 +61,6 @@ var/mob/living/carbon/human/H = target H.adjustStaminaLoss(8) - /mob/living/simple_animal/hostile/carp/holocarp icon_state = "holocarp" icon_living = "holocarp" @@ -58,6 +68,8 @@ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID del_on_death = 1 +/mob/living/simple_animal/hostile/carp/holocarp/carp_randomify() + return /mob/living/simple_animal/hostile/carp/megacarp icon = 'icons/mob/alienqueen.dmi' @@ -73,4 +85,7 @@ mob_size = MOB_SIZE_LARGE obj_damage = 80 melee_damage_lower = 20 - melee_damage_upper = 20 \ No newline at end of file + melee_damage_upper = 20 + +/mob/living/simple_animal/hostile/carp/megacarp/carp_randomify() + return 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/floorcluwne.dm b/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm index 9ac2d899456..244edaeedec 100644 --- a/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm +++ b/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm @@ -142,7 +142,7 @@ return -/mob/living/simple_animal/hostile/floor_cluwne/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE)//prevents runtimes with machine fuckery +/mob/living/simple_animal/hostile/floor_cluwne/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE) //prevents runtimes with machine fuckery return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 18219179d40..6795f4ccec2 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -16,7 +16,8 @@ emote_hear = list("chitters") speak_chance = 5 turns_per_move = 5 - see_in_dark = 10 + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE butcher_results = list(/obj/item/reagent_containers/food/snacks/spidermeat = 2, /obj/item/reagent_containers/food/snacks/spiderleg = 8) response_help = "pets" response_disarm = "gently pushes aside" diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 48c7a24f855..c82a0ee7806 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -59,9 +59,6 @@ return target.attack_animal(src) - - - /obj/item/organ/internal/body_egg/changeling_egg name = "changeling egg" desc = "Twitching and disgusting." @@ -91,7 +88,12 @@ if(origin.changeling.can_absorb_dna(M, owner)) origin.changeling.absorb_dna(owner, M) - origin.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) + var/datum/action/changeling/humanform/HF = new + HF.Grant(M) + for(var/power in origin.changeling.purchasedpowers) + var/datum/action/changeling/S = power + if(istype(S) && S.needs_button) + S.Grant(M) M.key = origin.key owner.gib() diff --git a/code/modules/mob/living/simple_animal/hostile/hellhound.dm b/code/modules/mob/living/simple_animal/hostile/hellhound.dm index 450f6767892..f3e110d0099 100644 --- a/code/modules/mob/living/simple_animal/hostile/hellhound.dm +++ b/code/modules/mob/living/simple_animal/hostile/hellhound.dm @@ -71,7 +71,7 @@ else if(health > (maxHealth*0.25)) msgs += "It is covered in wounds!" if(resting) - if(bruteloss > 0 || fireloss > 0) + if(getBruteLoss() || getFireLoss()) msgs += "It is currently licking its wounds, regenerating the damage to its body!" else msgs += "It is currently resting." @@ -79,7 +79,7 @@ /mob/living/simple_animal/hostile/hellhound/Life(seconds, times_fired) . = ..() - if(stat != DEAD && resting && (bruteloss > 0) || (fireloss > 0)) + if(stat != DEAD && resting && (getBruteLoss() || getFireLoss())) if(life_regen_cycles >= life_regen_cycle_trigger) life_regen_cycles = 0 to_chat(src, "You lick your wounds, helping them close.") @@ -91,7 +91,7 @@ /mob/living/simple_animal/hostile/hellhound/proc/wants_to_rest() if(target) return FALSE - if(bruteloss > 0 || fireloss > 0) + if(getBruteLoss() || getFireLoss()) return TRUE return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index ccbd37f2f4c..9c787639ba4 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -30,8 +30,6 @@ var/stat_exclusive = 0 //Mobs with this set to 1 will exclusively attack things defined by stat_attack, stat_attack 2 means they will only attack corpses var/attack_same = 0 //Set us to 1 to allow us to attack our own faction, or 2, to only ever attack our own faction - var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever) - //typecache of things this mob will attack in DestroySurroundings() if it has environment_smash var/list/environment_target_typecache = list( /obj/machinery/door/window, @@ -48,11 +46,17 @@ var/list/emote_taunt = list() var/taunt_chance = 0 + var/lose_patience_timer_id //id for a timer to call LoseTarget(), used to stop mobs fixating on a target they can't reach + var/lose_patience_timeout = 300 //30 seconds by default, so there's no major changes to AI behaviour, beyond actually bailing if stuck forever + + var/attack_all_objects = FALSE //if true, equivalent to having a wanted_objects list containing ALL objects. + /mob/living/simple_animal/hostile/New() ..() if(!targets_from) targets_from = src environment_target_typecache = typecacheof(environment_target_typecache) + wanted_objects = typecacheof(wanted_objects) /mob/living/simple_animal/hostile/Destroy() targets_from = null @@ -63,13 +67,7 @@ . = ..() if(!.) walk(src, 0) - return 0 - -/mob/living/simple_animal/hostile/process_ai() - ..() - if(!AICanContinue()) - return 0 - return 1 + return FALSE /mob/living/simple_animal/hostile/handle_automated_action() if(AIStatus == AI_OFF) @@ -82,7 +80,7 @@ DestroySurroundings() if(!MoveToTarget(possible_targets)) //if we lose our target if(AIShouldSleep(possible_targets)) // we try to acquire a new one - AIStatus = AI_IDLE // otherwise we go idle + toggle_ai(AI_IDLE) // otherwise we go idle return 1 /mob/living/simple_animal/hostile/attacked_by(obj/item/I, mob/living/user) @@ -205,13 +203,15 @@ return 0 return 1 if(isobj(the_target)) - if(is_type_in_list(the_target, wanted_objects)) + if(attack_all_objects || is_type_in_list(the_target, wanted_objects)) return 1 return 0 /mob/living/simple_animal/hostile/proc/GiveTarget(new_target)//Step 4, give us our selected target target = new_target + LosePatience() if(target != null) + GainPatience() Aggro() return 1 @@ -238,6 +238,7 @@ if(target) if(targets_from && isturf(targets_from.loc) && target.Adjacent(targets_from)) //If they're next to us, attack AttackingTarget() + GainPatience() return 1 return 0 if(environment_smash) @@ -263,8 +264,8 @@ if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight search_objects = 0 target = null - if(AIStatus == AI_IDLE) - AIStatus = AI_ON + if(AIStatus != AI_ON && AIStatus != AI_OFF) + toggle_ai(AI_ON) FindTarget() else if(target != null && prob(40))//No more pulling a mob forever and having a second player attack it, it can switch targets now if it finds a more suitable one FindTarget() @@ -400,9 +401,54 @@ if(AI_IDLE) if(FindTarget(possible_targets, 1)) . = 1 - AIStatus = AI_ON //Wake up for more than one Life() cycle. + toggle_ai(AI_ON) //Wake up for more than one Life() cycle. else . = 0 /mob/living/simple_animal/hostile/proc/AIShouldSleep(var/list/possible_targets) return !FindTarget(possible_targets, 1) + + +//These two procs handle losing our target if we've failed to attack them for +//more than lose_patience_timeout deciseconds, which probably means we're stuck +/mob/living/simple_animal/hostile/proc/GainPatience() + if(lose_patience_timeout) + LosePatience() + lose_patience_timer_id = addtimer(CALLBACK(src, .proc/LoseTarget), lose_patience_timeout, TIMER_STOPPABLE) + +/mob/living/simple_animal/hostile/proc/LosePatience() + deltimer(lose_patience_timer_id) + +/mob/living/simple_animal/hostile/consider_wakeup() + ..() + var/list/tlist + var/turf/T = get_turf(src) + + if(!T) + return + + if(!length(SSmobs.clients_by_zlevel[T.z])) // It's fine to use .len here but doesn't compile on 511 + toggle_ai(AI_Z_OFF) + return + + var/cheap_search = isturf(T) && !is_station_level(T.z) + if(cheap_search) + tlist = ListTargetsLazy(T.z) + else + tlist = ListTargets() + + if(AIStatus == AI_IDLE && FindTarget(tlist, 1)) + if(cheap_search) //Try again with full effort + FindTarget() + toggle_ai(AI_ON) + +/mob/living/simple_animal/hostile/proc/ListTargetsLazy(var/_Z)//Step 1, find out what we can see + var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/spacepod)) + . = list() + for(var/I in SSmobs.clients_by_zlevel[_Z]) + var/mob/M = I + if(get_dist(M, src) < vision_range) + if(isturf(M.loc)) + . += M + else if(M.loc.type in hostile_machines) + . += M.loc 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 new file mode 100644 index 00000000000..7fd32bd71ec --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -0,0 +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) + +#undef MINER_DASH_RANGE \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 66d66e706a7..a53b8092e54 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -1,5 +1,3 @@ -#define MEDAL_PREFIX "Bubblegum" - /* BUBBLEGUM @@ -46,7 +44,7 @@ Difficulty: Hard del_on_death = 1 loot = list(/obj/structure/closet/crate/necropolis/bubblegum) var/charging = 0 - medal_type = MEDAL_PREFIX + medal_type = BOSS_MEDAL_BUBBLEGUM score_type = BUBBLEGUM_SCORE deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... " death_sound = 'sound/misc/enter_blood.ogg' @@ -389,5 +387,3 @@ Difficulty: Hard if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum)) return 1 return 0 - -#undef MEDAL_PREFIX \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index e5bb62ecd9b..5d66061335c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -1,5 +1,4 @@ -#define MEDAL_PREFIX "Colossus" /* COLOSSUS @@ -44,7 +43,7 @@ Difficulty: Very Hard ranged = 1 pixel_x = -32 del_on_death = 1 - medal_type = MEDAL_PREFIX + medal_type = BOSS_MEDAL_COLOSSUS score_type = COLOSSUS_SCORE loot = list(/obj/machinery/anomalous_crystal/random, /obj/item/organ/internal/vocal_cords/colossus) butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) @@ -262,5 +261,3 @@ Difficulty: Very Hard gpstag = "Angelic Signal" desc = "Get in the fucking robot." invisibility = 100 - -#undef MEDAL_PREFIX diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm similarity index 98% rename from code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm rename to code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 36e29b8dfaf..68db8cb1274 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -1,4 +1,3 @@ -#define MEDAL_PREFIX "Drake" /* ASH DRAKE @@ -48,7 +47,7 @@ Difficulty: Medium butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) var/swooping = 0 var/swoop_cooldown = 0 - medal_type = MEDAL_PREFIX + medal_type = BOSS_MEDAL_DRAKE score_type = DRAKE_SCORE deathmessage = "collapses into a pile of bones, its flesh sloughing away." death_sound = 'sound/misc/demon_dies.ogg' @@ -131,7 +130,7 @@ Difficulty: Medium playsound(T,'sound/magic/fireball.ogg', 200, 1) new /obj/effect/temp_visual/fireball(T) sleep(12) - explosion(T, 0, 0, 1, 0, 0, 0, 1) + explosion(T, 0, 0, 1, 0, 0, 0, 1, 1) /mob/living/simple_animal/hostile/megafauna/dragon/OpenFire() anger_modifier = Clamp(((maxHealth - health)/50),0,20) @@ -274,6 +273,4 @@ Difficulty: Medium loot = list() /mob/living/simple_animal/hostile/megafauna/dragon/lesser/grant_achievement(medaltype,scoretype) - return - -#undef MEDAL_PREFIX \ No newline at end of file + return \ 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 cf16c118777..7f974149556 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -1,4 +1,3 @@ -#define MEDAL_PREFIX "Hierophant" /* The Hierophant @@ -66,8 +65,8 @@ Difficulty: Hard var/did_reset = TRUE //if we timed out, returned to our rune, and healed some //var/list/kill_phrases = list("Wsyvgi sj irivkc xettih. Vitemvmrk...", "Irivkc wsyvgi jsyrh. Vitemvmrk...", "Jyip jsyrh. Egxmzexmrk vitemv gcgpiw...") //var/list/target_phrases = list("Xevkix psgexih.", "Iriqc jsyrh.", "Eguymvih xevkix.") - medal_type = MEDAL_PREFIX - score_type = BIRD_SCORE + medal_type = BOSS_MEDAL_HIEROPHANT + score_type = HIEROPHANT_SCORE del_on_death = TRUE death_sound = 'sound/magic/repulse.ogg' @@ -497,6 +496,7 @@ Difficulty: Hard icon = 'icons/effects/effects.dmi' icon_state = "hierophant_blast" name = "vortex blast" + layer = 3.9 // between LYING_MOB_LAYER and ABOVE_MOB_LAYER luminosity = 1 desc = "Get out of the way!" duration = 9 @@ -527,7 +527,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)) @@ -591,24 +591,3 @@ Difficulty: Hard gpstag = "Zealous Signal" desc = "Heed its words." invisibility = 100 - -/turf/simulated/indestructible/hierophant - icon_state = "hierophant1" - oxygen = 14 - nitrogen = 23 - temperature = 300 - desc = "A floor with a square pattern. It's faintly cool to the touch." - -/turf/simulated/indestructible/hierophant/New() - ..() - if(prob(50)) - icon_state = "hierophant2" - -/turf/simulated/indestructible/riveted/hierophant - name = "wall" - desc = "A wall made out of smooth, cold stone." - icon = 'icons/turf/walls/hierophant_wall.dmi' - icon_state = "hierophant" - smooth = SMOOTH_TRUE - -#undef MEDAL_PREFIX diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index e3c9dbbf61b..027bbb60a14 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -1,4 +1,3 @@ -#define MEDAL_PREFIX "Legion" /* LEGION @@ -31,6 +30,7 @@ Difficulty: Medium armour_penetration = 50 melee_damage_lower = 25 melee_damage_upper = 25 + wander = 0 speed = 2 ranged = 1 del_on_death = 1 @@ -39,7 +39,7 @@ Difficulty: Medium ranged_cooldown_time = 20 var/size = 5 var/charging = 0 - medal_type = MEDAL_PREFIX + medal_type = BOSS_MEDAL_LEGION score_type = LEGION_SCORE pixel_y = -90 pixel_x = -75 @@ -143,5 +143,3 @@ Difficulty: Medium gpstag = "Echoing Signal" desc = "The message repeats." invisibility = 100 - -#undef MEDAL_PREFIX diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 870b3bf62cc..a32aceb33e3 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -1,5 +1,3 @@ -#define MEDAL_PREFIX "Boss" - /mob/living/simple_animal/hostile/megafauna name = "megafauna" desc = "Attack the weak point for massive damage." @@ -33,7 +31,7 @@ /obj/structure/barricade, /obj/machinery/field, /obj/machinery/power/emitter) - var/medal_type = MEDAL_PREFIX + var/medal_type var/score_type = BOSS_SCORE var/elimination = 0 var/anger_modifier = 0 @@ -42,7 +40,7 @@ move_resist = MOVE_FORCE_OVERPOWERING pull_force = MOVE_FORCE_OVERPOWERING mob_size = MOB_SIZE_LARGE - layer = MOB_LAYER + 0.5 //Looks weird with them slipping under mineral walls and cameras and shit otherwise + layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway /mob/living/simple_animal/hostile/megafauna/Destroy() @@ -102,122 +100,16 @@ if(3) adjustBruteLoss(50) -/mob/living/simple_animal/hostile/megafauna/proc/grant_achievement(medaltype,scoretype) +/mob/living/simple_animal/hostile/megafauna/proc/grant_achievement(medaltype, scoretype, crusher_kill) + if(!medal_type || admin_spawned || !SSmedals.hub_enabled) //Don't award medals if the medal type isn't set + return FALSE - if(medal_type == "Boss") //Don't award medals if the medal type isn't set - return - - if(admin_spawned) - return - - if(global.medal_hub && global.medal_pass && global.medals_enabled) - for(var/mob/living/L in view(7,src)) - if(L.stat) - continue - if(L.client) - var/client/C = L.client - var/suffixm = BOSS_KILL_MEDAL - UnlockMedal("Boss [suffixm]",C) - UnlockMedal("[medaltype] [suffixm]",C) - SetScore(BOSS_SCORE,C,1) - SetScore(score_type,C,1) - -/proc/UnlockMedal(medal,client/player) - - if(!player || !medal) - return - if(global.medal_hub && global.medal_pass && global.medals_enabled) - spawn() - var/result = world.SetMedal(medal, player, global.medal_hub, global.medal_pass) - if(isnull(result)) - global.medals_enabled = FALSE - log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.ckey]") - message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!") - else if(result) - to_chat(player.mob, "Achievement unlocked: [medal]!") - - -/proc/SetScore(score,client/player,increment,force) - - if(!score || !player) - return - if(global.medal_hub && global.medal_pass && global.medals_enabled) - spawn() - var/list/oldscore = GetScore(score,player,1) - - if(increment) - if(!oldscore[score]) - oldscore[score] = 1 - else - oldscore[score] = (text2num(oldscore[score]) + 1) - else - oldscore[score] = force - - var/newscoreparam = list2params(oldscore) - - var/result = world.SetScores(player.ckey, newscoreparam, global.medal_hub, global.medal_pass) - - if(isnull(result)) - global.medals_enabled = FALSE - log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.ckey]") - message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!") - - -/proc/GetScore(score,client/player,returnlist) - - if(!score || !player) - return - if(global.medal_hub && global.medal_pass && global.medals_enabled) - - var/scoreget = world.GetScores(player.ckey, score, global.medal_hub, global.medal_pass) - if(isnull(scoreget)) - global.medals_enabled = FALSE - log_game("SCORE ERROR: Could not contact hub to get score. Score:[score] player:[player.ckey]") - message_admins("Error! Failed to contact hub to get score: [score] for [player.ckey]!") - return - - var/list/scoregetlist = params2list(scoreget) - - if(returnlist) - return scoregetlist - else - return scoregetlist[score] - - -/proc/CheckMedal(medal,client/player) - - if(!player || !medal) - return - if(global.medal_hub && global.medal_pass && global.medals_enabled) - - var/result = world.GetMedal(medal, player, global.medal_hub, global.medal_pass) - - if(isnull(result)) - global.medals_enabled = FALSE - log_game("MEDAL ERROR: Could not contact hub to get medal:[medal] player:[player.ckey]") - message_admins("Error! Failed to contact hub to get [medal] medal for [player.ckey]!") - else if(result) - to_chat(player.mob, "[medal] is unlocked") - -/proc/LockMedal(medal,client/player) - - if(!player || !medal) - return - if(global.medal_hub && global.medal_pass && global.medals_enabled) - - var/result = world.ClearMedal(medal, player, global.medal_hub, global.medal_pass) - - if(isnull(result)) - global.medals_enabled = FALSE - log_game("MEDAL ERROR: Could not contact hub to clear medal:[medal] player:[player.ckey]") - message_admins("Error! Failed to contact hub to clear [medal] medal for [player.ckey]!") - else if(result) - message_admins("Medal: [medal] removed for [player.ckey]") - else - message_admins("Medal: [medal] was not found for [player.ckey]. Unable to clear.") - - -/proc/ClearScore(client/player) - world.SetScores(player.ckey, "", global.medal_hub, global.medal_pass) - -#undef MEDAL_PREFIX + for(var/mob/living/L in view(7,src)) + if(L.stat || !L.client) + continue + var/client/C = L.client + SSmedals.UnlockMedal("Boss [BOSS_KILL_MEDAL]", C) + SSmedals.UnlockMedal("[medaltype] [BOSS_KILL_MEDAL]", C) + SSmedals.SetScore(BOSS_SCORE, C, 1) + SSmedals.SetScore(score_type, C, 1) + return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm new file mode 100644 index 00000000000..fa2479bb658 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -0,0 +1,288 @@ +/* + +Swarmer Beacon + +A strange machine appears anywhere a normal lavaland mob can it produces a swarmer at a rate of +1/15 seconds, until there are GetTotalAISwarmerCap()/2 swarmers, after this it is up to the swarmers themselves to +increase their population (it will repopulate them should they fall under GetTotalAISwarmerCap()/2 again) + +tl;dr A million of the little hellraisers spawn (controlled by AI) and try to eat mining + +Loot: Not much, besides a shit load of artificial bluespace crystals, Oh and mining doesn't get eaten +that's a plus I suppose. + +Difficulty: Special + +*/ + +GLOBAL_LIST_EMPTY(AISwarmers) +GLOBAL_LIST_EMPTY(AISwarmersByType)//AISwarmersByType[.../resource] = list(1st, 2nd, nth), AISwarmersByType[../ranged] = list(1st, 2nd, nth) etc. +GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swarmer/ai/resource = 30, /mob/living/simple_animal/hostile/swarmer/ai/ranged_combat = 20, /mob/living/simple_animal/hostile/swarmer/ai/melee_combat = 10)) + + +//returns a type of AI swarmer that is NOT at max cap +//type order is shuffled, to prevent bias +/proc/GetUncappedAISwarmerType() + var/static/list/swarmerTypes = subtypesof(/mob/living/simple_animal/hostile/swarmer/ai) + LAZYINITLIST(GLOB.AISwarmersByType) + for(var/t in shuffle(swarmerTypes)) + var/list/amount = GLOB.AISwarmersByType[t] + if(!amount || amount.len < GLOB.AISwarmerCapsByType[t]) + return t + + +//Total of all subtype caps +/proc/GetTotalAISwarmerCap() + var/static/list/swarmerTypes = subtypesof(/mob/living/simple_animal/hostile/swarmer/ai) + . = 0 + LAZYINITLIST(GLOB.AISwarmersByType) + for(var/t in swarmerTypes) + . += GLOB.AISwarmerCapsByType[t] + + +/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon + name = "swarmer beacon" + desc = "That name is a bit of a mouthful, but stop paying attention to your mouth they're eating everything!" + icon = 'icons/mob/swarmer.dmi' + icon_state = "swarmer_console" + health = 750 + maxHealth = 750 //""""low-ish"""" HP because it's a passive boss, and the swarm itself is the real foe + internal_gps = /obj/item/gps/internal/swarmer_beacon + medal_type = BOSS_MEDAL_SWARMERS + score_type = SWARMER_BEACON_SCORE + faction = list("mining", "boss", "swarmer") + weather_immunities = list("lava","ash") + stop_automated_movement = TRUE + wander = FALSE + layer = BELOW_MOB_LAYER + AIStatus = AI_OFF + var/swarmer_spawn_cooldown = 0 + var/swarmer_spawn_cooldown_amt = 150 //Deciseconds between the swarmers we spawn + var/call_help_cooldown = 0 + var/call_help_cooldown_amt = 150 //Deciseconds between calling swarmers to help us when attacked + var/static/list/swarmer_caps + + +/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Initialize(mapload) + . = ..() + swarmer_caps = GLOB.AISwarmerCapsByType //for admin-edits + for(var/ddir in cardinal) + new /obj/structure/swarmer/blockade (get_step(src, ddir)) + var/mob/living/simple_animal/hostile/swarmer/ai/resource/R = new(loc) + step(R, ddir) //Step the swarmers, instead of spawning them there, incase the turf is solid + + +/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Life() + . = ..() + if(.) + var/createtype = GetUncappedAISwarmerType() + if(createtype && world.time > swarmer_spawn_cooldown && GLOB.AISwarmers.len < (GetTotalAISwarmerCap()*0.5)) + swarmer_spawn_cooldown = world.time + swarmer_spawn_cooldown_amt + new createtype(loc) + + +/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + . = ..() + if(. > 0 && world.time > call_help_cooldown) + call_help_cooldown = world.time + call_help_cooldown_amt + summon_backup(25) //long range, only called max once per 15 seconds, so it's not deathlag + + +/obj/item/gps/internal/swarmer_beacon + icon_state = null + gpstag = "Hungry Signal" + desc = "Transmitted over the signal is a strange message repeated in every language you know of, and some you don't too..." //the message is "nom nom nom" + invisibility = 100 + +//SWARMER AI +//AI versions of the swarmer mini-antag +//This is an Abstract Base, it re-enables AI, but does not give the swarmer any goals/targets +/mob/living/simple_animal/hostile/swarmer/ai + wander = 1 + faction = list("swarmer", "mining") + weather_immunities = list("ash") //wouldn't be fun otherwise + AIStatus = AI_ON + +/mob/living/simple_animal/hostile/swarmer/ai/Initialize(mapload) + . = ..() + ToggleLight() //so you can see them eating you out of house and home/shooting you/stunlocking you for eternity + LAZYINITLIST(GLOB.AISwarmersByType[type]) + GLOB.AISwarmers += src + GLOB.AISwarmersByType[type] += src + + +/mob/living/simple_animal/hostile/swarmer/ai/Destroy() + GLOB.AISwarmers -= src + GLOB.AISwarmersByType[type] -= src + return ..() + + +/mob/living/simple_animal/hostile/swarmer/ai/SwarmerTypeToCreate() + return GetUncappedAISwarmerType() + + +/mob/living/simple_animal/hostile/swarmer/ai/resource/handle_automated_action() + . = ..() + if(.) + if(!stop_automated_movement) + if(health < maxHealth*0.25) + StartAction(100) + RepairSelf() + return + + +/mob/living/simple_animal/hostile/swarmer/ai/Move(atom/newloc) + if(newloc) + if(newloc.z == z) //so these actions are Z-specific + if(islava(newloc)) + var/turf/simulated/floor/plating/lava/L = newloc + if(!L.is_safe()) + StartAction(20) + new /obj/structure/lattice/catwalk/swarmer_catwalk(newloc) + return FALSE + + if(ischasm(newloc) && !throwing) + throw_at(get_edge_target_turf(src, get_dir(src, newloc)), 7 , 3, src, FALSE) //my planet needs me + return FALSE + + return ..() + + +/mob/living/simple_animal/hostile/swarmer/ai/proc/StartAction(deci = 0) + stop_automated_movement = TRUE + AIStatus = AI_OFF + addtimer(CALLBACK(src, .proc/EndAction), deci) + + +/mob/living/simple_animal/hostile/swarmer/ai/proc/EndAction() + stop_automated_movement = FALSE + AIStatus = AI_ON + + + + +//RESOURCE SWARMER: +//Similar to the original Player-Swarmers, these dismantle things to obtain the metal inside +//They then use this medal to produce more swarmers or traps/barricades + +/mob/living/simple_animal/hostile/swarmer/ai/resource + search_objects = 1 + attack_all_objects = TRUE //attempt to nibble everything + lose_patience_timeout = 150 + var/static/list/sharedWanted = typecacheof(list(/turf/simulated/mineral, /turf/simulated/wall)) //eat rocks and walls + var/static/list/sharedIgnore = list() + +//This handles viable things to eat/attack +//Place specific cases of AI derpiness here +//Most can be left to the automatic Gain/LosePatience() system +/mob/living/simple_animal/hostile/swarmer/ai/resource/CanAttack(atom/the_target) + + //SPECIFIC CASES: + //Smash fulltile windows before grilles + if(istype(the_target, /obj/structure/grille)) + for(var/obj/structure/window/rogueWindow in get_turf(the_target)) + if(rogueWindow.fulltile) //done this way because the subtypes are weird. + the_target = rogueWindow + break + + //GENERAL CASES: + if(is_type_in_typecache(the_target, sharedIgnore)) //always ignore + return FALSE + if(is_type_in_typecache(the_target, sharedWanted)) //always eat + return TRUE + + return ..() //else, have a nibble, see if it's food + + +/mob/living/simple_animal/hostile/swarmer/ai/resource/OpenFire(atom/A) + if(isliving(A)) //don't shoot rocks, sillies. + ..() + + +/mob/living/simple_animal/hostile/swarmer/ai/resource/AttackingTarget() + if(target.swarmer_act(src)) + add_type_to_wanted(target.type) + return TRUE + else + add_type_to_ignore(target.type) + return FALSE + + +/mob/living/simple_animal/hostile/swarmer/ai/resource/handle_automated_action() + . = ..() + if(.) + if(!stop_automated_movement) + if(GLOB.AISwarmers.len < GetTotalAISwarmerCap() && resources >= 50) + StartAction(100) //so they'll actually sit still and use the verbs + CreateSwarmer() + return + + if(resources > 5) + if(prob(5)) //lower odds, as to prioritise reproduction + StartAction(10) //not a typo + CreateBarricade() + return + if(prob(5)) + CreateTrap() + return + + +//So swarmers can learn what is and isn't food +/mob/living/simple_animal/hostile/swarmer/ai/resource/proc/add_type_to_wanted(typepath) + if(!sharedWanted[typepath])// this and += is faster than |= + sharedWanted += typecacheof(typepath) + + +/mob/living/simple_animal/hostile/swarmer/ai/resource/proc/add_type_to_ignore(typepath) + if(!sharedIgnore[typepath]) + sharedIgnore += typecacheof(typepath) + + +//RANGED SWARMER +/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat + icon_state = "swarmer_ranged" + icon_living = "swarmer_ranged" + projectiletype = /obj/item/projectile/beam/laser + projectilesound = 'sound/weapons/laser.ogg' + check_friendly_fire = TRUE //you're supposed to protect the resource swarmers, you poop + retreat_distance = 3 + minimum_distance = 3 + +/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat/Aggro() + ..() + summon_backup(15, TRUE) //Exact matching, so that goliaths don't come to aid the swarmers, that'd be silly + + +//MELEE SWARMER +/mob/living/simple_animal/hostile/swarmer/ai/melee_combat + icon_state = "swarmer_melee" + icon_living = "swarmer_melee" + health = 60 + maxHealth = 60 + ranged = FALSE + +/mob/living/simple_animal/hostile/swarmer/ai/melee_combat/Aggro() + ..() + summon_backup(15, TRUE) + + +/mob/living/simple_animal/hostile/swarmer/ai/melee_combat/AttackingTarget() + if(isliving(target)) + if(prob(35)) + StartAction(30) + DisperseTarget(target) + else + var/mob/living/L = target + L.attack_animal(src) + L.electrocute_act(10, src, safety = TRUE) //safety = TRUE means we don't check gloves... Ok? + return TRUE + else + return ..() + +//SWARMER CATWALKS +//Used so they can survive lavaland better +/obj/structure/lattice/catwalk/swarmer_catwalk + name = "swarmer catwalk" + desc = "A catwalk-like mesh, produced by swarmers to allow them to navigate hostile terrain." + icon = 'icons/obj/smooth_structures/swarmer_catwalk.dmi' + icon_state = "swarmer_catwalk" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm new file mode 100644 index 00000000000..28aacd37a73 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm @@ -0,0 +1,140 @@ +/mob/living/simple_animal/hostile/asteroid/basilisk + name = "basilisk" + desc = "A territorial beast, covered in a thick shell that absorbs energy. Its stare causes victims to freeze from the inside." + icon = 'icons/mob/animal.dmi' + icon_state = "Basilisk" + icon_living = "Basilisk" + icon_aggro = "Basilisk_alert" + icon_dead = "Basilisk_dead" + icon_gib = "syndicate_gib" + move_to_delay = 20 + projectiletype = /obj/item/projectile/temp/basilisk + projectilesound = 'sound/weapons/pierce.ogg' + ranged = 1 + ranged_message = "stares" + ranged_cooldown_time = 30 + throw_message = "does nothing against the hard shell of" + vision_range = 2 + speed = 3 + maxHealth = 200 + health = 200 + harm_intent_damage = 5 + obj_damage = 60 + melee_damage_lower = 12 + melee_damage_upper = 12 + attacktext = "bites into" + a_intent = INTENT_HARM + speak_emote = list("chitters") + attack_sound = 'sound/weapons/bladeslice.ogg' + aggro_vision_range = 9 + idle_vision_range = 2 + turns_per_move = 5 + loot = list(/obj/item/stack/ore/diamond{layer = 4.1}, + /obj/item/stack/ore/diamond{layer = 4.1}) + +/obj/item/projectile/temp/basilisk + name = "freezing blast" + icon_state = "ice_2" + damage = 0 + damage_type = BURN + nodamage = 1 + flag = "energy" + temperature = 50 + +/mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(var/new_target) + if(..()) //we have a target + if(isliving(target)) + var/mob/living/L = target + if(L.bodytemperature > 261) + L.bodytemperature = 261 + visible_message("The [src.name]'s stare chills [L.name] to the bone!") + +/mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity) + switch(severity) + if(1.0) + gib() + if(2.0) + adjustBruteLoss(140) + if(3.0) + adjustBruteLoss(110) + +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher + name = "watcher" + desc = "A levitating, eye-like creature held aloft by winglike formations of sinew. A sharp spine of crystal protrudes from its body." + icon = 'icons/mob/lavaland/watcher.dmi' + icon_state = "watcher" + icon_living = "watcher" + icon_aggro = "watcher" + icon_dead = "watcher_dead" + pixel_x = -10 + throw_message = "bounces harmlessly off of" + melee_damage_lower = 15 + melee_damage_upper = 15 + attacktext = "impales" + a_intent = INTENT_HARM + speak_emote = list("telepathically cries") + attack_sound = 'sound/weapons/bladeslice.ogg' + stat_attack = 1 + flying = TRUE + robust_searching = 1 + loot = list() + butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1) + +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/Initialize() + . = ..() + if(prob(1)) + if(prob(75)) + new /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing(loc) + else + new /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing(loc) + return INITIALIZE_HINT_QDEL + +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing + name = "magmawing watcher" + desc = "When raised very close to lava, some watchers adapt to the extreme heat and use lava as both a weapon and wings." + icon_state = "watcher_magmawing" + icon_living = "watcher_magmawing" + icon_aggro = "watcher_magmawing" + icon_dead = "watcher_magmawing_dead" + maxHealth = 215 //Compensate for the lack of slowdown on projectiles with a bit of extra health + health = 215 + light_range = 3 + light_power = 2.5 + light_color = LIGHT_COLOR_ORANGE + projectiletype = /obj/item/projectile/temp/basilisk/magmawing + +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing + name = "icewing watcher" + desc = "Very rarely, some watchers will eke out an existence far from heat sources. In the absence of warmth, they become icy and fragile but fire much stronger freezing blasts." + icon_state = "watcher_icewing" + icon_living = "watcher_icewing" + icon_aggro = "watcher_icewing" + icon_dead = "watcher_icewing_dead" + maxHealth = 170 + health = 170 + projectiletype = /obj/item/projectile/temp/basilisk/icewing + butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) //No sinew; the wings are too fragile to be usable + +/obj/item/projectile/temp/basilisk/magmawing + name = "scorching blast" + icon_state = "lava" + damage = 5 + damage_type = BURN + nodamage = FALSE + temperature = 500 //Heats you up! + +/obj/item/projectile/temp/basilisk/magmawing/on_hit(atom/target, blocked = FALSE) + . = ..() + if(.) + var/mob/living/L = target + if (istype(L)) + L.adjust_fire_stacks(0.1) + L.IgniteMob() + +/obj/item/projectile/temp/basilisk/icewing + damage = 5 + damage_type = BURN + nodamage = FALSE + +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril + fromtendril = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm new file mode 100644 index 00000000000..a1c488b4068 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm @@ -0,0 +1,190 @@ +/mob/living/simple_animal/hostile/asteroid/goliath + name = "goliath" + desc = "A massive beast that uses long tentacles to ensare its prey, threatening them is not advised under any conditions." + icon = 'icons/mob/animal.dmi' + icon_state = "Goliath" + icon_living = "Goliath" + icon_aggro = "Goliath_alert" + icon_dead = "Goliath_dead" + icon_gib = "syndicate_gib" + attack_sound = 'sound/weapons/punch4.ogg' + mouse_opacity = MOUSE_OPACITY_OPAQUE + move_to_delay = 40 + ranged = TRUE + ranged_cooldown = 2 //By default, start the Goliath with his cooldown off so that people can run away quickly on first sight + ranged_cooldown_time = 120 + friendly = "wails at" + speak_emote = list("bellows") + vision_range = 4 + speed = 3 + maxHealth = 300 + health = 300 + harm_intent_damage = 1 //Only the manliest of men can kill a Goliath with only their fists. + obj_damage = 100 + melee_damage_lower = 25 + melee_damage_upper = 25 + attacktext = "pulverizes" + attack_sound = 'sound/weapons/punch1.ogg' + throw_message = "does nothing to the rocky hide of the" + aggro_vision_range = 9 + idle_vision_range = 5 + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG + var/pre_attack = FALSE + var/pre_attack_icon = "Goliath_preattack" + loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) + +/mob/living/simple_animal/hostile/asteroid/goliath/Life() + . = ..() + handle_preattack() + +/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack() + if(ranged_cooldown <= world.time + ranged_cooldown_time * 0.25 && !pre_attack) + pre_attack++ + if(!pre_attack || stat || AIStatus == AI_IDLE) + return + icon_state = pre_attack_icon + +/mob/living/simple_animal/hostile/asteroid/goliath/revive() + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG + ..() + +/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire() + var/tturf = get_turf(target) + if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen + visible_message("The [src.name] digs its tentacles under [target.name]!") + new /obj/effect/temp_visual/goliath_tentacle/original(tturf, src) + ranged_cooldown = world.time + ranged_cooldown_time + icon_state = icon_aggro + pre_attack = FALSE + +/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(damage) + ranged_cooldown-- + handle_preattack() + ..() + +/mob/living/simple_animal/hostile/asteroid/goliath/Aggro() + vision_range = aggro_vision_range + handle_preattack() + if(icon_state != icon_aggro) + icon_state = icon_aggro + +// Lavaland Goliath +/mob/living/simple_animal/hostile/asteroid/goliath/beast + name = "goliath" + desc = "A hulking, armor-plated beast with long tendrils arching from its back." + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' + icon_state = "goliath" + icon_living = "goliath" + icon_aggro = "goliath" + icon_dead = "goliath_dead" + throw_message = "does nothing to the tough hide of the" + pre_attack_icon = "goliath2" + butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2) + loot = list() + stat_attack = TRUE + robust_searching = TRUE + +/mob/living/simple_animal/hostile/asteroid/goliath/beast/random/Initialize() + . = ..() + if(prob(1)) + new /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient(loc) + return INITIALIZE_HINT_QDEL + +/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient + name = "ancient goliath" + desc = "Goliaths are biologically immortal, and rare specimens have survived for centuries. This one is clearly ancient, and its tentacles constantly churn the earth around it." + icon_state = "Goliath" + icon_living = "Goliath" + icon_aggro = "Goliath_alert" + icon_dead = "Goliath_dead" + maxHealth = 400 + health = 400 + speed = 4 + pre_attack_icon = "Goliath_preattack" + throw_message = "does nothing to the rocky hide of the" + loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) //A throwback to the asteroid days + butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/bone = 2) + wander = FALSE + var/list/cached_tentacle_turfs + var/turf/last_location + var/tentacle_recheck_cooldown = 100 + +/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/Life() + . = ..() + if(!.) // dead + return + if(isturf(loc)) + if(!LAZYLEN(cached_tentacle_turfs) || loc != last_location || tentacle_recheck_cooldown <= world.time) + LAZYCLEARLIST(cached_tentacle_turfs) + last_location = loc + tentacle_recheck_cooldown = world.time + initial(tentacle_recheck_cooldown) + for(var/turf/simulated/floor/T in orange(4, loc)) + LAZYADD(cached_tentacle_turfs, T) + for(var/t in cached_tentacle_turfs) + if(isfloorturf(t)) + if(prob(10)) + new /obj/effect/temp_visual/goliath_tentacle(t, src) + else + cached_tentacle_turfs -= t + +/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril + fromtendril = TRUE + +// Tentacles +/obj/effect/temp_visual/goliath_tentacle + name = "goliath tentacle" + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' + icon_state = "Goliath_tentacle_spawn" + layer = BELOW_MOB_LAYER + var/mob/living/spawner + +/obj/effect/temp_visual/goliath_tentacle/Initialize(mapload, mob/living/new_spawner) + . = ..() + for(var/obj/effect/temp_visual/goliath_tentacle/T in loc) + if(T != src) + return INITIALIZE_HINT_QDEL + if(!QDELETED(new_spawner)) + spawner = new_spawner + if(ismineralturf(loc)) + var/turf/simulated/mineral/M = loc + M.gets_drilled() + deltimer(timerid) + timerid = addtimer(CALLBACK(src, .proc/tripanim), 7, TIMER_STOPPABLE) + +/obj/effect/temp_visual/goliath_tentacle/original/Initialize(mapload, new_spawner) + . = ..() + var/list/directions = cardinal.Copy() + for(var/i in 1 to 3) + var/spawndir = pick_n_take(directions) + var/turf/T = get_step(src, spawndir) + if(T) + new /obj/effect/temp_visual/goliath_tentacle(T, spawner) + +/obj/effect/temp_visual/goliath_tentacle/proc/tripanim() + icon_state = "Goliath_tentacle_wiggle" + deltimer(timerid) + timerid = addtimer(CALLBACK(src, .proc/trip), 3, TIMER_STOPPABLE) + +/obj/effect/temp_visual/goliath_tentacle/proc/trip() + var/latched = FALSE + for(var/mob/living/L in loc) + if((!QDELETED(spawner) && spawner.faction_check_mob(L)) || L.stat == DEAD) + continue + visible_message("[src] grabs hold of [L]!") + L.Stun(5) + L.adjustBruteLoss(rand(10,15)) + latched = TRUE + if(!latched) + retract() + else + deltimer(timerid) + timerid = addtimer(CALLBACK(src, .proc/retract), 10, TIMER_STOPPABLE) + +/obj/effect/temp_visual/goliath_tentacle/proc/retract() + icon_state = "Goliath_tentacle_retract" + deltimer(timerid) + timerid = QDEL_IN(src, 5) diff --git a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm new file mode 100644 index 00000000000..6e5c840a401 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm @@ -0,0 +1,114 @@ +/mob/living/simple_animal/hostile/asteroid/gutlunch + name = "gutlunch" + desc = "A scavenger that eats raw meat, often found alongside ash walkers. Produces a thick, nutritious milk." + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' + icon_state = "gutlunch" + icon_living = "gutlunch" + icon_dead = "gutlunch" + icon_aggro = "gutlunch" + speak_emote = list("warbles", "quavers") + emote_hear = list("trills.") + emote_see = list("sniffs.", "burps.") + weather_immunities = list("lava","ash") + faction = list("mining", "ashwalker") + density = 0 + speak_chance = 1 + turns_per_move = 8 + obj_damage = 0 + environment_smash = 0 + move_to_delay = 15 + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "squishes" + friendly = "pinches" + a_intent = INTENT_HELP + ventcrawler = 2 + gold_core_spawnable = 2 + stat_attack = 1 + gender = NEUTER + stop_automated_movement = FALSE + stop_automated_movement_when_pulled = TRUE + stat_exclusive = TRUE + robust_searching = TRUE + search_objects = TRUE + del_on_death = TRUE + loot = list(/obj/effect/decal/cleanable/blood/gibs) + deathmessage = "is pulped into bugmash." + + animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch + childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55) + + wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs) + var/obj/item/udder/gutlunch/udder = null + +/mob/living/simple_animal/hostile/asteroid/gutlunch/New() + udder = new() + ..() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/Destroy() + qdel(udder) + udder = null + return ..() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/regenerate_icons() + cut_overlays() + if(udder.reagents.total_volume == udder.reagents.maximum_volume) + add_overlay("gl_full") + ..() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/attackby(obj/item/O, mob/user, params) + if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass)) + udder.milkAnimal(O, user) + regenerate_icons() + else + ..() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/AttackingTarget() + if(is_type_in_typecache(target, wanted_objects)) //we eats + udder.generateMilk() + regenerate_icons() + visible_message("[src] slurps up [target].") + qdel(target) + return + ..() + +/obj/item/udder/gutlunch + name = "nutrient sac" + +/obj/item/udder/gutlunch/New() + reagents = new(50) + reagents.my_atom = src + +/obj/item/udder/gutlunch/generateMilk() + if(prob(60)) + reagents.add_reagent("cream", rand(2, 5)) + if(prob(45)) + reagents.add_reagent("salglu_solution", rand(2,5)) + + +//Male gutlunch. They're smaller and more colorful! +/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck + name = "gubbuck" + gender = MALE + +/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck/New() + ..() + add_atom_colour(pick("#E39FBB", "#D97D64", "#CF8C4A"), FIXED_COLOUR_PRIORITY) + resize = 0.85 + update_transform() + +//Lady gutlunch. They make the babby. +/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen + name = "guthen" + gender = FEMALE + +/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/Life() + ..() + if(udder.reagents.total_volume == udder.reagents.maximum_volume) //Only breed when we're full. + make_babies() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/make_babies() + . = ..() + if(.) + udder.reagents.clear_reagents() + regenerate_icons() diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm index 4041e95c6c7..60c1f5e08e7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm @@ -98,7 +98,7 @@ /obj/item/organ/internal/hivelord_core/on_life() ..() - if(owner.health < config.health_threshold_crit) + if(owner.health < HEALTH_THRESHOLD_CRIT) ui_action_click() /obj/item/organ/internal/hivelord_core/afterattack(atom/target, mob/user, proximity_flag) @@ -218,7 +218,7 @@ // Legion /mob/living/simple_animal/hostile/asteroid/hivelord/legion name = "legion" - desc = "You can still see what was once a human under the shifting mass of corruption." + desc = "You can still see what was once a person under the shifting mass of corruption." icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "legion" icon_living = "legion" @@ -236,20 +236,44 @@ del_on_death = 1 stat_attack = 1 robust_searching = 1 + var/dwarf_mob = FALSE var/mob/living/carbon/human/stored_mob +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/Initialize() + . = ..() + if(prob(5)) + new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(loc) + return INITIALIZE_HINT_QDEL + +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf + name = "dwarf legion" + desc = "You can still see what was once a midget under the shifting mass of corruption." + icon_state = "dwarf_legion" + icon_living = "dwarf_legion" + icon_aggro = "dwarf_legion" + icon_dead = "dwarf_legion" + maxHealth = 60 + health = 60 + speed = 2 //faster! + dwarf_mob = TRUE + +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril + fromtendril = TRUE + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/death(gibbed) - if(can_die()) - visible_message("The skulls on [src] wail in anger as they flee from their dying host!") - var/turf/T = get_turf(src) - if(T) - if(stored_mob) - stored_mob.forceMove(get_turf(src)) - stored_mob = null - else - new /obj/effect/mob_spawn/human/corpse/charredskeleton(T) - // due to `del_on_death` - return ..(gibbed) + visible_message("The skulls on [src] wail in anger as they flee from their dying host!") + var/turf/T = get_turf(src) + if(T) + if(stored_mob) + stored_mob.forceMove(get_turf(src)) + stored_mob = null + else if(fromtendril) + new /obj/effect/mob_spawn/human/corpse/charredskeleton(T) + else if(dwarf_mob) + new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested/dwarf(T) + else + new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested(T) + ..(gibbed) /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion @@ -286,8 +310,12 @@ /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H) visible_message("[name] burrows into the flesh of [H]!") - var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L = new(H.loc) - visible_message("[L] staggers to their feet!") + var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L + if((DWARF in H.mutations)) //dwarf legions aren't just fluff! + L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc) + else + L = new(H.loc) + visible_message("[L] staggers to [L.p_their()] feet!") H.death() H.adjustBruteLoss(1000) L.stored_mob = H @@ -337,3 +365,104 @@ husk = FALSE mob_species = /datum/species/skeleton mob_color = "#454545" + +//Legion infested mobs + +/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/dwarf/equip(mob/living/carbon/human/H) + . = ..() + H.dna.SetSEState(SMALLSIZEBLOCK, 1, 1) + H.mutations.Add(DWARF) + genemutcheck(H, SMALLSIZEBLOCK, null, MUTCHK_FORCED) + H.update_mutations() + +/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize() + var/type = pickweight(list("Miner" = 66, "Ashwalker" = 10, "Golem" = 10,"Clown" = 10, pick(list("Shadow", "YeOlde","Operative", "Cultist")) = 4)) + switch(type) + if("Miner") + mob_species = pickweight(list(/datum/species/human = 72, /datum/species/unathi = 28)) + uniform = /obj/item/clothing/under/rank/miner/lavaland + if (prob(4)) + belt = /obj/item/storage/belt/mining + else if(prob(10)) + belt = pickweight(list(/obj/item/pickaxe = 8, /obj/item/pickaxe/silver = 2, /obj/item/pickaxe/diamond = 1)) + else + belt = /obj/item/tank/emergency_oxygen/engi + if(mob_species != /datum/species/unathi) + shoes = /obj/item/clothing/shoes/workboots/mining + gloves = /obj/item/clothing/gloves/color/black + mask = /obj/item/clothing/mask/gas/explorer + if(prob(20)) + suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer = 18, /obj/item/clothing/suit/hooded/goliath = 2)) + if(prob(30)) + r_pocket = pickweight(list(/obj/item/stack/marker_beacon = 20, /obj/item/stack/spacecash/c1000 = 7, /obj/item/reagent_containers/hypospray/autoinjector/survival = 2, /obj/item/borg/upgrade/modkit/damage = 1 )) + if(prob(10)) + l_pocket = pickweight(list(/obj/item/stack/spacecash/c1000 = 7, /obj/item/reagent_containers/hypospray/autoinjector/survival = 2, /obj/item/borg/upgrade/modkit/cooldown = 1 )) + if("Ashwalker") + mob_species = /datum/species/unathi/ashwalker + uniform = /obj/item/clothing/under/gladiator/ash_walker + if(prob(95)) + head = /obj/item/clothing/head/helmet/gladiator + else + head = /obj/item/clothing/head/skullhelmet + suit = /obj/item/clothing/suit/armor/bone + if(prob(5)) + back = pickweight(list(/obj/item/twohanded/spear/bonespear = 3, /obj/item/twohanded/fireaxe/boneaxe = 2)) + if(prob(10)) + belt = /obj/item/storage/belt/mining + if(prob(30)) + r_pocket = /obj/item/kitchen/knife/combat/survival/bone + if(prob(30)) + l_pocket = /obj/item/kitchen/knife/combat/survival/bone + if("Clown") + name = pick(GLOB.clown_names) + outfit = /datum/outfit/job/clown + belt = null + backpack_contents = list() + if(prob(70)) + backpack_contents += pick(list(/obj/item/stamp/clown = 1, /obj/item/reagent_containers/spray/waterflower = 1, /obj/item/reagent_containers/food/snacks/grown/banana = 1, /obj/item/megaphone = 1)) + if(prob(30)) + backpack_contents += list(/obj/item/stack/sheet/mineral/bananium = pickweight(list( 1 = 3, 2 = 2, 3 = 1))) + if(prob(10)) + l_pocket = pickweight(list(/obj/item/bikehorn/golden = 3, /obj/item/bikehorn/airhorn= 1 )) + if("Golem") + mob_species = pick(list(/datum/species/golem/adamantine, /datum/species/golem/plasma, /datum/species/golem/diamond, /datum/species/golem/gold, /datum/species/golem/silver, /datum/species/golem/plasteel, /datum/species/golem/titanium, /datum/species/golem/plastitanium)) + if(prob(30)) + glasses = pickweight(list(/obj/item/clothing/glasses/meson = 2, /obj/item/clothing/glasses/hud/health = 2, /obj/item/clothing/glasses/hud/diagnostic =2, /obj/item/clothing/glasses/science = 2, /obj/item/clothing/glasses/welding = 2, /obj/item/clothing/glasses/night = 1)) + if(prob(10)) + belt = pick(list(/obj/item/storage/belt/mining, /obj/item/storage/belt/utility/full)) + if(prob(50)) + back = /obj/item/bedsheet/rd/royal_cape + if(prob(10)) + l_pocket = pick(list(/obj/item/crowbar/power, /obj/item/wrench/power, /obj/item/weldingtool/experimental)) + if("YeOlde") + mob_gender = FEMALE + uniform = /obj/item/clothing/under/maid + gloves = /obj/item/clothing/gloves/color/white + shoes = /obj/item/clothing/shoes/laceup + head = /obj/item/clothing/head/helmet/riot/knight + suit = /obj/item/clothing/suit/armor/riot/knight + back = /obj/item/shield/riot/buckler + belt = /obj/item/nullrod/claymore + r_pocket = /obj/item/tank/emergency_oxygen + mask = /obj/item/clothing/mask/breath + if("Operative") + id_job = "Operative" + outfit = /datum/outfit/syndicatecommandocorpse + if("Shadow") + mob_species = /datum/species/shadow + uniform = /obj/item/clothing/under/color/black + shoes = /obj/item/clothing/shoes/black + suit = /obj/item/clothing/suit/storage/labcoat + glasses = /obj/item/clothing/glasses/sunglasses/blindfold + back = /obj/item/tank/oxygen + mask = /obj/item/clothing/mask/breath + if("Cultist") + uniform = /obj/item/clothing/under/roman + suit = /obj/item/clothing/suit/hooded/cultrobes + head = /obj/item/clothing/head/culthood + suit_store = /obj/item/tome + r_pocket = /obj/item/restraints/legcuffs/bola/cult + l_pocket = /obj/item/melee/cultblade/dagger + glasses = /obj/item/clothing/glasses/hud/health/night + backpack_contents = list(/obj/item/reagent_containers/food/drinks/bottle/unholywater = 1, /obj/item/cult_shift = 1, /obj/item/flashlight/flare = 1, /obj/item/stack/sheet/runed_metal = 15) + . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining/mining.dm b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm new file mode 100644 index 00000000000..e23624a5a9d --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm @@ -0,0 +1,48 @@ +/mob/living/simple_animal/hostile/asteroid/ + vision_range = 2 + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 15 + faction = list("mining") + weather_immunities = list("lava","ash") + obj_damage = 30 + environment_smash = 2 + minbodytemp = 0 + heat_damage_per_tick = 20 + response_help = "pokes" + response_disarm = "shoves" + response_harm = "strikes" + status_flags = 0 + a_intent = INTENT_HARM + var/throw_message = "bounces off of" + var/icon_aggro = null // for swapping to when we get aggressive + var/fromtendril = FALSE + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + mob_size = MOB_SIZE_LARGE + +/mob/living/simple_animal/hostile/asteroid/Aggro() + ..() + icon_state = icon_aggro + +/mob/living/simple_animal/hostile/asteroid/LoseAggro() + ..() + if(stat == CONSCIOUS) + icon_state = icon_living + +/mob/living/simple_animal/hostile/asteroid/bullet_act(var/obj/item/projectile/P)//Reduces damage from most projectiles to curb off-screen kills + if(!stat) + Aggro() + if(P.damage < 30 && P.damage_type != BRUTE) + P.damage = (P.damage / 3) + visible_message("The [P] has a reduced effect on [src]!") + ..() + +/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM)//No floor tiling them to death, wiseguy + if(istype(AM, /obj/item)) + var/obj/item/T = AM + if(!stat) + Aggro() + if(T.throwforce <= 20) + visible_message("The [T.name] [src.throw_message] [src.name]!") + return + ..() 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 new file mode 100644 index 00000000000..c6bc205627e --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm @@ -0,0 +1,79 @@ +/mob/living/simple_animal/hostile/spawner/lavaland + name = "necropolis tendril" + desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it." + icon = 'icons/mob/nest.dmi' + icon_state = "tendril" + icon_living = "tendril" + icon_dead = "tendril" + faction = list("mining") + weather_immunities = list("lava","ash") + luminosity = 1 + health = 250 + maxHealth = 250 + max_mobs = 3 + spawn_time = 300 //30 seconds default + 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 + maxbodytemp = INFINITY + loot = list(/obj/effect/collapse, /obj/structure/closet/crate/necropolis/tendril) + del_on_death = 1 + var/gps = null + +/mob/living/simple_animal/hostile/spawner/lavaland/New() + ..() + //for(var/F in RANGE_TURFS(1, src)) TODO: Uncomment + //if(ismineralturf(F)) + //var/turf/simulated/mineral/M = F + //M.ChangeTurf(M.turf_type, FALSE, TRUE) + gps = new /obj/item/gps/internal(src) + +/mob/living/simple_animal/hostile/spawner/lavaland/Destroy() + qdel(gps) + . = ..() + +/mob/living/simple_animal/hostile/spawner/lavaland/death() + var/last_tendril = TRUE + for(var/mob/living/simple_animal/hostile/spawner/lavaland/other in GLOB.mob_list) + if(other != src) + last_tendril = FALSE + break + if(last_tendril && !admin_spawned) + if(SSmedals.hub_enabled) + for(var/mob/living/L in view(7,src)) + if(L.stat || !L.client) + continue + SSmedals.UnlockMedal("[BOSS_MEDAL_TENDRIL] [ALL_KILL_MEDAL]", L.client) + SSmedals.SetScore(TENDRIL_CLEAR_SCORE, L.client, 1) + ..() + +/obj/effect/collapse + name = "collapsing necropolis tendril" + desc = "Get clear!" + luminosity = 1 + layer = ABOVE_OPEN_TURF_LAYER + icon = 'icons/mob/nest.dmi' + icon_state = "tendril" + anchored = TRUE + +/obj/effect/collapse/New() + ..() + visible_message("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!") + visible_message("Something falls free of the tendril!") + playsound(get_turf(src),'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1) + spawn(50) + for(var/mob/M in range(7,src)) + shake_camera(M, 15, 1) + playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1) + visible_message("The tendril falls inward, the ground around it widening into a yawning chasm!") + for(var/turf/T in range(2,src)) + if(!T.density) + T.TerraformTurf(/turf/simulated/floor/chasm/straight_down/lava_land_surface) + qdel(src) + +/mob/living/simple_animal/hostile/spawner/lavaland/goliath + mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril) + +/mob/living/simple_animal/hostile/spawner/lavaland/legion + 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/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 0f37482b3e2..efc18895141 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -16,7 +16,7 @@ var/throw_message = "bounces off of" var/icon_aggro = null // for swapping to when we get aggressive see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE mob_size = MOB_SIZE_LARGE /mob/living/simple_animal/hostile/asteroid/Aggro() @@ -140,9 +140,9 @@ move_resist = MOVE_FORCE_VERY_STRONG pull_force = MOVE_FORCE_VERY_STRONG var/pre_attack = 0 - loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1}) + loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = ABOVE_MOB_LAYER}) -/mob/living/simple_animal/hostile/asteroid/goliath/process_ai() +/mob/living/simple_animal/hostile/asteroid/goliath/Life() ..() handle_preattack() @@ -223,46 +223,3 @@ else spawn(50) qdel(src) - -/obj/item/asteroid/goliath_hide - name = "goliath hide plates" - desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna." - icon = 'icons/obj/items.dmi' - icon_state = "goliath_hide" - flags = NOBLUDGEON - w_class = WEIGHT_CLASS_NORMAL - layer = 4 - -/obj/item/asteroid/goliath_hide/afterattack(atom/target, mob/user, proximity_flag) - if(proximity_flag) - if(istype(target, /obj/item/clothing/suit/space/hardsuit/mining) || istype(target, /obj/item/clothing/head/helmet/space/hardsuit/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner)) - var/obj/item/clothing/C = target - var/current_armor = C.armor - if(current_armor.["melee"] < 60) - current_armor.["melee"] = min(current_armor.["melee"] + 10, 60) - to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") - qdel(src) - else - to_chat(user, "You can't improve [C] any further.") - return - if(istype(target, /obj/mecha/working/ripley)) - var/obj/mecha/D = target - if(D.icon_state != "ripley-open") - to_chat(user, "You can't add armour onto the mech while someone is inside!") - return - var/list/damage_absorption = D.damage_absorption - if(damage_absorption["brute"] > 0.3) - damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3) - damage_absorption["bullet"] = damage_absorption["bullet"] - 0.05 - damage_absorption["fire"] = damage_absorption["fire"] - 0.05 - damage_absorption["laser"] = damage_absorption["laser"] - 0.025 - to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") - qdel(src) - D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open") - D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." - if(damage_absorption.["brute"] == 0.3) - D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") - D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." - else - to_chat(user, "You can't improve [D] any further!") - return 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..70d279fd400 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -0,0 +1,113 @@ +/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 + maxHealth = 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/death() + . = ..() + qdel(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/Life() + . = ..() + 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/retaliate/fish.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm index 7b10c0e828a..555530ee71d 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm @@ -2,9 +2,8 @@ /mob/living/simple_animal/hostile/retaliate/carp name = "sea carp" desc = "A large fish bearing similarities to a certain space-faring menace." + icon = 'icons/mob/carp.dmi' icon_state = "carp" - icon_living = "carp" - icon_dead = "carp_dead" icon_gib = "carp_gib" speak_chance = 0 turns_per_move = 5 @@ -15,20 +14,33 @@ speed = 0 maxHealth = 25 health = 25 - retreat_distance = 6 vision_range = 5 - harm_intent_damage = 8 melee_damage_lower = 15 melee_damage_upper = 15 attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' speak_emote = list("gnashes") - faction = list("carp") flying = 1 + var/carp_color = "carp" //holder for icon set + var/list/icon_sets = list("carp", "blue", "yellow", "grape", "rust", "teal", "purple") + +/mob/living/simple_animal/hostile/retaliate/carp/Initialize(mapload) + . = ..() + carp_randomify() + update_icons() + +/mob/living/simple_animal/hostile/retaliate/carp/proc/carp_randomify() + if(prob(1)) + carp_color = pick("white", "black") + else + carp_color = pick(icon_sets) + icon_state = "[carp_color]" + icon_living = "[carp_color]" + icon_dead = "[carp_color]_dead" /mob/living/simple_animal/hostile/retaliate/carp/koi name = "space koi" @@ -42,7 +54,7 @@ melee_damage_lower = 2 melee_damage_upper = 2 speak_emote = list("blurps") - butcher_results = null + butcher_results = list(/obj/item/reagent_containers/food/snacks/salmonmeat = 1) 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 @@ -50,18 +62,17 @@ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE -/mob/living/simple_animal/hostile/retaliate/carp/koi/New() - ..() +/mob/living/simple_animal/hostile/retaliate/carp/koi/Initialize(mapload) + . = ..() var/koinum = rand(1, 4) icon_state = "koi[koinum]" icon_living = "koi[koinum]" icon_dead = "koi[koinum]-dead" - /mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(var/movement_dir) return TRUE /mob/living/simple_animal/hostile/retaliate/carp/koi/honk icon_state = "koi5" icon_living = "koi5" - icon_dead = "koi5-dead" \ No newline at end of file + icon_dead = "koi5-dead" diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 829377720c1..2e1e7508e1c 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -33,14 +33,14 @@ animate_movement = NO_STEPS // Do not animate movement, you jump around as you're a scary statue. - see_in_dark = 13 + see_in_dark = 8 vision_range = 12 aggro_vision_range = 12 idle_vision_range = 12 search_objects = 1 // So that it can see through walls - see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS move_force = MOVE_FORCE_EXTREMELY_STRONG move_resist = MOVE_FORCE_EXTREMELY_STRONG @@ -104,7 +104,7 @@ return null // Check for darkness var/turf/T = get_turf(loc) - if(T && destination && T.lighting_overlay) + if(T && destination && T.lighting_object) if(T.get_lumcount() * 10 < 1 && destination.get_lumcount() * 10 < 1) // No one can see us in the darkness, right? return null if(T == destination) @@ -189,34 +189,6 @@ L.EyeBlind(4) return -/mob/living/simple_animal/hostile/statue/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - 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 - var/non_night_vision = SEE_INVISIBLE_LIVING - var/night_vision = SEE_INVISIBLE_OBSERVER_NOLIGHTING - -/obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets, mob/user = usr) - for(var/mob/living/target in targets) - if(target.see_invisible == non_night_vision) - target.see_invisible = night_vision - else - target.see_invisible = non_night_vision - /mob/living/simple_animal/hostile/statue/sentience_act() faction -= "neutral" diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm index 51028a69111..14353c4dfd0 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm @@ -24,6 +24,12 @@ canlay = 1000 spider_tier = TS_TIER_5 projectiletype = /obj/item/projectile/terrorqueenspit/empress + icon = 'icons/mob/terrorspider64.dmi' + pixel_x = -16 + mob_size = MOB_SIZE_LARGE + icon_state = "terror_empress" + icon_living = "terror_empress" + icon_dead = "terror_empress_dead" var/datum/action/innate/terrorspider/queen/empress/empresslings/empresslings_action var/datum/action/innate/terrorspider/queen/empress/empresserase/empresserase_action atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) @@ -42,7 +48,7 @@ queenfakelings_action.button.name = "Empress Lings" /mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/LayQueenEggs() - var/eggtype = input("What kind of eggs?") as null|anything in list(TS_DESC_QUEEN, TS_DESC_MOTHER, TS_DESC_PRINCE, TS_DESC_PRINCESS, TS_DESC_RED, TS_DESC_GRAY, TS_DESC_GREEN, TS_DESC_BLACK, TS_DESC_PURPLE, TS_DESC_WHITE) + var/eggtype = input("What kind of eggs?") as null|anything in list(TS_DESC_QUEEN, TS_DESC_MOTHER, TS_DESC_PRINCE, TS_DESC_PRINCESS, TS_DESC_RED, TS_DESC_GRAY, TS_DESC_GREEN, TS_DESC_BLACK, TS_DESC_PURPLE, TS_DESC_WHITE, TS_DESC_BROWN) var/numlings = input("How many in the batch?") as null|anything in list(1, 2, 3, 4, 5, 10, 15, 20, 30, 40, 50) if(eggtype == null || numlings == null) to_chat(src, "Cancelled.") @@ -60,6 +66,8 @@ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple, numlings) if(TS_DESC_WHITE) DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/white, numlings) + if(TS_DESC_BROWN) + DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/brown, numlings) if(TS_DESC_PRINCE) DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/prince, numlings) if(TS_DESC_PRINCESS) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm index 354f99db8af..d1e171d2f55 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm @@ -38,6 +38,8 @@ if(can_die()) if(spider_awaymission && !is_away_level(z)) canspawn = FALSE + if(degenerate) + canspawn = FALSE if(canspawn) canspawn = FALSE for(var/i in 0 to spawn_count) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm index ed2ea164634..2839dedb237 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm @@ -142,9 +142,8 @@ visible_message("\The [src] looks around warily - then seeks a better nesting ground.") path_to_vent = 1 else - visible_message("\The [src] looks around, searching for the vent that should be there, but isn't. A bluespace portal forms on her, and she is gone.") - qdel(src) - new /obj/effect/portal(get_turf(loc)) + neststep = -1 + message_admins("Warning: [key_name_admin(src)] was spawned in an area without a vent! This is likely a mapping/spawn mistake. This mob's AI has been permanently deactivated.") if(1) // No nest, and we should create one. Start NestMode(), then advance to step 2. if(world.time > (lastnestsetup + nestfrequency)) 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 c797d51ce3b..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 @@ -94,9 +94,8 @@ var/global/list/ts_spiderling_list = list() // Vision idle_vision_range = 10 aggro_vision_range = 10 - see_in_dark = 10 - nightvision = 1 - see_invisible = 5 + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE sight = SEE_MOBS // AI aggression settings @@ -203,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) @@ -316,12 +315,12 @@ var/global/list/ts_spiderling_list = list() adjustToxLoss(rand(1,10)) if(regen_points < regen_points_max) regen_points += regen_points_per_tick - if((bruteloss > 0) || (fireloss > 0)) + if(getBruteLoss() || getFireLoss()) if(regen_points > regen_points_per_hp) - if(bruteloss > 0) + if(getBruteLoss()) adjustBruteLoss(-1) regen_points -= regen_points_per_hp - else if(fireloss > 0) + else if(getFireLoss()) adjustFireLoss(-1) regen_points -= regen_points_per_hp if(prob(5)) 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/pony.dm b/code/modules/mob/living/simple_animal/pony.dm deleted file mode 100644 index 960f8fc0998..00000000000 --- a/code/modules/mob/living/simple_animal/pony.dm +++ /dev/null @@ -1,129 +0,0 @@ -/mob/living/simple_animal/pony - name = "\improper pony" - desc = "A bound spirit" - icon = 'icons/mob/pony.dmi' -// icon_dead = "shade_dead" - maxHealth = 50 - health = 50 - speak_emote = list("whinnys") - emote_hear = list("excitedly says") - response_help = "pets" - response_disarm = "pushes" - response_harm = "kicks" - melee_damage_lower = 5 - melee_damage_upper = 15 - attacktext = "sends rainbows of power to" - minbodytemp = 0 - maxbodytemp = 4000 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - speed = 0 - stop_automated_movement = 0 - status_flags = 0 - faction = list("pony") - status_flags = CANPUSH - universal_speak = 1 - -/mob/living/simple_animal/pony/Life() - ..() - if(stat == 2) - new /obj/item/reagent_containers/food/snacks/ectoplasm(src.loc) - src.visible_message("[src] lets out a contented sigh as [p_their()] form unwinds.") - src.ghostize() - qdel(src) - return - -/mob/living/simple_animal/pony/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri - if(istype(O, /obj/item/soulstone)) - O.transfer_soul("SHADE", src, user) - else - ..() - -/mob/living/simple_animal/pony/twilight - name = "Twilight Sparkle" - real_name = "Twilight Sparkle" - icon_state = "twilight" - icon_living = "twilight" - -/mob/living/simple_animal/pony/pinkie - name = "Pinkie Pie" - real_name = "Pinkie Pie" - icon_state = "pinkie" - icon_living = "pinkie" - -/mob/living/simple_animal/pony/rainbow - name = "Rainbow Dash" - real_name = "Rainbow Dash" - icon_state = "rainbow" - icon_living = "rainbow" - -mob/living/simple_animal/pony/fluttershy - name = "Fluttershy" - real_name = "Fluttershy" - icon_state = "fluttershy" - icon_living = "fluttershy" - -mob/living/simple_animal/pony/applejack - name = "Applejack" - real_name = "Applejack" - icon_state = "applejack" - icon_living = "applejack" - -mob/living/simple_animal/pony/luna - name = "Luna" - real_name = "Luna" - icon_state = "luna" - icon_living = "luna" - -mob/living/simple_animal/pony/clownie - name = "Clownie" - real_name = "Clownie" - icon_state = "clownie" - icon_living = "clownie" - -mob/living/simple_animal/pony/tia - name = "Tia" - real_name = "Tia" - icon_state = "tia" - icon_living = "tia" - -mob/living/simple_animal/pony/trixie - name = "Trixie" - real_name = "Trixie" - icon_state = "trixie_a_full" - icon_living = "trixing_a_full" - -mob/living/simple_animal/pony/lyra - name = "Lyra" - real_name = "Lyra" - icon_state = "lyra" - icon_living = "lyra" - -mob/living/simple_animal/pony/vinyl - name = "Vinyl" - real_name = "Vinyl" - icon_state = "vinyl" - icon_living = "vinyl" - -mob/living/simple_animal/pony/rarity - name = "Rarity" - real_name = "Rarity" - icon_state = "rarity" - icon_living = "rarity" - -mob/living/simple_animal/pony/whooves - name = "Whooves" - real_name = "Whooves" - icon_state = "whooves" - icon_living = "whooves" - -mob/living/simple_animal/pony/fleur - name = "Fleur" - real_name = "Fleur" - icon_state = "fleur" - icon_living = "fleur" - -mob/living/simple_animal/pony/mac - name = "Mac" - real_name = "Mac" - icon_state = "mac" - icon_living = "mac" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/posessed_object.dm b/code/modules/mob/living/simple_animal/posessed_object.dm index 7afb3b01cbc..f290dd7f2ef 100644 --- a/code/modules/mob/living/simple_animal/posessed_object.dm +++ b/code/modules/mob/living/simple_animal/posessed_object.dm @@ -108,7 +108,7 @@ /mob/living/simple_animal/possessed_object/IsAdvancedToolUser() // So we can shoot guns (Mostly ourselves), among other things. - return 1 + return TRUE /mob/living/simple_animal/possessed_object/get_access() // If we've possessed an ID card we've got access to lots of fun things! diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 02f15a59709..6955633efce 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -62,10 +62,9 @@ var/can_collar = 0 // can add collar to mob or not //Hot simple_animal baby making vars - - var/childtype = null - var/scan_ready = 1 - var/simplespecies //Sorry, no spider+corgi buttbabies. + var/list/childtype = null + var/next_scan_time = 0 + var/animal_species //Sorry, no spider+corgi buttbabies. var/gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //if CHEM_MOB_SPAWN_HOSTILE can be spawned by plasma with gold core, CHEM_MOB_SPAWN_FRIENDLY are 'friendlies' spawned with blood @@ -80,10 +79,14 @@ var/deathmessage = "" var/death_sound = null //The sound played on death + var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever) + var/can_have_ai = TRUE //once we have become sentient, we can never go back + var/shouldwakeup = FALSE //convenience var for forcibly waking up an idling AI on next check. + /mob/living/simple_animal/Initialize() ..() - GLOB.simple_animal_list += src + GLOB.simple_animals[AIStatus] += src verbs -= /mob/verb/observe if(!can_hide) verbs -= /mob/living/simple_animal/verb/hide @@ -97,7 +100,18 @@ collar.forceMove(loc) collar = null master_commander = null - GLOB.simple_animal_list -= src + GLOB.simple_animals[AIStatus] -= src + if(SSnpcpool.state == SS_PAUSED && LAZYLEN(SSnpcpool.currentrun)) + SSnpcpool.currentrun -= src + + if(nest) + nest.spawned_mobs -= src + nest = null + + var/turf/T = get_turf(src) + if (T && AIStatus == AI_Z_OFF) + SSidlenpcpool.idle_mobs_by_zlevel[T.z] -= src + return ..() /mob/living/simple_animal/Login() @@ -111,12 +125,6 @@ health = Clamp(health, 0, maxHealth) med_hud_set_status() - -/mob/living/simple_animal/proc/process_ai() - handle_automated_movement() - handle_automated_action() - handle_automated_speech() - /mob/living/simple_animal/lay_down() ..() handle_resting_state_icons() @@ -258,7 +266,7 @@ adjustBruteLoss(20) return -/mob/living/simple_animal/emote(var/act, var/m_type=1, var/message = null) +/mob/living/simple_animal/emote(act, m_type = 1, message = null, force) if(stat) return act = lowertext(act) @@ -269,7 +277,7 @@ if("help") to_chat(src, "scream") - ..(act, m_type, message) + ..() /mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) if(!Proj) @@ -437,27 +445,32 @@ /mob/living/simple_animal/proc/make_babies() // <3 <3 <3 - if(gender != FEMALE || stat || !scan_ready || !childtype || !simplespecies) - return - scan_ready = 0 - spawn(400) - scan_ready = 1 - var/alone = 1 + if(gender != FEMALE || stat || next_scan_time > world.time || !childtype || !animal_species || !SSticker.IsRoundInProgress()) + return FALSE + next_scan_time = world.time + 400 + + var/alone = TRUE var/mob/living/simple_animal/partner var/children = 0 + for(var/mob/M in oview(7, src)) - if(istype(M, childtype)) //Check for children FIRST. + if(M.stat != CONSCIOUS) //Check if it's conscious FIRST. + continue + else if(istype(M, childtype)) //Check for children SECOND. children++ - else if(istype(M, simplespecies)) - if(M.client) + else if(istype(M, animal_species)) + if(M.ckey) continue else if(!istype(M, childtype) && M.gender == MALE) //Better safe than sorry ;_; partner = M - else if(istype(M, /mob/)) - alone = 0 - continue + else if(isliving(M) && !faction_check_mob(M)) //shyness check. we're not shy in front of things that share a faction with us. + return //we never mate when not alone, so just abort early + if(alone && partner && children < 3) - return new childtype(loc) + var/childspawn = pickweight(childtype) + var/turf/target = get_turf(loc) + if(target) + return new childspawn(target) /mob/living/simple_animal/say_quote(var/message) var/verb = "says" @@ -534,8 +547,8 @@ W.forceMove(src) W.equipped(src, slot) - W.layer = 20 - W.plane = HUD_PLANE + W.layer = ABOVE_HUD_LAYER + W.plane = ABOVE_HUD_PLANE switch(slot) if(slot_collar) @@ -562,11 +575,59 @@ /* End Inventory */ /mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion + toggle_ai(AI_OFF) + can_have_ai = FALSE return +/mob/living/simple_animal/can_hear() + . = TRUE + +/mob/living/simple_animal/proc/consider_wakeup() + if(pulledby || shouldwakeup) + toggle_ai(AI_ON) + +/mob/living/simple_animal/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + . = ..() + if(!ckey && !stat)//Not unconscious + if(AIStatus == AI_IDLE) + toggle_ai(AI_ON) + +/mob/living/simple_animal/proc/toggle_ai(togglestatus) + if(!can_have_ai && (togglestatus != AI_OFF)) + return + if(AIStatus != togglestatus) + if(togglestatus > 0 && togglestatus < 5) + if(togglestatus == AI_Z_OFF || AIStatus == AI_Z_OFF) + var/turf/T = get_turf(src) + if(AIStatus == AI_Z_OFF) + SSidlenpcpool.idle_mobs_by_zlevel[T.z] -= src + else + SSidlenpcpool.idle_mobs_by_zlevel[T.z] += src + GLOB.simple_animals[AIStatus] -= src + GLOB.simple_animals[togglestatus] += src + AIStatus = togglestatus + else + stack_trace("Something attempted to set simple animals AI to an invalid state: [togglestatus]") + +/mob/living/simple_animal/onTransitZ(old_z, new_z) + ..() + if(AIStatus == AI_Z_OFF) + SSidlenpcpool.idle_mobs_by_zlevel[old_z] -= src + toggle_ai(initial(AIStatus)) + +// Simple animals will not be given night vision upon death, as that would result in issues when they are revived. +/mob/living/simple_animal/grant_death_vision() + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_OBSERVER + sync_lighting_plane_alpha() + /mob/living/simple_animal/update_sight() if(!client) return + if(stat == DEAD) grant_death_vision() return @@ -580,5 +641,5 @@ if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return -/mob/living/simple_animal/can_hear() - . = TRUE \ No newline at end of file + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm index 7a17dfb202b..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 @@ -29,7 +29,7 @@ spawned_mobs = null return ..() -/mob/living/simple_animal/hostile/spawner/process_ai() +/mob/living/simple_animal/hostile/spawner/Life() ..() spawn_mob() @@ -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,12 +52,12 @@ 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 name = "monster den" - desc = "A hole dug into the ground, harboring all kinds of monsters found within most caves or mining asteroids." + desc = "A hole dug into the ground, harboring all kinds of monsters found within most caves or mining areas." icon_state = "hole" icon_living = "hole" health = 200 @@ -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/living/stat_states.dm b/code/modules/mob/living/stat_states.dm index fa5530091c9..70cced62aab 100644 --- a/code/modules/mob/living/stat_states.dm +++ b/code/modules/mob/living/stat_states.dm @@ -33,7 +33,7 @@ /mob/living/proc/can_be_revived() . = TRUE // if(health <= min_health) - if(health <= config.health_threshold_dead) + if(health <= HEALTH_THRESHOLD_DEAD) return FALSE // death() is used to make a mob die @@ -71,3 +71,6 @@ spell.updateButtonIcon() return 1 + +/mob/living/proc/check_death_method() + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 4e5c778b7fb..1dded6c4e8c 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -297,6 +297,9 @@ SetLoseBreath(max(losebreath, amount)) /mob/living/SetLoseBreath(amount) + if(BREATHLESS in mutations) + losebreath = 0 + return FALSE losebreath = max(amount, 0) /mob/living/AdjustLoseBreath(amount, bound_lower = 0, bound_upper = INFINITY) @@ -546,3 +549,37 @@ dna.SetSEState(block, 0, 1) //Fix the gene genemutcheck(src, block,null, MUTCHK_FORCED) dna.UpdateSE() + +///////////////////////////////////// STUN ABSORPTION ///////////////////////////////////// + +/mob/living/proc/add_stun_absorption(key, duration, priority, message, self_message, examine_message) +//adds a stun absorption with a key, a duration in deciseconds, its priority, and the messages it makes when you're stun/examined, if any + if(!islist(stun_absorption)) + stun_absorption = list() + if(stun_absorption[key]) + stun_absorption[key]["end_time"] = world.time + duration + stun_absorption[key]["priority"] = priority + stun_absorption[key]["stuns_absorbed"] = 0 + else + stun_absorption[key] = list("end_time" = world.time + duration, "priority" = priority, "stuns_absorbed" = 0, \ + "visible_message" = message, "self_message" = self_message, "examine_message" = examine_message) + +/mob/living/proc/absorb_stun(amount, ignoring_flag_presence) + if(!amount || amount <= 0 || stat || ignoring_flag_presence || !islist(stun_absorption)) + return FALSE + var/priority_absorb_key + var/highest_priority + for(var/i in stun_absorption) + if(stun_absorption[i]["end_time"] > world.time && (!priority_absorb_key || stun_absorption[i]["priority"] > highest_priority)) + priority_absorb_key = stun_absorption[i] + highest_priority = priority_absorb_key["priority"] + if(priority_absorb_key) + if(priority_absorb_key["visible_message"] || priority_absorb_key["self_message"]) + if(priority_absorb_key["visible_message"] && priority_absorb_key["self_message"]) + visible_message("[src][priority_absorb_key["visible_message"]]", "[priority_absorb_key["self_message"]]") + else if(priority_absorb_key["visible_message"]) + visible_message("[src][priority_absorb_key["visible_message"]]") + else if(priority_absorb_key["self_message"]) + to_chat(src, "[priority_absorb_key["self_message"]]") + priority_absorb_key["stuns_absorbed"] += amount + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm index daf058bb41b..39357533abb 100644 --- a/code/modules/mob/living/update_status.dm +++ b/code/modules/mob/living/update_status.dm @@ -93,9 +93,9 @@ density = !lying if(lying) if(layer == initial(layer)) - layer = MOB_LAYER - 0.2 + layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs else - if(layer == MOB_LAYER - 0.2) + if(layer == LYING_MOB_LAYER) layer = initial(layer) update_transform() @@ -110,7 +110,7 @@ if(status_flags & GODMODE) return if(stat != DEAD) - if(health <= config.health_threshold_dead) + if(health <= HEALTH_THRESHOLD_DEAD && check_death_method()) death() create_debug_log("died of damage, trigger reason: [reason]") else if(paralysis || status_flags & FAKEDEATH) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index eecd0650af0..f5f1924e395 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -19,10 +19,10 @@ spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!") if(matches) if(M.client) - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)].") else - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).") /mob/Login() @@ -70,31 +70,4 @@ AA.display_to(list(src)) update_client_colour(0) - - callHook("mob_login", list("client" = client, "mob" = src)) - -// Calling update_interface() in /mob/Login() causes the Cyborg to immediately be ghosted; because of winget(). -// Calling it in the overriden Login, such as /mob/living/Login() doesn't cause this. -/mob/proc/update_interface() - spawn() // Spawn off so winget/winset don't delay callers. - if(client) - if(winget(src, "mainwindow.hotkey_toggle", "is-checked") == "true") - update_hotkey_mode() - else - update_normal_mode() - -/mob/proc/update_hotkey_mode() - var/hotkeyname = "hotkeymode" - if(client) - var/hotkeys = client.hotkeylist[client.hotkeytype] - hotkeyname = hotkeys[client.hotkeyon ? "on" : "off"] - client.hotkeyon = 1 - winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0") - -/mob/proc/update_normal_mode() - var/hotkeyname = "macro" - if(client) - var/hotkeys = client.hotkeylist[client.hotkeytype]//get the list containing the hotkey names - hotkeyname = hotkeys[client.hotkeyon ? "on" : "off"]//get the name of the hotkey, to not clutter winset() to much - client.hotkeyon = 0 - winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5") + update_morgue() diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index f409d184340..376b8d46ea5 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -6,7 +6,7 @@ create_attack_log("Logged out at [atom_loc_line(get_turf(src))]") // `holder` is nil'd out by now, so we check the `admin_datums` array directly //Only report this stuff if we are currently playing. - if(admin_datums[ckey] && ticker && ticker.current_state == GAME_STATE_PLAYING) + if(admin_datums[ckey] && SSticker && SSticker.current_state == GAME_STATE_PLAYING) var/datum/admins/temp_admin = admin_datums[ckey] // Triggers on people with banhammer power only - no mentors tripping the alarm if(temp_admin.rights & R_BAN) @@ -16,5 +16,5 @@ send2irc(config.admin_notify_irc, "[key_name(src)] logged out - No active admins, [admincounter[2]] non-admin staff, [admincounter[3]] inactive staff.") ..() - callHook("mob_logout", list("client" = client, "mob" = src)) + update_morgue() return 1 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e0d20f01a48..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) @@ -580,6 +582,10 @@ var/list/slot_equipment_priority = list( \ to_chat(src, "Something is there but you can't see it.") return 1 + var/is_antag = (isAntag(src) || isobserver(src)) //ghosts don't have minds + if(client) + client.update_description_holders(A, is_antag) + face_atom(A) A.examine(src) @@ -687,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.") @@ -741,7 +751,7 @@ var/list/slot_equipment_priority = list( \ to_chat(usr, "Respawning is disabled.") return - if(stat != DEAD || !ticker) + if(stat != DEAD || !SSticker) to_chat(usr, "You must be dead to use this!") return @@ -897,13 +907,18 @@ var/list/slot_equipment_priority = list( \ /mob/MouseDrop(mob/M as mob) ..() if(M != usr) return - if(isliving(M)) // Ewww + if(isliving(M)) var/mob/living/L = M if(L.mob_size <= MOB_SIZE_SMALL) return // Stops pAI drones and small mobs (borers, parrots, crabs) from stripping people. --DZD - if(!M.can_strip) return - if(usr == src) return - if(!Adjacent(usr)) return + if(!M.can_strip) + return + if(usr == src) + return + if(!Adjacent(usr)) + return + if(isLivingSSD(src) && M.client && M.client.send_ssd_warning(src)) + return show_inv(usr) /mob/proc/can_use_hands() @@ -921,7 +936,7 @@ var/list/slot_equipment_priority = list( \ // They should be in a cell or the Brig portion of the shuttle. var/area/A = loc.loc - if(!istype(A, /area/security/prison) && !istype(A, /area/prison)) + if(!istype(A, /area/security/prison)) if(!istype(A, /area/shuttle/escape) || loc.name != "Brig floor") return 0 @@ -947,9 +962,6 @@ var/list/slot_equipment_priority = list( \ statpanel("Status") // We only want alt-clicked turfs to come before Status - if(mind && mind.changeling) - add_stings_to_statpanel(mind.changeling.purchasedpowers) - if(mob_spell_list && mob_spell_list.len) for(var/obj/effect/proc_holder/spell/S in mob_spell_list) add_spell_to_statpanel(S) @@ -959,19 +971,13 @@ var/list/slot_equipment_priority = list( \ if(is_admin(src)) - if(statpanel("DI")) //not looking at that panel - stat("Loc", "([x], [y], [z]) [loc]") - stat("CPU", "[world.cpu]") - stat("Instances", "[world.contents.len]") - - if(processScheduler) - processScheduler.statProcesses() if(statpanel("MC")) //looking at that panel var/turf/T = get_turf(client.eye) stat("Location:", COORD(T)) stat("CPU:", "[world.cpu]") stat("Instances:", "[num2text(world.contents.len, 10)]") GLOB.stat_entry() + stat("Server Time:", time_stamp()) stat(null) if(Master) Master.stat_entry() @@ -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()]") @@ -1010,17 +1019,11 @@ var/list/slot_equipment_priority = list( \ var/atom/A = foo if(A.invisibility > see_invisible) continue - if(is_type_in_list(A, shouldnt_see)) + if(is_type_in_list(A, shouldnt_see) || !A.simulated) continue statpanel_things += A statpanel(listed_turf.name, null, statpanel_things) - -/mob/proc/add_stings_to_statpanel(var/list/stings) - for(var/obj/effect/proc_holder/changeling/S in stings) - if(S.chemical_cost >=0 && S.can_be_used_by(src)) - statpanel("[S.panel]",((S.chemical_cost > 0) ? "[S.chemical_cost]" : ""),S) - /mob/proc/add_spell_to_statpanel(var/obj/effect/proc_holder/spell/S) switch(S.charge_type) if("recharge") @@ -1030,7 +1033,6 @@ var/list/slot_equipment_priority = list( \ if("holdervar") statpanel(S.panel,"[S.holder_var_type] [S.holder_var_amount]",S) - // facing verbs /mob/proc/canface() if(!canmove) return 0 @@ -1075,7 +1077,7 @@ var/list/slot_equipment_priority = list( \ /mob/proc/IsAdvancedToolUser()//This might need a rename but it should replace the can this mob use things check - return 0 + return FALSE /mob/proc/swap_hand() return @@ -1091,7 +1093,7 @@ var/list/slot_equipment_priority = list( \ to_chat(usr, "You are banned from playing as sentient animals.") return - if(!ticker || ticker.current_state < 3) + if(!SSticker || SSticker.current_state < 3) to_chat(src, "You can't respawn as an NPC before the game starts!") return @@ -1172,12 +1174,11 @@ var/list/slot_equipment_priority = list( \ if(green) if(!no_text) visible_message("[src] vomits up some green goo!","You vomit up some green goo!") - new /obj/effect/decal/cleanable/vomit/green(location) + location.add_vomit_floor(FALSE, TRUE) else if(!no_text) visible_message("[src] pukes all over [p_them()]self!","You puke all over yourself!") - location.add_vomit_floor(src, 1) - playsound(location, 'sound/effects/splat.ogg', 50, 1) + location.add_vomit_floor(TRUE) /mob/proc/AddSpell(obj/effect/proc_holder/spell/S) mob_spell_list += S @@ -1295,6 +1296,7 @@ var/list/slot_equipment_priority = list( \ .["Show player panel"] = "?_src_=vars;mob_player_panel=[UID()]" .["Give Spell"] = "?_src_=vars;give_spell=[UID()]" + .["Give Martial Art"] = "?_src_=vars;givemartialart=[UID()]" .["Give Disease"] = "?_src_=vars;give_disease=[UID()]" .["Toggle Godmode"] = "?_src_=vars;godmode=[UID()]" .["Toggle Build Mode"] = "?_src_=vars;build_mode=[UID()]" @@ -1337,3 +1339,50 @@ var/list/slot_equipment_priority = list( \ /mob/proc/is_literate() return FALSE + +/mob/proc/faction_check_mob(mob/target, exact_match) + if(exact_match) //if we need an exact match, we need to do some bullfuckery. + var/list/faction_src = faction.Copy() + var/list/faction_target = target.faction.Copy() + if(!("\ref[src]" in faction_target)) //if they don't have our ref faction, remove it from our factions list. + faction_src -= "\ref[src]" //if we don't do this, we'll never have an exact match. + if(!("\ref[target]" in faction_src)) + faction_target -= "\ref[target]" //same thing here. + return faction_check(faction_src, faction_target, TRUE) + return faction_check(faction, target.faction, FALSE) + +/proc/faction_check(list/faction_A, list/faction_B, exact_match) + var/list/match_list + if(exact_match) + match_list = faction_A & faction_B //only items in both lists + var/length = LAZYLEN(match_list) + if(length) + return (length == LAZYLEN(faction_A)) //if they're not the same len(gth) or we don't have a len, then this isn't an exact match. + else + match_list = faction_A & faction_B + return LAZYLEN(match_list) + return FALSE + +/mob/proc/update_sight() + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() + +/mob/proc/sync_lighting_plane_alpha() + if(hud_used) + var/obj/screen/plane_master/lighting/L = hud_used.plane_masters["[LIGHTING_PLANE]"] + 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_defines.dm b/code/modules/mob/mob_defines.dm index 77c74c4396e..b378705becb 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -1,6 +1,6 @@ /mob density = 1 - layer = 4.0 + layer = MOB_LAYER animate_movement = 2 pressure_resistance = 8 dont_save = TRUE //to avoid it messing up in buildmode saving @@ -83,7 +83,6 @@ var/obj/item/clothing/mask/wear_mask = null//Carbon var/seer = 0 //for cult//Carbon, probably Human - var/see_override = 0 var/datum/hud/hud_used = null @@ -93,7 +92,7 @@ var/list/grabbed_by = list() var/list/requests = list() - + var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE var/list/mapobjs = list() var/in_throw_mode = 0 @@ -173,8 +172,11 @@ //SSD var, changed it up some so people can have special things happen for different mobs when SSD. var/player_logged = 0 + //Ghosted var, set only if a player has manually ghosted out of this mob. + var/player_ghosted = 0 + var/turf/listed_turf = null //the current turf being examined in the stat panel - var/list/shouldnt_see = list(/atom/movable/lighting_overlay) //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes + var/list/shouldnt_see = list() //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes var/kills = 0 @@ -193,9 +195,11 @@ var/list/permanent_huds = list() var/list/actions = list() + var/list/datum/action/chameleon_item_actions var/list/progressbars = null //for stacking do_after bars var/list/tkgrabbed_objects = list() // Assoc list of items to TK grabs var/forced_look = null // This can either be a numerical direction or a soft object reference (UID). It makes the mob always face towards the selected thing. + var/registered_z \ No newline at end of file diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 93941d6e7d2..077164be6b7 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -214,12 +214,12 @@ shift = -10 adir = assailant.dir affecting.setDir(assailant.dir) - affecting.loc = assailant.loc + affecting.forceMove(assailant.loc) if(GRAB_KILL) shift = 0 adir = 1 affecting.setDir(SOUTH)//face up - affecting.loc = assailant.loc + affecting.forceMove(assailant.loc) switch(adir) if(NORTH) @@ -387,15 +387,24 @@ if(M == assailant && state >= GRAB_AGGRESSIVE) //no eatin unless you have an agressive grab if(checkvalid(user, affecting)) //wut var/mob/living/carbon/attacker = user + + if(affecting.buckled) + to_chat(user, "[affecting] is buckled!") + return + user.visible_message("[user] is attempting to devour \the [affecting]!") if(!do_after(user, checktime(user, affecting), target = affecting)) return + if(affecting.buckled) + to_chat(user, "[affecting] is buckled!") + return + user.visible_message("[user] devours \the [affecting]!") if(affecting.mind) add_attack_logs(attacker, affecting, "Devoured") - affecting.loc = user + affecting.forceMove(user) attacker.stomach_contents.Add(affecting) qdel(src) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index beb474539f1..0a0e8422dbf 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -369,7 +369,7 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) if(hud_used && hud_used.action_intent) hud_used.action_intent.icon_state = "[a_intent]" - else if(isrobot(src) || islarva(src) || isanimal(src)) + else if(isrobot(src) || islarva(src) || isanimal(src) || isAI(src)) switch(input) if(INTENT_HELP) a_intent = INTENT_HELP @@ -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 @@ -568,9 +567,9 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name. if(force) - newname = input(src, "Pick a new name.", "Name Change", oldname) as text + newname = clean_input("Pick a new name.", "Name Change", oldname, src) else - newname = input(src, "You are a [role]. Would you like to change your name to something else? (You have 3 minutes to select a new name.)", "Name Change", oldname) as text + newname = clean_input("You are a [role]. Would you like to change your name to something else? (You have 3 minutes to select a new name.)", "Name Change", oldname, src) if(((world.time - time_passed) > 1800) && !force) alert(src, "Unfortunately, more than 3 minutes have passed for selecting your name. If you are a robot, use the Namepick verb; otherwise, adminhelp.", "Name Change") return //took too long @@ -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/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index a94be6a54c1..c3ec68c9793 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -9,7 +9,7 @@ return if(!new_type) - new_type = input("Mob type path:", "Mob type") as text|null + new_type = clean_input("Mob type path:", "Mob type") if(istext(new_type)) new_type = text2path(new_type) diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 1c7b06b1ce1..d8e6a239a9a 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -14,21 +14,16 @@ loc = locate(1,1,1) lastarea = loc + client.screen = list() // Remove HUD items just in case. + client.images = list() + if(!hud_used) + create_mob_hud() + if(hud_used) + hud_used.show_hud(hud_used.hud_version) + sight |= SEE_TURFS GLOB.player_list |= src -/* - var/list/watch_locations = list() - for(var/obj/effect/landmark/landmark in GLOB.landmarks_list) - if(landmark.tag == "landmark*new_player") - watch_locations += landmark.loc - - if(watch_locations.len>0) - loc = pick(watch_locations) -*/ - - callHook("mob_login", list("client" = client, "mob" = src)) - new_player_panel() spawn(30) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 80303c1dcd1..47a4e4a5d0e 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -59,7 +59,7 @@ real_name = "Random Character Slot" var/output = "

Setup Character
[real_name]

" - if(!ticker || ticker.current_state <= GAME_STATE_PREGAME) + if(!SSticker || SSticker.current_state <= GAME_STATE_PREGAME) if(!ready) output += "

Declare Ready

" else output += "

You are ready (Cancel)

" else @@ -106,21 +106,21 @@ /mob/new_player/Stat() statpanel("Lobby") - if(client.statpanel=="Lobby" && ticker) - if(ticker.hide_mode) + if(client.statpanel=="Lobby" && SSticker) + if(SSticker.hide_mode) stat("Game Mode:", "Secret") else - if(ticker.hide_mode == 0) + if(SSticker.hide_mode == 0) stat("Game Mode:", "[master_mode]") // Old setting for showing the game mode else stat("Game Mode: ", "Secret") - if((ticker.current_state == GAME_STATE_PREGAME) && going) - stat("Time To Start:", ticker.pregame_timeleft) - if((ticker.current_state == GAME_STATE_PREGAME) && !going) + if((SSticker.current_state == GAME_STATE_PREGAME) && going) + stat("Time To Start:", round(SSticker.pregame_timeleft/10)) + if((SSticker.current_state == GAME_STATE_PREGAME) && !going) stat("Time To Start:", "DELAYED") - if(ticker.current_state == GAME_STATE_PREGAME) + if(SSticker.current_state == GAME_STATE_PREGAME) stat("Players:", "[totalPlayers]") if(check_rights(R_ADMIN, 0, src)) stat("Players Ready:", "[totalPlayersReady]") @@ -136,8 +136,6 @@ ..() statpanel("Status") - if(client.statpanel == "Status" && ticker) - show_stat_station_time() /mob/new_player/Topic(href, href_list[]) @@ -182,7 +180,8 @@ return 0 if(alert(src,"Are you sure you wish to observe? You cannot normally join the round after doing this!","Player Setup","Yes","No") == "Yes") - if(!client) return 1 + if(!client) + return 1 var/mob/dead/observer/observer = new() src << browse(null, "window=playersetup") spawning = 1 @@ -193,7 +192,7 @@ close_spawn_windows() var/obj/O = locate("landmark*Observer-Start") to_chat(src, "Now teleporting.") - observer.loc = O.loc + observer.forceMove(O.loc) observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly. client.prefs.update_preview_icon(1) observer.icon = client.prefs.preview_icon @@ -217,10 +216,9 @@ if(!tos_consent) to_chat(usr, "You must consent to the terms of service before you can join!") return 0 - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) to_chat(usr, "The round is either not ready, or has already finished...") return - if(client.prefs.species in GLOB.whitelisted_species) if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist) @@ -256,7 +254,7 @@ new_player_panel() /mob/new_player/proc/IsJobAvailable(rank) - var/datum/job/job = job_master.GetJob(rank) + var/datum/job/job = SSjobs.GetJob(rank) if(!job) return 0 if(!job.is_position_available()) return 0 if(jobban_isbanned(src,rank)) return 0 @@ -269,9 +267,9 @@ if(config.assistantlimit) if(job.title == "Civilian") var/count = 0 - var/datum/job/officer = job_master.GetJob("Security Officer") - var/datum/job/warden = job_master.GetJob("Warden") - var/datum/job/hos = job_master.GetJob("Head of Security") + var/datum/job/officer = SSjobs.GetJob("Security Officer") + var/datum/job/warden = SSjobs.GetJob("Warden") + var/datum/job/hos = SSjobs.GetJob("Head of Security") count += (officer.current_positions + warden.current_positions + hos.current_positions) if(job.current_positions > (config.assistantratio * count)) if(count >= 5) // if theres more than 5 security on the station just let assistants join regardless, they should be able to handle the tide @@ -280,21 +278,21 @@ return 1 /mob/new_player/proc/IsAdminJob(rank) - var/datum/job/job = job_master.GetJob(rank) + var/datum/job/job = SSjobs.GetJob(rank) if(job.admin_only) return 1 else return 0 /mob/new_player/proc/IsERTSpawnJob(rank) - var/datum/job/job = job_master.GetJob(rank) + var/datum/job/job = SSjobs.GetJob(rank) if(job.spawn_ert) return 1 else return 0 /mob/new_player/proc/IsSyndicateCommand(rank) - var/datum/job/job = job_master.GetJob(rank) + var/datum/job/job = SSjobs.GetJob(rank) if(job.syndicate_command) return 1 else @@ -303,7 +301,7 @@ /mob/new_player/proc/AttemptLateSpawn(rank,var/spawning_at) if(src != usr) return 0 - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) to_chat(usr, "The round is either not ready, or has already finished...") return 0 if(!enter_allowed) @@ -312,15 +310,15 @@ if(!IsJobAvailable(rank)) to_chat(src, alert("[rank] is not available. Please try another.")) return 0 - var/datum/job/thisjob = job_master.GetJob(rank) + var/datum/job/thisjob = SSjobs.GetJob(rank) if(thisjob.barred_by_disability(client)) to_chat(src, alert("[rank] is not available due to your character's disability. Please try another.")) return 0 - job_master.AssignRole(src, rank, 1) + SSjobs.AssignRole(src, rank, 1) var/mob/living/character = create_character() //creates the human and transfers vars and mind - character = job_master.AssignRank(character, rank, 1) //equips the human + character = SSjobs.AssignRank(character, rank, 1) //equips the human // AIs don't need a spawnpoint, they must spawn at an empty core if(character.mind.assigned_role == "AI") @@ -330,7 +328,7 @@ ai_character.moveToEmptyCore() AnnounceCyborg(ai_character, rank, "has been downloaded to the empty core in \the [get_area(ai_character)]") - ticker.mode.latespawn(ai_character) + SSticker.mode.latespawn(ai_character) qdel(src) return @@ -344,53 +342,50 @@ else if(IsSyndicateCommand(rank)) character.loc = pick(syndicateofficer) else - character.loc = pick(aroomwarp) + character.forceMove(pick(aroomwarp)) join_message = "has arrived" else if(spawning_at) S = spawntypes[spawning_at] if(S && istype(S)) if(S.check_job_spawning(rank)) - character.loc = pick(S.turfs) + character.forceMove(pick(S.turfs)) join_message = S.msg else to_chat(character, "Your chosen spawnpoint ([S.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.") - character.loc = pick(latejoin) + character.forceMove(pick(latejoin)) join_message = "has arrived on the station" else - character.loc = pick(latejoin) + character.forceMove(pick(latejoin)) join_message = "has arrived on the station" character.lastarea = get_area(loc) // Moving wheelchair if they have one if(character.buckled && istype(character.buckled, /obj/structure/chair/wheelchair)) - character.buckled.loc = character.loc + character.buckled.forceMove(character.loc) character.buckled.dir = character.dir - character = job_master.EquipRank(character, rank, 1) //equips the human + character = SSjobs.EquipRank(character, rank, 1) //equips the human EquipCustomItems(character) - ticker.mode.latespawn(character) + SSticker.mode.latespawn(character) if(character.mind.assigned_role == "Cyborg") AnnounceCyborg(character, rank, join_message) - callHook("latespawn", list(character)) - else if(IsAdminJob(rank)) - callHook("latespawn", list(character)) else data_core.manifest_inject(character) - ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn - AnnounceArrival(character, rank, join_message) - callHook("latespawn", list(character)) - AddEmploymentContract(character) + SSticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn + if(!IsAdminJob(rank)) + AnnounceArrival(character, rank, join_message) + AddEmploymentContract(character) - if(!thisjob.is_position_available() && thisjob in job_master.prioritized_jobs) - job_master.prioritized_jobs -= thisjob + if(!thisjob.is_position_available() && thisjob in SSjobs.prioritized_jobs) + SSjobs.prioritized_jobs -= thisjob qdel(src) /mob/new_player/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message) - if(ticker.current_state == GAME_STATE_PLAYING) + if(SSticker.current_state == GAME_STATE_PLAYING) var/ailist[] = list() for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) ailist += A @@ -422,7 +417,7 @@ employmentCabinet.addFile(employee) /mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message) - if(ticker.current_state == GAME_STATE_PLAYING) + if(SSticker.current_state == GAME_STATE_PLAYING) var/ailist[] = list() for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) ailist += A @@ -452,11 +447,11 @@ else if(SSshuttle.emergency.mode >= SHUTTLE_CALL) dat += "The station is currently undergoing evacuation procedures.
" - if(length(job_master.prioritized_jobs)) + if(length(SSjobs.prioritized_jobs)) dat += "The station has flagged these jobs as high priority: " - var/amt = length(job_master.prioritized_jobs) + var/amt = length(SSjobs.prioritized_jobs) var/amt_count - for(var/datum/job/a in job_master.prioritized_jobs) + for(var/datum/job/a in SSjobs.prioritized_jobs) amt_count++ if(amt_count != amt) dat += " [a.title], " @@ -464,8 +459,7 @@ dat += " [a.title].
" - dat += "Choose from the following open positions:

" - + var/num_jobs_available = 0 var/list/activePlayers = list() var/list/categorizedJobs = list( "Command" = list(jobs = list(), titles = command_positions, color = "#aac1ee"), @@ -478,8 +472,9 @@ "Science" = list(jobs = list(), titles = science_positions, color = "#e6b3e6"), "Supply" = list(jobs = list(), titles = supply_positions, color = "#ead4ae"), ) - for(var/datum/job/job in job_master.occupations) + for(var/datum/job/job in SSjobs.occupations) if(job && IsJobAvailable(job.title) && !job.barred_by_disability(client)) + num_jobs_available++ activePlayers[job] = 0 var/categorized = 0 // Only players with the job assigned and AFK for less than 10 minutes count as active @@ -502,23 +497,27 @@ if(!categorized) categorizedJobs["Miscellaneous"]["jobs"] += job - dat += "
" - for(var/jobcat in categorizedJobs) - if(categorizedJobs[jobcat]["colBreak"]) - dat += "" - if(length(categorizedJobs[jobcat]["jobs"]) < 1) - continue - var/color = categorizedJobs[jobcat]["color"] - dat += "
" - dat += "[jobcat]" - for(var/datum/job/job in categorizedJobs[jobcat]["jobs"]) - if(job in job_master.prioritized_jobs) - dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" - else - dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" - dat += "

" + if(num_jobs_available) + dat += "Choose from the following open positions:

" + dat += "
" + for(var/jobcat in categorizedJobs) + if(categorizedJobs[jobcat]["colBreak"]) + dat += "" + if(length(categorizedJobs[jobcat]["jobs"]) < 1) + continue + var/color = categorizedJobs[jobcat]["color"] + dat += "
" + dat += "[jobcat]" + for(var/datum/job/job in categorizedJobs[jobcat]["jobs"]) + if(job in SSjobs.prioritized_jobs) + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" + else + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" + dat += "

" - dat += "
" + dat += "
" + else + dat += "

Unfortunately, there are no job slots free currently.
Wait a few minutes, then try again.
Or, try observing the round.
" // Removing the old window method but leaving it here for reference // src << browse(dat, "window=latechoices;size=300x640;can_close=1") // Added the new browser window method @@ -536,7 +535,7 @@ var/mob/living/carbon/human/new_character = new(loc) new_character.lastarea = get_area(loc) - if(ticker.random_players || appearance_isbanned(new_character)) + if(SSticker.random_players || appearance_isbanned(new_character)) client.prefs.random_character() client.prefs.real_name = random_name(client.prefs.gender) client.prefs.copy_to(new_character) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 84ac1ed9eb0..64f9e139542 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -385,19 +385,22 @@ if(underwear && (current_species.clothing_flags & HAS_UNDERWEAR)) var/datum/sprite_accessory/underwear/U = GLOB.underwear_list[underwear] if(U) - underwear_s = new/icon(U.icon, "uw_[U.icon_state]_s", ICON_OVERLAY) + var/u_icon = U.sprite_sheets && (current_species.name in U.sprite_sheets) ? U.sprite_sheets[current_species.name] : U.icon //Species-fit the undergarment. + underwear_s = new/icon(u_icon, "uw_[U.icon_state]_s", ICON_OVERLAY) var/icon/undershirt_s = null if(undershirt && (current_species.clothing_flags & HAS_UNDERSHIRT)) var/datum/sprite_accessory/undershirt/U2 = GLOB.undershirt_list[undershirt] if(U2) - undershirt_s = new/icon(U2.icon, "us_[U2.icon_state]_s", ICON_OVERLAY) + var/u2_icon = U2.sprite_sheets && (current_species.name in U2.sprite_sheets) ? U2.sprite_sheets[current_species.name] : U2.icon + undershirt_s = new/icon(u2_icon, "us_[U2.icon_state]_s", ICON_OVERLAY) var/icon/socks_s = null if(socks && (current_species.clothing_flags & HAS_SOCKS)) var/datum/sprite_accessory/socks/U3 = GLOB.socks_list[socks] if(U3) - socks_s = new/icon(U3.icon, "sk_[U3.icon_state]_s", ICON_OVERLAY) + var/u3_icon = U3.sprite_sheets && (current_species.name in U3.sprite_sheets) ? U3.sprite_sheets[current_species.name] : U3.icon + socks_s = new/icon(u3_icon, "sk_[U3.icon_state]_s", ICON_OVERLAY) var/icon/clothes_s = null var/uniform_dmi='icons/mob/uniform.dmi' diff --git a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm index 41dd75a49e5..d4834eccc80 100644 --- a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm @@ -49,6 +49,7 @@ // Restrict some styles to specific species var/list/species_allowed = list("Human", "Slime People") + var/list/sprite_sheets = list() //For accessories common across species but need to use 'fitted' sprites (like underwear). e.g. list("Vox" = 'icons/mob/species/vox/iconfile.dmi') var/list/models_allowed = list() //Specifies which, if any, hairstyles or markings can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm. var/list/heads_allowed = null //Specifies which, if any, alt heads a head marking, hairstyle or facial hair style is compatible with. var/list/tails_allowed = null //Specifies which, if any, tails a tail marking is compatible with. @@ -132,7 +133,7 @@ /datum/sprite_accessory/skin/human name = "Default human skin" icon_state = "default" - species_allowed = list("Human",) + species_allowed = list("Human") /datum/sprite_accessory/skin/human/human_tatt01 name = "Tatt01 human skin" @@ -167,7 +168,11 @@ /////////////////////////// /datum/sprite_accessory/underwear icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/underwear.dmi', + "Grey" = 'icons/mob/species/grey/underwear.dmi' + ) gender = NEUTER /datum/sprite_accessory/underwear/nude @@ -293,7 +298,10 @@ //////////////////////////// /datum/sprite_accessory/undershirt icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/underwear.dmi', + "Grey" = 'icons/mob/species/grey/underwear.dmi') gender = NEUTER /datum/sprite_accessory/undershirt/nude @@ -529,7 +537,8 @@ /////////////////////// /datum/sprite_accessory/socks icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") + sprite_sheets = list("Vox" = 'icons/mob/species/vox/underwear.dmi') gender = NEUTER /datum/sprite_accessory/socks/nude @@ -566,6 +575,10 @@ icon_state = "thin_knee" gender = FEMALE +/datum/sprite_accessory/socks/striped_norm + name = "Normal Striped" + icon_state = "striped_norm" + /datum/sprite_accessory/socks/striped_knee name = "Knee-high Striped" icon_state = "striped_knee" @@ -603,50 +616,3 @@ /datum/sprite_accessory/socks/black_fishnet name = "Black Fishnet" icon_state = "black_fishnet" - -/datum/sprite_accessory/socks/vox - species_allowed = list("Vox") - -/datum/sprite_accessory/socks/vox/vox_white - name = "Vox White" - icon_state = "vox_white" - -/datum/sprite_accessory/socks/vox/vox_black - name = "Vox Black" - icon_state = "vox_black" - -/datum/sprite_accessory/socks/vox/vox_thin - name = "Vox Black Thin" - icon_state = "vox_blackthin" - -/datum/sprite_accessory/socks/vox/vox_rainbow - name = "Vox Rainbow" - icon_state = "vox_rainbow" - -/datum/sprite_accessory/socks/vox/vox_stripped - name = "Vox Striped" - icon_state = "vox_white" - -/datum/sprite_accessory/socks/vox/vox_white_thigh - name = "Vox Thigh-high White" - icon_state = "vox_whiteTH" - -/datum/sprite_accessory/socks/vox/vox_black_thigh - name = "Vox Thigh-high Black" - icon_state = "vox_blackTH" - -/datum/sprite_accessory/socks/vox/vox_thin_thigh - name = "Vox Thigh-high Thin" - icon_state = "vox_blackthinTH" - -/datum/sprite_accessory/socks/vox/vox_rainbow_thigh - name = "Vox Thigh-high Rainbow" - icon_state = "vox_rainbowTH" - -/datum/sprite_accessory/socks/vox/vox_striped_thigh - name = "Vox Thigh-high Striped" - icon_state = "vox_stripedTH" - -/datum/sprite_accessory/socks/vox/vox_fishnet - name = "Vox Fishnets" - icon_state = "vox_fishnet" \ No newline at end of file diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index aeb6d8f14bf..93eb035b187 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -98,7 +98,7 @@ return verb -/mob/proc/emote(var/act, var/type, var/message) +/mob/proc/emote(act, type, message, force) if(act == "me") return custom_emote(type, message) @@ -184,7 +184,7 @@ var/current = prefix_locations[i] // ["Common", keypos] // There are a few things that will make us want to ignore all other languages in - namely, HIVEMIND languages. - var/datum/language/L = current[1] + var/datum/language/L = current[1] if(L && L.flags & HIVEMIND) . = new /datum/multilingual_say_piece(L, trim(strip_prefixes(message))) break diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index a1ed4f0bde9..00e5c1550d9 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -94,8 +94,6 @@ if(O.mmi) O.mmi.transfer_identity(src) //Does not transfer key/client. - callHook("borgify", list(O)) - O.update_pipe_vision() O.Namepick() @@ -289,8 +287,6 @@ return 1 if(ispath(MP, /mob/living/simple_animal/parrot)) return 1 - if(ispath(MP, /mob/living/simple_animal/pony)) - return 1 if(!GAMEMODE_IS_NUCLEAR) if(ispath(MP, /mob/living/simple_animal/pet/fox/Syndifox)) return 0 diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index 9c6c8f2fa73..9ad5449ee8b 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -39,7 +39,7 @@ var/global/image/typing_indicator set_typing_indicator(1) hud_typing = 1 - var/message = input("","say (text)") as null|text + var/message = typing_input(src, "", "say (text)") hud_typing = 0 set_typing_indicator(0) if(message) @@ -49,9 +49,10 @@ var/global/image/typing_indicator set name = ".Me" set hidden = 1 + set_typing_indicator(1) hud_typing = 1 - var/message = input("","me (text)") as null|text + var/message = typing_input(src, "", "me (text)") hud_typing = 0 set_typing_indicator(0) if(message) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index e978a2b4798..75aa563dd86 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -50,7 +50,7 @@ if(!physical) physical = src ..() - processing_objects += src + START_PROCESSING(SSobj, src) all_components = list() idle_threads = list() @@ -64,7 +64,7 @@ all_components.Remove(CH.device_type) qdel(CH) physical = null - processing_objects -= src + STOP_PROCESSING(SSobj, src) return ..() diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index d43a5f6d00c..27c81d48190 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -13,10 +13,10 @@ if(battery_module && battery_module.battery && battery_module.battery.charge) var/obj/item/stock_parts/cell/cell = battery_module.battery - if(cell.use(amount * CELLRATE)) + if(cell.use(amount * GLOB.CELLRATE)) return TRUE else // Discharge the cell anyway. - cell.use(min(amount*CELLRATE, cell.charge)) + cell.use(min(amount*GLOB.CELLRATE, cell.charge)) return FALSE return FALSE @@ -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/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm index d67268716a5..31bb8733463 100644 --- a/code/modules/modular_computers/file_system/programs/command/card.dm +++ b/code/modules/modular_computers/file_system/programs/command/card.dm @@ -72,7 +72,7 @@ /datum/computer_file/program/card_mod/proc/format_job_slots() var/list/formatted = list() - for(var/datum/job/job in job_master.occupations) + for(var/datum/job/job in SSjobs.occupations) if(job_blacklisted(job)) continue formatted.Add(list(list( @@ -127,28 +127,27 @@ /datum/computer_file/program/card_mod/proc/can_prioritize_job(datum/job/job) if(job) if(!job_blacklisted(job)) - if(job in job_master.prioritized_jobs) + if(job in SSjobs.prioritized_jobs) return 2 else - if(job_master.prioritized_jobs.len >= 3) + if(SSjobs.prioritized_jobs.len >= 3) return 0 if(job.total_positions <= job.current_positions) return 0 return 1 return -1 -/datum/computer_file/program/card_mod/proc/format_jobs(list/jobs) +/datum/computer_file/program/card_mod/proc/format_jobs(list/jobs, targetrank, list/jobformats) var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD] if(!card_slot || !card_slot.stored_card) return null - var/obj/item/card/id/id_card = card_slot.stored_card var/list/formatted = list() for(var/job in jobs) formatted.Add(list(list( "display_name" = replacetext(job, " ", " "), - "target_rank" = id_card && id_card.assignment ? id_card.assignment : "Unassigned", - "job" = job))) - + "target_rank" = targetrank, + "job" = job, + "jlinkformat" = jobformats[job] ? jobformats[job] : null))) return formatted @@ -225,11 +224,12 @@ var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN)) //let custom jobs function as an impromptu alt title, mainly for sechuds if(temp_t && modify) + SSjobs.log_job_transfer(modify.registered_name, modify.getRankAndAssignment(), temp_t, scan.registered_name) modify.assignment = temp_t log_game("[key_name(usr)] has given \"[modify.registered_name]\" the custom job title \"[temp_t]\".") else var/list/access = list() - if(is_centcom) + if(is_centcom && islist(get_centcom_access(t1))) access = get_centcom_access(t1) else var/datum/job/jobdatum @@ -249,12 +249,20 @@ if(t1 == "Civilian") message_admins("[key_name_admin(usr)] has reassigned \"[modify.registered_name]\" from \"[jobnamedata]\" to \"[t1]\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, t1, scan.registered_name) + SSjobs.slot_job_transfer(modify.rank, t1) + + var/mob/living/carbon/human/H = modify.getPlayer() + if(istype(H)) + if(jobban_isbanned(H, t1)) + message_admins("[ADMIN_FULLMONTY(H)] has been assigned the job [t1], in possible violation of their job ban.") + if(H.mind) + H.mind.playtime_role = t1 + modify.access = access modify.assignment = t1 modify.rank = t1 - callHook("reassign_employee", list(modify)) - if("PRG_reg") if(is_authenticated(usr)) var/temp_name = reject_bad_name(href_list["reg"]) @@ -271,6 +279,18 @@ if("PRG_mode") mode = text2num(href_list["mode_target"]) + if("PRG_wipe_my_logs") + if(is_authenticated(usr) && is_centcom) + var/delcount = SSjobs.delete_log_records(scan.registered_name, FALSE) + if(delcount) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + + if("PRG_wipe_all_logs") + if(is_authenticated(usr)) + var/delcount = SSjobs.delete_log_records(scan.registered_name, TRUE) + if(delcount) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + if("PRG_print") if(!printing && computer) printing = 1 @@ -312,15 +332,15 @@ var/jobnamedata = modify.getRankAndAssignment() log_game("[key_name(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".") message_admins("[key_name_admin(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Terminated", scan.registered_name) modify.assignment = "Terminated" modify.access = list() - callHook("terminate_employee", list(modify)) if("PRG_make_job_available") // MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS if(is_authenticated(usr)) var/edit_job_target = href_list["job"] - var/datum/job/j = job_master.GetJob(edit_job_target) + var/datum/job/j = SSjobs.GetJob(edit_job_target) if(!j) return 1 if(can_open_job(j) != 1) @@ -335,7 +355,7 @@ // MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS if(is_authenticated(usr)) var/edit_job_target = href_list["job"] - var/datum/job/j = job_master.GetJob(edit_job_target) + var/datum/job/j = SSjobs.GetJob(edit_job_target) if(!j) return 1 if(can_close_job(j) != 1) @@ -352,16 +372,16 @@ // TOGGLE WHETHER JOB APPEARS AS PRIORITIZED IN THE LOBBY if(is_authenticated(usr)) var/priority_target = href_list["job"] - var/datum/job/j = job_master.GetJob(priority_target) + var/datum/job/j = SSjobs.GetJob(priority_target) if(!j) return 0 // Unlike the proper ID computer, this does not check job_in_department var/priority = TRUE - if(j in job_master.prioritized_jobs) - job_master.prioritized_jobs -= j + if(j in SSjobs.prioritized_jobs) + SSjobs.prioritized_jobs -= j priority = FALSE - else if(job_master.prioritized_jobs.len < 3) - job_master.prioritized_jobs += j + else if(SSjobs.prioritized_jobs.len < 3) + SSjobs.prioritized_jobs += j else return 0 log_game("[key_name(usr)] [priority ? "prioritized" : "unprioritized"] the job \"[j.title]\".") @@ -398,6 +418,7 @@ data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----" data["target_rank"] = get_target_rank() data["scan_name"] = scan ? scan.name : "-----" + data["scan_owner"] = scan && scan.registered_name ? scan.registered_name : null data["authenticated"] = is_authenticated(user) data["has_modify"] = !!modify data["account_number"] = modify ? modify.associated_account_number : null @@ -405,14 +426,17 @@ data["all_centcom_access"] = null data["regions"] = null - data["engineering_jobs"] = format_jobs(engineering_positions) - data["medical_jobs"] = format_jobs(medical_positions) - data["science_jobs"] = format_jobs(science_positions) - data["security_jobs"] = format_jobs(security_positions) - data["support_jobs"] = format_jobs(support_positions) - data["civilian_jobs"] = format_jobs(civilian_positions) - data["special_jobs"] = format_jobs(whitelisted_positions) - data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + var/list/job_formats = SSjobs.format_jobs_for_id_computer(modify) + + data["top_jobs"] = format_jobs(list("Captain", "Custom"), data["target_rank"], job_formats) + data["engineering_jobs"] = format_jobs(engineering_positions, data["target_rank"], job_formats) + data["medical_jobs"] = format_jobs(medical_positions, data["target_rank"], job_formats) + data["science_jobs"] = format_jobs(science_positions, data["target_rank"], job_formats) + data["security_jobs"] = format_jobs(security_positions, data["target_rank"], job_formats) + data["support_jobs"] = format_jobs(support_positions, data["target_rank"], job_formats) + data["civilian_jobs"] = format_jobs(civilian_positions, data["target_rank"], job_formats) + data["special_jobs"] = format_jobs(whitelisted_positions, data["target_rank"], job_formats) + data["centcom_jobs"] = format_jobs(get_all_centcom_jobs(), data["target_rank"], job_formats) data["card_skins"] = format_card_skins(get_station_card_skins()) data["job_slots"] = format_job_slots() @@ -423,6 +447,9 @@ data["cooldown_mins"] = mins data["cooldown_secs"] = (seconds < 10) ? "0[seconds]" : seconds + if(mode == 3 && is_authenticated(user)) + data["id_change_html"] = SSjobs.fetch_transfer_record_html(is_centcom) + if(modify) data["current_skin"] = modify.icon_state diff --git a/code/modules/modular_computers/file_system/programs/command/comms.dm b/code/modules/modular_computers/file_system/programs/command/comms.dm index 637e4379e0a..dfce733cc7a 100644 --- a/code/modules/modular_computers/file_system/programs/command/comms.dm +++ b/code/modules/modular_computers/file_system/programs/command/comms.dm @@ -245,7 +245,7 @@ message_cooldown = 0 if("callshuttle") - var/input = input(usr, "Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") as text|null + var/input = clean_input("Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") if(!input || ..() || !is_authenticated(usr)) SSnanoui.update_uis(src) return 1 @@ -306,11 +306,11 @@ setMenuState(usr, COMM_SCREEN_STAT) if("setmsg1") - stat_msg1 = input("Line 1", "Enter Message Text", stat_msg1) as text|null + stat_msg1 = clean_input("Line 1", "Enter Message Text", stat_msg1) setMenuState(usr, COMM_SCREEN_STAT) if("setmsg2") - stat_msg2 = input("Line 2", "Enter Message Text", stat_msg2) as text|null + stat_msg2 = clean_input("Line 2", "Enter Message Text", stat_msg2) setMenuState(usr, COMM_SCREEN_STAT) if("nukerequest") diff --git a/code/modules/modular_computers/file_system/programs/engineering/alarm.dm b/code/modules/modular_computers/file_system/programs/engineering/alarm.dm index 5fcaf9b03fd..226511e2c09 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/alarm.dm @@ -11,7 +11,7 @@ /datum/computer_file/program/alarm_monitor/New() ..() - alarm_handlers = list(atmosphere_alarm, fire_alarm, power_alarm) + alarm_handlers = list(SSalarms.atmosphere_alarm, SSalarms.fire_alarm, SSalarms.power_alarm) for(var/datum/alarm_handler/AH in alarm_handlers) AH.register(src, /datum/computer_file/program/alarm_monitor/proc/update_icon) diff --git a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm index 2efe872a7f5..783ae9fa947 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm @@ -39,7 +39,7 @@ data["powermonitor"] = attached ? TRUE : FALSE if(attached) - var/datum/powernet/powernet = attached.get_powernet() + var/datum/powernet/powernet = attached.powernet data["poweravail"] = powernet.avail data["powerload"] = powernet.viewload data["powerdemand"] = powernet.load 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/modular_computers/hardware/recharger.dm b/code/modules/modular_computers/hardware/recharger.dm index 688d689cf67..418a9736528 100644 --- a/code/modules/modular_computers/hardware/recharger.dm +++ b/code/modules/modular_computers/hardware/recharger.dm @@ -20,7 +20,7 @@ return if(use_power(charge_rate, charging=1)) - holder.give_power(charge_rate * CELLRATE) + holder.give_power(charge_rate * GLOB.CELLRATE) /obj/item/computer_hardware/recharger/APC diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm index e4dd848dac6..dc52841a367 100644 --- a/code/modules/nano/modules/alarm_monitor.dm +++ b/code/modules/nano/modules/alarm_monitor.dm @@ -5,15 +5,15 @@ /datum/nano_module/alarm_monitor/all/New() ..() - alarm_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) + alarm_handlers = list(SSalarms.atmosphere_alarm, SSalarms.burglar_alarm, SSalarms.camera_alarm, SSalarms.fire_alarm, SSalarms.motion_alarm, SSalarms.power_alarm) /datum/nano_module/alarm_monitor/engineering/New() ..() - alarm_handlers = list(atmosphere_alarm, fire_alarm, power_alarm) + alarm_handlers = list(SSalarms.atmosphere_alarm, SSalarms.fire_alarm, SSalarms.power_alarm) /datum/nano_module/alarm_monitor/security/New() ..() - alarm_handlers = list(burglar_alarm, camera_alarm, motion_alarm) + alarm_handlers = list(SSalarms.burglar_alarm, SSalarms.camera_alarm, SSalarms.motion_alarm) /datum/nano_module/alarm_monitor/proc/register(var/object, var/procName) for(var/datum/alarm_handler/AH in alarm_handlers) diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm index 9936895e473..3b61ea0f557 100644 --- a/code/modules/nano/modules/atmos_control.dm +++ b/code/modules/nano/modules/atmos_control.dm @@ -42,6 +42,7 @@ /datum/nano_module/atmos_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) var/data[0] data["alarms"] = air_alarm_repository.air_alarm_data(monitored_alarms) + return data /datum/nano_module/atmos_control/proc/generate_state(air_alarm) 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 87649f97512..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 @@ -506,7 +508,7 @@ nanoui is used to open and update nano browser uis * * @return nothing */ -/datum/nanoui/proc/process(update = 0) +/datum/nanoui/process(update = 0) if(!src_object || !user) close() return diff --git a/code/modules/ninja/suit/SpiderOS.dm b/code/modules/ninja/suit/SpiderOS.dm index cb91167e202..d9827c5cf32 100644 --- a/code/modules/ninja/suit/SpiderOS.dm +++ b/code/modules/ninja/suit/SpiderOS.dm @@ -211,7 +211,7 @@ if("Message") var/obj/item/pda/P = locate(href_list["target"]) - var/t = input(U, "Please enter untraceable message.") as text + var/t = clean_input("Please enter untraceable message.", user=U) t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN) if(!t||U.stat||U.wear_suit!=src||!s_initialized)//Wow, another one of these. Man... display_to << browse(null, "window=spideros") diff --git a/code/modules/ninja/suit/mask.dm b/code/modules/ninja/suit/mask.dm index 910ccbc953c..0ebec2e724f 100644 --- a/code/modules/ninja/suit/mask.dm +++ b/code/modules/ninja/suit/mask.dm @@ -6,16 +6,26 @@ Contents: */ -/obj/item/clothing/mask/gas/voice/space_ninja +/obj/item/clothing/mask/gas/space_ninja name = "ninja mask" desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement." icon_state = "s-ninja(norm)" item_state = "s-ninja_mask" unacidable = 1 - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + 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' ) + + var/obj/item/voice_changer/voice_changer + +/obj/item/clothing/mask/gas/space_ninja/Initialize(mapload) + . = ..() + voice_changer = new(src) + +/obj/item/clothing/mask/gas/space_ninja/Destroy() + QDEL_NULL(voice_changer) + return ..() \ No newline at end of file diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index f03a08d237a..6e550e64893 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -24,9 +24,12 @@ Contents: var/obj/item/clothing/head/helmet/space/space_ninja/suitHood var/obj/item/clothing/gloves/space_ninja/suitGloves var/obj/item/clothing/shoes/space_ninja/suitShoes - var/obj/item/clothing/mask/gas/voice/space_ninja/suitMask + 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)) @@ -41,7 +44,7 @@ Contents: if(!istype(user.shoes, /obj/item/clothing/shoes/space_ninja)) to_chat(user, "ERROR: Unable to locate foot gear.\nABORTING...") return 0 - if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) + if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/space_ninja)) to_chat(user, "ERROR: Unable to locate mask.\nABORTING...") return 0 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/clipboard.dm b/code/modules/paperwork/clipboard.dm index e1ae7da26f5..dc16101eac7 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -131,13 +131,13 @@ obj/item/clipboard/proc/penPlacement(mob/user, obj/item/pen/P, placing) else penPlacement(usr, containedpen, FALSE) else if(href_list["remove"]) - var/obj/item/P = locate(href_list["remove"]) + var/obj/item/P = locate(href_list["remove"]) in src if(isPaperwork(P)) usr.put_in_hands(P) to_chat(usr, "You remove [P] from [src].") checkTopPaper() //So we don't accidentally make the top sheet not be on the clipboard else if(href_list["viewOrWrite"]) - var/obj/item/P = locate(href_list["viewOrWrite"]) + var/obj/item/P = locate(href_list["viewOrWrite"]) in src if(!isPaperwork(P)) return if(is_pen(I) && isPaperwork(P) != PHOTO) //Because you can't write on photos that aren't in your hand @@ -148,7 +148,7 @@ obj/item/clipboard/proc/penPlacement(mob/user, obj/item/pen/P, placing) var/obj/item/photo/Ph = P Ph.show(usr) else if(href_list["topPaper"]) - var/obj/item/P = locate(href_list["topPaper"]) + var/obj/item/P = locate(href_list["topPaper"]) in src if(P == toppaper) return to_chat(usr, "You flick the pages so that [P] is on top.") diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index 6e2c8e6b521..c1124bee744 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -104,7 +104,7 @@ H.visible_message("[H] holds up a contract claiming his soul, then immediately catches fire. It looks like \he's trying to commit suicide!") H.adjust_fire_stacks(20) H.IgniteMob() - return(FIRELOSS) + return FIRELOSS else ..() diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index f4808f46d53..13d85941a79 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -283,34 +283,25 @@ var/global/list/fax_blacklist = list() use_power(200) - var/obj/item/rcvdcopy - if(istype(copyitem, /obj/item/paper)) - rcvdcopy = copy(copyitem) - else if(istype(copyitem, /obj/item/photo)) - rcvdcopy = photocopy(copyitem) - else if(istype(copyitem, /obj/item/paper_bundle)) - rcvdcopy = bundlecopy(copyitem) - else + if(!(istype(copyitem, /obj/item/paper) || istype(copyitem, /obj/item/paper_bundle) || istype(copyitem, /obj/item/photo))) visible_message("[src] beeps, \"Error transmitting message.\"") return - rcvdcopy.loc = null //hopefully this shouldn't cause trouble - var/datum/fax/admin/A = new /datum/fax/admin() - A.name = rcvdcopy.name + A.name = copyitem.name A.from_department = department A.to_department = destination A.origin = src - A.message = rcvdcopy + A.message = copyitem A.sent_by = sender A.sent_at = world.time //message badmins that a fax has arrived switch(destination) if("Central Command") - message_admins(sender, "CENTCOM FAX", destination, rcvdcopy, "#006100") + message_admins(sender, "CENTCOM FAX", destination, copyitem, "#006100") if("Syndicate") - message_admins(sender, "SYNDICATE FAX", destination, rcvdcopy, "#DC143C") + message_admins(sender, "SYNDICATE FAX", destination, copyitem, "#DC143C") for(var/obj/machinery/photocopier/faxmachine/F in allfaxes) if(F.department == destination) F.receivefax(copyitem) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 8c188952406..7c7fe156ca0 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -36,7 +36,7 @@ to_chat(user, "You put the [W] into \the [src].") update_icon() else if(istype(W, /obj/item/pen)) - var/n_name = input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text|null + var/n_name = clean_input("What would you like to label the folder?", "Folder Labelling", null) if(!n_name) return n_name = sanitize(copytext(n_name, 1, MAX_NAME_LEN)) @@ -131,3 +131,9 @@ new /obj/item/documents/syndicate/yellow(src) update_icon() +/obj/item/folder/syndicate/mining/New() + . = ..() + new /obj/item/documents/syndicate/mining(src) + update_icon() + + diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index d5ca6b0b0f8..9e844d6cf21 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -54,8 +54,6 @@ /obj/item/paper/update_icon() ..() - if(icon_state == "paper_talisman") - return if(info) icon_state = "paper_words" return @@ -75,16 +73,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() @@ -108,7 +109,7 @@ /obj/item/paper/attack_self(mob/living/user as mob) user.examinate(src) - if(rigged && (holiday_master.holidays && holiday_master.holidays[APRIL_FOOLS])) + if(rigged && (SSholiday.holidays && SSholiday.holidays[APRIL_FOOLS])) if(spam_flag == 0) spam_flag = 1 playsound(loc, 'sound/items/bikehorn.ogg', 50, 1) @@ -212,7 +213,7 @@ /obj/item/paper/proc/parsepencode(var/t, var/obj/item/pen/P, mob/user as mob) - t = pencode_to_html(t, usr, P, TRUE, TRUE, TRUE, deffont, signfont, crayonfont) + t = pencode_to_html(html_encode(t), usr, P, TRUE, TRUE, TRUE, deffont, signfont, crayonfont) return t /obj/item/paper/proc/populatefields() @@ -282,7 +283,6 @@ message_admins("PAPER: [key_name_admin(usr)] tried to use forbidden word in [src]: [bad].") return */ - t = html_encode(t) t = parsepencode(t, i, usr) // Encode everything from pencode to html if(id!="end") @@ -334,15 +334,15 @@ else if(h_user.l_store == src) h_user.unEquip(src) B.loc = h_user - B.layer = 20 - B.plane = HUD_PLANE + B.layer = ABOVE_HUD_LAYER + B.plane = ABOVE_HUD_PLANE h_user.l_store = B h_user.update_inv_pockets() else if(h_user.r_store == src) h_user.unEquip(src) B.loc = h_user - B.layer = 20 - B.plane = HUD_PLANE + B.layer = ABOVE_HUD_LAYER + B.plane = ABOVE_HUD_PLANE h_user.r_store = B h_user.update_inv_pockets() else if(h_user.head == src) @@ -403,8 +403,8 @@ /obj/item/paper/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() - if(burn_state >= FLAMMABLE) //Only render paper that's burnable to be hard to read. - info = "[stars(info)]" + if(burn_state >= FLAMMABLE) //Renders paper that has been lit on fire to be illegible. + info = "Heat-curled corners and sooty words offer little insight. Whatever was once written on this page has been rendered illegible through fire." /obj/item/paper/proc/stamp(var/obj/item/stamp/S) stamps += (!stamps || stamps == "" ? "
" : "") + "" @@ -621,11 +621,11 @@ /obj/item/paper/evilfax/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/paper/evilfax/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) if(mytarget && !used) var/mob/living/carbon/target = mytarget target.ForceContractDisease(new /datum/disease/transformation/corgi(0)) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index da241a9c007..01974ad3694 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -131,7 +131,7 @@ usr << browse(dat + "[P.name]" \ + "" \ + "

Written on the back:
[P.scribble]" : ]"\ + + "[P.scribble ? "

Written on the back:
[P.scribble]" : ""]"\ + "", "window=[name]") /obj/item/paper_bundle/attack_self(mob/user as mob) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index e8643c97cff..c9169a09757 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -72,7 +72,7 @@ papers.Remove(P) else P = new /obj/item/paper - if(holiday_master.holidays && holiday_master.holidays[APRIL_FOOLS]) + if(SSholiday.holidays && SSholiday.holidays[APRIL_FOOLS]) if(prob(30)) P.info = "HONK HONK HONK HONK HONK HONK HONK
HOOOOOOOOOOOOOOOOOOOOOONK
APRIL FOOLS
" P.rigged = 1 diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 83897e5cbd3..302f2e02342 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -26,7 +26,7 @@ /obj/item/pen/suicide_act(mob/user) to_chat(viewers(user), "[user] starts scribbling numbers over [user.p_them()]self with the [name]! It looks like [user.p_theyre()] trying to commit sudoku.") - return (BRUTELOSS) + return BRUTELOSS /obj/item/pen/blue name = "blue-ink pen" diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index af28e221eb8..de3f2ad52d6 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -325,9 +325,10 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s to_chat(user, "[pictures_left] photos left.") icon_state = icon_off on = 0 - if(user.mind && !(user.mind.assigned_role == "Chaplain")) - if(prob(24)) - handle_haunt(user) + if(istype(src,/obj/item/camera/spooky)) + if(user.mind && user.mind.assigned_role == "Chaplain" && see_ghosts) + if(prob(24)) + handle_haunt(user) spawn(64) icon_state = icon_on on = 1 diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 9bb3a09ebb0..8c24cc55c9d 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -15,7 +15,7 @@ /obj/item/stamp/suicide_act(mob/user) user.visible_message("[user] stamps 'VOID' on [user.p_their()] forehead, then promptly falls over, dead.") - return (OXYLOSS) + return OXYLOSS /obj/item/stamp/qm name = "Quartermaster's rubber stamp" @@ -92,27 +92,3 @@ icon_state = "stamp-syndicate" item_color = "syndicate" -// Syndicate stamp to forge documents. - -/obj/item/stamp/chameleon/attack_self(mob/user as mob) - - var/list/stamp_types = typesof(/obj/item/stamp) - src.type // Get all stamp types except our own - var/list/stamps = list() - - // Generate them into a list - for(var/stamp_type in stamp_types) - var/obj/item/stamp/S = new stamp_type - stamps[capitalize(S.name)] = S - - var/list/show_stamps = list("EXIT" = null) + sortList(stamps) // the list that will be shown to the user to pick from - - var/input_stamp = input(user, "Choose a stamp to disguise as.", "Choose a stamp.") in show_stamps - - if(user && src in user.contents) - - var/obj/item/stamp/chosen_stamp = stamps[capitalize(input_stamp)] - - if(chosen_stamp) - name = chosen_stamp.name - icon_state = chosen_stamp.icon_state - item_color = chosen_stamp.item_color diff --git a/code/modules/pda/cart_apps.dm b/code/modules/pda/cart_apps.dm index 46e8e1d257c..4ca5b4af427 100644 --- a/code/modules/pda/cart_apps.dm +++ b/code/modules/pda/cart_apps.dm @@ -21,14 +21,14 @@ if("alert") post_status("alert", href_list["alert"]) if("setmsg1") - message1 = input("Line 1", "Enter Message Text", message1) as text|null + message1 = clean_input("Line 1", "Enter Message Text", message1) if("setmsg2") - message2 = input("Line 2", "Enter Message Text", message2) as text|null + message2 = clean_input("Line 2", "Enter Message Text", message2) else post_status(href_list["statdisp"]) /datum/data/pda/app/status_display/proc/post_status(var/command, var/data1, var/data2) - var/datum/radio_frequency/frequency = radio_controller.return_frequency(DISPLAY_FREQ) + var/datum/radio_frequency/frequency = SSradio.return_frequency(DISPLAY_FREQ) if(!frequency) return @@ -392,7 +392,7 @@ BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null) var/CbotData[0] - for(var/mob/living/simple_animal/bot/cleanbot/B in GLOB.simple_animal_list) + for(var/mob/living/simple_animal/bot/cleanbot/B in GLOB.simple_animals) var/turf/bl = get_turf(B) if(bl) if(bl.z != cl.z) 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/pda/mob_hunt_game_app.dm b/code/modules/pda/mob_hunt_game_app.dm index c08e64b7ae3..2bb28ba0264 100644 --- a/code/modules/pda/mob_hunt_game_app.dm +++ b/code/modules/pda/mob_hunt_game_app.dm @@ -21,12 +21,12 @@ /datum/data/pda/app/mob_hunter_game/start() ..() - processing_objects.Add(pda) + START_PROCESSING(SSobj, pda) /datum/data/pda/app/mob_hunter_game/stop() ..() disconnect("Program Terminated") - processing_objects.Remove(pda) + STOP_PROCESSING(SSobj, pda) /datum/data/pda/app/mob_hunter_game/proc/scan_nearby() if(!SSmob_hunt || !connected) diff --git a/code/modules/pda/radio.dm b/code/modules/pda/radio.dm index e6d7f29f6ac..7db0ed332d5 100644 --- a/code/modules/pda/radio.dm +++ b/code/modules/pda/radio.dm @@ -26,15 +26,15 @@ add_to_radio(bot_filter) /obj/item/integrated_radio/Destroy() - if(radio_controller) - radio_controller.remove_object(src, control_freq) + if(SSradio) + SSradio.remove_object(src, control_freq) hostpda = null return ..() /obj/item/integrated_radio/proc/post_signal(var/freq, var/key, var/value, var/key2, var/value2, var/key3, var/value3,var/key4, var/value4, s_filter) // to_chat(world, "Post: [freq]: [key]=[value], [key2]=[value2]") - var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) + var/datum/radio_frequency/frequency = SSradio.return_frequency(freq) if(!frequency) return @@ -93,8 +93,8 @@ post_signal(control_freq, "command", "bot_status", "active", active, s_filter = bot_filter) /obj/item/integrated_radio/proc/add_to_radio(bot_filter) //Master filter control for bots. Must be placed in the bot's local New() to support map spawned bots. - if(radio_controller) - radio_controller.add_object(src, control_freq, filter = bot_filter) + if(SSradio) + SSradio.add_object(src, control_freq, filter = bot_filter) /obj/item/integrated_radio/honkbot bot_filter = RADIO_HONKBOT @@ -171,13 +171,13 @@ var/datum/radio_frequency/radio_connection /obj/item/integrated_radio/signal/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) + if(SSradio) + SSradio.remove_object(src, frequency) radio_connection = null return ..() /obj/item/integrated_radio/signal/Initialize() - if(!radio_controller) + if(!SSradio) return if(src.frequency < PUBLIC_LOW_FREQ || src.frequency > PUBLIC_HIGH_FREQ) src.frequency = sanitize_frequency(src.frequency) @@ -185,9 +185,9 @@ set_frequency(frequency) /obj/item/integrated_radio/signal/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency) + radio_connection = SSradio.add_object(src, frequency) /obj/item/integrated_radio/signal/proc/send_signal(message="ACTIVATE") diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 1f7af8e4204..7b3162fdefb 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -46,15 +46,14 @@ name = "area power controller" desc = "A control terminal for the area electrical systems." icon_state = "apc0" - anchored = 1 use_power = NO_POWER_USE req_access = list(access_engine_equip) - var/spooky=0 + siemens_strength = 1 var/area/area var/areastring = null var/obj/item/stock_parts/cell/cell var/start_charge = 90 // initial cell charge % - var/cell_type = 2500 + var/cell_type = 2500 //Base cell has 2500 capacity. Enter the path of a different cell you want to use. cell determines charge rates, max capacity, ect. These can also be changed with other APC vars, but isn't recommended to minimize the risk of accidental usage of dirty editted APCs var/opened = 0 //0=closed, 1=opened, 2=cover removed var/shorted = 0 var/lighting = 3 @@ -100,7 +99,7 @@ var/indestructible = 0 // If set, prevents aliens from destroying it var/keep_preset_name = 0 - var/report_power_alarm = 1 + var/report_power_alarm = TRUE var/shock_proof = 0 //if set to 1, this APC will not arc bolts of electricity if it's overloaded. @@ -117,9 +116,12 @@ lighting = 0 operating = 0 - /obj/machinery/power/apc/noalarm - report_power_alarm = 0 + report_power_alarm = FALSE + +/obj/machinery/power/apc/syndicate //general syndicate access + req_access = list(access_syndicate) + report_power_alarm = FALSE /obj/item/apc_electronics name = "power control module" @@ -133,43 +135,41 @@ 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. - if(!terminal) - make_terminal() if(terminal) terminal.connect_to_network() -/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0) +/obj/machinery/power/apc/New(turf/loc, ndir, building = 0) if(!armor) armor = list(melee = 20, bullet = 20, laser = 10, energy = 100, bomb = 30, bio = 100, rad = 100) ..() GLOB.apcs += src GLOB.apcs = sortAtom(GLOB.apcs) - wires = new(src) + wires = new(src) // offset 24 pixels in direction of dir // this allows the APC to be embedded in a wall, yet still inside an area if(building) - dir = ndir - src.tdir = dir // to fix Vars bug - dir = SOUTH + setDir(ndir) + tdir = dir // to fix Vars bug + setDir(SOUTH) pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24) pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0 - if(building==0) - init() - else + if(building) area = get_area(src) area.apc |= src opened = 1 operating = 0 name = "[area.name] APC" stat |= MAINT - src.update_icon() - spawn(5) - src.update() + update_icon() + addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/Destroy() GLOB.apcs -= src @@ -192,14 +192,17 @@ // create a terminal object at the same position as original turf loc // wires will attach to this terminal = new/obj/machinery/power/terminal(src.loc) - terminal.dir = tdir + terminal.setDir(tdir) terminal.master = src -/obj/machinery/power/apc/proc/init() +/obj/machinery/power/apc/Initialize(mapload) + . = ..() + if(!mapload) + return has_electronics = 2 //installed and secured // is starting with a power cell installed, create it and set its charge level if(cell_type) - src.cell = new/obj/item/stock_parts/cell(src) + cell = new/obj/item/stock_parts/cell(src) cell.maxcharge = cell_type // cell_type is maximum charge (old default was 1000 or 2500 (values one and two respectively) cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value) @@ -218,12 +221,12 @@ area = get_area_name(areastring) name = "\improper [area.name] APC" area.apc |= src + update_icon() make_terminal() - spawn(5) - src.update() + addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/examine(mob/user) if(..(user, 1)) @@ -250,9 +253,9 @@ // update the APC icon to show the three base states // also add overlays for indicator lights -/obj/machinery/power/apc/update_icon() +/obj/machinery/power/apc/update_icon(force_update = FALSE) - if(!status_overlays) + if(!status_overlays || force_update) status_overlays = 1 status_overlays_lock = new status_overlays_charging = new @@ -293,10 +296,10 @@ var/update = check_updates() //returns 0 if no need to update icons. // 1 if we need to update the icon_state // 2 if we need to update the overlays - if(!update) + if(!update && !force_update) return - if(update & 1) // Updating the icon state + if(force_update || update & 1) // Updating the icon state if(update_state & UPSTATE_ALLGOOD) icon_state = "apc0" else if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2)) @@ -324,7 +327,7 @@ - if(update & 2) + if(force_update || update & 2) if(overlays.len) overlays.len = 0 @@ -414,14 +417,17 @@ update_icon() updating_icon = 0 -/obj/machinery/power/apc/proc/spookify() - if(spooky) return // Fuck you we're already spooky - spooky=1 - update_icon() - spawn(10) - spooky=0 - update_icon() - +/obj/machinery/power/apc/get_spooked(second_pass = FALSE) + if(opened || wiresexposed) + return + if(stat & (NOPOWER | BROKEN)) + return + if(!second_pass) //The first time, we just cut overlays + addtimer(CALLBACK(src, .get_spooked, TRUE), 1) + cut_overlays() + else + flick("apcemag", src) //Second time we cause the APC to update its icon, then add a timer to update icon later + addtimer(CALLBACK(src, .proc/update_icon, TRUE), 10) //attack with an item - open/close cover, insert cell, or (un)lock interface /obj/machinery/power/apc/attackby(obj/item/W, mob/living/user, params) @@ -535,7 +541,7 @@ if(C.amount >= 10 && !terminal && opened && has_electronics != 2) var/turf/T = get_turf(src) var/obj/structure/cable/N = T.get_cable_node() - if(prob(50) && electrocute_mob(usr, N, N)) + if(prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) do_sparks(5, 1, src) return C.use(10) @@ -1083,14 +1089,9 @@ else return 0 -//Returns 1 if the APC should attempt to charge -/obj/machinery/power/apc/proc/attempt_charging() - return (chargemode && charging == 1 && operating) - -/obj/machinery/power/apc/draw_power(var/amount) +/obj/machinery/power/apc/add_load(amount) if(terminal && terminal.powernet) - return terminal.powernet.draw_power(amount) - return 0 + terminal.add_load(amount) /obj/machinery/power/apc/avail() if(terminal) @@ -1099,7 +1100,6 @@ return 0 /obj/machinery/power/apc/process() - if(stat & (BROKEN|MAINT)) return if(!area.requires_power) @@ -1135,18 +1135,21 @@ if(cell && !shorted) // draw power from cell as before to power the area - var/cellused = min(cell.charge, CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell + var/cellused = min(cell.charge, GLOB.CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell cell.use(cellused) if(excess > lastused_total) // if power excess recharge the cell // by the same amount just used - var/draw = draw_power(cellused/CELLRATE) // draw the power needed to charge this cell - cell.give(draw * CELLRATE) + cell.give(cellused) + add_load(cellused/GLOB.CELLRATE) // add the load used to recharge the cell + + else // no excess, and not enough per-apc - if( (cell.charge/CELLRATE + excess) >= lastused_total) // can we draw enough from cell+grid to cover last usage? - var/draw = draw_power(excess) - cell.charge = min(cell.maxcharge, cell.charge + CELLRATE * draw) //recharge with what we can + if((cell.charge/GLOB.CELLRATE + excess) >= lastused_total) // can we draw enough from cell+grid to cover last usage? + cell.charge = min(cell.maxcharge, cell.charge + GLOB.CELLRATE * excess) //recharge with what we can + add_load(excess) // so draw what we can from the grid charging = 0 + else // not enough power available to run the last tick! charging = 0 chargecount = 0 @@ -1171,42 +1174,40 @@ lighting = autoset(lighting, 1) environ = autoset(environ, 1) autoflag = 3 - if(report_power_alarm) - power_alarm.clearAlarm(loc, src) + if(report_power_alarm && is_station_contact(z)) + SSalarms.power_alarm.clearAlarm(loc, src) else if(cell.charge < 1250 && cell.charge > 750 && longtermpower < 0) // <30%, turn off equipment if(autoflag != 2) equipment = autoset(equipment, 2) lighting = autoset(lighting, 1) environ = autoset(environ, 1) - if(report_power_alarm) - power_alarm.triggerAlarm(loc, src) + if(report_power_alarm && is_station_contact(z)) + SSalarms.power_alarm.triggerAlarm(loc, src) autoflag = 2 else if(cell.charge < 750 && cell.charge > 10) // <15%, turn off lighting & equipment if((autoflag > 1 && longtermpower < 0) || (autoflag > 1 && longtermpower >= 0)) equipment = autoset(equipment, 2) lighting = autoset(lighting, 2) environ = autoset(environ, 1) - if(report_power_alarm) - power_alarm.triggerAlarm(loc, src) + if(report_power_alarm && is_station_contact(z)) + SSalarms.power_alarm.triggerAlarm(loc, src) autoflag = 1 else if(cell.charge <= 0) // zero charge, turn all off if(autoflag != 0) equipment = autoset(equipment, 0) lighting = autoset(lighting, 0) environ = autoset(environ, 0) - if(report_power_alarm) - power_alarm.triggerAlarm(loc, src) + if(report_power_alarm && is_station_contact(z)) + SSalarms.power_alarm.triggerAlarm(loc, src) autoflag = 0 // now trickle-charge the cell - - if(src.attempt_charging()) + if(chargemode && charging == 1 && operating) if(excess > 0) // check to make sure we have enough to charge // Max charge is capped to % per second constant - var/ch = min(excess*CELLRATE, cell.maxcharge*CHARGELEVEL) - - ch = draw_power(ch/CELLRATE) // Removes the power we're taking from the grid - cell.give(ch*CELLRATE) // actually recharge the cell + var/ch = min(excess*GLOB.CELLRATE, cell.maxcharge*GLOB.CHARGELEVEL) + add_load(ch/GLOB.CELLRATE) // Removes the power we're taking from the grid + cell.give(ch) // actually recharge the cell else charging = 0 // stop charging @@ -1219,12 +1220,12 @@ if(chargemode) if(!charging) - if(excess > cell.maxcharge*CHARGELEVEL) + if(excess > cell.maxcharge*GLOB.CHARGELEVEL) chargecount++ else chargecount = 0 - if(chargecount >= 10) + if(chargecount == 10) chargecount = 0 charging = 1 @@ -1237,13 +1238,13 @@ if(prob(5)) var/list/shock_mobs = list() for(var/C in view(get_turf(src), 5)) //We only want to shock a single random mob in range, not every one. - if(iscarbon(C)) - shock_mobs +=C + if(isliving(C)) + shock_mobs += C if(shock_mobs.len) - var/mob/living/carbon/S = pick(shock_mobs) - S.electrocute_act(rand(5,25), "electrical arc") - playsound(get_turf(S), 'sound/effects/eleczap.ogg', 75, 1) - Beam(S,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) + var/mob/living/L = pick(shock_mobs) + L.electrocute_act(rand(5, 25), "electrical arc") + playsound(get_turf(L), 'sound/effects/eleczap.ogg', 75, 1) + Beam(L, icon_state = "lightning[rand(1, 12)]", icon = 'icons/effects/effects.dmi', time = 5) else // no cell, switch everything off @@ -1252,8 +1253,8 @@ equipment = autoset(equipment, 0) lighting = autoset(lighting, 0) environ = autoset(environ, 0) - if(report_power_alarm) - power_alarm.triggerAlarm(loc, src) + if(report_power_alarm && is_station_contact(z)) + SSalarms.power_alarm.triggerAlarm(loc, src) autoflag = 0 // update icon & area power if anything changed @@ -1291,9 +1292,13 @@ lighting = 0 equipment = 0 environ = 0 + update_icon() + update() spawn(600) equipment = 3 environ = 3 + update_icon() + update() ..() /obj/machinery/power/apc/ex_act(severity) @@ -1352,6 +1357,11 @@ L.broken(0, 1) stoplag() +/obj/machinery/power/apc/proc/null_charge() + for(var/obj/machinery/light/L in area) + L.broken(0, 1) + stoplag() + /obj/machinery/power/apc/proc/setsubsystem(val) if(cell && cell.charge > 0) return (val==1) ? 0 : val diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 410b91bdf48..68eaec16040 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -35,7 +35,7 @@ By design, d1 is the smallest direction and d2 is the highest icon_state = "0-1" var/d1 = 0 var/d2 = 1 - layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 + layer = WIRE_LAYER //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 color = COLOR_RED /obj/structure/cable/yellow @@ -59,38 +59,41 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/white color = COLOR_WHITE -/obj/structure/cable/New() - ..() - +/obj/structure/cable/Initialize(mapload) + . = ..() // ensure d1 & d2 reflect the icon_state for entering and exiting cable - var/dash = findtext(icon_state, "-") + d1 = text2num(copytext( icon_state, 1, dash )) + d2 = text2num(copytext( icon_state, dash+1 )) - d1 = text2num( copytext( icon_state, 1, dash ) ) - - d2 = text2num( copytext( icon_state, dash+1 ) ) - - var/turf/T = src.loc // hide if turf is not intact - - if(level==1) hide(T.intact) + var/turf/T = get_turf(src) // hide if turf is not intact + if(level == 1) + hide(T.intact) LAZYADD(GLOB.cable_list, src) //add it to the global cable list - /obj/structure/cable/Destroy() // called when a cable is deleted if(powernet) cut_cable_from_powernet() // update the powernets LAZYREMOVE(GLOB.cable_list, src) //remove it from global cable list return ..() // then go ahead and delete the cable +/obj/structure/cable/deconstruct(disassembled = TRUE) + var/turf/T = get_turf(src) + if(d1) // 0-X cables are 1 unit, X-X cables are 2 units long + new/obj/item/stack/cable_coil(T, 2, paramcolor = color) + else + new/obj/item/stack/cable_coil(T, 1, paramcolor = color) + qdel(src) + /////////////////////////////////// // General procedures /////////////////////////////////// //If underfloor, hide the cable -/obj/structure/cable/hide(var/i) +/obj/structure/cable/hide(i) - if(level == 1 && istype(loc, /turf)) + if(level == 1 && isturf(loc)) invisibility = i ? 101 : 0 updateicon() @@ -101,9 +104,49 @@ By design, d1 is the smallest direction and d2 is the highest icon_state = "[d1]-[d2]" -// returns the powernet this cable belongs to -/obj/structure/cable/proc/get_powernet() //TODO: remove this as it is obsolete - return powernet +//////////////////////////////////////////// +// Power related +/////////////////////////////////////////// + +// All power generation handled in add_avail() +// Machines should use add_load(), surplus(), avail() +// Non-machines should use add_delayedload(), delayed_surplus(), newavail() + +/obj/structure/cable/proc/add_avail(amount) + if(powernet) + powernet.newavail += amount + +/obj/structure/cable/proc/add_load(amount) + if(powernet) + powernet.load += amount + +/obj/structure/cable/proc/surplus() + if(powernet) + return Clamp(powernet.avail-powernet.load, 0, powernet.avail) + else + return 0 + +/obj/structure/cable/proc/avail() + if(powernet) + return powernet.avail + else + return 0 + +/obj/structure/cable/proc/add_delayedload(amount) + if(powernet) + powernet.delayedload += amount + +/obj/structure/cable/proc/delayed_surplus() + if(powernet) + return Clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) + else + return 0 + +/obj/structure/cable/proc/newavail() + if(powernet) + return powernet.newavail + else + return 0 //Telekinesis has no effect on a cable /obj/structure/cable/attack_tk(mob/user) @@ -120,47 +163,19 @@ By design, d1 is the smallest direction and d2 is the highest if(T.intact) return - if(istype(W, /obj/item/wirecutters)) -///// Z-Level Stuff - /* if(src.d1 == 12 || src.d2 == 12) - to_chat(user, "You must cut this cable from above.") - return */ -///// Z-Level Stuff - /* if(breaker_box) - to_chat(user, "This cable is connected to nearby breaker box. Use breaker box to interact with it.") - return */ - + if(iswirecutter(W)) if(shock(user, 50)) return - - if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long - new/obj/item/stack/cable_coil(T, 2, paramcolor = color) - else - new/obj/item/stack/cable_coil(T, 1, paramcolor = color) - - for(var/mob/O in viewers(src, null)) - O.show_message("[user] cuts the cable.", 1) - -///// Z-Level Stuff - /*if(src.d1 == 11 || src.d2 == 11) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.down) - var/turf/below = locate(src.x, src.y, controller.down_target) - for(var/obj/structure/cable/c in below) - if(c.d1 == 12 || c.d2 == 12) - c.qdel()*/ -///// Z-Level Stuff + user.visible_message("[user] cuts the cable.", "You cut the cable.") investigate_log("was cut by [key_name(usr, 1)] in [get_area(user)]([T.x], [T.y], [T.z] - [ADMIN_JMP(T)])","wires") - - qdel(src) // qdel + deconstruct() return else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W if(coil.get_amount() < 1) - to_chat(user, "Not enough cable") + to_chat(user, "Not enough cable!") return coil.cable_join(src, user) @@ -173,11 +188,9 @@ By design, d1 is the smallest direction and d2 is the highest else if(istype(W, /obj/item/multitool)) if(powernet && (powernet.avail > 0)) // is it powered? - to_chat(user, "[powernet.avail]W in power network.") - + to_chat(user, "Total power: [DisplayPower(powernet.avail)]\nLoad: [DisplayPower(powernet.load)]\nExcess power: [DisplayPower(surplus())]") else - to_chat(user, "The cable is not powered.") - + to_chat(user, "The cable is not powered.") shock(user, 5, 0.2) else if(istype(W, /obj/item/toy/crayon)) @@ -188,33 +201,34 @@ By design, d1 is the smallest direction and d2 is the highest if(W.flags & CONDUCT) shock(user, 50, 0.7) - src.add_fingerprint(user) + add_fingerprint(user) // shock the user with probability prb -/obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0) +/obj/structure/cable/proc/shock(mob/user, prb, siemens_coeff = 1) if(!prob(prb)) - return 0 + return FALSE if(electrocute_mob(user, powernet, src, siemens_coeff)) do_sparks(5, 1, src) - return 1 + return TRUE else - return 0 + return FALSE + +/obj/structure/cable/singularity_pull(S, current_size) + ..() + if(current_size >= STAGE_FIVE) + deconstruct() //explosion handling /obj/structure/cable/ex_act(severity) switch(severity) - if(1.0) + if(1) qdel(src) // qdel - if(2.0) + if(2) if(prob(50)) - new/obj/item/stack/cable_coil(get_turf(src), src.d1 ? 2 : 1, paramcolor = color) - qdel(src) // qdel - - if(3.0) + deconstruct() + if(3) if(prob(25)) - new/obj/item/stack/cable_coil(get_turf(src), src.d1 ? 2 : 1, paramcolor = color) - qdel(src) // qdel - return + deconstruct() obj/structure/cable/proc/cable_color(var/colorC) if(colorC) @@ -235,7 +249,7 @@ obj/structure/cable/proc/cable_color(var/colorC) //handles merging diagonally matching cables //for info : direction^3 is flipping horizontally, direction^12 is flipping vertically -/obj/structure/cable/proc/mergeDiagonalsNetworks(var/direction) +/obj/structure/cable/proc/mergeDiagonalsNetworks(direction) //search for and merge diagonally matching cables from the first direction component (north/south) var/turf/T = get_step(src, direction&3)//go north/south @@ -279,7 +293,7 @@ obj/structure/cable/proc/cable_color(var/colorC) C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet // merge with the powernets of power objects in the given direction -/obj/structure/cable/proc/mergeConnectedNetworks(var/direction) +/obj/structure/cable/proc/mergeConnectedNetworks(direction) var/fdir = (!direction)? 0 : turn(direction, 180) //flip the direction, to match with the source position on its turf @@ -317,25 +331,27 @@ obj/structure/cable/proc/cable_color(var/colorC) //first let's add turf cables to our powernet //then we'll connect machines on turf with a node cable is present for(var/AM in loc) - if(istype(AM,/obj/structure/cable)) + if(istype(AM, /obj/structure/cable)) var/obj/structure/cable/C = AM if(C.d1 == d1 || C.d2 == d1 || C.d1 == d2 || C.d2 == d2) //only connected if they have a common direction - if(C.powernet == powernet) continue + if(C.powernet == powernet) + continue if(C.powernet) merge_powernets(powernet, C.powernet) else powernet.add_cable(C) //the cable was powernetless, let's just add it to our powernet - else if(istype(AM,/obj/machinery/power/apc)) + else if(istype(AM, /obj/machinery/power/apc)) var/obj/machinery/power/apc/N = AM - if(!N.terminal) continue // APC are connected through their terminal + if(!N.terminal) + continue // APC are connected through their terminal if(N.terminal.powernet == powernet) continue to_connect += N.terminal //we'll connect the machines after all cables are merged - else if(istype(AM,/obj/machinery/power)) //other power machines + else if(istype(AM, /obj/machinery/power)) //other power machines var/obj/machinery/power/M = AM if(M.powernet == powernet) @@ -353,23 +369,10 @@ obj/structure/cable/proc/cable_color(var/colorC) ////////////////////////////////////////////// //if powernetless_only = 1, will only get connections without powernet -/obj/structure/cable/proc/get_connections(var/powernetless_only = 0) +/obj/structure/cable/proc/get_connections(powernetless_only = 0) . = list() // this will be a list of all connected power objects var/turf/T -///// Z-Level Stuff - /* if(d1 == 11 || d1 == 12) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up && d1 == 12) - T = locate(src.x, src.y, controller.up_target) - if(T) - . += power_list(T, src, 11, 1) - if(controller.down && d1 == 11) - T = locate(src.x, src.y, controller.down_target) - if(T) - . += power_list(T, src, 12, 1) */ -///// Z-Level Stuff //get matching cables from the first direction if(d1) //if not a node cable T = get_step(src, d1) @@ -386,20 +389,6 @@ obj/structure/cable/proc/cable_color(var/colorC) . += power_list(loc, src, d1, powernetless_only) //get on turf matching cables -///// Z-Level Stuff - /*if(d2 == 11 || d2 == 12) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up && d2 == 12) - T = locate(src.x, src.y, controller.up_target) - if(T) - . += power_list(T, src, 11, 1) - if(controller.down && d2 == 11) - T = locate(src.x, src.y, controller.down_target) - if(T) - . += power_list(T, src, 12, 1) -///// Z-Level Stuff - else */ //do the same on the second direction (which can't be 0) T = get_step(src, d2) if(T) @@ -420,7 +409,8 @@ obj/structure/cable/proc/cable_color(var/colorC) //needed as this can, unlike other placements, disconnect cables /obj/structure/cable/proc/denode() var/turf/T1 = loc - if(!T1) return + if(!T1) + return var/list/powerlist = power_list(T1,src,0,0) //find the other cables that ended in the centre of the turf, with or without a powernet if(powerlist.len>0) @@ -428,13 +418,19 @@ obj/structure/cable/proc/cable_color(var/colorC) propagate_network(powerlist[1],PN) //propagates the new powernet beginning at the source cable if(PN.is_empty()) //can happen with machines made nodeless when smoothing cables - qdel(PN) // qdel + qdel(PN) + +/obj/structure/cable/proc/auto_propogate_cut_cable(obj/O) + if(O && !QDELETED(O)) + var/datum/powernet/newPN = new()// creates a new powernet... + propagate_network(O, newPN)//... and propagates it to the other side of the cable // cut the cable's powernet at this cable and updates the powergrid -/obj/structure/cable/proc/cut_cable_from_powernet() +/obj/structure/cable/proc/cut_cable_from_powernet(remove=TRUE) var/turf/T1 = loc var/list/P_list - if(!T1) return + if(!T1) + return if(d1) T1 = get_step(T1, d1) P_list = power_list(T1, src, turn(d1,180),0,cable_only = 1) // what adjacently joins on to cut cable... @@ -452,11 +448,13 @@ obj/structure/cable/proc/cable_color(var/colorC) var/obj/O = P_list[1] // remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist - loc = null + if(remove) + loc = null powernet.remove_cable(src) //remove the cut cable from its powernet // queue it to rebuild SSmachines.deferred_powernet_rebuilds += O +// addtimer(CALLBACK(O, .proc/auto_propogate_cut_cable, O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables // Disconnect machines connected to nodes if(d1 == 0) // if we cut a node (O-X) cable @@ -464,6 +462,7 @@ obj/structure/cable/proc/cable_color(var/colorC) if(!P.connect_to_network()) //can't find a node cable on a the turf to connect to P.disconnect_from_network() //remove from current network + /////////////////////////////////////////////// // The cable coil object, used for laying cable /////////////////////////////////////////////// @@ -472,9 +471,7 @@ obj/structure/cable/proc/cable_color(var/colorC) // Definitions //////////////////////////////// -var/global/list/datum/stack_recipe/cable_coil_recipes = list( - new /datum/stack_recipe/cable_restraints("cable restraints", /obj/item/restraints/handcuffs/cable, 15), -) +GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restraints", /obj/item/restraints/handcuffs/cable, 15))) /obj/item/stack/cable_coil name = "cable coil" @@ -504,7 +501,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( user.visible_message("[user] is making a noose with the [name]! It looks like [user.p_theyre()] trying to commit suicide.") else user.visible_message("[user] is strangling [user.p_them()]self with the [name]! It looks like [user.p_theyre()] trying to commit suicide.") - return(OXYLOSS) + return OXYLOSS /obj/item/stack/cable_coil/New(loc, length = MAXCOIL, paramcolor = null) ..() @@ -514,7 +511,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( pixel_x = rand(-2,2) pixel_y = rand(-2,2) update_icon() - recipes = cable_coil_recipes + recipes = GLOB.cable_coil_recipes update_wclass() /////////////////////////////////// @@ -657,7 +654,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( to_chat(user, "You can't lay cable at a place that far away!") return - var/dirn = null + var/dirn if(!dirnew) //If we weren't given a direction, come up with one! (Called as null from catwalk.dm and floor.dm) if(user.loc == T) dirn = user.dir //If laying on the tile we're on, lay in the direction we're facing @@ -694,7 +691,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(C.shock(user, 50)) if(prob(50)) //fail new /obj/item/stack/cable_coil(get_turf(C), 1, paramcolor = C.color) - qdel(C) // qdel + C.deconstruct() return C @@ -711,7 +708,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( return if(get_dist(C, user) > 1) // make sure it's close enough - to_chat(user, "You can't lay cable at a place that far away.") + to_chat(user, "You can't lay cable at a place that far away!") return @@ -724,13 +721,41 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( // one end of the clicked cable is pointing towards us if(C.d1 == dirn || C.d2 == dirn) if(U.intact) // can't place a cable if the floor is complete - to_chat(user, "You can't lay cable there unless the floor tiles are removed.") + to_chat(user, "You can't lay cable there unless the floor tiles are removed!") return else // cable is pointing at us, we're standing on an open tile // so create a stub pointing at the clicked cable on our tile - place_turf(U, user, turn(dirn, 180)) + var/fdirn = turn(dirn, 180) // the opposite direction + + for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already + if(LC.d1 == fdirn || LC.d2 == fdirn) + to_chat(user, "There's already a cable at that position!") + return + + var/obj/structure/cable/NC = get_new_cable (U) + + NC.d1 = 0 + NC.d2 = fdirn + NC.add_fingerprint(user) + NC.update_icon() + + //create a new powernet with the cable, if needed it will be merged later + var/datum/powernet/newPN = new() + newPN.add_cable(NC) + + NC.mergeConnectedNetworks(NC.d2) //merge the powernet with adjacents powernets + NC.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets + + if(NC.d2 & (NC.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions + NC.mergeDiagonalsNetworks(NC.d2) + + use(1) + + if(NC.shock(user, 50)) + if(prob(50)) //fail + NC.deconstruct() return // exisiting cable doesn't point at our position, so see if it's a stub @@ -749,7 +774,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(LC == C) // skip the cable we're interacting with continue if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction - to_chat(user, "There's already a cable at that position.") + to_chat(user, "There's already a cable at that position!") return @@ -776,8 +801,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(C.shock(user, 50)) if(prob(50)) //fail - new/obj/item/stack/cable_coil(get_turf(C), 2, paramcolor = C.color) - qdel(C) // qdel + C.deconstruct() return C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets. @@ -790,8 +814,8 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( /obj/item/stack/cable_coil/cut item_state = "coil2" -/obj/item/stack/cable_coil/cut/New(loc) - ..() +/obj/item/stack/cable_coil/cut/Initialize(mapload) + . = ..() src.amount = rand(1,2) pixel_x = rand(-2,2) pixel_y = rand(-2,2) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 3bc2b5bc39b..33b423c6360 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -19,25 +19,28 @@ 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() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) charge = maxcharge if(ratingdesc) desc += " This one has a power rating of [DisplayPower(maxcharge)], and you should not swallow it." update_icon() /obj/item/stock_parts/cell/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/stock_parts/cell/vv_edit_var(var_name, var_value) switch(var_name) if("self_recharge") if(var_value) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) . = ..() /obj/item/stock_parts/cell/process() @@ -90,7 +93,7 @@ /obj/item/stock_parts/cell/suicide_act(mob/user) to_chat(viewers(user), "[user] is licking the electrodes of the [src]! It looks like [user.p_theyre()] trying to commit suicide.") - return (FIRELOSS) + return FIRELOSS /obj/item/stock_parts/cell/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/reagent_containers/syringe)) @@ -162,23 +165,10 @@ ex_act(EXPLODE_DEVASTATE) /obj/item/stock_parts/cell/proc/get_electrocute_damage() - switch(charge) - if(5000000 to INFINITY) - return min(rand(200, 300),rand(200, 300)) - if(4000000 to 5000000 - 1) - return min(rand(80, 180),rand(80, 180)) - if(1000000 to 4000000 - 1) - return min(rand(50, 160),rand(50, 160)) - if(200000 to 1000000 - 1) - return min(rand(25, 80),rand(25, 80)) - if(100000 to 200000 - 1)//Ave powernet - return min(rand(20, 60),rand(20, 60)) - if(50000 to 100000 - 1) - return min(rand(15, 40),rand(15, 40)) - if(1000 to 50000 - 1) - return min(rand(10, 20),rand(10, 20)) - else - return 0 + if(charge >= 1000) + return Clamp(20 + round(charge / 25000), 20, 195) + rand(-5, 5) + else + return 0 // Cell variants /obj/item/stock_parts/cell/empty/New() diff --git a/code/modules/power/engine.dm b/code/modules/power/engine.dm deleted file mode 100644 index bf05e7cd2d4..00000000000 --- a/code/modules/power/engine.dm +++ /dev/null @@ -1,24 +0,0 @@ - -/turf/simulated/floor/engine/attack_hand(var/mob/user as mob) - user.Move_Pulled(src) - -/turf/simulated/floor/engine/ex_act(severity) - switch(severity) - if(1.0) - ChangeTurf(/turf/space) - qdel(src) - return - if(2.0) - if(prob(50)) - ChangeTurf(/turf/space) - qdel(src) - return - else - return - -/turf/simulated/floor/engine/blob_act() - if(prob(25)) - ChangeTurf(/turf/space) - qdel(src) - return - return \ No newline at end of file diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 3a453ffe10c..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() @@ -85,8 +85,8 @@ var/const/GRAV_NEEDS_WRENCH = 3 // Generator which spawns with the station. // -/obj/machinery/gravity_generator/main/station/Initialize() - ..() +/obj/machinery/gravity_generator/main/station/Initialize(mapload) + . = ..() setup_parts() middle.overlays += "activated" update_list() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 8dda1ed8731..b186e862f01 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -232,6 +232,9 @@ on = FALSE return +/obj/machinery/light/get_spooked() + flicker() + // update the icon_state and luminosity of the light depending on its state /obj/machinery/light/proc/update(var/trigger = TRUE) switch(status) @@ -353,7 +356,7 @@ M.show_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) if(on && (W.flags & CONDUCT)) if(prob(12)) - electrocute_mob(user, get_area(src), src, 0.3) + electrocute_mob(user, get_area(src), src, 0.3, TRUE) broken() else @@ -387,7 +390,7 @@ if(has_power() && (W.flags & CONDUCT)) do_sparks(3, 1, src) if(prob(75)) - electrocute_mob(user, get_area(src), src, rand(0.7,1.0)) + electrocute_mob(user, get_area(src), src, rand(0.7, 1), TRUE) // returns whether this light has power diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 69b27eff562..33741d1475b 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -9,7 +9,7 @@ /obj/machinery/power name = null icon = 'icons/obj/power.dmi' - anchored = 1.0 + anchored = TRUE on_blueprints = TRUE var/datum/powernet/powernet = null use_power = NO_POWER_USE @@ -25,18 +25,24 @@ ////////////////////////////// // common helper procs for all power machines -/obj/machinery/power/proc/add_avail(var/amount) +// All power generation handled in add_avail() +// Machines should use add_load(), surplus(), avail() +// Non-machines should use add_delayedload(), delayed_surplus(), newavail() + +/obj/machinery/power/proc/add_avail(amount) if(powernet) powernet.newavail += amount + return TRUE + else + return FALSE -/obj/machinery/power/proc/draw_power(var/amount) +/obj/machinery/power/proc/add_load(amount) if(powernet) - return powernet.draw_power(amount) - return 0 + powernet.load += amount /obj/machinery/power/proc/surplus() if(powernet) - return powernet.avail-powernet.load + return Clamp(powernet.avail-powernet.load, 0, powernet.avail) else return 0 @@ -46,9 +52,19 @@ else return 0 -/obj/machinery/power/proc/load() +/obj/machinery/power/proc/add_delayedload(amount) if(powernet) - return powernet.load + powernet.delayedload += amount + +/obj/machinery/power/proc/delayed_surplus() + if(powernet) + return Clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) + else + return 0 + +/obj/machinery/power/proc/newavail() + if(powernet) + return powernet.newavail else return 0 @@ -58,21 +74,20 @@ // returns true if the area has power on given channel (or doesn't require power). // defaults to power_channel /obj/machinery/proc/powered(var/chan = -1) // defaults to power_channel - if(!loc) - return 0 + return FALSE if(!use_power) - return 1 + return TRUE var/area/A = get_area(src) // make sure it's in an area if(!A) - return 0 // if not, then not powered + return FALSE // if not, then not powered if(chan == -1) chan = power_channel return A.powered(chan) // return power status of the area // increment the power usage stats for an area -/obj/machinery/proc/use_power(var/amount, var/chan = -1) // defaults to power_channel +/obj/machinery/proc/use_power(amount, chan = -1) // defaults to power_channel var/area/A = get_area(src) // make sure it's in an area if(!A) return @@ -103,43 +118,36 @@ /obj/machinery/power/proc/connect_to_network() var/turf/T = src.loc if(!T || !istype(T)) - return 0 + return FALSE var/obj/structure/cable/C = T.get_cable_node() //check if we have a node cable on the machine turf, the first found is picked if(!C || !C.powernet) - return 0 + return FALSE C.powernet.add_machine(src) - return 1 + return TRUE // remove and disconnect the machine from its current powernet /obj/machinery/power/proc/disconnect_from_network() if(!powernet) - return 0 + return FALSE powernet.remove_machine(src) - return 1 + return TRUE // attach a wire to a power machine - leads from the turf you are standing on //almost never called, overwritten by all power machines but terminal and generator -/obj/machinery/power/attackby(obj/item/W, mob/user) - - if(istype(W, /obj/item/stack/cable_coil)) - - var/obj/item/stack/cable_coil/coil = W - +/obj/machinery/power/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/coil = I var/turf/T = user.loc - - if(T.intact || !istype(T, /turf/simulated/floor)) + if(T.intact || !isfloorturf(T)) return - if(get_dist(src, user) > 1) return - coil.place_turf(T, user) - return else - ..() - return + return ..() + /////////////////////////////////////////// // Powernet handling helpers @@ -159,7 +167,8 @@ cdir = get_dir(T,loc) for(var/obj/structure/cable/C in T) - if(C.powernet) continue + if(C.powernet) + continue if(C.d1 == cdir || C.d2 == cdir) . += C return . @@ -186,7 +195,8 @@ /obj/machinery/power/proc/get_indirect_connections() . = list() for(var/obj/structure/cable/C in loc) - if(C.powernet) continue + if(C.powernet) + continue if(C.d1 == 0) // the cable is a node cable . += C return . @@ -199,44 +209,32 @@ // returns a list of all power-related objects (nodes, cable, junctions) in turf, // excluding source, that match the direction d // if unmarked==1, only return those with no powernet -/proc/power_list(var/turf/T, var/source, var/d, var/unmarked=0, var/cable_only = 0) +/proc/power_list(turf/T, source, d, unmarked=0, cable_only = 0) . = list() - var/fdir = (!d)? 0 : turn(d, 180) // the opposite direction to d (or 0 if d==0) -///// Z-Level Stuff - var/Zdir - if(d==11) - Zdir = 11 - else if(d==12) - Zdir = 12 - else - Zdir = 999 -///// Z-Level Stuff - for(var/AM in T) - if(AM == source) continue //we don't want to return source - if(!cable_only && istype(AM,/obj/machinery/power)) + for(var/AM in T) + if(AM == source) + continue //we don't want to return source + + if(!cable_only && istype(AM, /obj/machinery/power)) var/obj/machinery/power/P = AM - if(P.powernet == 0) continue // exclude APCs which have powernet=0 + if(P.powernet == 0) + continue // exclude APCs which have powernet=0 if(!unmarked || !P.powernet) //if unmarked=1 we only return things with no powernet if(d == 0) . += P - else if(istype(AM,/obj/structure/cable)) + else if(istype(AM, /obj/structure/cable)) var/obj/structure/cable/C = AM if(!unmarked || !C.powernet) -///// Z-Level Stuff - if(C.d1 == fdir || C.d2 == fdir || C.d1 == Zdir || C.d2 == Zdir) -///// Z-Level Stuff - . += C - else if(C.d1 == d || C.d2 == d) + if(C.d1 == d || C.d2 == d) . += C return . //remove the old powernet and replace it with a new one throughout the network. -/proc/propagate_network(var/obj/O, var/datum/powernet/PN) - //log_world("propagating new network") +/proc/propagate_network(obj/O, datum/powernet/PN) var/list/worklist = list() var/list/found_machines = list() var/index = 1 @@ -248,13 +246,13 @@ P = worklist[index] //get the next power object found index++ - if( istype(P,/obj/structure/cable)) + if(istype(P, /obj/structure/cable)) var/obj/structure/cable/C = P if(C.powernet != PN) //add it to the powernet, if it isn't already there PN.add_cable(C) worklist |= C.get_connections() //get adjacents power objects, with or without a powernet - else if(P.anchored && istype(P,/obj/machinery/power)) + else if(P.anchored && istype(P, /obj/machinery/power)) var/obj/machinery/power/M = P found_machines |= M //we wait until the powernet is fully propagates to connect the machines @@ -268,7 +266,7 @@ //Merge two powernets, the bigger (in cable length term) absorbing the other -/proc/merge_powernets(var/datum/powernet/net1, var/datum/powernet/net2) +/proc/merge_powernets(datum/powernet/net1, datum/powernet/net2) if(!net1 || !net2) //if one of the powernet doesn't exist, return return @@ -285,8 +283,6 @@ for(var/obj/structure/cable/Cable in net2.cables) //merge cables net1.add_cable(Cable) - if(!net2) return net1 - for(var/obj/machinery/power/Node in net2.nodes) //merge power machines if(!Node.connect_to_network()) Node.disconnect_from_network() //if somehow we can't connect the machine to the new powernet, disconnect it from the old nonetheless @@ -298,34 +294,35 @@ //power_source is a source of electricity, can be powercell, area, apc, cable, powernet or null //source is an object caused electrocuting (airlock, grille, etc) //No animations will be performed by this proc. -/proc/electrocute_mob(mob/living/carbon/M as mob, var/power_source, var/obj/source, var/siemens_coeff = 1.0) - if(!istype(M)) - return 0 - if(istype(M.loc,/obj/mecha)) - return 0 //feckin mechs are dumb - if(istype(M,/mob/living/carbon/human)) +/proc/electrocute_mob(mob/living/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE) + if(!M || ismecha(M.loc)) + return FALSE //feckin mechs are dumb + if(dist_check) + if(!in_range(source, M)) + return FALSE + if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves if(G.siemens_coefficient == 0) - return 0 //to avoid spamming with insulated glvoes on + return FALSE //to avoid spamming with insulated glvoes on var/area/source_area - if(istype(power_source,/area)) + if(istype(power_source, /area)) source_area = power_source power_source = source_area.get_apc() - if(istype(power_source,/obj/structure/cable)) + if(istype(power_source, /obj/structure/cable)) var/obj/structure/cable/Cable = power_source power_source = Cable.powernet var/datum/powernet/PN var/obj/item/stock_parts/cell/cell - if(istype(power_source,/datum/powernet)) + if(istype(power_source, /datum/powernet)) PN = power_source - else if(istype(power_source,/obj/item/stock_parts/cell)) + else if(istype(power_source, /obj/item/stock_parts/cell)) cell = power_source - else if(istype(power_source,/obj/machinery/power/apc)) + else if(istype(power_source, /obj/machinery/power/apc)) var/obj/machinery/power/apc/apc = power_source cell = apc.cell if(apc.terminal) @@ -344,7 +341,7 @@ if(cell) cell_damage = cell.get_electrocute_damage() var/shock_damage = 0 - if(PN_damage>=cell_damage) + if(PN_damage >= cell_damage) power_source = PN shock_damage = PN_damage else @@ -354,10 +351,30 @@ var/drained_energy = drained_hp*20 if(source_area) - source_area.use_power(drained_energy/CELLRATE) - else if(istype(power_source,/datum/powernet)) - var/drained_power = drained_energy/CELLRATE //convert from "joules" to "watts" - drained_power = PN.draw_power(drained_power) - else if(istype(power_source, /obj/item/stock_parts/cell)) + source_area.use_power(drained_energy/GLOB.CELLRATE) + else if(istype(power_source, /datum/powernet)) + var/drained_power = drained_energy/GLOB.CELLRATE //convert from "joules" to "watts" + PN.delayedload += (min(drained_power, max(PN.newavail - PN.delayedload, 0))) + else if (istype(power_source, /obj/item/stock_parts/cell)) cell.use(drained_energy) return drained_energy + +//////////////////////////////////////////////// +// Misc. +/////////////////////////////////////////////// + + +// return a knot cable (O-X) if one is present in the turf +// null if there's none +/turf/proc/get_cable_node() + if(!can_have_cabling()) + return null + for(var/obj/structure/cable/C in src) + if(C.d1 == 0) + return C + return null + +/area/proc/get_apc() + for(var/obj/machinery/power/apc/APC in GLOB.apcs) + if(APC.area == src) + return APC \ No newline at end of file diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index a07d854380d..b64481b1104 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -1,19 +1,19 @@ +//////////////////////////////////////////// +// POWERNET DATUM +// each contiguous network of cables & nodes +///////////////////////////////////// /datum/powernet + var/number // unique id var/list/cables = list() // all cables & junctions var/list/nodes = list() // all connected machines var/load = 0 // the current load on the powernet, increased by each machine at processing var/newavail = 0 // what available power was gathered last tick, then becomes... var/avail = 0 //...the current available power in the powernet + var/viewavail = 0 // the available power as it appears on the power console (gradually updated) var/viewload = 0 // the load as it appears on the power console (gradually updated) - var/number = 0 // Unused //TODEL - - var/perapc = 0 // per-apc avilability - var/perapc_excess = 0 - var/netexcess = 0 // excess power on the powernet (typically avail-load) - - var/problem = 0 // If either of these is set to 1 there is some sort of issue at the powernet. - + var/netexcess = 0 // excess power on the powernet (typically avail-load)/////// + var/delayedload = 0 // load applied to powernet between power ticks. /datum/powernet/New() SSmachines.powernets += src @@ -31,31 +31,21 @@ SSmachines.powernets -= src return ..() -//Returns the amount of excess power (before refunding to SMESs) from last tick. -//This is for machines that might adjust their power consumption using this data. -/datum/powernet/proc/last_surplus() - return max(avail - load, 0) - -/datum/powernet/proc/draw_power(var/amount) - var/draw = between(0, amount, avail - load) - load += draw - return draw - /datum/powernet/proc/is_empty() return !cables.len && !nodes.len //remove a cable from the current powernet //if the powernet is then empty, delete it //Warning : this proc DON'T check if the cable exists -/datum/powernet/proc/remove_cable(var/obj/structure/cable/C) +/datum/powernet/proc/remove_cable(obj/structure/cable/C) cables -= C C.powernet = null if(is_empty())//the powernet is now empty... - qdel(src)///... delete it - qdel + qdel(src)///... delete it //add a cable to the current powernet //Warning : this proc DON'T check if the cable exists -/datum/powernet/proc/add_cable(var/obj/structure/cable/C) +/datum/powernet/proc/add_cable(obj/structure/cable/C) if(C.powernet)// if C already has a powernet... if(C.powernet == src) return @@ -67,16 +57,16 @@ //remove a power machine from the current powernet //if the powernet is then empty, delete it //Warning : this proc DON'T check if the machine exists -/datum/powernet/proc/remove_machine(var/obj/machinery/power/M) +/datum/powernet/proc/remove_machine(obj/machinery/power/M) nodes -=M M.powernet = null if(is_empty())//the powernet is now empty... - qdel(src)///... delete it - qdel + qdel(src)///... delete it //add a power machine to the current powernet //Warning : this proc DON'T check if the machine exists -/datum/powernet/proc/add_machine(var/obj/machinery/power/M) +/datum/powernet/proc/add_machine(obj/machinery/power/M) if(M.powernet)// if M already has a powernet... if(M.powernet == src) return @@ -85,86 +75,28 @@ M.powernet = src nodes[M] = M -// Triggers warning for certain amount of ticks -/datum/powernet/proc/trigger_warning(var/duration_ticks = 20) - problem = max(duration_ticks, problem) - //handles the power changes in the powernet //called every ticks by the powernet controller /datum/powernet/proc/reset() - var/numapc = 0 - - if(problem > 0) - problem = max(problem - 1, 0) - - if(nodes && nodes.len) // Added to fix a bad list bug -- TLE - for(var/obj/machinery/power/terminal/term in nodes) - if( istype( term.master, /obj/machinery/power/apc ) ) - numapc++ - + //see if there's a surplus of power remaining in the powernet and stores unused power in the SMES netexcess = avail - load - if(numapc) - //very simple load balancing. If there was a net excess this tick then it must have been that some APCs used less than perapc, since perapc*numapc = avail - //Therefore we can raise the amount of power rationed out to APCs on the assumption that those APCs that used less than perapc will continue to do so. - //If that assumption fails, then some APCs will miss out on power next tick, however it will be rebalanced for the tick after. - if(netexcess >= 0) - perapc_excess += min(netexcess/numapc, (avail - perapc) - perapc_excess) - else - perapc_excess = 0 - - perapc = avail/numapc + perapc_excess - if(netexcess > 100 && nodes && nodes.len) // if there was excess power last cycle for(var/obj/machinery/power/smes/S in nodes) // find the SMESes in the network S.restore() // and restore some of the power that was used - //updates the viewed load (as seen on power computers) - viewload = round(load) + // update power consoles + viewavail = round(0.8 * viewavail + 0.2 * avail) + viewload = round(0.8 * viewload + 0.2 * load) - //reset the powernet - load = 0 + // reset the powernet + load = delayedload + delayedload = 0 avail = newavail newavail = 0 /datum/powernet/proc/get_electrocute_damage() - switch(avail) - if(5000000 to INFINITY) - return min(rand(200,300),rand(200,300)) - if(4000000 to 5000000) - return min(rand(80,180),rand(80,180)) - if(1000000 to 4000000) - return min(rand(50,160),rand(50,160)) - if(200000 to 1000000) - return min(rand(25,80),rand(25,80)) - if(100000 to 200000)//Ave powernet - return min(rand(20,60),rand(20,60)) - if(50000 to 100000) - return min(rand(15,40),rand(15,40)) - if(1000 to 50000) - return min(rand(10,20),rand(10,20)) - else - return 0 - -//////////////////////////////////////////////// -// Misc. -/////////////////////////////////////////////// - - -// return a knot cable (O-X) if one is present in the turf -// null if there's none -/turf/proc/get_cable_node() - if(!istype(src, /turf/simulated/floor)) - return null - for(var/obj/structure/cable/C in src) - if(C.d1 == 0) - return C - return null - -/area/proc/get_apc() - // This was a simple locate() in src, but an unresolved BYOND bug causes trying to locate() in an - // area to take an inconceivably long time, especially for large areas. - // See: http://www.byond.com/forum/?post=1860571 - var/obj/machinery/power/apc/FINDME - for(FINDME in src) - return FINDME \ No newline at end of file + if(avail >= 1000) + return Clamp(20 + round(avail / 25000), 20, 195) + rand(-5, 5) + else + return 0 \ No newline at end of file diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index a85d9e880bd..3e910a613b0 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -15,8 +15,8 @@ var/global/list/rad_collectors = list() var/locked = 0 var/drainratio = 1 -/obj/machinery/power/rad_collector/New() - ..() +/obj/machinery/power/rad_collector/Initialize(mapload) + . = ..() rad_collectors += src /obj/machinery/power/rad_collector/Destroy() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index a0e84f8455a..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) @@ -78,7 +77,7 @@ if(isliving(user)) var/shock_damage = min(rand(30,40),rand(30,40)) - if(iscarbon(user)) + if(isliving(user) && !issilicon(user)) var/stun = min(shock_damage, 15) user.Stun(stun) user.Weaken(10) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index b0ed7c14581..9ba302ab19b 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -23,18 +23,25 @@ var/frequency = 0 var/id_tag = null + var/projectile_type = /obj/item/projectile/beam/emitter + var/projectile_sound = 'sound/weapons/emitter.ogg' var/datum/radio_frequency/radio_connection var/datum/effect_system/spark_spread/sparks -/obj/machinery/power/emitter/New() - ..() +/obj/machinery/power/emitter/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/emitter(null) component_parts += new /obj/item/stock_parts/micro_laser(null) component_parts += new /obj/item/stock_parts/manipulator(null) RefreshParts() + if(state == 2 && anchored) + connect_to_network() sparks = new + sparks.attach(src) sparks.set_up(5, 1, src) + if(frequency) + set_frequency(frequency) /obj/machinery/power/emitter/RefreshParts() var/max_firedelay = 120 @@ -54,10 +61,10 @@ //Radio remote control /obj/machinery/power/emitter/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) /obj/machinery/power/emitter/verb/rotate() @@ -79,13 +86,6 @@ return rotate() -/obj/machinery/power/emitter/Initialize() - ..() - if(state == 2 && anchored) - connect_to_network() - if(frequency) - set_frequency(frequency) - /obj/machinery/power/emitter/multitool_menu(var/mob/user,var/obj/item/multitool/P) return {"
").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),t={width:n.width(),height:n.height()},r=document.activeElement;try{r.id}catch(e){r=document.body}return n.wrap(e),n[0]!==r&&!D.contains(n[0],r)||D(r).focus(),e=n.parent(),"static"===n.css("position")?(e.css({position:"relative"}),n.css({position:"relative"})):(D.extend(i,{position:n.css("position"),zIndex:n.css("z-index")}),D.each(["top","left","bottom","right"],function(e,t){i[t]=n.css(t),isNaN(parseInt(i[t],10))&&(i[t]="auto")}),n.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),n.css(t),e.css(i).show()},removeWrapper:function(e){var t=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),e[0]!==t&&!D.contains(e[0],t)||D(t).focus()),e},setTransition:function(i,e,r,o){return o=o||{},D.each(e,function(e,t){var n=i.cssUnit(t);0r&&0!==r||!1===i.call(e,o))&&jQuery.timer.remove(e,n,i)}a.timerID=i.timerID,s[n][i.timerID]||(s[n][i.timerID]=window.setInterval(a,t)),this.global.push(e)}},remove:function(e,t,n){var i,r=jQuery.data(e,this.dataKey);if(r){if(t){if(r[t]){if(n)n.timerID&&(window.clearInterval(r[t][n.timerID]),delete r[t][n.timerID]);else for(var n in r[t])window.clearInterval(r[t][n]),delete r[t][n];for(i in r[t])break;i||(i=null,delete r[t])}}else for(t in r)this.remove(e,t,n);for(i in r)break;i||jQuery.removeData(e,this.dataKey)}}}}),jQuery(window).bind("unload",function(){jQuery.each(jQuery.timer.global,function(e,t){jQuery.timer.remove(t)})}),function(){"use strict";var a={version:"1.0.1-nanoui",templateSettings:{evaluate:/\{\{([\s\S]+?)\}\}/g,interpolate:/\{\{:([\s\S]+?)\}\}/g,encode:/\{\{>([\s\S]+?)\}\}/g,use:/\{\{#([\s\S]+?)\}\}/g,define:/\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g,conditional:/\{\{\/?if\s*([\s\S]*?)\s*\}\}/g,conditionalElse:/\{\{else\s*([\s\S]*?)\s*\}\}/g,iterate:/\{\{\/?for\s*(?:\}\}|([\s\S]+?)\s*(?:\:\s*([\w$]+))?\s*(?:\:\s*([\w$]+))?\s*\}\})/g,props:/\{\{\/?props\s*(?:\}\}|([\s\S]+?)\s*(?:\:\s*([\w$]+))?\s*(?:\:\s*([\w$]+))?\s*\}\})/g,empty:/\{\{empty\}\}/g,varname:"data, config, helper",strip:!0,append:!0,selfcontained:!1},template:void 0,compile:void 0};function l(){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},e=/&(?!#?\w+;)|<|>|"|'|\//g;return function(){return this?this.replace(e,function(e){return t[e]||e}):this}}"undefined"!=typeof module&&module.exports?module.exports=a:"function"==typeof define&&define.amd?define(function(){return a}):function(){return this||(0,eval)("this")}().doT=a,String.prototype.encodeHTML=l();var u={append:{start:"'+(",end:")+'",endencode:"||'').toString().encodeHTML()+'"},split:{start:"';out+=(",end:");out+='",endencode:"||'').toString().encodeHTML();out+='"}},c=/$^/;function f(e){return e.replace(/\\('|\\)/g,"$1").replace(/[\r\t\n]/g," ")}a.template=function(e,t,n){var i,r=(t=t||a.templateSettings).append?u.append:u.split,o=0,s=t.use||t.define?function i(r,e,o){return("string"==typeof e?e:e.toString()).replace(r.define||c,function(e,i,t,n){return 0===i.indexOf("def.")&&(i=i.substring(4)),i in o||(":"===t?(r.defineParams&&n.replace(r.defineParams,function(e,t,n){o[i]={arg:t,text:n}}),i in o||(o[i]=n)):new Function("def","def['"+i+"']="+n)(o)),""}).replace(r.use||c,function(e,t){r.useParams&&(t=t.replace(r.useParams,function(e,t,n,i){if(o[n]&&o[n].arg&&i){var r=(n+":"+i).replace(/'|\\/g,"_");return o.__exp=o.__exp||{},o.__exp[r]=o[n].text.replace(new RegExp("(^|[^\\w$])"+o[n].arg+"([^\\w$])","g"),"$1"+i+"$2"),t+"def.__exp['"+r+"']"}}));var n=new Function("def","return "+t)(o);return n?i(r,n,o):n})}(t,e,n||{}):e;s=("var out='"+(t.strip?s.replace(/(^|\r|\n)\t* +| +\t*(\r|\n|$)/g," ").replace(/\r|\n|\t|\/\*[\s\S]*?\*\//g,""):s).replace(/'|\\/g,"\\$&").replace(t.interpolate||c,function(e,t){return r.start+f(t)+r.end}).replace(t.encode||c,function(e,t){return i=!0,r.start+f(t)+r.endencode}).replace(t.conditional||c,function(e,t){return t?"';if("+f(t)+"){out+='":"';}out+='"}).replace(t.conditionalElse||c,function(e,t){return t?"';}else if("+f(t)+"){out+='":"';}else{out+='"}).replace(t.iterate||c,function(e,t,n,i){if(!t)return"';} } out+='";o+=1,n=n||"value",i=i||"index",t=f(t);var r="arr"+o;return"';var "+r+"="+t+";if("+r+" && "+r+".length > 0){var "+n+","+i+"=-1,l"+o+"="+r+".length-1;while("+i+" 0){var "+n+";for( var "+i+" in "+r+"){ if (!"+r+".hasOwnProperty("+i+")) continue; "+n+"="+r+"["+i+"];out+='"}).replace(t.empty||c,function(e){return"';}}else{if(true){out+='"}).replace(t.evaluate||c,function(e,t){return"';"+f(t)+"out+='"})+"';return out;").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r").replace(/(\s|;|\}|^|\{)out\+='';/g,"$1").replace(/\+''/g,"").replace(/(\s|;|\}|^|\{)out\+=''\+/g,"$1out+="),i&&t.selfcontained&&(s="String.prototype.encodeHTML=("+l.toString()+"());"+s);try{return new Function(t.varname,s)}catch(e){throw"undefined"!=typeof console&&console.log("Could not create a template function: "+s),e}},a.compile=function(e,t){return a.template(e,null,t)}}(),function(e,t){"use strict";"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.returnExports=t()}(this,function(){function n(e){try{var t=S.call(e).replace(/\/\/.*\n/g,"").replace(/\/\*[.\s\S]*\*\//g,"").replace(/\n/gm," ").replace(/ {2}/g," ");return N.test(t)}catch(e){return!1}}function p(e){if(!e)return!1;if("function"!=typeof e&&"object"!=typeof e)return!1;if(E)return function(e){try{return!n(e)&&(S.call(e),!0)}catch(e){return!1}}(e);if(n(e))return!1;var t=_.call(e);return"[object Function]"===t||"[object GeneratorFunction]"===t}var h,d,l=Array,e=l.prototype,a=Object,t=a.prototype,u=Function,i=u.prototype,v=String,r=v.prototype,y=Number,o=y.prototype,c=e.slice,s=e.splice,g=e.push,f=e.unshift,m=e.concat,b=e.join,x=i.call,w=i.apply,T=Math.max,C=Math.min,_=t.toString,E="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag,S=Function.prototype.toString,N=/^\s*class /,D=RegExp.prototype.exec;h=function(e){return"object"==typeof e&&(E?function(e){try{return D.call(e),!0}catch(e){return!1}}(e):"[object RegExp]"===_.call(e))};var k=String.prototype.valueOf;d=function(e){return"string"==typeof e||"object"==typeof e&&(E?function(e){try{return k.call(e),!0}catch(e){return!1}}(e):"[object String]"===_.call(e))};function j(e){var t=typeof e;return null===e||"object"!=t&&"function"!=t}function A(){}var P,H,M=a.defineProperty&&function(){try{var e={};for(var t in a.defineProperty(e,"x",{enumerable:!1,value:e}),e)return!1;return e.x===e}catch(e){return!1}}(),L=(P=t.hasOwnProperty,H=M?function(e,t,n,i){!i&&t in e||a.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:!0,value:n})}:function(e,t,n,i){!i&&t in e||(e[t]=n)},function(e,t,n){for(var i in t)P.call(t,i)&&H(e,i,t[i],n)}),O=y.isNaN||function(e){return e!=e},I=function(e){var t=+e;return O(t)?t=0:0!==t&&t!==1/0&&t!==-1/0&&(t=(0>>0};L(i,{bind:function(t){var n=this;if(!p(n))throw new TypeError("Function.prototype.bind called on incompatible "+n);for(var i,r=c.call(arguments,1),e=T(0,n.length-r.length),o=[],s=0;s=r)throw new TypeError("reduce of empty array with no initial value")}for(;sError name: "+e.name+"
Error Message: "+e.message)}t.hasOwnProperty("data")||(a&&a.hasOwnProperty("data")?t.data=a.data:t.data={}),n?l(t):a=t}(e)},addBeforeUpdateCallback:function(e,t){r[e]=t},addBeforeUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addBeforeUpdateCallback(t,e[t])},removeBeforeUpdateCallback:function(e){r.hasOwnProperty(e)&&delete r[e]},executeBeforeUpdateCallbacks:function(e){return t(r,e)},addAfterUpdateCallback:function(e,t){o[e]=t},addAfterUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addAfterUpdateCallback(t,e[t])},removeAfterUpdateCallback:function(e){o.hasOwnProperty(e)&&delete o[e]},executeAfterUpdateCallbacks:function(e){return t(o,e)},addState:function(e){e instanceof NanoStateClass?e.key?i[e.key]=e:reportError("ERROR: Attempted to add a state with an invalid stateKey"):reportError("ERROR: Attempted to add a state which is not instanceof NanoStateClass")},setCurrentState:function(e){if(void 0===e||!e)return reportError("ERROR: No state key was passed!"),!1;if(!i.hasOwnProperty(e))return reportError("ERROR: Attempted to set a current state which does not exist: "+e),!1;var t=s;return s=i[e],null!=t&&t.onRemove(s),s.onAdd(t),!0},getCurrentState:function(){return s},getData:function(){return a}}}(),NanoBaseCallbacks=function(){var a=!0,t={},n={status:function(n){var e;return 2==n.config.status?(e="good",$(".linkActive").removeClass("inactive")):(e=1==n.config.status?"average":"bad",$(".linkActive").addClass("inactive")),$(".statusicon").removeClass("good bad average").addClass(e),$(".linkActive").stopTime("linkPending"),$(".linkActive").removeClass("linkPending"),$(".linkActive").off("click").on("click",function(e){e.preventDefault();var t=$(this).data("href");null!=t&&a&&(a=!1,$("body").oneTime(300,"enableClick",function(){a=!0}),2==n.config.status&&$(this).oneTime(300,"linkPending",function(){$(this).addClass("linkPending")}),window.location.href=t)}),n},nanomap:function(e){return $(".mapIcon").off("mouseenter mouseleave").on("mouseenter",function(e){$("#uiMapTooltip").html($(this).children(".tooltip").html()).show().stopTime().oneTime(5e3,"hideTooltip",function(){$(this).fadeOut(500)})}),$(".zoomLink").off("click").on("click",function(e){e.preventDefault();var t=$(this).data("zoomLevel"),n=$("#uiMap"),a=n.width()*t,r=n.height()*t;n.css({zoom:t,left:"50%",top:"50%",marginLeft:"-"+Math.floor(a/2)+"px",marginTop:"-"+Math.floor(r/2)+"px"})}),$("#uiMapImage").attr("src",e.config.map+"_nanomap_z"+e.config.mapZLevel+".png"),e}};return{addCallbacks:function(){NanoStateManager.addBeforeUpdateCallbacks(t),NanoStateManager.addAfterUpdateCallbacks(n)},removeCallbacks:function(){for(var e in t)t.hasOwnProperty(e)&&NanoStateManager.removeBeforeUpdateCallback(e);for(var e in n)n.hasOwnProperty(e)&&NanoStateManager.removeAfterUpdateCallback(e)}}}(),NanoBaseHelpers=function(){var t={syndicateMode:function(){return $(".mainBG").css("background","url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDAwIDIwMCIgb3BhY2l0eT0iLjI1Ij4NCgk8cG9seWdvbiBwb2ludHM9IjI1MCwwIDE1MCwwIDEwMCw1MCI+PC9wb2x5Z29uPg0KCTxwb2x5Z29uIHBvaW50cz0iMTAwLDUwIDE1MCwyNSAyMDAsNjUgMjUwLDE1MCI+PC9wb2x5Z29uPg0KCTxwb2x5Z29uIHBvaW50cz0iMjUwLDE1MCAyMDAsOTAgMTAwLDIwMCI+PC9wb2x5Z29uPg0KPC9zdmc+') no-repeat fixed center/70% 70%, linear-gradient(to bottom, #8f1414 0%, #4B0A0A 100%) no-repeat fixed center/100% 100%;"),$("#uiTitleFluff").css("background-image","url('uiTitleFluff-Syndicate.png')"),$("#uiTitleFluff").css("background-position","50% 50%"),$("#uiTitleFluff").css("background-repeat","no-repeat"),""},combine:function(e,t){return e&&t?e.concat(t):e||t},dump:function(e){return JSON.stringify(e)},link:function(e,t,n,a,r,o){var i="",s="noIcon";void 0!==t&&t&&(i='
',s="hasIcon"),void 0!==r&&r||(r="link");var l="";void 0!==o&&o&&(l='id="'+o+'"');var c=NanoTransition.allocID(l+"_"+e.toString().replace(/[^a-z0-9_]/gi,"_")+"_"+t);return void 0!==a&&a?'