diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 403526d30b..a553cef999 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -210,6 +210,8 @@ This prevents nesting levels from getting deeper then they need to be.
* Do not divide when you can easily convert it to a multiplication. (ie `4/2` should be done as `4*0.5`)
+* Do not use the shorthand sql insert format (where no column names are specified) because it unnecessarily breaks all queries on minor column changes and prevents using these tables for tracking outside related info such as in a connected site/forum.
+
#### Enforced not enforced
The following different coding styles are not only not enforced, but it is generally frowned upon to change them over from one to the other for little reason:
diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt
index c34c6b694b..d0546da131 100644
--- a/SQL/database_changelog.txt
+++ b/SQL/database_changelog.txt
@@ -1,3 +1,13 @@
+21 April 2017, by Jordie0608
+
+Modified table 'player', adding the column 'accountjoindate', removing the column 'id' and making the column 'ckey' the primary key.
+
+ALTER TABLE `feedback`.`player` DROP COLUMN `id`, ADD COLUMN `accountjoindate` DATE NULL AFTER `lastadminrank`, DROP PRIMARY KEY, ADD PRIMARY KEY (`ckey`), DROP INDEX `ckey`;
+
+Remember to add a prefix to the table name if you use them.
+
+----------------------------------------------------
+
10 March 2017, by Jordie0608
Modified table 'death', adding the columns 'toxloss', 'cloneloss', and 'staminaloss' and table 'legacy_population', adding the columns 'server_ip' and 'server_port'.
diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql
index 77e9b9429e..0d0817bf1f 100644
--- a/SQL/tgstation_schema.sql
+++ b/SQL/tgstation_schema.sql
@@ -261,15 +261,14 @@ DROP TABLE IF EXISTS `player`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `player` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
`ckey` varchar(32) NOT NULL,
`firstseen` datetime NOT NULL,
`lastseen` datetime NOT NULL,
`ip` int(10) unsigned NOT NULL,
`computerid` varchar(32) NOT NULL,
`lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
- PRIMARY KEY (`id`),
- UNIQUE KEY `ckey` (`ckey`),
+ `accountjoindate` DATE DEFAULT NULL,
+ PRIMARY KEY (`ckey`),
KEY `idx_player_cid_ckey` (`computerid`,`ckey`),
KEY `idx_player_ip_ckey` (`ip`,`ckey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql
index be27384ea5..4d74b9deaa 100644
--- a/SQL/tgstation_schema_prefixed.sql
+++ b/SQL/tgstation_schema_prefixed.sql
@@ -261,15 +261,14 @@ DROP TABLE IF EXISTS `SS13_player`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `SS13_player` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
`ckey` varchar(32) NOT NULL,
`firstseen` datetime NOT NULL,
`lastseen` datetime NOT NULL,
`ip` int(10) unsigned NOT NULL,
`computerid` varchar(32) NOT NULL,
`lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
- PRIMARY KEY (`id`),
- UNIQUE KEY `ckey` (`ckey`),
+ `accountjoindate` DATE DEFAULT NULL,
+ PRIMARY KEY (`ckey`),
KEY `idx_player_cid_ckey` (`computerid`,`ckey`),
KEY `idx_player_ip_ckey` (`ip`,`ckey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
diff --git a/Test.txt b/Test.txt
deleted file mode 100644
index 68db24f630..0000000000
--- a/Test.txt
+++ /dev/null
@@ -1 +0,0 @@
-~~
\ No newline at end of file
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm
index 167aa9ef1b..1c47260f2c 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm
@@ -148,10 +148,8 @@
/area/ruin/powered/golem_ship)
"u" = (
/obj/structure/table/wood,
-/obj/item/weapon/bedsheet/rd{
- desc = "Majestic.";
+/obj/item/weapon/bedsheet/rd/royal_cape{
layer = 3;
- name = "Royal Cape of the Liberator";
pixel_x = 5;
pixel_y = 9
},
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
index 711ee674ee..930fea83aa 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
@@ -84,6 +84,7 @@
/area/ruin/powered)
"p" = (
/obj/structure/rack,
+/obj/item/weapon/storage/bag/plants/portaseeder,
/obj/item/weapon/storage/bag/ore,
/obj/item/weapon/storage/firstaid/regular,
/turf/open/floor/plating/asteroid/basalt,
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
index 65d7aac80f..64c1a7cb26 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
@@ -9,19 +9,89 @@
/turf/closed/wall/r_wall,
/area/ruin/powered)
"d" = (
-/obj/structure/shuttle/engine/propulsion{
- icon_state = "propulsion";
- dir = 8
+/obj/structure/table/wood,
+/obj/item/weapon/lighter,
+/obj/item/weapon/lighter,
+/obj/item/weapon/storage/fancy/rollingpapers,
+/obj/item/weapon/storage/fancy/rollingpapers,
+/obj/item/weapon/storage/fancy/rollingpapers,
+/obj/item/weapon/storage/fancy/rollingpapers,
+/turf/open/floor/plasteel/freezer{
+ baseturf = /turf/open/floor/plating/lava/smooth
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
+/area/ruin/powered)
"e" = (
-/obj/machinery/smartfridge,
+/obj/structure/table/wood,
+/obj/item/weapon/storage/box/disks_plantgene,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"f" = (
+/obj/machinery/plantgenes/seedvault,
+/turf/open/floor/plasteel/freezer{
+ baseturf = /turf/open/floor/plating/lava/smooth
+ },
+/area/ruin/powered)
+"g" = (
+/obj/structure/table/wood,
+/turf/open/floor/plasteel/freezer{
+ baseturf = /turf/open/floor/plating/lava/smooth
+ },
+/area/ruin/powered)
+"h" = (
+/turf/open/floor/plasteel/freezer{
+ baseturf = /turf/open/floor/plating/lava/smooth
+ },
+/area/ruin/powered)
+"i" = (
+/obj/structure/closet/crate/hydroponics,
+/obj/structure/beebox,
+/obj/item/weapon/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/open/floor/plasteel/freezer{
+ baseturf = /turf/open/floor/plating/lava/smooth
+ },
+/area/ruin/powered)
+"j" = (
+/obj/structure/shuttle/engine/propulsion{
+ icon_state = "propulsion";
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"k" = (
+/obj/structure/closet/crate,
+/obj/effect/spawner/lootdrop/seed_vault,
+/turf/open/floor/plasteel/freezer{
+ baseturf = /turf/open/floor/plating/lava/smooth
+ },
+/area/ruin/powered)
+"l" = (
+/obj/machinery/door/airlock,
+/turf/open/floor/plasteel/freezer{
+ baseturf = /turf/open/floor/plating/lava/smooth
+ },
+/area/ruin/powered)
+"m" = (
+/obj/structure/shuttle/engine/propulsion{
+ icon_state = "propulsion";
+ dir = 8
+ },
+/turf/open/space/basic,
+/area/lavaland/surface/outdoors)
+"n" = (
+/obj/machinery/smartfridge,
+/turf/open/floor/plasteel/freezer{
+ baseturf = /turf/open/floor/plating/lava/smooth
+ },
+/area/ruin/powered)
+"o" = (
/obj/structure/closet/crate/hydroponics,
/obj/item/weapon/cultivator,
/obj/item/weapon/cultivator,
@@ -39,34 +109,22 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"g" = (
+"p" = (
/obj/machinery/hydroponics/constructable,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"h" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/seed_vault,
-/turf/open/floor/plasteel/freezer{
- baseturf = /turf/open/floor/plating/lava/smooth
- },
-/area/ruin/powered)
-"i" = (
-/obj/machinery/plantgenes/seedvault,
-/turf/open/floor/plasteel/freezer{
- baseturf = /turf/open/floor/plating/lava/smooth
- },
-/area/ruin/powered)
-"j" = (
+"q" = (
/obj/item/weapon/hatchet,
/obj/item/weapon/storage/bag/plants,
/obj/item/weapon/reagent_containers/glass/bucket,
+/obj/structure/table/wood,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"k" = (
+"r" = (
/obj/structure/table/wood,
/obj/item/weapon/storage/bag/plants,
/obj/item/weapon/storage/bag/plants,
@@ -76,7 +134,7 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"l" = (
+"s" = (
/obj/structure/table/wood,
/obj/item/weapon/gun/energy/floragun,
/obj/item/weapon/gun/energy/floragun,
@@ -87,25 +145,13 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"m" = (
-/turf/open/floor/plasteel/freezer{
- baseturf = /turf/open/floor/plating/lava/smooth
- },
-/area/ruin/powered)
-"n" = (
-/obj/structure/shuttle/engine/propulsion{
- icon_state = "propulsion";
- dir = 8
- },
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"o" = (
+"t" = (
/obj/effect/mob_spawn/human/seed_vault,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"p" = (
+"u" = (
/obj/structure/sink{
icon_state = "sink";
dir = 8;
@@ -116,19 +162,19 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"q" = (
+"v" = (
/obj/machinery/vending/hydronutrients,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"r" = (
+"w" = (
/obj/machinery/vending/hydroseeds,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"s" = (
+"x" = (
/obj/machinery/reagentgrinder{
pixel_y = 5
},
@@ -141,7 +187,7 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"t" = (
+"y" = (
/obj/structure/sink{
dir = 4;
icon_state = "sink";
@@ -152,57 +198,51 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"u" = (
-/obj/machinery/door/airlock,
-/turf/open/floor/plasteel/freezer{
- baseturf = /turf/open/floor/plating/lava/smooth
- },
-/area/ruin/powered)
-"v" = (
+"z" = (
/obj/machinery/door/airlock/external,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"w" = (
+"A" = (
/obj/machinery/door/airlock/external,
/obj/structure/fans/tiny,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"x" = (
+"B" = (
/obj/structure/disposalpipe/trunk,
/obj/machinery/disposal/bin,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"y" = (
+"C" = (
/obj/machinery/seed_extractor,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"z" = (
+"D" = (
/obj/machinery/biogenerator,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"A" = (
-/obj/machinery/chem_dispenser/mutagen,
+"E" = (
+/obj/machinery/chem_dispenser/mutagensaltpeter,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"B" = (
+"F" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"C" = (
+"G" = (
/obj/structure/closet/crate/hydroponics,
/obj/item/clothing/under/rank/hydroponics,
/obj/item/clothing/under/rank/hydroponics,
@@ -212,13 +252,13 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"D" = (
+"H" = (
/obj/machinery/chem_master/condimaster,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"E" = (
+"I" = (
/obj/structure/table/wood,
/obj/item/weapon/reagent_containers/glass/bucket,
/obj/item/weapon/reagent_containers/glass/bucket,
@@ -228,25 +268,25 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"F" = (
+"J" = (
/obj/item/weapon/storage/toolbox/syndicate,
/obj/structure/table/wood,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
-"G" = (
+"K" = (
/obj/structure/disposalpipe/segment,
/turf/closed/wall/r_wall,
/area/ruin/powered)
-"H" = (
+"L" = (
/obj/structure/disposalpipe/segment{
dir = 1;
icon_state = "pipe-c"
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"I" = (
+"M" = (
/obj/structure/disposalpipe/trunk{
dir = 8
},
@@ -284,10 +324,10 @@ a
a
a
c
-o
-o
-o
-o
+t
+t
+t
+t
c
a
a
@@ -299,17 +339,17 @@ b
"}
(3,1,1) = {"
b
-b
+a
a
a
a
a
c
c
-m
-m
-m
-m
+h
+h
+h
+h
c
c
a
@@ -321,16 +361,16 @@ b
"}
(4,1,1) = {"
b
-b
-a
a
a
c
c
c
c
-u
-u
+c
+c
+l
+l
c
c
c
@@ -344,18 +384,18 @@ a
(5,1,1) = {"
a
a
-a
-a
-a
c
-e
-m
-p
-m
-m
-p
-m
-p
+c
+k
+c
+n
+h
+u
+h
+h
+u
+h
+u
c
a
a
@@ -366,18 +406,18 @@ a
(6,1,1) = {"
a
a
-a
-a
-a
c
-f
-m
-m
-m
-m
-m
-m
-C
+d
+h
+c
+o
+h
+h
+h
+h
+h
+h
+G
c
a
a
@@ -388,18 +428,18 @@ a
(7,1,1) = {"
a
a
-a
-a
-a
c
-g
-m
-g
-m
-m
-g
-m
-g
+e
+h
+c
+p
+h
+p
+h
+h
+p
+h
+p
c
a
a
@@ -408,44 +448,44 @@ a
a
"}
(8,1,1) = {"
-a
-a
-a
-a
+b
a
c
+e
+h
+l
+h
+h
+v
+h
h
-m
-q
-m
-m
-x
B
-B
-G
-H
+F
+F
+K
+L
a
a
a
a
"}
(9,1,1) = {"
-a
-a
-a
-a
+b
a
c
-i
-m
-e
-m
-m
-y
-m
-m
+f
+h
c
-I
+p
+h
+n
+h
+h
+C
+h
+k
+c
+M
a
a
a
@@ -454,18 +494,18 @@ a
(10,1,1) = {"
a
a
-a
-a
-a
c
g
-m
-r
-m
-m
-z
-m
-g
+h
+c
+p
+h
+w
+h
+h
+D
+h
+p
c
b
a
@@ -476,18 +516,18 @@ a
(11,1,1) = {"
a
a
-a
-a
-a
c
-j
-m
-s
-m
-m
-A
-m
-D
+h
+h
+c
+q
+h
+x
+h
+h
+E
+h
+H
c
a
a
@@ -496,20 +536,20 @@ a
a
"}
(12,1,1) = {"
-a
-a
-a
-a
+b
a
c
-g
-m
-m
-m
-m
-m
-m
-g
+h
+h
+c
+p
+h
+h
+h
+h
+h
+h
+p
c
a
a
@@ -520,18 +560,18 @@ a
(13,1,1) = {"
a
a
-a
-a
-a
c
-k
-m
-m
-g
-g
-m
-m
-E
+i
+h
+c
+r
+h
+h
+p
+p
+h
+h
+I
c
a
a
@@ -542,18 +582,18 @@ a
(14,1,1) = {"
a
a
-a
-a
-a
c
-l
-m
-t
-m
-m
-t
-m
-F
+c
+i
+c
+s
+h
+y
+h
+h
+y
+h
+J
c
a
a
@@ -564,15 +604,15 @@ a
(15,1,1) = {"
a
a
-a
-a
-a
+b
c
c
c
c
-v
-v
+c
+c
+z
+z
c
c
c
@@ -584,21 +624,21 @@ a
a
"}
(16,1,1) = {"
-a
-a
b
a
-a
-d
+b
+j
c
-n
+j
c
-m
-m
+j
c
-n
+h
+h
c
-n
+j
+c
+j
a
a
a
@@ -611,12 +651,12 @@ a
a
a
a
-b
a
-b
+a
+a
c
-w
-w
+A
+A
c
b
b
diff --git a/_maps/map_files/Cerestation/cerestation.dmm b/_maps/map_files/Cerestation/cerestation.dmm
index 860ff65d60..1edf7431b1 100644
--- a/_maps/map_files/Cerestation/cerestation.dmm
+++ b/_maps/map_files/Cerestation/cerestation.dmm
@@ -1922,9 +1922,6 @@
/obj/structure/window/reinforced{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/turf/open/floor/plasteel/vault{
baseturf = /turf/open/floor/plating/asteroid/airless;
dir = 8
@@ -1948,14 +1945,12 @@
/obj/structure/window/reinforced{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
/obj/structure/cable/orange{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/vault{
baseturf = /turf/open/floor/plating/asteroid/airless;
dir = 8
@@ -3744,11 +3739,15 @@
},
/area/ai_monitored/security/armory)
"ahq" = (
-/obj/machinery/light/small{
- dir = 1
+/obj/machinery/atmospherics/components/unary/vent_pump{
+ dir = 8;
+ layer = 2.4;
+ on = 1
},
-/turf/open/floor/plating/asteroid,
-/area/security/transfer)
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
"ahr" = (
/obj/structure/cable/orange{
d1 = 1;
@@ -4531,20 +4530,13 @@
},
/area/security/transfer)
"aiQ" = (
-/obj/machinery/power/apc{
- dir = 1;
- name = "Security Transfer Range APC";
- pixel_x = 0;
- pixel_y = 24
+/obj/structure/chair{
+ dir = 4
},
-/obj/structure/cable/orange{
- d2 = 8;
- icon_state = "0-8"
- },
-/turf/open/floor/plating/astplate{
+/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/security/transfer)
+/area/security/prison)
"aiR" = (
/obj/structure/rack,
/obj/item/weapon/pickaxe/mini,
@@ -4952,10 +4944,13 @@
},
/area/security/transfer)
"ajJ" = (
-/turf/open/floor/plating/astplate{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/security/transfer)
+/area/security/prison)
"ajK" = (
/obj/structure/rack,
/obj/item/weapon/shovel,
@@ -5360,20 +5355,35 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/machinery/light/small{
- dir = 8
+/obj/machinery/door/airlock/security{
+ name = "Interrogation Room";
+ req_access_txt = "0";
+ req_one_access_txt = "38;2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"akC" = (
+/obj/machinery/light/small,
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
},
/turf/open/floor/plating/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/security/transfer)
-"akC" = (
-/obj/machinery/light/small,
-/turf/open/floor/plating/asteroid,
-/area/security/transfer)
"akD" = (
/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plating/asteroid,
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ icon_plating = "asteroid_dug";
+ icon_state = "asteroid_dug";
+ name = "ditch"
+ },
/area/security/transfer)
"akE" = (
/obj/structure/disposalpipe/segment,
@@ -5719,15 +5729,35 @@
d2 = 2;
icon_state = "1-2"
},
-/turf/open/floor/plating{
+/obj/structure/cable/orange{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/security/transfer)
+/area/security/prison)
"alm" = (
-/turf/closed/wall/r_wall{
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 32
+ },
+/obj/machinery/camera{
+ c_tag = "Brig Cells North 2"
+ },
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/security/transfer)
+/area/security/prison)
"aln" = (
/obj/structure/mineral_door/iron{
name = "Transfer Center"
@@ -5928,30 +5958,40 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/machinery/door/airlock/security{
- name = "Inmate Transfer Facility";
- req_access_txt = "2"
- },
-/turf/open/floor/plating{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/security/transfer)
+/area/security/prison)
"alL" = (
/obj/machinery/light/small{
dir = 8
},
/obj/item/weapon/ore/glass,
-/turf/open/floor/plating/asteroid,
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ icon_plating = "asteroid_dug";
+ icon_state = "asteroid_dug";
+ name = "ditch"
+ },
/area/security/transfer)
"alM" = (
/obj/item/weapon/shovel,
-/turf/open/floor/plating/astplate{
- baseturf = /turf/open/floor/plating/asteroid/airless
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ icon_plating = "asteroid_dug";
+ icon_state = "asteroid_dug";
+ name = "ditch"
},
/area/security/transfer)
"alN" = (
/obj/item/weapon/ore/glass,
-/turf/open/floor/plating/asteroid,
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ icon_plating = "asteroid_dug";
+ icon_state = "asteroid_dug";
+ name = "ditch"
+ },
/area/security/transfer)
"alO" = (
/obj/structure/closet/emcloset,
@@ -6391,9 +6431,6 @@
},
/area/security/prison)
"amA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
/obj/structure/cable/orange{
d1 = 1;
d2 = 4;
@@ -6404,6 +6441,7 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -6414,20 +6452,15 @@
d2 = 4;
icon_state = "2-4"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
/obj/structure/cable/orange{
d1 = 2;
d2 = 8;
icon_state = "2-8"
},
-/obj/machinery/camera{
- c_tag = "Brig Cells North 2"
- },
-/obj/structure/extinguisher_cabinet{
- pixel_y = 32
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -9004,32 +9037,34 @@
},
/obj/structure/grille,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"ary" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"arz" = (
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
"arA" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"arB" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 4";
+ dir = 8;
+ network = list("SS13")
},
/turf/open/floor/engine,
-/area/space)
-"arB" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/grille,
-/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"arC" = (
/turf/closed/wall{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -15851,6 +15886,10 @@
req_one_access_txt = "19;41"
},
/obj/structure/disposalpipe/segment,
+/obj/machinery/door/poddoor/preopen{
+ id = "bridge";
+ name = "Emergency Blast Door"
+ },
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -15881,6 +15920,10 @@
req_one_access_txt = "19;41"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/poddoor/preopen{
+ id = "bridge";
+ name = "Emergency Blast Door"
+ },
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -17888,7 +17931,6 @@
pixel_x = 5;
pixel_y = 3
},
-/obj/item/weapon/stamp,
/obj/item/device/radio/intercom{
broadcasting = 0;
name = "Station Intercom (General)";
@@ -17896,6 +17938,7 @@
},
/obj/item/stack/packageWrap,
/obj/item/device/destTagger,
+/obj/item/weapon/stamp,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -22499,8 +22542,13 @@
icon_state = "1-4"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aPn" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -22514,8 +22562,13 @@
pixel_x = 0
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aPo" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -22533,7 +22586,9 @@
},
/obj/structure/grille,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aPp" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -22545,25 +22600,31 @@
},
/obj/structure/grille,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aPq" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"aPr" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/structure/grille,
-/turf/open/space,
-/area/space)
-"aPr" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
+/obj/structure/window/reinforced{
+ dir = 1
},
-/obj/structure/grille,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aPs" = (
/obj/structure/grille,
/obj/machinery/door/firedoor,
@@ -23762,11 +23823,10 @@
},
/area/hallway/primary/fore)
"aQS" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"aQT" = (
/obj/structure/window/reinforced{
dir = 1
@@ -23788,15 +23848,22 @@
/turf/open/floor/engine,
/area/space)
"aQV" = (
-/obj/machinery/door/airlock/glass,
-/turf/open/floor/plasteel/neutral/corner{
- tag = "icon-neutralcorner (NORTH)";
- icon_state = "neutralcorner";
- dir = 1;
- baseturf = /turf/open/floor/plating/asteroid/airless
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
},
-/area/hallway/primary/fore)
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aQW" = (
+/obj/machinery/door/airlock/glass,
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -23805,13 +23872,10 @@
},
/area/hallway/primary/fore)
"aQX" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
/obj/structure/cable/orange{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
},
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
@@ -24994,9 +25058,10 @@
},
/area/hallway/primary/fore)
"aSQ" = (
-/obj/structure/window/reinforced,
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"aSR" = (
/obj/machinery/door/airlock/glass,
/turf/open/floor/plasteel/neutral/corner{
@@ -25440,8 +25505,11 @@
dir = 6
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aTD" = (
/obj/structure/window/reinforced{
dir = 1
@@ -25451,8 +25519,11 @@
dir = 4
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aTE" = (
/obj/structure/window/reinforced{
dir = 1
@@ -25463,7 +25534,9 @@
},
/obj/structure/grille,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aTF" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/door/airlock/atmos{
@@ -27380,6 +27453,9 @@
dir = 1
},
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -27850,16 +27926,27 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
"aXD" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
"aXE" = (
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
@@ -27910,8 +27997,13 @@
dir = 10
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"aXJ" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -27926,8 +28018,14 @@
dir = 6
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"aXK" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -28036,8 +28134,13 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
"aXT" = (
/obj/structure/cable{
d1 = 1;
@@ -28076,8 +28179,13 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"aXY" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -28091,8 +28199,14 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"aXZ" = (
/obj/machinery/power/solar_control{
id = "foresolar";
@@ -28416,8 +28530,13 @@
dir = 10
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
"aYy" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -28425,8 +28544,13 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
"aYz" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -28440,8 +28564,13 @@
icon_state = "1-2"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
"aYA" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -28652,17 +28781,14 @@
name = "Civilian Asteroid"
})
"aYU" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Medbay-Cargo Bridge";
- dir = 4;
- icon_state = "camera"
- },
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
"aYV" = (
/obj/machinery/conveyor/auto{
tag = "icon-conveyor0 (EAST)";
@@ -29061,8 +29187,13 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
"aZN" = (
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
@@ -29137,8 +29268,13 @@
dir = 9
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"aZU" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -29153,8 +29289,14 @@
dir = 5
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"aZV" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -29212,6 +29354,9 @@
/area/hallway/primary/port)
"bac" = (
/obj/machinery/door/airlock/glass,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -29363,8 +29508,13 @@
icon_state = "1-8"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
"bat" = (
/obj/structure/disposalpipe/trunk{
dir = 1
@@ -29410,6 +29560,12 @@
},
/area/hallway/primary/port)
"bay" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -29746,6 +29902,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -29942,6 +30101,9 @@
pixel_x = -32
},
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -30496,6 +30658,12 @@
pixel_x = 29;
pixel_y = 0
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (EAST)";
icon_state = "neutralcorner";
@@ -30571,6 +30739,9 @@
pixel_x = -24
},
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -31180,6 +31351,11 @@
d2 = 8;
icon_state = "2-8"
},
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -32150,6 +32326,9 @@
dir = 1
},
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -33966,6 +34145,9 @@
dir = 8;
icon_state = "pipe-c"
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -34487,6 +34669,12 @@
d2 = 8;
icon_state = "1-8"
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -34496,6 +34684,12 @@
dir = 1;
on = 1
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -37957,6 +38151,12 @@
icon_state = "camera";
network = list("SS13")
},
+/obj/machinery/button/door{
+ id = "cmooffice";
+ name = "Office Emergency Lockdown";
+ pixel_x = 0;
+ pixel_y = -24
+ },
/mob/living/simple_animal/pet/cat/Runtime,
/turf/open/floor/plasteel/barber{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -38438,8 +38638,13 @@
dir = 5
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"bpN" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -38453,8 +38658,13 @@
dir = 4
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"bpO" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -38467,8 +38677,13 @@
dir = 9
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"bpP" = (
/obj/machinery/light{
dir = 4
@@ -38551,8 +38766,13 @@
icon_state = "pipe-c"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"bpW" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -38569,8 +38789,13 @@
dir = 4
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"bpX" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -38587,8 +38812,13 @@
icon_state = "pipe-c"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"bpY" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
@@ -38635,6 +38865,9 @@
/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "cmooffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -41048,15 +41281,24 @@
/turf/open/floor/engine,
/area/space)
"btW" = (
-/obj/structure/window/reinforced,
-/obj/machinery/camera{
- c_tag = "Service-Engineering Bridge 2";
- dir = 1
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"btX" = (
/obj/machinery/door/airlock/glass,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -41069,6 +41311,12 @@
pixel_x = 0;
pixel_y = -29
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -41077,6 +41325,12 @@
/area/hallway/primary/central)
"btZ" = (
/obj/machinery/light,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -41087,6 +41341,12 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -41104,6 +41364,12 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -41112,6 +41378,12 @@
/area/hallway/primary/central)
"buc" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -41122,6 +41394,12 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -41136,6 +41414,11 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -41309,12 +41592,24 @@
dir = 2;
icon_state = "pipe-c"
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/hallway/primary/central)
"bur" = (
/obj/machinery/light,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -41325,24 +41620,39 @@
pixel_x = 0;
pixel_y = -29
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/hallway/primary/central)
"but" = (
/obj/machinery/door/airlock/glass,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/hallway/primary/central)
"buu" = (
-/obj/structure/window/reinforced,
-/obj/machinery/camera{
- c_tag = "Medbay-Engineering Bridge";
- dir = 1
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"buv" = (
/obj/machinery/door/airlock/glass,
/turf/open/floor/plasteel/neutral/corner{
@@ -41849,19 +42159,19 @@
dir = 6
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/floor/plating/asteroid/airless,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"bvv" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/structure/grille,
-/turf/open/space,
-/area/space)
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"bvw" = (
/obj/structure/window/reinforced{
dir = 1
@@ -41871,8 +42181,11 @@
dir = 10
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"bvx" = (
/obj/machinery/door/airlock/maintenance{
name = "External Airlock Access";
@@ -42199,8 +42512,11 @@
icon_state = "pipe-c"
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"bvW" = (
/obj/structure/window/reinforced{
dir = 1
@@ -42213,8 +42529,11 @@
dir = 4
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"bvX" = (
/obj/structure/window/reinforced{
dir = 1
@@ -42228,8 +42547,11 @@
icon_state = "pipe-c"
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"bvY" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable{
@@ -53296,6 +53618,9 @@
icon_state = "0-4"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "ceoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -53313,6 +53638,9 @@
icon_state = "4-8";
pixel_x = 0
},
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "ceoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -53338,6 +53666,9 @@
icon_state = "4-8";
pixel_x = 0
},
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "ceoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -53359,6 +53690,9 @@
icon_state = "0-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "ceoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -54299,6 +54633,13 @@
pixel_y = 8;
req_access_txt = "10;11"
},
+/obj/machinery/button/door{
+ id = "ceoffice";
+ name = "Office Emergency Lockdown";
+ pixel_x = -24;
+ pixel_y = -8;
+ req_access_txt = "10;11"
+ },
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -55644,6 +55985,7 @@
/area/atmos)
"bSJ" = (
/obj/machinery/computer/apc_control,
+/obj/machinery/light,
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -55665,6 +56007,11 @@
/area/crew_quarters/chief)
"bSL" = (
/obj/machinery/suit_storage_unit/ce,
+/obj/machinery/airalarm{
+ dir = 1;
+ icon_state = "alarm0";
+ pixel_y = -22
+ },
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -58987,8 +59334,13 @@
icon_state = "pipe-c"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"bYM" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -59004,8 +59356,13 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"bYN" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -59290,8 +59647,13 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/disposalpipe/segment,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"bZo" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -59305,8 +59667,13 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"bZp" = (
/obj/machinery/light{
dir = 8
@@ -61264,17 +61631,10 @@
name = "Central Asteroid Maintenance"
})
"cdj" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
-/obj/machinery/camera{
- c_tag = "Docking-Medbay Bridge";
- dir = 8;
- network = list("SS13")
- },
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"cdk" = (
/obj/structure/disposalpipe/junction{
icon_state = "pipe-j2";
@@ -61528,6 +61888,12 @@
d2 = 4;
icon_state = "1-4"
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -62223,6 +62589,12 @@
dir = 4;
pixel_x = 24
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -62678,21 +63050,24 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
-/turf/open/floor/plating/airless/astplate{
- baseturf = /turf/open/floor/plating/asteroid/airless
- },
-/area/mine/unexplored{
- name = "Civilian Asteroid"
- })
-"cfO" = (
+/obj/structure/grille,
/obj/structure/window/reinforced{
dir = 8
},
+/turf/open/floor/plating/airless/astplate{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
+"cfO" = (
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
name = "reinforced floor"
},
-/area/hallway/primary/port)
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
"cfP" = (
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
@@ -62700,16 +63075,20 @@
},
/area/hallway/primary/port)
"cfQ" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
name = "reinforced floor"
},
-/area/hallway/primary/port)
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
"cfR" = (
/obj/structure/window/reinforced{
dir = 8
@@ -62722,11 +63101,15 @@
d2 = 4;
icon_state = "2-4"
},
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/floor/plating/airless/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Civilian Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"cfS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -62768,8 +63151,13 @@
icon_state = "pipe-c"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"cfV" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -62785,8 +63173,13 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"cfW" = (
/obj/structure/table,
/obj/item/toy/figure/clown,
@@ -62837,11 +63230,15 @@
pixel_x = 0
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/floor/plating/airless/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Civilian Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"cgb" = (
/obj/structure/window/reinforced{
@@ -62853,11 +63250,15 @@
d2 = 2;
icon_state = "1-2"
},
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/floor/plating/airless/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Civilian Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"cgc" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -62972,9 +63373,6 @@
name = "Port Asteroid Maintenance"
})
"cgp" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
/obj/machinery/light{
dir = 8
},
@@ -62982,7 +63380,9 @@
baseturf = /turf/open/floor/plating/asteroid/airless;
name = "reinforced floor"
},
-/area/hallway/primary/port)
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
"cgq" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -63083,6 +63483,9 @@
icon_state = "tube1";
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -63167,6 +63570,9 @@
pixel_x = 28;
pixel_y = 0
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -63224,26 +63630,24 @@
name = "Research Asteroid"
})
"cgT" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating/airless/astplate{
+/turf/closed/wall/r_wall{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Research Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"cgU" = (
-/obj/structure/window/reinforced{
+/obj/machinery/light/small{
dir = 8
},
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
name = "reinforced floor"
},
-/area/hallway/primary/aft)
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
"cgV" = (
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
@@ -63251,36 +63655,31 @@
},
/area/hallway/primary/aft)
"cgW" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
+/obj/structure/disposalpipe/segment,
/obj/machinery/camera{
c_tag = "Service-Research Bridge";
dir = 9;
icon_state = "camera"
},
-/obj/structure/disposalpipe/segment,
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
name = "reinforced floor"
},
-/area/hallway/primary/aft)
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
"cgX" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
-/turf/open/floor/plating/airless/astplate{
+/turf/closed/wall/r_wall{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Research Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"cgY" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
@@ -63324,16 +63723,14 @@
name = "Aft Asteroid Maintenance"
})
"chd" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
/obj/structure/disposalpipe/segment,
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
name = "reinforced floor"
},
-/area/hallway/primary/aft)
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
"che" = (
/obj/machinery/power/solar{
id = "portsolar";
@@ -63507,6 +63904,11 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -64193,11 +64595,15 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
},
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/floor/plating/airless/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Research Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"ciE" = (
/obj/structure/window/reinforced{
@@ -64211,11 +64617,15 @@
d2 = 4;
icon_state = "1-4"
},
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/floor/plating/airless/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Research Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"ciF" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -68698,8 +69108,13 @@
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
"cqD" = (
/turf/closed/wall{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -69557,6 +69972,11 @@
d2 = 8;
icon_state = "1-8"
},
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
/turf/open/floor/plasteel/neutral/side{
baseturf = /turf/open/floor/plating/asteroid/airless;
dir = 1;
@@ -70509,6 +70929,12 @@
dir = 1;
pixel_y = -24
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -70521,6 +70947,12 @@
dir = 4;
icon_state = "pipe-c"
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -70532,6 +70964,12 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -70539,44 +70977,50 @@
},
/area/hallway/primary/aft)
"ctA" = (
-/obj/structure/window/reinforced,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/obj/machinery/camera{
c_tag = "Research-Docking Bridge 1";
dir = 1;
icon_state = "camera";
network = list("SS13")
},
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
"ctB" = (
-/obj/structure/window/reinforced,
-/obj/machinery/camera{
- c_tag = "Research-Docking Bridge 2";
- dir = 1;
- icon_state = "camera";
- network = list("SS13")
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/power/apc{
+ dir = 2;
+ name = "Science-Docking Bridge APC";
+ pixel_y = -24
+ },
+/obj/structure/cable{
+ d2 = 8;
+ icon_state = "0-8"
+ },
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
"ctC" = (
-/obj/structure/window/reinforced,
-/obj/machinery/camera{
- c_tag = "Research-Docking Bridge 3";
- dir = 1;
- icon_state = "camera";
- network = list("SS13")
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
"ctD" = (
/obj/machinery/door/airlock/glass,
/obj/structure/disposalpipe/segment{
@@ -70978,8 +71422,11 @@
/obj/structure/lattice/catwalk,
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
"cul" = (
/obj/machinery/status_display{
density = 0;
@@ -75746,6 +76193,9 @@
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "rdoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -75755,6 +76205,9 @@
/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "rdoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -75773,6 +76226,9 @@
/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "rdoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -76682,6 +77138,7 @@
icon_state = "camera";
network = list("SS13")
},
+/obj/item/clothing/neck/stethoscope,
/turf/open/floor/plasteel/whitepurple/side{
tag = "icon-whitepurple (SOUTHWEST)";
icon_state = "whitepurple";
@@ -76730,6 +77187,7 @@
/obj/machinery/newscaster/security_unit{
pixel_x = -28
},
+/obj/machinery/recharger,
/turf/open/floor/plasteel/red/side{
icon_state = "red";
dir = 8;
@@ -83054,7 +83512,9 @@
"cPD" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"cPE" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/engine,
@@ -83142,12 +83602,11 @@
/turf/open/floor/engine,
/area/space)
"cPT" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
/obj/structure/disposalpipe/segment,
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
"cPU" = (
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -83339,6 +83798,12 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (EAST)";
icon_state = "neutralcorner";
@@ -83358,6 +83823,9 @@
"cQC" = (
/obj/machinery/door/airlock/glass,
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -83414,6 +83882,9 @@
/area/hallway/primary/central)
"cQJ" = (
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -83846,14 +84317,13 @@
},
/area/hallway/primary/starboard)
"cRM" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"cRN" = (
/obj/structure/window/reinforced{
dir = 1
@@ -84231,7 +84701,9 @@
dir = 4
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"cSD" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -84805,6 +85277,12 @@
dir = 4;
icon_state = "pipe-c"
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -84821,6 +85299,12 @@
"cTX" = (
/obj/machinery/door/airlock/glass,
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -85064,12 +85548,19 @@
},
/area/teleporter)
"cUy" = (
-/obj/structure/window/reinforced,
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
"cUz" = (
/obj/structure/window/reinforced,
/obj/structure/disposalpipe/segment{
@@ -87179,6 +87670,10 @@
req_one_access = null;
req_one_access_txt = "0"
},
+/obj/machinery/door/poddoor/preopen{
+ id = "bridge";
+ name = "Emergency Blast Door"
+ },
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -87192,6 +87687,10 @@
req_one_access = null;
req_one_access_txt = "0"
},
+/obj/machinery/door/poddoor/preopen{
+ id = "bridge";
+ name = "Emergency Blast Door"
+ },
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -87277,6 +87776,9 @@
/obj/structure/window/reinforced/fulltile,
/obj/structure/grille,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "qmoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -87294,6 +87796,9 @@
"cZQ" = (
/obj/structure/window/reinforced/fulltile,
/obj/structure/grille,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "qmoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -87530,6 +88035,11 @@
/area/quartermaster/qm)
"dap" = (
/obj/structure/closet/secure_closet/quartermaster,
+/obj/machinery/button/door{
+ id = "qmoffice";
+ name = "Office Emergency Lockdown";
+ pixel_x = -24
+ },
/turf/open/floor/plasteel/brown{
tag = "icon-brown (WEST)";
icon_state = "brown";
@@ -88359,6 +88869,9 @@
icon_state = "alarm0";
pixel_x = -22
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -90292,6 +90805,9 @@
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "cmooffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -91711,7 +92227,6 @@
},
/obj/item/weapon/stamp/ce,
/obj/item/weapon/pen,
-/obj/machinery/light,
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -91722,10 +92237,8 @@
d2 = 4;
icon_state = "1-4"
},
-/obj/machinery/airalarm{
- dir = 1;
- icon_state = "alarm0";
- pixel_y = -22
+/obj/structure/cable{
+ icon_state = "1-2"
},
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -92435,17 +92948,13 @@
name = "Central Asteroid Maintenance"
})
"djU" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
-/obj/machinery/camera{
- c_tag = "Docking-Medbay Bridge 2";
- dir = 8;
- network = list("SS13")
+/obj/structure/cable{
+ icon_state = "1-2"
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"djV" = (
/obj/structure/closet/crate,
/obj/effect/spawner/lootdrop/maintenance,
@@ -93766,6 +94275,12 @@
scrub_N2O = 0;
scrub_Toxins = 0
},
+/obj/machinery/button/door{
+ id = "rdoffice";
+ name = "Office Emergency Lockdown";
+ pixel_x = -24;
+ pixel_y = -8
+ },
/turf/open/floor/plasteel/cafeteria{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -94369,10 +94884,10 @@
/obj/structure/disposaloutlet{
dir = 8
},
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
/obj/structure/lattice/catwalk,
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
/turf/open/space,
/area/space)
"dnB" = (
@@ -96655,6 +97170,4503 @@
},
/turf/closed/wall/r_wall,
/area/maintenance/incinerator)
+"dsd" = (
+/obj/machinery/power/apc{
+ dir = 1;
+ name = "Armory APC";
+ pixel_x = 0;
+ pixel_y = 24
+ },
+/obj/structure/cable/orange{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/obj/structure/rack,
+/obj/item/weapon/storage/box/chemimp{
+ pixel_x = 4;
+ pixel_y = 3
+ },
+/obj/item/weapon/reagent_containers/glass/bottle/morphine,
+/turf/open/floor/plasteel/darkred/side{
+ icon_state = "darkred";
+ dir = 1;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/ai_monitored/security/armory)
+"dse" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/structure/rack,
+/obj/item/weapon/storage/lockbox/loyalty,
+/obj/item/weapon/storage/box/trackimp,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/darkred/side{
+ icon_state = "darkred";
+ dir = 1;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/ai_monitored/security/armory)
+"dsf" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/ai_monitored/security/armory)
+"dsg" = (
+/obj/structure/closet/secure_closet{
+ name = "contraband locker";
+ req_access_txt = "3"
+ },
+/obj/effect/spawner/lootdrop/armory_contraband{
+ loot = list(/obj/item/weapon/gun/ballistic/automatic/pistol = 5, /obj/item/weapon/gun/ballistic/shotgun/automatic/combat = 5, /obj/item/weapon/gun/ballistic/revolver/mateba, /obj/item/weapon/gun/ballistic/automatic/pistol/deagle, /obj/item/weapon/storage/box/syndie_kit/throwing_weapons = 3)
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/ai_monitored/security/armory)
+"dsh" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber{
+ on = 1;
+ scrub_N2O = 0;
+ scrub_Toxins = 0
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsi" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsj" = (
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsk" = (
+/obj/machinery/airalarm{
+ frequency = 1439;
+ locked = 0;
+ pixel_y = 23
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsl" = (
+/obj/machinery/camera{
+ c_tag = "Security Interrogation";
+ dir = 9;
+ icon_state = "camera";
+ network = list("SS13");
+ tag = "null"
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsm" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsn" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dso" = (
+/obj/structure/table/wood,
+/obj/item/device/flashlight/lamp,
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsp" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsq" = (
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsr" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dss" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dst" = (
+/obj/structure/table/wood,
+/obj/item/device/taperecorder,
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsu" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsv" = (
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsw" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsx" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsy" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsz" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsA" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsB" = (
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door_timer{
+ id = "Cell 8";
+ name = "Cell 8";
+ pixel_x = 32;
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsC" = (
+/obj/machinery/power/apc{
+ dir = 1;
+ name = "Security Transfer Range APC";
+ pixel_x = 0;
+ pixel_y = 24
+ },
+/obj/structure/cable/orange{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating/astplate{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsD" = (
+/obj/structure/cable/orange{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating/astplate{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsE" = (
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/structure/cable/orange{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsF" = (
+/obj/structure/mineral_door/iron{
+ name = "Transfer Center"
+ },
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/astplate{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsG" = (
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door_timer{
+ id = "Cell 7";
+ name = "Cell 7";
+ pixel_x = 32;
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsH" = (
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/structure/cable/orange{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsI" = (
+/obj/machinery/door/airlock/security{
+ name = "Inmate Transfer Facility";
+ req_access_txt = "2"
+ },
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsJ" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsK" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsL" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plating/astplate{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsM" = (
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/astplate{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsN" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/window/reinforced/fulltile,
+/obj/machinery/door/firedoor,
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "ceoffice"
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/crew_quarters/chief)
+"dsO" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/glass_engineering{
+ name = "Chief Engineer's Office";
+ req_access_txt = "56"
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel/neutral{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/crew_quarters/chief)
+"dsP" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/window/reinforced/fulltile,
+/obj/machinery/door/firedoor,
+/obj/structure/grille,
+/obj/structure/cable{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "ceoffice"
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/crew_quarters/chief)
+"dsQ" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 4";
+ dir = 8;
+ network = list("SS13")
+ },
+/turf/open/space,
+/area/space)
+"dsR" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 1";
+ dir = 8;
+ network = list("SS13")
+ },
+/turf/open/space,
+/area/space)
+"dsS" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 2";
+ network = list("SS13")
+ },
+/turf/open/space,
+/area/space)
+"dsT" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 3";
+ network = list("SS13")
+ },
+/turf/open/space,
+/area/space)
+"dsU" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge Ceneter";
+ dir = 1
+ },
+/turf/open/space,
+/area/space)
+"dsV" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dsW" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dsX" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dsY" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dsZ" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dta" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtb" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtc" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtd" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dte" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtf" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtg" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dth" = (
+/obj/machinery/camera{
+ c_tag = "Command-Service Bridge";
+ dir = 4;
+ icon_state = "camera"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dti" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtj" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtk" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtl" = (
+/obj/machinery/camera{
+ c_tag = "Command-Engineering Bridge";
+ dir = 8;
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtm" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtn" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dto" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtp" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtq" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtr" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dts" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/power/apc{
+ dir = 8;
+ name = "Medical-Cargo Bridge APC";
+ pixel_x = -25
+ },
+/obj/structure/cable{
+ icon_state = "0-2";
+ d2 = 2
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtt" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtu" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtv" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtw" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtx" = (
+/obj/machinery/power/apc{
+ dir = 8;
+ name = "Command-Service Bridge APC";
+ pixel_x = -25
+ },
+/obj/structure/cable{
+ icon_state = "0-4";
+ d2 = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dty" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtz" = (
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtA" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtB" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtC" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtD" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtE" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtF" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtG" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtH" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtI" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtJ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtK" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtL" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtM" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtN" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtO" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtP" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtQ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtR" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtS" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtT" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtU" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtV" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/camera{
+ c_tag = "Medbay-Cargo Bridge";
+ dir = 4;
+ icon_state = "camera"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtW" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtX" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtY" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtZ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dua" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dub" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"duc" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dud" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"due" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"duf" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dug" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"duh" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dui" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"duj" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"duk" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/port)
+"dul" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel/neutral{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dum" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dun" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duo" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dup" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duq" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dur" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dus" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dut" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"duu" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"duv" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duw" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dux" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duy" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duz" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duA" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duB" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"duC" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"duD" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"duE" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duF" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duG" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duH" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duI" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duJ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duK" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duL" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duM" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duN" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duO" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duP" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duQ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duR" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duS" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duT" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duU" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duV" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duW" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duX" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duY" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duZ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dva" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvb" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvc" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvd" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dve" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvf" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvg" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvh" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvi" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvj" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvk" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvl" = (
+/obj/machinery/camera{
+ c_tag = "Service-Engineering Bridge 1";
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvm" = (
+/obj/machinery/power/apc{
+ dir = 2;
+ name = "Service-Engineering Bridge APC";
+ pixel_y = -24
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvn" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvo" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvp" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvq" = (
+/obj/machinery/camera{
+ c_tag = "Service-Engineering Bridge 2";
+ dir = 1
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvr" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ icon_state = "neutralcorner";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dvs" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ icon_state = "neutralcorner";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dvt" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ icon_state = "neutralcorner";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dvu" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dvv" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dvw" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dvx" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dvy" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dvz" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dvA" = (
+/obj/machinery/camera{
+ c_tag = "Medbay-Engineering Bridge";
+ dir = 1
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dvB" = (
+/obj/machinery/power/apc{
+ dir = 2;
+ name = "Engineering-Medical Bridge APC";
+ pixel_y = -24
+ },
+/obj/structure/cable{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dvC" = (
+/obj/machinery/camera{
+ c_tag = "Medbay-Engineering Bridge 2";
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dvD" = (
+/turf/closed/wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvE" = (
+/turf/closed/wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvF" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvG" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvH" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvI" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvJ" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvK" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvL" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvM" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvN" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvO" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvP" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvQ" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvR" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvS" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvT" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvU" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvV" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvW" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvX" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvY" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvZ" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dwa" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dwb" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dwc" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dwd" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwe" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwf" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwg" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwh" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwi" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwj" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwk" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwl" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwm" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwn" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwo" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwp" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwq" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwr" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dws" = (
+/obj/machinery/camera{
+ c_tag = "Docking-Medbay Bridge";
+ dir = 8;
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwt" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwu" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwv" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dww" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwx" = (
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwy" = (
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "Docking-Medical Bridge APC";
+ pixel_x = 24;
+ pixel_y = 0
+ },
+/obj/structure/cable{
+ icon_state = "0-2";
+ d2 = 2
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwz" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwA" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwB" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwC" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwD" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwE" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwF" = (
+/obj/machinery/camera{
+ c_tag = "Docking-Medbay Bridge 2";
+ dir = 8;
+ network = list("SS13")
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwG" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwH" = (
+/obj/machinery/door/airlock/glass,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwI" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwJ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwK" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwL" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwM" = (
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwN" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 24
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwO" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwP" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwQ" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwR" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwS" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwT" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwU" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwV" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwW" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwX" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwY" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwZ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxa" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxb" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxc" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxd" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxe" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxf" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxg" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxh" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxi" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxj" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxk" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxl" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxm" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxn" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxo" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxp" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxq" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxr" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxs" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxt" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxu" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxv" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxw" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxx" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxy" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxz" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxA" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxB" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxC" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxD" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxE" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxF" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxG" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxH" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxI" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxJ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxK" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxL" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxM" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxN" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxO" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxP" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxQ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxR" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxS" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxT" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxU" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxV" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxW" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxX" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxY" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxZ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dya" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyb" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyc" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyd" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dye" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyf" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyg" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyh" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyi" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyj" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyk" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyl" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dym" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyn" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyo" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyp" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyq" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyr" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dys" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyt" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyu" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyv" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyw" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyx" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyy" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyz" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyA" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyB" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyC" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyD" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyE" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyF" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyG" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyH" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyI" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyJ" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ icon_state = "neutralcorner";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/aft)
+"dyK" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ icon_state = "neutralcorner";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/aft)
+"dyL" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ icon_state = "neutralcorner";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/aft)
+"dyM" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Research-Docking Bridge 5";
+ dir = 1;
+ icon_state = "camera";
+ network = list("SS13")
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyN" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Research-Docking Bridge 2";
+ dir = 1;
+ icon_state = "camera";
+ network = list("SS13")
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyO" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyP" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyQ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyR" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyS" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyT" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyU" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyV" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Research-Docking Bridge 3";
+ dir = 1;
+ icon_state = "camera";
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyW" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyX" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyY" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyZ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dza" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Research-Docking Bridge 4";
+ dir = 1;
+ icon_state = "camera";
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzb" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzc" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzd" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dze" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzf" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzg" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzh" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzi" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzj" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzk" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
+"dzl" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
+"dzm" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
+"dzn" = (
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/space,
+/area/space)
+"dzo" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/structure/grille,
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzp" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzq" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzr" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzs" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzt" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzu" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzv" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzw" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzx" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzy" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzz" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzA" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzB" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzC" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzD" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzE" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzF" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzG" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzH" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzI" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzJ" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzK" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzL" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzM" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzN" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzO" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzP" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzQ" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 1";
+ dir = 8;
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzR" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzS" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzT" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzU" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzV" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzW" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzX" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzY" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzZ" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAa" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAb" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAc" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAd" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAe" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAf" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAg" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAh" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAi" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAj" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAk" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAl" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAm" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAn" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAo" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAp" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAq" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAr" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAs" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAt" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAu" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAv" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAw" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAx" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAy" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAz" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAA" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 2";
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAB" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 3";
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAC" = (
+/obj/machinery/power/apc{
+ dir = 1;
+ name = "Cargo-AI-Command Bridge APC";
+ pixel_y = 24
+ },
+/obj/structure/cable/orange{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAD" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAE" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAF" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAG" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAH" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 3";
+ network = list("SS13")
+ },
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAI" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAJ" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAK" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAL" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAM" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAN" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAO" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAP" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAQ" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (NORTH)";
+ icon_state = "neutralcorner";
+ dir = 1;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/fore)
+"dAR" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (NORTH)";
+ icon_state = "neutralcorner";
+ dir = 1;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/fore)
+"dAS" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (NORTH)";
+ icon_state = "neutralcorner";
+ dir = 1;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/fore)
+"dAT" = (
+/obj/effect/landmark/lightsout,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAU" = (
+/obj/machinery/light,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAV" = (
+/obj/machinery/light/small,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAW" = (
+/obj/machinery/light,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAX" = (
+/obj/machinery/light,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAY" = (
+/obj/machinery/light/small,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAZ" = (
+/obj/machinery/light,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBa" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBb" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBc" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBd" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBe" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBf" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBg" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBh" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBi" = (
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBj" = (
+/obj/effect/landmark/lightsout,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dBk" = (
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBl" = (
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "Command-Engineering Bridge APC";
+ pixel_x = 24;
+ pixel_y = 0
+ },
+/obj/structure/cable{
+ icon_state = "0-2";
+ pixel_y = 1;
+ d2 = 2
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBm" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBn" = (
+/obj/effect/landmark/lightsout,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dBo" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBp" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBq" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBr" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBs" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBt" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBu" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBv" = (
+/obj/machinery/door/airlock/glass,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (EAST)";
+ icon_state = "neutralcorner";
+ dir = 4;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dBw" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (EAST)";
+ icon_state = "neutralcorner";
+ dir = 4;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dBx" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (EAST)";
+ icon_state = "neutralcorner";
+ dir = 4;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dBy" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (EAST)";
+ icon_state = "neutralcorner";
+ dir = 4;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dBz" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (EAST)";
+ icon_state = "neutralcorner";
+ dir = 4;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dBA" = (
+/obj/effect/landmark/lightsout,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dBB" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall/r_wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
+"dBC" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "Service-Science Bridge APC";
+ pixel_x = 23;
+ pixel_y = 2
+ },
+/obj/structure/cable,
+/turf/open/floor/engine{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ name = "reinforced floor"
+ },
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
+"dBD" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
+"dBE" = (
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/engine{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ name = "reinforced floor"
+ },
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
+"dBF" = (
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/engine{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ name = "reinforced floor"
+ },
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
+"dBG" = (
+/obj/effect/landmark/lightsout,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dBH" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (NORTH)";
+ icon_state = "neutralcorner";
+ dir = 1;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/fore)
(1,1,1) = {"
aaa
@@ -108308,7 +113320,7 @@ abE
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
aaa
@@ -109523,11 +114535,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
aaa
@@ -109780,11 +114792,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
aaa
@@ -110037,11 +115049,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
aaa
@@ -110294,11 +115306,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
aaa
@@ -110551,11 +115563,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
aaa
@@ -110808,11 +115820,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
aaa
@@ -110879,18 +115891,18 @@ aLm
aXC
aXS
aXS
+dsX
aXS
aXS
aXS
+dsX
+aXS
+aXS
+dsX
aXS
aXS
aXS
-aXS
-aXS
-aXS
-aXS
-aXS
-aXS
+dsX
aXS
aXS
aZM
@@ -110964,16 +115976,16 @@ cfN
cga
cga
cga
+dBB
+cga
+cga
+dBB
+cga
+cga
+dBB
cga
cga
cga
-cgT
-cgT
-cgT
-cgT
-cgT
-cgT
-cgT
ciD
cjg
cjg
@@ -111065,11 +116077,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
abE
@@ -111133,24 +116145,24 @@ aSU
aVB
aSU
aSR
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-aYI
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dth
+dsV
+dsV
+dtx
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
baa
baw
baY
@@ -111225,13 +116237,13 @@ cgp
cfO
cfO
cgU
-cgU
-cgU
-cgU
-cgU
-cgU
-cgU
-cgU
+cfO
+cfO
+cgp
+cfO
+cfO
+cfO
+cfO
cjh
cjF
cjF
@@ -111390,24 +116402,24 @@ aRD
aRD
aRD
aRP
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dBj
+dsV
+dty
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
bab
bax
baZ
@@ -111474,21 +116486,21 @@ bTq
bax
bax
bab
-cfP
-cfP
-cfP
-cfP
-cfP
-cfP
-cfP
-cgV
-cgV
-cgV
-cgV
-cgV
-cgV
-cgV
-cgV
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
cji
cjG
cjG
@@ -111591,7 +116603,7 @@ abE
abW
acH
acH
-abW
+acO
acO
acO
acO
@@ -111647,26 +116659,26 @@ aSN
aSN
aSN
aSP
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
+dsV
+dsV
+dsV
+dsY
+dsV
+dsV
+dsV
+dti
+dsV
+dsV
+dtz
+dtG
+dtG
+dtG
+dtQ
+dtG
+dtG
+dtG
bac
-bay
+duk
bba
bbA
bbA
@@ -111735,17 +116747,17 @@ cfQ
cfQ
cfQ
cfQ
-cfQ
-cfQ
-cfQ
+dBC
+dBE
+dBE
cgW
-chd
-chd
-cho
-chd
-chd
-chd
-chd
+dBE
+dBE
+dBE
+dBE
+dBE
+dBE
+dBE
cjj
cTY
ckn
@@ -111848,7 +116860,7 @@ abE
abW
acH
acH
-abW
+acO
acO
acO
acO
@@ -111907,18 +116919,18 @@ aLm
aXD
aXD
aXD
+dsZ
aXD
aXD
aXD
+dsZ
+aXD
+aXD
+dsZ
aXD
aXD
aXD
-aXD
-aXD
-aXD
-aXD
-aXD
-aXD
+dsZ
aXD
aXD
aXD
@@ -111992,16 +117004,16 @@ cfR
cgb
cgb
cgb
+dBD
+cgb
+cgb
+dBD
+cgb
+cgb
+dBD
cgb
cgb
cgb
-cgX
-cgX
-cgX
-cgX
-cgX
-cgX
-cgX
ciE
cjg
cjg
@@ -112105,7 +117117,6 @@ abE
abW
acH
acH
-abW
acO
acO
adF
@@ -112114,6 +117125,7 @@ aeB
aeB
aeB
aeB
+aeB
agr
doX
doZ
@@ -112362,10 +117374,10 @@ abW
abW
abW
abW
-abW
acO
acO
-adG
+dsd
+aec
aeb
aeC
aeY
@@ -112610,7 +117622,7 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
abE
@@ -112619,15 +117631,15 @@ abW
abW
abW
abW
-abW
acO
acO
-adH
+dse
aec
aeD
aeD
aeD
aeD
+aeD
agt
acO
acO
@@ -112867,7 +117879,7 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
abE
@@ -112876,10 +117888,10 @@ abE
abW
abW
abW
-abW
acO
acO
adI
+dsf
aed
aeE
aeZ
@@ -113124,7 +118136,7 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
abE
@@ -113133,12 +118145,12 @@ abE
abW
abW
abW
-abW
acO
acO
adJ
aee
aeF
+aeD
afa
afu
afO
@@ -113381,7 +118393,7 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
abE
@@ -113390,12 +118402,12 @@ abE
abW
abW
abW
-abW
acO
acO
adK
aef
aef
+aee
afb
aee
afP
@@ -113647,10 +118659,10 @@ abE
abW
abW
abW
-abW
acO
acO
-adL
+adM
+aef
aef
aef
aef
@@ -113904,12 +118916,12 @@ abE
abW
abW
abW
-abW
acO
acO
adM
aeg
aeG
+dsg
afc
afv
aeG
@@ -114161,7 +119173,6 @@ abE
abW
abW
abW
-abW
acO
acO
doV
@@ -114173,6 +119184,7 @@ acO
acO
acO
acO
+acO
afr
afr
afr
@@ -114418,7 +119430,6 @@ abE
abW
abW
acH
-acH
acO
acO
acO
@@ -114428,20 +119439,21 @@ acO
acO
acO
acO
-acO
-acO
-aiO
-ajI
+afr
+afr
+afr
+dsr
+dsm
akB
all
alK
amA
ant
+apr
+apr
aol
apr
apr
-apr
-aol
asV
apr
apr
@@ -114684,22 +119696,22 @@ abW
abW
abW
abW
-abW
-agy
-agy
-aiP
-ajJ
-ajJ
-alm
afr
+dsh
+dsm
+dss
+ajJ
+akt
+alm
+dsA
amB
-anp
-aom
-aps
+dsB
aqg
anp
-aom
-asW
+dsE
+dsG
+dsH
+anp
aqg
anp
aom
@@ -114941,13 +119953,11 @@ abW
abW
abW
abW
-abW
-agy
-agz
-aiQ
-agA
-ajJ
-ajJ
+afr
+dsi
+dsn
+dsn
+dsx
afr
amC
anu
@@ -114957,6 +119967,8 @@ amC
ard
aon
alH
+dsI
+alH
amC
avf
aon
@@ -115198,13 +120210,11 @@ acH
acH
abW
abW
-abW
-afR
-afR
-agA
-agA
-agA
-agA
+afr
+dsj
+dso
+dst
+dsx
afr
amD
ann
@@ -115214,6 +120224,8 @@ amD
ann
aoo
alH
+dsJ
+alH
amD
ann
aoo
@@ -115454,14 +120466,12 @@ acH
acH
acH
abW
-acH
-acH
-afR
-afR
-agy
-ajJ
-agA
-agA
+abW
+afr
+dsk
+dsp
+dsp
+dsz
afr
amE
anv
@@ -115471,6 +120481,8 @@ aqh
ann
ann
alH
+dsJ
+alH
auc
ann
ann
@@ -115711,14 +120723,12 @@ acH
acH
acH
abW
-acH
-acH
-acH
-afR
-agz
+abW
+afr
+dsl
+dsj
+dsj
ahq
-agA
-agA
afr
amF
anw
@@ -115728,6 +120738,8 @@ aqi
anw
asb
alH
+aiP
+alH
aud
anw
awt
@@ -115968,14 +120980,7 @@ abW
acH
acH
acH
-acH
-afR
-agy
-agy
-agA
-agA
-agA
-agA
+abW
afr
afr
afr
@@ -115990,6 +120995,13 @@ afr
afr
afr
afr
+dsL
+afr
+afr
+afr
+afr
+afr
+afr
afr
afr
afr
@@ -116225,23 +121237,23 @@ abW
acH
acH
acH
-afR
+abW
+abW
+abW
+abW
+abW
+abW
+abW
+agy
+agy
+agy
+agy
+agy
agy
agA
agA
-agA
-agA
-ajJ
-agA
+aiP
agy
-agy
-agy
-agy
-agy
-agy
-agy
-adZ
-adZ
adZ
adZ
adZ
@@ -116482,26 +121494,26 @@ abW
acH
acH
acH
-afR
-agz
-ahq
-agA
-agA
-agA
-agA
+acH
+acH
+acH
+acH
+acH
+acH
+acH
agy
aig
agy
+agz
+dsC
+agz
+aiO
+ajI
+dsM
agy
-agA
-agA
-agy
-agy
-afS
-afS
-afS
-afV
-afV
+adZ
+adZ
+adZ
adZ
adZ
azY
@@ -116739,28 +121751,28 @@ abW
abW
abW
acH
-afR
-agA
-agA
-aie
-agA
-agA
-akC
-agz
+acH
+acH
+acH
+acH
+acH
+acH
+acH
+agy
alL
akD
amG
-amG
-alN
-agA
+aiP
+agz
+dsF
agy
-afV
-asX
-aue
-avg
-afS
-axD
-afS
+agy
+agy
+adZ
+adZ
+adZ
+adZ
+adZ
azY
aBs
aCi
@@ -116996,28 +122008,28 @@ abW
abW
abW
acH
-afR
-agA
-agA
-agA
-agA
-agA
-akD
-aln
+acH
+acH
+acH
+acH
+acH
+acH
+acH
+agy
alM
amG
anx
-amG
-amG
+dsD
+ajI
akC
agz
-afV
-aym
-auf
-aym
afS
-akp
-aOF
+afS
+afS
+afV
+afV
+axD
+afS
cJJ
aBt
aCj
@@ -117253,13 +122265,13 @@ abW
abW
abW
acH
-afR
-agy
-agA
-aif
-aiR
-ajK
-agy
+acH
+acH
+acH
+acH
+acH
+acH
+abW
agy
alN
alN
@@ -117269,11 +122281,11 @@ agA
afR
afR
afV
-asY
-aym
-cYZ
-akH
-axE
+asX
+aue
+avg
+afS
+akp
ayA
azY
aBu
@@ -117340,9 +122352,9 @@ aZm
bon
bpM
cRM
-arz
-arz
-bvm
+duE
+duE
+dvD
bwV
byz
bzM
@@ -117511,25 +122523,25 @@ abW
abW
acH
acH
-agy
-agy
-aig
+abW
+abW
+acH
+acH
+acH
+acH
afR
afR
afR
afR
+aiR
+ajK
afR
-afR
-afR
-afR
-agy
-afR
-aez
-afV
-afV
-afV
-afV
+acH
afV
+aym
+auf
+aym
+afS
akp
cYo
cJK
@@ -117597,9 +122609,9 @@ bjB
arw
bpN
cRM
-arz
-arz
-bvm
+duE
+duE
+dvD
bwW
bvm
aZn
@@ -117768,26 +122780,26 @@ abW
abW
abW
abW
-adZ
-adZ
-adZ
-aez
-aez
-aez
-aez
-aez
-aez
-aez
-aez
-adZ
-adZ
-aez
-adZ
-aez
-aez
-adZ
-afS
-akp
+abW
+abW
+abW
+acH
+acH
+acH
+acH
+acH
+acH
+acH
+acH
+abW
+abW
+acH
+afV
+asY
+aym
+cYZ
+akH
+axE
cZm
cJK
aBs
@@ -117854,8 +122866,8 @@ aaa
arw
bpN
cRM
-arz
-aSQ
+duE
+duE
bvu
bwX
bjB
@@ -118039,9 +123051,9 @@ aez
aez
aez
aez
-aez
afV
-afS
+afV
+afV
afV
afV
cZj
@@ -118109,10 +123121,10 @@ aaa
aaa
aaa
arw
-bpN
-cRM
-arz
-aSQ
+dum
+duv
+duE
+duE
bvv
arw
aaa
@@ -118368,9 +123380,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -118625,9 +123637,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -118882,9 +123894,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -119139,9 +124151,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -119394,10 +124406,10 @@ aaa
aaa
aaa
arw
-bpN
-cRM
-arz
-aSQ
+dum
+duv
+duE
+dvl
bvv
arw
aaa
@@ -119653,9 +124665,9 @@ aaa
arw
bpN
cRM
-arz
-btV
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -119910,9 +124922,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -120167,9 +125179,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -120424,9 +125436,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -120679,10 +125691,10 @@ aaa
aaa
aaa
arw
-bpN
-cRM
-arz
-aSQ
+dum
+dux
+duE
+duE
bvv
arw
aaa
@@ -120938,9 +125950,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -121195,9 +126207,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -121452,9 +126464,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -121707,10 +126719,10 @@ aaa
aaa
aaa
arw
-bpN
-cRM
-arz
-aSQ
+dum
+dux
+duE
+dvm
bvv
arw
aaa
@@ -121956,7 +126968,7 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
abC
@@ -121966,9 +126978,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aaa
aaa
@@ -122223,9 +127235,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aaa
aaa
@@ -122480,9 +127492,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aaa
aaa
@@ -122737,9 +127749,9 @@ aaa
arw
bpN
cRM
-arz
-btW
-bvv
+duE
+dvn
+dvF
arw
aaa
aaa
@@ -122810,8 +127822,8 @@ cph
cpM
cqB
crL
-cjG
-ctv
+csz
+dyJ
cUn
cjU
ckB
@@ -122992,10 +128004,10 @@ aaa
aaa
aaa
arw
-bpN
-cRM
-arz
-aSQ
+dum
+duv
+duE
+dvq
bvv
arw
aaa
@@ -123251,9 +128263,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aaa
aaa
@@ -123263,24 +128275,24 @@ bAd
byQ
bEj
dpl
-dpm
+dpl
dpn
dpo
dpp
dpq
dpr
-dps
-dpt
+dpr
+dpr
+dpu
+dpr
+dpr
+dpu
+dpr
+dpr
+dpr
+dpr
+dpu
dpu
-dpv
-dpw
-dpx
-dpy
-dpz
-dpB
-dpD
-dpF
-dpH
caf
bBN
bBN
@@ -123325,7 +128337,7 @@ cpO
cmY
cjF
cjG
-ctv
+dyK
cUn
cjU
dlF
@@ -123508,9 +128520,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aaa
aaa
@@ -123582,7 +128594,7 @@ cpP
cmY
cjF
cjG
-ctv
+dyK
cUn
cgN
dlG
@@ -123765,9 +128777,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aaa
aZt
@@ -124022,9 +129034,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aZt
aZt
@@ -124053,8 +129065,8 @@ bYp
bXG
bOM
cbr
-dpN
-dpP
+dpJ
+dpL
cMH
byS
cbr
@@ -124277,10 +129289,10 @@ aZf
aZf
aaa
arw
-bpN
-cRM
-arz
-aSQ
+dum
+duv
+duE
+dvn
bvv
arw
aZt
@@ -124311,8 +129323,8 @@ bXG
bOM
byS
dfU
-dpQ
-dpS
+dpJ
+dpL
byS
cbr
dgD
@@ -124351,8 +129363,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
cgN
@@ -124536,9 +129548,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aZf
aZt
@@ -124570,9 +129582,9 @@ bAd
diS
djs
dpT
-dpW
-dpY
-dqa
+dpp
+dpq
+dpL
cMH
cMH
byS
@@ -124608,9 +129620,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-dlz
+dwX
+dwX
+cUy
cuk
cgN
cgN
@@ -124793,9 +129805,9 @@ aZf
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aZf
aZt
@@ -124865,8 +129877,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -125050,8 +130062,8 @@ aZf
boo
bpO
cRM
-arz
-aSQ
+duE
+dvn
bvw
bwY
aZf
@@ -125086,7 +130098,7 @@ cMV
cbr
byS
cbr
-dqc
+dqb
djm
bAd
aZt
@@ -125122,8 +130134,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -125343,7 +130355,7 @@ cbr
dgD
cNc
dht
-dqd
+dqb
djO
byS
aZH
@@ -125378,11 +130390,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
-cUy
-cuk
+dwO
+dxb
+dwX
+dyM
+dwO
aaa
aaa
aXR
@@ -125565,7 +130577,7 @@ boq
cQD
cSs
baO
-bhM
+dvr
bal
cKO
bal
@@ -125600,7 +130612,7 @@ cMW
cbr
cMH
bAd
-dqe
+dqb
djP
djl
aZH
@@ -125636,8 +130648,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -125822,7 +130834,7 @@ bor
cQW
baN
baO
-bhM
+dvr
bal
bwZ
bal
@@ -125857,7 +130869,7 @@ bOM
bOM
bOM
byS
-dqf
+dqb
bAe
cMH
aZH
@@ -125893,8 +130905,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -126114,13 +131126,13 @@ cbi
cbi
bOM
dge
-dqg
+dqb
+dqr
+dqr
+dqs
+dqs
+dqr
dqr
-dqJ
-dqR
-dqZ
-drh
-drp
aaa
aaa
aaa
@@ -126150,8 +131162,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -126371,13 +131383,13 @@ cbj
cbP
bOM
dfU
-dqh
+dqb
dqs
dqK
dqS
dra
dri
-drq
+dqr
aaa
aaa
aaa
@@ -126407,8 +131419,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -126593,7 +131605,7 @@ bcY
cQW
baN
baO
-bhM
+dvr
bal
bxa
bcp
@@ -126628,18 +131640,18 @@ cbi
cbi
bOM
cbr
-dqi
-dqt
+dqb
+dqr
+dqL
dqL
-dqT
drb
drj
drr
drx
drD
-drJ
-drP
-drV
+drD
+drD
+drD
drZ
aaa
aaa
@@ -126663,11 +131675,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
+dwO
+dxg
+dwX
ctA
-cuk
+dwO
abC
abC
aXR
@@ -126892,10 +131904,10 @@ dqU
drc
drk
drs
-dry
-drE
+drs
+drs
drK
-drQ
+drO
arw
arw
aaa
@@ -126921,8 +131933,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -127143,17 +132155,17 @@ cbk
bOM
cbr
dqk
-dqv
+dqr
dqN
dqV
drd
drl
drt
drz
-drF
+drt
drL
-drR
-drW
+drO
+drO
dsa
aaa
aaa
@@ -127178,8 +132190,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -127399,8 +132411,8 @@ cbl
cbQ
bOM
cbr
-dql
-dqw
+dqk
+dqs
dqO
dqW
dre
@@ -127435,8 +132447,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -127657,18 +132669,18 @@ cbk
bOM
cbr
dqm
-dqx
+dqs
dqP
dqX
drf
drn
drv
drB
-drH
+drv
drN
-drT
-drY
-dsc
+drO
+drO
+dsa
aaa
aaa
aaa
@@ -127692,8 +132704,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
abC
@@ -127913,17 +132925,17 @@ bOM
bOM
bOM
cbr
-dqn
-dqy
-dqQ
-dqY
-drg
-dro
-drw
-drC
-drI
+dqk
+dqr
+dqr
+dqr
+dqs
+dqr
+drs
+drs
+drs
+drO
drO
-drU
arw
arw
aaa
@@ -127948,11 +132960,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
+dwO
+dxb
+dwX
cUy
-cuk
+dwO
aaa
aaa
aXR
@@ -128170,7 +133182,7 @@ cbm
cbm
bOM
djs
-dqo
+dqk
dgE
byS
aZH
@@ -128206,8 +133218,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -128463,8 +133475,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -128720,8 +133732,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -128976,11 +133988,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
-cUy
-cuk
+dwO
+dxg
+dwX
+dyN
+dwO
aaa
aaa
aXR
@@ -129199,7 +134211,7 @@ cbo
bOM
djG
bAd
-dqB
+dqk
bBN
aZH
aZt
@@ -129234,10 +134246,10 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
-cuk
+cqC
aaa
aaa
aXR
@@ -129440,7 +134452,7 @@ bOZ
dhQ
did
div
-bTM
+dsN
bUM
bVM
bRs
@@ -129456,7 +134468,7 @@ cbS
bOM
bAd
byS
-dqC
+dqk
byS
aZH
aZH
@@ -129491,8 +134503,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -129697,7 +134709,7 @@ dhF
bQz
die
diw
-bTM
+dsO
bUN
bJx
bTH
@@ -129713,7 +134725,7 @@ cbo
bOM
bAd
cMH
-dqD
+dqk
byS
aZH
aZH
@@ -129748,8 +134760,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -129954,7 +134966,7 @@ bPb
dhS
dif
bSM
-bTM
+dsP
bUO
bVN
bWA
@@ -129970,7 +134982,7 @@ bOM
bOM
bAd
bAd
-dqE
+dqk
bBN
aZH
aZH
@@ -130004,11 +135016,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
+dwO
+dxb
+dwX
ctB
-cuk
+dwO
abC
abC
aXR
@@ -130154,18 +135166,18 @@ aLm
aXI
aXX
aXX
+dta
aXX
aXX
aXX
+dta
+aXX
+aXX
+dta
aXX
aXX
aXX
-aXX
-aXX
-aXX
-aXX
-aXX
-aXX
+dta
aXX
aXX
aZT
@@ -130227,7 +135239,7 @@ byS
bAd
byS
cbr
-dqF
+dqk
bBN
aZH
aZH
@@ -130262,9 +135274,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dBG
+dyO
cuk
aaa
aaa
@@ -130408,24 +135420,24 @@ aSU
aSU
aSU
aSR
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
+dsW
+dsW
+dsW
+dBh
+dsW
+dsW
+dsW
+dBi
+dsW
+dsW
+dBi
+dsW
+dsW
+dsW
+dBh
+dsW
+dsW
+dsW
ban
baN
cQE
@@ -130484,7 +135496,7 @@ djv
byS
bPt
byP
-dqG
+dqk
djk
aZH
aZt
@@ -130519,9 +135531,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -130730,18 +135742,18 @@ bUR
bVQ
bWD
dpA
-dpC
-dpE
-dpG
-dpI
+dpA
+dpA
+dpA
+dpA
dpK
-dpO
-dpR
+dpA
+dpA
dpU
djw
byP
byP
-dqH
+dqk
cMH
aZH
aZt
@@ -130776,10 +135788,10 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
-cuk
+dwX
+dwX
+dyO
+cqC
aaa
aaa
aXR
@@ -130922,31 +135934,31 @@ aSN
aSN
aSN
aSP
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-aYK
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-bap
+dsW
+dsW
+dsW
+dsW
+dsW
+dsW
+dsW
+dtl
+dsW
+dsW
+dBl
+dBm
+dBm
+dBm
+dBm
+dBm
+dBm
+dBm
+dBv
cQA
-baP
-baP
+dBw
+dBw
bcq
-baP
-baP
+dBw
+dBz
bek
baP
bfX
@@ -130996,8 +136008,8 @@ cbr
byP
dpV
dpX
-dpZ
-dqq
+dpX
+dpX
dqI
byS
aZH
@@ -131032,11 +136044,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
-cUy
-cuk
+dwO
+dxg
+dwX
+dyO
+dwO
abC
abC
aXR
@@ -131182,18 +136194,18 @@ aLm
aXJ
aXY
aXY
+dtb
aXY
aXY
aXY
+dtb
+aXY
+aXY
+dtb
aXY
aXY
aXY
-aXY
-aXY
-aXY
-aXY
-aXY
-aXY
+dtb
aXY
aXY
aZU
@@ -131290,9 +136302,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -131547,9 +136559,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -131804,9 +136816,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -132060,11 +137072,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
-cUy
-cuk
+dwO
+dxb
+dwX
+dyV
+dwO
aaa
aaa
aXR
@@ -132318,9 +137330,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -132575,9 +137587,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -132832,9 +137844,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -133089,9 +138101,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
abC
abC
@@ -133345,11 +138357,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
-ctC
-cuk
+dwO
+dxg
+dwX
+dyO
+dwO
aaa
aaa
aXR
@@ -133603,9 +138615,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -133860,9 +138872,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -134117,9 +139129,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
abC
abC
@@ -134374,9 +139386,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -134630,11 +139642,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
-cUy
-cuk
+dwO
+dxb
+dwX
+dza
+dwO
aaa
aaa
aXR
@@ -134817,7 +139829,7 @@ boB
bal
baP
cSv
-bhP
+dvu
bvU
bxw
cbr
@@ -134888,9 +139900,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -135145,9 +140157,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -135402,9 +140414,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-dlA
+dwX
+dwX
+dyO
cuk
aaa
aXR
@@ -135476,37 +140488,37 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaf
-aaf
-aaf
-aeh
-aeh
-aeh
-aeh
-aeh
-aeh
-aaa
-aaa
-ahT
-ajS
-ahT
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+abC
aaa
aaa
aaa
@@ -135520,8 +140532,8 @@ aaa
aaa
abC
aaa
-aaa
-aaa
+cKF
+cKF
aaa
aaa
aaa
@@ -135588,7 +140600,7 @@ boE
bal
baP
cSv
-bhP
+dvu
bal
bxz
byS
@@ -135659,9 +140671,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aXR
@@ -135748,28 +140760,28 @@ aaa
aaa
aaa
aaa
-aaf
-aaf
-adg
-adg
-adg
-adg
-adg
+aaa
+aaa
aaf
aaf
aaf
-adg
-adg
-adg
-adg
-ajT
+aeh
+aeh
+aeh
+aeh
+aeh
+aeh
+aaa
+aaa
ahT
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+ajS
+ahT
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -135777,9 +140789,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
abW
@@ -135845,7 +140857,7 @@ boF
bal
brr
cSv
-bhP
+dvu
bal
bxA
cMH
@@ -136002,25 +141014,25 @@ aaa
aaa
aaa
aaa
+aaa
+aaa
+aaa
+aaf
+aaf
+adg
+adg
+adg
+adg
+adg
aaf
aaf
aaf
-aaf
-aaf
-adg
-adt
-adt
-adt
adg
adg
adg
adg
-adg
-adt
-adt
-adt
ajT
-aae
+ahT
aaa
aaa
aaa
@@ -136034,9 +141046,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
abW
@@ -136050,9 +141062,9 @@ abW
aaa
aOu
aPm
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTC
aUB
aaa
@@ -136256,28 +141268,27 @@ aaa
aaa
aaa
aaa
-aae
-aae
-aae
-aae
-aae
-aae
-aae
-aae
+aaa
+aaa
+aaa
+aaf
+aaf
+aaf
+aaf
+aaf
adg
adt
-adN
-aei
-aeH
adt
-afz
adt
-agV
-ahJ
-aip
+adg
+adg
+adg
+adg
+adg
adt
-ajU
-aae
+adt
+adt
+ajT
aae
aaa
aaa
@@ -136289,11 +141300,12 @@ aaa
aaa
aaa
aaa
+aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -136307,9 +141319,9 @@ abW
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -136359,7 +141371,7 @@ boH
bpV
aQS
cSC
-aSQ
+dvx
bvV
bxB
aZt
@@ -136508,9 +141520,9 @@ aaa
aaa
aaa
aaa
-aaf
-aaf
-aaf
+aaa
+aaa
+aaa
aaa
aaa
aae
@@ -136523,19 +141535,19 @@ aae
aae
adg
adt
-adO
-aej
-aeI
-afd
-afA
-afd
-agW
-ahK
-aiq
+adN
+aei
+aeH
adt
-ajT
+afz
+adt
+agV
+ahJ
+aip
+adt
+ajU
+aae
aae
-aaf
aaa
aaa
aaa
@@ -136548,9 +141560,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -136564,9 +141576,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -136616,7 +141628,7 @@ arw
bpW
aQS
cSC
-aSQ
+dvx
bvW
arw
aZt
@@ -136764,12 +141776,12 @@ aaa
aaa
aaa
aaa
+aaa
aaf
aaf
-aae
-aae
-aae
-aae
+aaf
+aaa
+aaa
aae
aae
aae
@@ -136779,22 +141791,22 @@ aae
aae
aae
adg
-adu
adt
+adO
+aej
+aeI
+afd
+afA
+afd
+agW
+ahK
+aiq
adt
-adt
-adt
-afB
-afX
-adt
-adt
-adt
-aje
ajT
-aaf
-aaf
-aaf
aae
+aaf
+aaa
+aaa
aaa
aaa
aaa
@@ -136805,9 +141817,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -136821,9 +141833,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -136873,7 +141885,7 @@ arw
bpW
aQS
cSC
-aSQ
+dvx
bvW
arw
aZt
@@ -137020,15 +142032,15 @@ aaa
aaa
aaa
aaa
-aae
-aae
-aae
-aae
-aae
-aae
-aae
-aae
+aaa
aaf
+aaf
+aae
+aae
+aae
+aae
+aae
+aae
aae
aae
aae
@@ -137036,23 +142048,23 @@ aae
aae
aae
adg
-adv
-adP
-aek
-aeJ
-afe
-afC
-afd
-afd
-ahL
-air
-ajf
+adu
+adt
+adt
+adt
+adt
+afB
+afX
+adt
+adt
+adt
+aje
ajT
aaf
aaf
aaf
aae
-aaf
+aaa
aaa
aaa
aaa
@@ -137062,9 +142074,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -137077,11 +142089,11 @@ aaa
aaa
aaa
arw
-aPn
-aQS
-arz
-aSQ
-aTD
+dAj
+dAA
+ary
+dAU
+dBa
arw
aaa
aaa
@@ -137127,11 +142139,11 @@ aaa
abC
aaa
arw
-bpW
-aQS
+dus
+duB
cSC
-aSQ
-bvW
+dvA
+dwa
arw
aZt
aZt
@@ -137276,7 +142288,7 @@ aaa
aaa
aaa
aaa
-aaf
+aaa
aae
aae
aae
@@ -137286,28 +142298,28 @@ aae
aae
aae
aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-adg
-adg
-adQ
-ael
-aeK
-adS
-afD
-adS
-adt
-ahM
-ais
+aae
+aae
+aae
+aae
+aae
+aae
adg
+adv
+adP
+aek
+aeJ
+afe
+afC
+afd
+afd
+ahL
+air
+ajf
ajT
-aae
aaf
-aae
+aaf
+aaf
aae
aaf
aaa
@@ -137319,9 +142331,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -137335,9 +142347,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -137387,7 +142399,7 @@ arw
bpW
aQS
cSC
-buu
+dvx
bvW
arw
aaa
@@ -137534,39 +142546,38 @@ aaa
aaa
aaa
aaf
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aaf
+aaf
aaf
aaf
-aal
-aal
-aal
-aal
-aal
-aal
-aal
-aal
-aal
-aal
-aal
aaf
aaf
aaf
adg
-adR
-aem
-aeL
-adS
-afE
-adS
-adt
-adt
-adt
adg
-ajV
-aae
-aae
-aae
+adQ
+ael
+aeK
+adS
+afD
+adS
+adt
+ahM
+ais
+adg
+ajT
aae
aaf
+aae
+aae
aaf
aaa
aaa
@@ -137574,6 +142585,15 @@ aaa
aaa
aaa
aaa
+aaa
+abC
+aaa
+cKF
+cKF
+cKF
+aaa
+aaa
+aaa
abC
aaa
aaa
@@ -137581,20 +142601,12 @@ aaa
aaa
aaa
aaa
-aaa
-abC
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
arw
aPn
-aQT
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -137644,7 +142656,7 @@ arw
bpW
aQS
cSC
-aSQ
+dvx
bvW
arw
aaa
@@ -137792,8 +142804,7 @@ aaa
aaa
aaf
aaf
-aal
-aal
+aaf
aal
aal
aal
@@ -137807,17 +142818,18 @@ aal
aal
aaf
aaf
-adw
+aaf
+adg
+adR
+aem
+aeL
adS
+afE
adS
-adS
-adS
-afF
-adS
-adS
-adS
-adS
-adw
+adt
+adt
+adt
+adg
ajV
aae
aae
@@ -137825,7 +142837,7 @@ aae
aae
aaf
aaf
-aaf
+aaa
aaa
aaa
aaa
@@ -137833,9 +142845,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -137849,9 +142861,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -137901,7 +142913,7 @@ arw
bpW
aQS
cSC
-aSQ
+dvx
bvW
arw
aaa
@@ -138051,35 +143063,35 @@ aaf
aaf
aal
aal
-aau
-aax
-aax
-abl
-aax
-abM
-aax
-aax
-aaw
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+aal
aal
aal
aal
aaf
+aaf
adw
-adT
-aen
-aeM
adS
-afG
-afY
-agX
-ahN
-ait
+adS
+adS
+adS
+afF
+adS
+adS
+adS
+adS
adw
ajV
aae
aae
-aaf
-aaf
+aae
+aae
aaf
aaf
aaf
@@ -138090,9 +143102,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -138106,9 +143118,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -138158,7 +143170,7 @@ arw
bpW
aQS
cSC
-aSQ
+dvx
bvW
arw
aaa
@@ -138303,34 +143315,34 @@ aaa
aaa
aaa
aaa
-aae
-aae
-aae
+aaa
+aaf
+aaf
aal
aal
-aav
+aau
aax
-aaw
-aaw
-abx
aax
+abl
+aax
+abM
aax
aax
aaw
-acL
-cJi
aal
aal
aal
-adU
-aeo
+aaf
+adw
+adT
+aen
aeM
-aff
-aeM
-afZ
-agY
-aeM
-aiu
+adS
+afG
+afY
+agX
+ahN
+ait
adw
ajV
aae
@@ -138347,9 +143359,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -138362,11 +143374,11 @@ aaa
aaa
aaa
arw
-aPn
-aQS
-arz
-aSQ
-aTD
+dAj
+ary
+ary
+dAV
+dBa
arw
aaa
aaa
@@ -138412,11 +143424,11 @@ aaa
abC
aaa
arw
-bpW
-aQS
+dus
+duC
cSC
-aSQ
-bvW
+dvB
+dwa
arw
aaa
aaa
@@ -138565,36 +143577,36 @@ aae
aae
aal
aal
-aaw
-aaE
-aaS
-cJk
-aaX
-abN
-abZ
-acn
-acu
+aav
aax
aaw
+aaw
+abx
+aax
+aax
+aax
+aaw
+acL
+cJi
aal
aal
aal
-aal
-aal
-aal
-aal
-aal
-aga
-agZ
-ahO
-aiv
+adU
+aeo
+aeM
+aff
+aeM
+afZ
+agY
+aeM
+aiu
adw
-ajW
-akI
-akI
-akI
-akI
-akI
+ajV
+aae
+aae
+aaf
+aaf
+aaf
aaf
aaf
aaa
@@ -138604,9 +143616,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -138620,9 +143632,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -138672,7 +143684,7 @@ arw
bpW
aQS
cSC
-aSQ
+aQS
bvW
arw
aaa
@@ -138821,39 +143833,39 @@ aae
aae
aae
aal
-cJi
+aal
aaw
-aaF
-aaT
-aax
-aby
+aaE
+aaS
+cJk
aaX
-aca
+abN
+abZ
+acn
+acu
aax
-acv
-aax
-dnz
+aaw
aal
-adh
-adx
-adh
-adh
-adh
-adh
aal
-agb
-aha
-ahP
-aiw
+aal
+aal
+aal
+aal
+aal
+aal
+aga
+agZ
+ahO
+aiv
adw
-ajX
-akJ
-akJ
-akJ
-amY
+ajW
akI
akI
akI
+akI
+akI
+aaf
+aaf
aaa
aaa
aaa
@@ -138862,8 +143874,8 @@ aaa
abC
aaa
aaa
-aaa
-aaa
+cKF
+cKF
aaa
aaa
aaa
@@ -138877,9 +143889,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -138929,7 +143941,7 @@ arw
bpW
aQS
cSC
-aSQ
+aQS
bvW
arw
aaa
@@ -139078,65 +144090,65 @@ aae
aae
aae
aal
-aal
+cJi
+aaw
+aaF
+aaT
aax
-aaG
-aaU
-abm
-abm
-abO
+aby
aaX
+aca
aax
acv
aax
-aau
+dnz
aal
-cJi
+adh
+adx
+adh
+adh
+adh
+adh
aal
-aal
-aal
-aal
-cJi
-aal
-agc
-ahb
-aeM
-aix
+agb
+aha
+ahP
+aiw
adw
-ajY
-akK
-als
-als
-amZ
-anJ
-aoO
-apK
-aqI
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
+ajX
+akJ
+akJ
+akJ
+amY
+akI
+akI
+akI
+cKF
+cKF
+cKF
+cKF
+cKF
+abC
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+abC
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -139186,7 +144198,7 @@ arw
bpW
aQS
cSC
-aSQ
+aQS
bvW
arw
aaa
@@ -139337,63 +144349,63 @@ aae
aal
aal
aax
-aaH
-aaS
-abn
-aaS
-abP
-aax
+aaG
+aaU
+abm
+abm
+abO
aaX
-acw
aax
-acP
+acv
+aax
+aau
aal
-aaw
-ady
-adV
-aaw
-ady
-aaw
+cJi
aal
-agd
-ahc
+aal
+aal
+aal
+cJi
+aal
+agc
+ahb
+aeM
+aix
adw
-adw
-adw
-agk
-akL
-akI
-akI
-akI
-akI
-akI
-akI
-akI
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-aPo
-aQS
-arz
-aSQ
+ajY
+akK
+als
+als
+amZ
+anJ
+aoO
+apK
+baR
+aqI
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+aPn
+ary
+ary
+ary
aTD
arw
abC
@@ -139443,7 +144455,7 @@ arw
bpW
aQS
cSC
-dfN
+aQS
bvW
arw
aaa
@@ -139593,65 +144605,65 @@ aae
aae
aal
aal
-aaw
-aaI
-aaS
-aaS
-aaS
+aax
aaH
-aaE
aaS
-acx
-abZ
-abZ
-acR
-adi
-adi
-adi
-adi
-aeN
-adi
-acR
-age
-ahd
-ahQ
-aiy
-ajg
-ahQ
-akM
-alt
-alt
-ana
-alt
-alt
-apL
-aqJ
+abn
+aaS
+abP
+aax
+aaX
+acw
+aax
+acP
+aal
+aaw
+ady
+adV
+aaw
+ady
+aaw
+aal
+agd
+ahc
+adw
+adw
+adw
+agk
+akL
+akI
+akI
+akI
+akI
+akI
+akI
+akI
+dzo
+dzq
+dzq
+dzq
+dzw
+dzq
+dzq
+dzq
+dzw
+dzq
+dzq
+dzq
+dzw
+dzq
+dzq
+dzq
+dzw
+dzq
+dzq
+dzq
+dzq
+dAl
+dAB
ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-arz
-arz
-aSQ
-aTD
+dAU
+dBa
arw
aaa
aaa
@@ -139697,11 +144709,11 @@ aaa
abC
aaa
arw
-bpW
-aQS
+dus
+duB
cSC
-aSQ
-bvW
+dvC
+dwa
arw
aaa
aaa
@@ -139850,67 +144862,67 @@ aae
aae
aal
aal
-aay
-aaJ
-aaV
+aaw
+aaI
aaS
-abz
-abQ
-acb
-aco
-acy
-acK
-abm
-acS
-adj
-adz
-adj
-aep
-aeO
-adj
-acS
-agf
-ahe
-agk
-aiz
-ajh
-agk
-akN
-alu
-amc
-anb
-amc
-amc
-apM
-aqK
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-dbJ
+aaS
+aaS
+aaH
+aaE
+aaS
+acx
+abZ
+abZ
+acR
+adi
+adi
+adi
+adi
+aeN
+adi
+acR
+age
+ahd
+ahQ
+aiy
+ajg
+ahQ
+akM
+alt
+alt
+ana
+alt
+alt
+apL
+aqJ
+ary
+ary
+ary
+ary
+dzx
+ary
+ary
+ary
+dzG
+ary
+ary
+ary
+dzx
+ary
+ary
+ary
+dzG
+ary
+ary
+ary
+ary
+dzx
+ary
+ary
+ary
aTD
arw
-aaa
+cKF
aaa
aaa
aaa
@@ -139957,7 +144969,7 @@ arw
bpW
aQS
cSC
-aSQ
+aQS
bvW
arw
aaa
@@ -140107,64 +145119,64 @@ aae
aae
aal
aal
-aaw
-aaK
-aaW
+aay
+aaJ
+aaV
aaS
-aaS
-aaw
-aaE
-aaS
-acz
-acc
-acc
-acT
-adk
-adA
-adk
-adk
-adk
-adk
-acT
-agg
-ahf
-ahR
-aiA
-aji
-ahR
-akO
-alv
-amd
-anc
-anK
-amd
-amd
-aqL
-arA
-arA
-arA
-arA
-arA
-axa
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-aJo
-arA
-arA
-arA
-arA
-arA
-arA
-arz
-arz
-aSQ
+abz
+abQ
+acb
+aco
+acy
+acK
+abm
+acS
+adj
+adz
+adj
+aep
+aeO
+adj
+acS
+agf
+ahe
+agk
+aiz
+ajh
+agk
+akN
+alu
+amc
+anb
+amc
+amc
+apM
+aqK
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+dAT
+ary
aTD
arw
aaa
@@ -140214,7 +145226,7 @@ arw
bpW
aQS
cSC
-aSQ
+aQS
bvW
arw
aaa
@@ -140364,64 +145376,64 @@ aae
aae
aal
aal
-aax
aaw
+aaK
+aaW
aaS
-abo
aaS
-abR
-aax
-aaX
-acA
-aax
-acP
-aal
-adl
-adB
aaw
-aaw
-adB
-adl
-aal
-agh
-ahg
-agk
-agk
-agk
-agk
-akP
-akI
-akI
-akI
-akI
-akI
-akI
-akI
+aaE
+aaS
+acz
+acc
+acc
+acT
+adk
+adA
+adk
+adk
+adk
+adk
+acT
+agg
+ahf
+ahR
+aiA
+aji
+ahR
+akO
+alv
+amd
+anc
+anK
+amd
+amd
+aqL
+ary
+ary
+ary
+ary
arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-aPp
-aQS
-arz
-aSQ
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+dzQ
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
aTD
arw
aaa
@@ -140471,7 +145483,7 @@ boI
bpX
aQS
cSC
-aSQ
+aQS
bvX
bxC
aaa
@@ -140623,63 +145635,63 @@ aal
aal
aax
aaw
-aaX
-aaw
-aaw
-aaw
-aaX
+aaS
+abo
+aaS
+abR
aax
-acB
+aaX
+acA
aax
-aau
+acP
aal
+adl
+adB
+aaw
+aaw
+adB
+adl
aal
-aal
-aal
-aal
-aal
-aal
-aal
-agi
-ahh
-ahS
-aiB
+agh
+ahg
agk
-ajZ
-akQ
-alw
-ame
-ame
-anL
-aoP
-apN
-aqM
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
+agk
+agk
+agk
+akP
+akI
+akI
+akI
+akI
+akI
+akI
+akI
+dzp
+dzp
+dzp
+dzp
+dzy
+dzp
+dzp
+dzp
+dzy
+dzp
+dzp
+dzp
+dzy
+dzp
+dzp
+dzp
+dzy
+dzp
+dzp
+dzp
+dzp
aPq
-aQS
-arz
-aSQ
-aTD
+dAC
+ary
+dAU
+dBa
arw
aaa
aaa
@@ -140877,65 +145889,65 @@ aae
aae
aae
aal
-cJi
-aaw
-aaF
-aaT
+aal
aax
-aby
+aaw
+aaX
+aaw
+aaw
+aaw
aaX
-aca
aax
acB
aax
-aaw
+aau
aal
-adh
-adh
-adh
-aeq
-adh
-adh
aal
-agj
-ahi
-cYe
+aal
+aal
+aal
+aal
+aal
+aal
+agi
+ahh
+ahS
aiB
agk
-ajX
-akJ
-akJ
-akJ
-akJ
-akI
-akI
-akI
-abC
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-abC
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-abC
-aaa
-aaa
-aaa
+ajZ
+akQ
+alw
+ame
+ame
+anL
+aoP
+apN
+dzn
+aqM
arw
-aPq
-aQS
-arz
-aSQ
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -141130,43 +146142,43 @@ aaa
aaa
aaa
aaa
-aaf
-aaf
-aaf
-aal
+aae
+aae
+aae
aal
+cJi
aaw
-aaE
-aaS
-cJk
+aaF
+aaT
+aax
+aby
aaX
-abS
-acc
-acp
-acC
+aca
+aax
+acB
aax
aaw
aal
+adh
+adh
+adh
+aeq
+adh
+adh
aal
-aal
-aal
-aal
-aal
-aal
-aal
+agj
+ahi
+cYe
+aiB
agk
-agk
-agk
-agk
-agk
-ajW
+ajX
+akJ
+akJ
+akJ
+akJ
akI
akI
akI
-akI
-akI
-aaf
-aaa
abC
aaa
aaa
@@ -141189,10 +146201,10 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -141387,42 +146399,50 @@ aaa
aaa
aaa
aaa
+aaf
+aaf
+aaf
+aal
+aal
+aaw
+aaE
+aaS
+cJk
+aaX
+abS
+acc
+acp
+acC
+aax
+aaw
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+agk
+agk
+agk
+agk
+agk
+ajW
+akI
+akI
+akI
+akI
+akI
+aaf
aaa
-aaf
-aaf
-aal
-aal
-aaz
-aax
-aaw
-aaw
-abA
-aax
-aax
-aax
-aaw
-acL
-cJi
-aal
-aal
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-ajV
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
+abC
+aaa
+aaa
+aaa
+aaa
+aaa
+cKF
aaa
abC
aaa
@@ -141432,24 +146452,16 @@ aaa
aaa
aaa
aaa
-abC
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
abC
aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -141649,25 +146661,25 @@ aaf
aaf
aal
aal
-aau
-aaL
+aaz
aax
-abp
-aax
-abM
-aax
-aaL
aaw
-aal
+aaw
+abA
+aax
+aax
+aax
+aaw
+acL
+cJi
aal
aal
aaf
aaf
-aae
-aae
-aae
-aae
-aae
+aaf
+aaf
+aaf
+aaf
aaf
aaf
aaf
@@ -141703,10 +146715,10 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -141906,18 +146918,18 @@ aaf
aaf
aal
aal
+aau
+aaL
+aax
+abp
+aax
+abM
+aax
+aaL
+aaw
aal
aal
aal
-aal
-aal
-aal
-aal
-aal
-aal
-aal
-aal
-aaf
aaf
aaf
aae
@@ -141960,11 +146972,11 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
-aTD
+dAr
+dAH
+ary
+dAV
+dBa
arw
aaa
aaa
@@ -142159,7 +147171,6 @@ aaa
aaa
aaa
aaa
-aaa
aaf
aaf
aal
@@ -142173,24 +147184,25 @@ aal
aal
aal
aal
+aal
+aal
+aaf
+aaf
+aaf
+aae
+aae
+aae
+aae
+aae
aaf
aaf
aaf
aaf
-aae
-aae
-aae
-aae
-aae
-aae
-aae
-aae
-aae
aaf
ajV
aaf
-aae
-aae
+aaf
+aaf
aaf
aaf
aaf
@@ -142215,12 +147227,12 @@ aaa
abC
aaa
aaa
-aaa
+cKF
arw
-aPq
-aQU
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -142419,15 +147431,17 @@ aaa
aaa
aaf
aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+aal
aaf
aaf
aaf
@@ -142438,8 +147452,6 @@ aae
aae
aae
aae
-aaf
-aae
aae
aae
aae
@@ -142450,7 +147462,7 @@ aae
aae
aaf
aaf
-aaa
+aaf
aaa
abC
aaa
@@ -142462,22 +147474,22 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
abC
aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -142677,18 +147689,18 @@ aaa
aaf
aaf
aaf
-aae
-aae
-aae
-aae
-aae
aaf
aaf
aaf
aaf
-aae
-aae
-aae
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
aae
aae
aae
@@ -142703,10 +147715,10 @@ aae
aaf
ajV
aaf
+aae
+aae
+aaf
aaf
-aaa
-aaa
-aaa
aaa
aaa
abC
@@ -142731,10 +147743,10 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -142931,11 +147943,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaf
-aaf
-aaf
aaf
aaf
aaf
@@ -142944,7 +147951,10 @@ aae
aae
aae
aae
-aae
+aaf
+aaf
+aaf
+aaf
aae
aae
aae
@@ -142955,11 +147965,13 @@ aae
aae
aae
aaf
+aae
+aae
+aae
+aae
aaf
+ajV
aaf
-ahT
-aka
-ahT
aaf
aaa
aaa
@@ -142988,10 +148000,10 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -143071,17 +148083,17 @@ bYL
bZn
bZn
bZn
+dwp
bZn
bZn
bZn
bZn
+dwp
bZn
bZn
bZn
bZn
-bZn
-bZn
-bZn
+dwp
bZn
bZn
bZn
@@ -143190,11 +148202,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+aaf
+aaf
+aaf
+aaf
+aaf
aaf
aae
aae
@@ -143215,9 +148227,9 @@ aaf
aaf
aaf
ahT
-akb
+aka
ahT
-aaa
+aaf
aaa
aaa
aaa
@@ -143245,19 +148257,19 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
-aTD
+dAr
+dAD
+ary
+dAU
+dBa
arw
aaa
aaa
-aaa
-aaa
-alx
-alx
-alx
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -143324,25 +148336,25 @@ bVU
buw
bXj
buv
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
+dwd
+dwd
+dwd
+dwd
+dwq
+dwd
+dwd
+dwd
+dwd
+dwx
+dwd
+dwd
+dwd
+dwd
+dwq
+dwd
+dwd
+dwd
+dwd
buv
bXj
buw
@@ -143452,7 +148464,7 @@ aaa
aaa
aaa
aaa
-aaa
+aaf
aae
aae
aae
@@ -143470,26 +148482,26 @@ aae
aae
aaf
aaf
+aaf
+ahT
+akb
+ahT
+aaa
+aaa
+aaa
+aaa
aaa
aaa
abC
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-alx
-alF
-alx
-alx
-alx
-alx
-alx
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
abC
-aaa
+cKF
aaa
aaa
aaa
@@ -143502,16 +148514,16 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
aaa
aaa
-alx
+aaa
alx
alx
alx
@@ -143581,25 +148593,25 @@ bbs
bbs
bbs
baU
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dBA
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
baU
bbs
cgk
@@ -143710,13 +148722,15 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
aae
aae
aae
@@ -143725,44 +148739,42 @@ aae
aae
aaf
aaf
-aaf
-ahT
-abC
-abC
-abC
+dzk
+dzk
+dzk
abC
aaa
aaa
aaa
aaa
+aaa
+alx
+alF
alx
alx
alx
alx
alx
-and
-and
-alx
-alx
-alx
+aaa
+aaa
abC
aaa
aaa
-alx
-alx
-alx
-alx
-alx
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
abC
aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -143771,14 +148783,14 @@ aaa
alx
alx
alx
-alF
-abC
-abC
-abC
-abC
-abC
-abC
-abC
+alx
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
abC
aYG
abC
@@ -143838,34 +148850,34 @@ bSZ
bSZ
bSZ
bYb
-arA
-arA
-arA
-arA
-arA
-cdj
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-djU
-arA
-arA
-arA
-arA
-arA
-bYb
-bSZ
-bSZ
-bSZ
+dwd
+dwd
+dwd
+dwd
+dws
+dwd
+dwd
+dwd
+dwd
+dwy
+dwA
+dwA
+dwA
+dwA
+dwF
+dwA
+dwA
+dwA
+dwA
+dwH
+dwI
+dwI
+dwI
cgA
cgJ
-bSZ
-bRQ
-cLb
+dwI
+dwM
+dwN
chu
bkA
bkA
@@ -143988,54 +149000,54 @@ aaa
aaa
abC
abC
+aaa
+aaa
+aaa
+aaa
+alx
+alx
+alx
+alx
+alx
+and
+and
+alx
+alx
+alx
+abC
+aaa
+aaa
+alx
+alx
+alx
+alx
+alx
+aaa
abC
aaa
aaa
aaa
+arw
+dAn
+dAD
+ary
+ary
+aTD
+arw
+aaa
+aaa
+aaa
alx
alx
-and
alx
-and
-and
-and
-alx
-alx
-and
alF
-alx
-and
-and
-alx
-alx
-alx
-alx
-aaa
abC
-aaa
-aaa
-aaa
-aOv
-aPr
-aQS
-arz
-aSQ
-aTE
-aUC
-aaa
-aaa
-akR
-alx
-alx
-alx
-alx
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+abC
+abC
+abC
+abC
+abC
+abC
abC
aYG
abC
@@ -144099,17 +149111,17 @@ bYM
bZo
bZo
bZo
+dwt
bZo
bZo
bZo
bZo
+dwt
bZo
bZo
bZo
bZo
-bZo
-bZo
-bZo
+dwt
bZo
bZo
bZo
@@ -144244,53 +149256,53 @@ aaa
aaa
aaa
abC
+abC
+abC
aaa
-abC
-abC
+aaa
+aaa
+alx
+alx
+and
+alx
+and
+and
+and
+alx
+alx
+and
alF
alx
+and
+and
alx
-and
-and
-afV
-afV
-afS
-aez
-afV
-adZ
-aez
-afV
-afV
-aez
-aez
alx
-and
-and
alx
alx
aaa
-aaa
-aaa
-aKo
-aOw
-aKo
-aQV
-aRP
-aSR
-aLm
-aUD
-aLm
-akR
+abC
+cKF
+cKF
+cKF
+aOv
+dAz
+dAD
+ary
+ary
+dBg
+aUC
+cKF
+cKF
akR
alx
alx
alx
alx
-alx
-alx
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
aaa
abC
@@ -144502,46 +149514,46 @@ aaa
aaa
abC
aaa
-aaa
-aaa
+abC
+abC
+alF
alx
alx
and
-aez
+and
+afV
+afV
+afS
aez
afV
-aqH
-afq
-apx
-cZd
-cYm
-aiS
-azp
-amb
-aBV
adZ
+aez
afV
afV
aez
+aez
+alx
+and
+and
alx
alx
-alx
-akR
-akR
+aaa
+aaa
+aaa
aKo
-aOx
+aOw
aKo
aQW
-aRD
-aSS
+aRP
+aSR
aLm
-aUE
+aUD
aLm
+akR
+akR
alx
alx
alx
-and
-and
alx
alx
alx
@@ -144759,54 +149771,54 @@ aaa
aaa
abC
aaa
-akR
+aaa
+aaa
+alx
alx
and
-and
aez
-afS
+aez
afV
-aoQ
+aqH
afq
-akq
-alQ
-akq
-akq
-akp
-cYo
-akp
-cYl
-akp
+apx
+cZd
+cYm
+aiS
+azp
amb
-cYj
+aBV
+adZ
+afV
+afV
aez
-and
-and
+alx
+alx
+alx
+akR
+akR
aKo
-aLo
-aLo
+aOx
aKo
-aOy
-aKo
-aQW
+dAQ
aRD
-aST
-aLm
-aUF
-aLm
+aSS
aLm
+aUE
aLm
alx
+alx
+alx
and
and
alx
alx
alx
-alx
-alx
aaa
aaa
-abC
+aaa
+aaa
+aaa
abC
aYG
abC
@@ -145015,57 +150027,57 @@ aaa
aaa
aaa
abC
-akR
+aaa
akR
alx
and
and
aez
-apO
-aoR
-ahr
-ahr
-ahr
-cYY
-avL
-ahr
-ahr
-azq
-cYY
-ahr
-ahr
-aEj
afS
afV
+aoQ
+afq
+akq
+alQ
+akq
+akq
+akp
+cYo
+akp
+cYl
+akp
+amb
+cYj
aez
-aez
+and
+and
aKo
-aLp
-aMq
-aNr
-aOz
-aPs
-aQW
+aLo
+aLo
+aKo
+aOy
+aKo
+dAQ
aRD
-aSU
+aST
+aLm
+aUF
+aLm
aLm
-aUG
-aVj
-aVD
aLm
alx
and
-aXa
-aXb
-aXa
-aXa
-aYi
+and
+alx
+alx
+alx
+alx
alx
aaa
-aaa
+cKF
abC
-aYF
-aYH
+abC
+aYG
abC
aaa
aaa
@@ -145270,59 +150282,59 @@ aaa
aaa
aaa
aaa
-ajj
-akc
-anQ
-dnE
-ajn
+aaa
+abC
+akR
+akR
+alx
+and
+and
aez
+apO
+aoR
+ahr
+ahr
+ahr
+cYY
+avL
+ahr
+ahr
+azq
+cYY
+ahr
+ahr
+aEj
afS
afV
-afq
-anC
-arC
-arC
-arC
-arC
-arC
-arC
-arC
-arC
-arC
-arC
-afq
-anC
-afS
-adZ
-aIf
-adZ
+aez
+aez
aKo
-aLq
-aMr
-aNs
-aOA
-aPt
-aQX
+aLp
+aMq
+aNr
+aOz
+aPs
+dAQ
aRD
-aSV
+aSU
aLm
-aUH
-aVk
-aVE
+aUG
+aVj
+aVD
aLm
-afV
-afV
+alx
+and
+aXa
+aXb
+aXa
aXa
-aXt
-aXL
-aXZ
-aYi
-aYi
aYi
+alx
+aaa
+aaa
abC
-abC
-aYG
-abC
+aYF
+aYH
abC
aaa
aaa
@@ -145527,60 +150539,60 @@ aaa
aaa
aaa
aaa
-ajk
-alE
-akd
-dnF
+ajj
+akc
+anQ
+dnE
ajn
-ajn
-aUW
-aoQ
-aoR
-aqN
-arC
-asx
-atB
-asx
-atC
-atC
-axN
-azr
-asx
-arC
-aqH
-aEk
-amb
-akp
-cZB
+aez
afS
-aKp
-aLr
-aMs
-aNt
-aOB
-aPu
-aQY
-aRF
-aSW
-cKe
-aUI
-aVl
-aVF
+afV
+afq
+anC
+arC
+arC
+arC
+arC
+arC
+arC
+arC
+arC
+arC
+arC
+afq
+anC
+afS
+adZ
+aIf
+adZ
+aKo
+aLq
+aMr
+aNs
+aOA
+aPt
+dAS
+aRD
+aSV
aLm
-ajt
-aqH
-aXb
-aXu
-aXM
-aYa
-aYj
-aYr
-aYj
-aYn
-aYn
-aYH
+aUH
+aVk
+aVE
+aLm
+afV
+afV
+aXa
+aXt
+aXL
+aXZ
+aYi
+aYi
+aYi
+abC
+abC
+aYG
+abC
abC
-aaa
aaa
aaa
aaa
@@ -145784,58 +150796,58 @@ aaa
aaa
aaa
aaa
-ajl
-ake
-akS
-aly
-amf
-ane
-alr
+ajk
+alE
+akd
+dnF
+ajn
+ajn
+aUW
+aoQ
aoR
-apP
-afV
+aqN
arC
-asy
-atC
asx
+atB
asx
-axb
atC
atC
-aAH
+axN
+azr
+asx
arC
+aqH
+aEk
+amb
+akp
+cZB
afS
-amI
-aCr
-aCr
-aCr
-aBA
-aKo
-aKo
-aKo
-aKo
-aKo
-aKo
-aQZ
-aRQ
-aSX
+aKp
+aLr
+aMs
+aNt
+aOB
+aPu
+aQY
+aRF
+aSW
+cKe
+aUI
+aVl
+aVF
aLm
-aUJ
-aVe
-aVG
-aLm
-alR
-aWQ
-aXc
-aXv
-aXN
-aYb
-aYi
-aYi
-aYi
-abC
-abC
-abC
+ajt
+aqH
+aXb
+aXu
+aXM
+aYa
+aYj
+aYr
+aYj
+aYn
+aYn
+aYH
abC
abC
abC
@@ -146041,59 +151053,59 @@ aaa
aaa
aaa
aaa
-cJr
-akf
-akT
+ajl
+ake
+akS
aly
-amg
-ajn
-anM
-aoS
-cYC
-adZ
-arC
-asz
-atD
-auF
-avM
-atC
-axO
-atC
-aAI
-arC
-adZ
-afS
+amf
+ane
+alr
+aoR
+apP
afV
-aiS
-dad
-dan
-day
+arC
+asy
+atC
+asx
+asx
+axb
+atC
+atC
+aAH
+arC
+afS
+amI
+aCr
+aCr
aCr
aBA
-cYl
-dam
+aKo
+aKo
+aKo
+aKo
+aKo
+aKo
+aQZ
+aRQ
+aSX
aLm
-aRa
-aRK
-aSY
+aUJ
+aVe
+aVG
aLm
-aUK
-aVf
-aVH
-aLm
-aqH
-anC
-aXb
-aXb
-aXa
-aXb
+alR
+aWQ
+aXc
+aXv
+aXN
+aYb
aYi
-alx
-aaa
-aaa
-aaa
-aaa
-aaa
+aYi
+aYi
+abC
+abC
+abC
+abC
aaa
aaa
aaa
@@ -146298,53 +151310,53 @@ aaa
aaa
aaa
aaa
-ajl
-akg
-akU
+cJr
+akf
+akT
aly
-amh
+amg
ajn
-anN
-aoT
-adZ
+anM
+aoS
+cYC
adZ
arC
-asx
+asz
+atD
+auF
+avM
atC
-auG
-avN
-auG
-axP
axO
+atC
aAI
arC
adZ
-adZ
-cZM
-cZM
-cZM
-cZM
-cZM
-cZM
-anC
+afS
+afV
+aiS
+dad
+dan
+day
+aCr
+aBA
cYl
-afS
-aPl
-aRb
-aRR
-aSZ
-aTF
-aUL
+dam
aLm
+aRa
+aRK
+aSY
aLm
+aUK
+aVf
+aVH
aLm
-aoR
-apu
-afS
-alx
-alx
-alx
-alx
+aqH
+anC
+aXb
+aXb
+aXa
+aXb
+aYi
alx
aaa
aaa
@@ -146361,19 +151373,19 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
bbq
bbq
bbq
-baS
-baS
-baS
-baS
-baS
-baS
+bbq
+bbq
+bbq
+bbq
+bbq
+cKp
big
bja
-bjS
+bjP
deo
blC
dpb
@@ -146556,52 +151568,52 @@ aaa
aaa
aaa
ajl
-akf
+akg
akU
-alz
-ami
+aly
+amh
ajn
-ajn
-anV
-anV
-anV
-arC
-arC
-arC
-auH
-avO
-auH
-arC
-arC
-aAJ
-arC
-anV
-anV
-cZM
-cZV
-daf
-dap
-daA
-cZM
-amI
-ahr
-aOo
-aPv
-aRc
-aRS
-aTa
-aLm
-aLm
-aLm
+anN
+aoT
adZ
adZ
+arC
+asx
+atC
+auG
+avN
+auG
+axP
+axO
+aAI
+arC
+adZ
+adZ
+cZM
+cZM
+cZM
+cZM
+cZM
+cZM
anC
-afq
-aLm
-aLm
+cYl
+afS
+aPl
+aRb
+aRR
+aSZ
+aTF
+aUL
aLm
aLm
aLm
+aoR
+apu
+afS
+alx
+alx
+alx
+alx
alx
aaa
aaa
@@ -146621,16 +151633,16 @@ aaa
aaa
bbq
bbq
-bbo
+bbq
+baS
+baS
+baS
+baS
baS
-bdG
-bew
-bfl
-bgl
baS
big
bja
-bjP
+bjS
dew
bkD
bkD
@@ -146815,51 +151827,50 @@ aaa
ajl
akf
akU
-alA
-amh
-anf
+alz
+ami
ajn
-aoU
-cYD
-aqO
-arD
-asA
-atE
-auI
-avP
-auI
-axQ
-azs
-aAK
-aBW
-aCU
-aEl
-cZO
-cZW
-dag
-daq
-daB
+ajn
+anV
+anV
+anV
+arC
+arC
+arC
+auH
+avO
+auH
+arC
+arC
+aAJ
+arC
+anV
+anV
cZM
-daQ
-aUW
-avh
-aPw
-aRd
-aRD
-aTb
+cZV
+daf
+dap
+daA
+cZM
+amI
+ahr
+aOo
+aPv
+aRc
+aRS
+aTa
+aLm
+aLm
aLm
adZ
adZ
-adZ
-aWh
-apu
-aez
+anC
+afq
+aLm
+aLm
+aLm
aLm
-aMo
-aMn
-aYc
aLm
-alx
alx
aaa
aaa
@@ -146878,16 +151889,17 @@ aaa
aaa
aaa
bbq
+bbq
bbo
baS
-bdH
-bex
-bex
-bgm
-bgY
-bih
-bjc
-bjR
+bdG
+bew
+bfl
+bgl
+baS
+big
+bja
+bjP
bkD
blD
bmC
@@ -147069,55 +152081,55 @@ aaa
aaa
aaa
aaa
-cJs
+ajl
akf
akU
-aly
-amj
-ang
-anO
-aoV
-apQ
-apQ
-arE
-arE
-cLT
-arE
-avQ
-apQ
-apQ
-azt
-aAL
-aBX
-cZA
-aEn
-cZP
-cZX
-dah
-dar
-daC
+alA
+amh
+anf
+ajn
+aoU
+cYD
+aqO
+arD
+asA
+atE
+auI
+avP
+auI
+axQ
+azs
+aAK
+aBW
+aCU
+aEl
+cZO
+cZW
+dag
+daq
+daB
cZM
-afV
-aez
-afV
+daQ
+aUW
+avh
+aPw
+aRd
+aRD
+aTb
aLm
-aRe
-aRT
-aTc
-aPv
-aUM
-ahr
-ahr
+adZ
+adZ
+adZ
+aWh
apu
-afV
aez
aLm
-aNp
-aNp
-aYd
-aLm
-aLm
+aMo
+aMn
+aYc
aLm
+alx
+alx
aaa
aaa
aaa
@@ -147134,17 +152146,17 @@ aaa
aaa
aaa
aaa
+bbq
+bbo
baS
-baS
-baS
-bdI
-bey
-bey
-bgn
-baS
-big
-bbs
-bjP
+bdH
+bex
+bex
+bgm
+bgY
+bih
+bjc
+bjR
bkD
blE
bmD
@@ -147326,82 +152338,82 @@ aaa
aaa
aaa
aaa
-ajl
-akh
-akV
-alB
-amk
-anh
-anP
-aoW
-aoW
-aoW
-arF
-arF
-aoW
-arF
-avR
-aoU
-aoU
-aoU
-aoU
+cJs
+akf
+akU
+aly
+amj
+ang
+anO
+aoV
+apQ
+apQ
+arE
+arE
+cLT
+arE
+avQ
+apQ
+apQ
+azt
+aAL
aBX
-aoU
+cZA
aEn
-cZQ
+cZP
cZX
-dai
-das
-daD
-anV
-anV
-anV
-anV
-anV
-aRd
-aRD
-aTa
-aPw
-alr
-aqH
-aoy
-afK
+dah
+dar
+daC
+cZM
+afV
+aez
+afV
+aLm
+aRe
+aRT
+aTc
+aPv
+aUM
+ahr
+ahr
+apu
afV
aez
aLm
-aXw
-aXO
-aXO
-aYk
-aYs
-aYv
-aYw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-bar
-baR
-baR
-bbR
-bcv
-bbR
-bdJ
-ber
-ber
-bgo
+aNp
+aNp
+aYd
+aLm
+aLm
+aLm
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+aaa
+aaa
baS
-bii
-bjd
-bjT
+baS
+baS
+bdI
+bey
+bey
+bgn
+baS
+big
+bja
+bjP
bkD
blF
bmE
@@ -147583,82 +152595,82 @@ aaa
aaa
aaa
aaa
-ajm
-aki
-akW
-alC
-alD
-ani
-ajn
+ajl
+akh
+akV
+alB
+amk
+anh
+anP
+aoW
+aoW
+aoW
+arF
+arF
+aoW
+arF
+avR
aoU
aoU
-aqP
-arG
-asB
-atF
-asG
-avS
-axc
-aoW
-aoW
-aoW
-aBY
-azy
-cZI
-cZR
-cZZ
-daj
-dat
-daE
+aoU
+aoU
+aBX
+aoU
+aEn
+cZQ
+cZX
+dai
+das
+daD
anV
-aMt
-aNu
-aOC
-aPx
-aRf
-aRU
+anV
+anV
+anV
+anV
+aRd
+aRD
aTa
+aPw
+alr
+aqH
+aoy
+afK
+afV
+aez
aLm
-aLm
-aLm
-aLm
-aLm
-aLm
-aLm
-aLm
-aXx
-cKe
-aLm
-aLm
-aLm
-aLm
-aYx
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-bas
+aXw
+aXO
+aXO
+aYk
+aYs
+aYv
+aYw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+bar
+baR
+baR
+bbR
+bcv
+bbR
+bdJ
+ber
+ber
+bgo
baS
-baS
-baS
-baS
-baS
-baS
-baS
-baS
-cKp
-baS
-bij
-bbs
-bjU
+bii
+bjd
+bjT
bkD
bkD
bkD
@@ -147840,82 +152852,82 @@ aaa
aaa
aaa
aaa
-ajn
-akj
-ajn
+ajm
+aki
+akW
+alC
alD
-aml
-anj
+ani
ajn
aoU
aoU
-aoY
-arH
-asC
+aqP
+arG
+asB
+atF
+asG
+avS
+axc
+aoW
+aoW
+aoW
+aBY
+azy
+cZI
+cZR
+cZZ
+daj
+dat
+daE
anV
-auJ
-avT
-aoY
-aoU
-aoU
-aAM
-anV
-aCW
-aEn
-anV
-anV
-anV
-anV
-anV
-anV
-aMu
-aoU
-aoU
-aBX
-aRg
-aRD
-aTd
-aTG
-aUN
-aTG
-aTG
-aWi
-aTG
-aWR
-dbP
-aXy
-aTG
-aTG
-aYl
-aYt
-cPO
-cPT
-cPT
-cPT
-cPT
-cPT
-cPT
-aYU
-cPT
-cPT
-cPT
-cPT
-cPT
-cPT
-cPT
-cQC
-bbr
-cQJ
-bcw
-cQJ
-cQJ
-cQJ
-bfm
-cQJ
-cQJ
-bik
-bbs
-bjP
+aMt
+aNu
+aOC
+aPx
+aRf
+aRU
+aTa
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
+aXx
+cKe
+aLm
+aLm
+aLm
+aLm
+aYx
+aYz
+aYz
+aYz
+dtr
+aYz
+aYz
+aYz
+aYz
+dtr
+aYz
+aYz
+aYz
+bas
+baS
+baS
+baS
+baS
+baS
+baS
+baS
+baS
+cKp
+baS
+bij
+bja
+bjU
bkD
blG
bmF
@@ -148097,81 +153109,81 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-ajn
-ajn
ajn
+akj
ajn
+alD
+aml
+anj
ajn
aoU
aoU
aoY
-arI
-arM
-aoY
-arM
-arI
-aoY
-axR
-azv
-aAN
+arH
+asC
anV
-aCX
-aEo
-aBW
-aHf
-aIg
-aJp
-aKq
-aLs
-aMv
+auJ
+avT
+aoY
+aoU
+aoU
+aAM
+anV
+aCW
+aEn
+anV
+anV
+anV
+anV
+anV
+anV
+aMu
aoU
aoU
aBX
aRg
-aRV
-aTe
aRD
-aUO
-aRD
-aRD
-aWj
-aRD
-aTS
-aRD
-aRD
-aRD
-aRD
-aYm
-aRD
-aRP
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-baU
-bbs
-bbT
-bbs
-bbs
-bbs
-bbs
-bfn
-bbs
-bbs
-bil
-cKz
+aTd
+aTG
+aUN
+aTG
+aTG
+aWi
+dBH
+aWR
+dbP
+aXy
+aTG
+aTG
+aYl
+aYt
+cPO
+cPT
+cPT
+cPT
+cPT
+dts
+aYU
+aYU
+aYU
+aYU
+dtV
+aYU
+aYU
+aYU
+aYU
+cQC
+bbr
+cQJ
+bcw
+cQJ
+cQJ
+cQJ
+bfm
+cQJ
+cQJ
+bik
+dul
bjP
bkD
blE
@@ -148356,80 +153368,80 @@ aaa
aaa
aaa
aaa
-aaa
-akR
-akR
-akR
+ajn
+ajn
+ajn
+ajn
+ajn
+aoU
+aoU
+aoY
+arI
+arM
+aoY
+arM
+arI
+aoY
+axR
+azv
+aAN
anV
-aoY
-aoY
-aoY
-arH
-asD
-aoY
-auK
-avT
-aoY
-aoY
-aoY
-aoY
-anV
-aCY
-aEp
-aFJ
-aHg
-aIh
-aoU
-aEn
-aoY
-aMw
+aCX
+aEo
+aBW
+aHf
+aIg
+aJp
+aKq
+aLs
+aMv
aoU
aoU
-aPy
-aRh
-aRW
-aTf
-aTH
-aUP
-aVm
-aVI
-aWk
-aWE
-aWS
-aXd
-aQN
-aXP
-aQN
-aQN
-aQN
-aQR
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-baV
-bbt
-bbU
-bcx
-bdd
-bdd
-bez
-bfo
-bdd
-bdd
-bim
-bcx
-bjV
+aBX
+aRg
+aRV
+aTe
+aRD
+aUO
+aRD
+aRD
+aWj
+aRD
+aTS
+aRD
+aRD
+aRD
+aRD
+aYm
+aRD
+aRP
+dtd
+dtd
+dtd
+dtd
+dtd
+dtd
+dBn
+dtd
+dtd
+dtd
+dtd
+dtd
+dtd
+dtd
+baU
+bbs
+bbT
+bbs
+bbs
+bbs
+bbs
+bfn
+bbs
+bbs
+bil
+cKz
+bjP
bkD
blF
bmE
@@ -148614,79 +153626,79 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-abC
-arw
-aoZ
-aoZ
-aoZ
-arJ
-asE
-aoZ
-auL
-avU
-aoZ
-aoZ
-aoZ
-aaa
+akR
+akR
+akR
anV
-aCZ
-aEq
-aFK
-aHh
+aoY
+aoY
+aoY
+arH
+asD
+aoY
+auK
+avT
+aoY
+aoY
+aoY
+aoY
+anV
+aCY
+aEp
+aFJ
+aHg
+aIh
aoU
-aoU
-aKr
-aLt
-aMx
+aEn
+aoY
+aMw
aoU
aoU
aPy
-aPy
-aRX
-aTg
-aTI
-anV
-aLm
-aLm
-aWl
-aPJ
-aPl
-aLm
-aLm
-aLm
-aLm
-aLm
-aLm
-aLm
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-baS
-baS
-baS
-baS
-baS
-bdK
-baS
-baS
-baS
-bgZ
-bin
-baS
-bjW
+aRh
+aRW
+aTf
+aTH
+aUP
+aVm
+aVI
+aWk
+aWE
+aWS
+aXd
+aQN
+aXP
+aQN
+aQN
+aQN
+aQR
+dtd
+dtd
+dtd
+dtd
+dtu
+dtd
+dtd
+dtd
+dtd
+dtu
+dtd
+dtd
+dtd
+dtd
+baV
+bbt
+bbU
+bcx
+bdd
+bdd
+bez
+bfo
+bdd
+bdd
+bim
+bcx
+bjV
bjW
bjW
bjW
@@ -148876,73 +153888,73 @@ aaa
abC
arw
aoZ
-apR
-apR
-apR
-apR
-atG
-apR
-apR
-apR
-axS
aoZ
-aAO
-aoY
-aDa
-aEr
-aBY
-aHi
-aoU
-aoU
-aKs
-aoY
-aMy
-aoU
-aoU
-aoU
-aoU
-aRY
-azA
-aTJ
+aoZ
+arJ
+asE
+aoZ
+auL
+avU
+aoZ
+aoZ
+aoZ
+aaa
+anV
+aCZ
+aEq
+aFK
+aHh
+aoU
+aoU
+aKr
+aLt
+aMx
+aoU
+aoU
+aPy
+aPy
+aRX
+aTg
+aTI
anV
-alx
aLm
-aWm
-aPI
-aUR
-dbQ
-aXz
aLm
-alx
-alx
-alx
-aaa
-aaa
-abC
-aaa
-aaa
-aaa
-aaa
-abC
-aaa
-aaa
-aaa
-aaa
-abC
-aaa
-aaa
-baW
-baW
-bbo
-bbo
-bbq
-bbq
-bbq
-bbq
-bgs
-bha
-bio
-bje
+aWl
+aPJ
+aPl
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
+aYy
+aYy
+aYy
+aYy
+dtv
+aYy
+aYy
+aYy
+aYy
+dtv
+aYy
+aYy
+aYy
+aYy
+baS
+baS
+baS
+baS
+baS
+bdK
+baS
+baS
+baS
+bgZ
+bin
+baS
bjW
bkE
blH
@@ -149137,38 +154149,38 @@ apR
apR
apR
apR
+atG
apR
apR
apR
-apR
-apR
-azw
-aAP
+axS
+aoZ
+aAO
aoY
-aCW
-aEs
-anV
-aHj
-aIi
-azy
-aKt
+aDa
+aEr
aBY
-aMz
-aoW
-aoW
-aoW
-aoW
-aRZ
-cOC
+aHi
+aoU
+aoU
+aKs
+aoY
+aMy
+aoU
+aoU
+aoU
+aoU
+aRY
+azA
aTJ
anV
alx
aLm
-aWn
-aOl
-daW
-aXe
-aXA
+aWm
+aPI
+aUR
+dbQ
+aXz
aLm
alx
alx
@@ -149190,16 +154202,16 @@ aaa
aaa
baW
baW
-baW
+bbo
bbo
bbq
bbq
bbq
bbq
-bgp
-bhb
-ddo
-bjf
+bgs
+bha
+bio
+bje
bjW
bkF
blI
@@ -149405,46 +154417,46 @@ aoY
aCW
aEs
anV
-aHk
-aCW
-aJq
-aKu
-aLu
-aMA
-aoU
-aoU
-aoU
-aoU
-aRY
-apb
+aHj
+aIi
+azy
+aKt
+aBY
+aMz
+aoW
+aoW
+aoW
+aoW
+aRZ
+cOC
aTJ
anV
alx
aLm
-aMg
-aWF
-aWT
-aXf
-aNF
+aWn
+aOl
+daW
+aXe
+aXA
aLm
alx
alx
alx
-alx
-aXR
-aXR
-aXR
aaa
-aXR
-aXR
-aXR
-aXR
aaa
-aXR
-aXR
-aXR
-aXR
-aXR
+abC
+aaa
+aaa
+aaa
+aaa
+abC
+aaa
+aaa
+aaa
+aaa
+abC
+aaa
+aaa
baW
baW
baW
@@ -149659,49 +154671,49 @@ apR
azw
aAP
aoY
-aDb
-aEt
-anV
-aHl
aCW
+aEs
+anV
+aHk
+aCW
+aJq
+aKu
+aLu
+aMA
aoU
-aKv
-aoY
-aMB
-aNv
-aOD
-aPz
-aRi
-aSa
-aTh
-aTK
+aoU
+aoU
+aoU
+aRY
+apb
+aTJ
anV
alx
aLm
-aLm
-aLm
-aLm
-aLm
-aLm
+aMg
+aWF
+aWT
+aXf
+aNF
aLm
alx
alx
alx
alx
+aXR
+aXR
+aXR
aaa
+aXR
+aXR
+aXR
+aXR
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+aXR
+aXR
+aXR
+aXR
+aXR
baW
baW
baW
@@ -149912,35 +154924,35 @@ apR
apR
apR
apR
-axS
-aoZ
-aAQ
+apR
+azw
+aAP
aoY
+aDb
+aEt
+anV
+aHl
aCW
-aEs
-anV
-aHm
-aCW
-aJr
-aKw
-anV
-anV
-anV
-anV
-aPA
-anV
-aSb
-avk
-anV
+aoU
+aKv
+aoY
+aMB
+aNv
+aOD
+aPz
+aRi
+aSa
+aTh
+aTK
anV
alx
-and
-and
-alx
-alx
-alx
-alx
-alx
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
alx
alx
alx
@@ -150161,45 +155173,45 @@ aaa
abC
arw
aoZ
+apR
+apR
+apR
+apR
+apR
+apR
+apR
+apR
+axS
aoZ
-aoZ
-arK
-arK
-aoZ
-auM
-arK
-aoZ
-aoZ
-aoZ
-aaa
-anV
-aCZ
+aAQ
+aoY
+aCW
aEs
anV
-aHn
+aHm
aCW
-aoU
-daF
+aJr
+aKw
+anV
+anV
+anV
+anV
+aPA
+anV
+aSb
+avk
+anV
anV
-aez
-aez
-adZ
-afV
-akp
-aSc
-cOD
-cZB
-afS
-alx
-alx
-alx
-and
alx
and
and
-and
-and
-and
+alx
+alx
+alx
+alx
+alx
+alx
+alx
alx
alx
alx
@@ -150411,54 +155423,54 @@ aaa
aaa
aaa
aaa
-dnA
aaa
-akR
-akR
-akR
+aaa
+aaa
+aaa
+abC
+arw
+aoZ
+aoZ
+aoZ
+arK
+arK
+aoZ
+auM
+arK
+aoZ
+aoZ
+aoZ
+aaa
anV
-aoY
-aoY
-aoY
-arL
-asF
-aoY
-asF
-arL
-aoY
-aoY
-aoY
-aoY
-anV
-aCY
+aCZ
aEs
anV
-aHo
+aHn
aCW
aoU
-aKx
+daF
anV
aez
aez
adZ
-afS
-cYt
-cYK
-aiS
-afS
afV
+akp
+aSc
+cOD
+cZB
+afS
+alx
+alx
+alx
and
-and
-and
+alx
and
and
and
and
and
alx
-and
-and
-and
+alx
alx
alx
aaa
@@ -150668,42 +155680,42 @@ aaa
aaa
aaa
aaa
-dnB
-dnD
-dnD
-dnD
-dnD
-anT
-aoX
-aoU
-aoY
-arM
-arM
-aoY
-arM
-arM
-aoY
-axT
-azx
-aAR
+dnA
+aaa
+akR
+akR
+akR
anV
-aCX
+aoY
+aoY
+aoY
+arL
+asF
+aoY
+asF
+arL
+aoY
+aoY
+aoY
+aoY
+anV
+aCY
aEs
anV
-aHp
-aIj
-aJs
-aKy
-aHp
+aHo
+aCW
+aoU
+aKx
+anV
aez
aez
+adZ
afS
-cYm
-cYu
-akp
-akp
-cYg
+cYt
+cYK
+aiS
afS
+afV
and
and
and
@@ -150725,7 +155737,7 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
aaa
@@ -150925,50 +155937,50 @@ aaa
aaa
aaa
aaa
-dnC
-akR
-akR
-akR
-alx
-anU
-apa
+dnB
+dnD
+dnD
+dnD
+dnD
+anT
+aoX
aoU
aoY
-arL
-arL
+arM
+arM
aoY
-arL
-arL
+arM
+arM
aoY
-aoU
-aoU
-aAM
+axT
+azx
+aAR
anV
-aDc
+aCX
aEs
-aFL
-aHq
-aIk
-aJt
-aKz
+anV
+aHp
+aIj
+aJs
+aKy
aHp
aez
aez
-aez
-cYj
+afS
+cYm
cYu
-aXh
+akp
+akp
+cYg
afS
-adZ
-afS
-aez
-aez
-afV
-aez
and
and
-alx
-alx
+and
+and
+and
+and
+and
+and
alx
and
and
@@ -151182,54 +156194,54 @@ aaa
aaa
aaa
aaa
-aaa
+dnC
+akR
akR
akR
alx
-alx
+anU
+apa
+aoU
+aoY
+arL
+arL
+aoY
+arL
+arL
+aoY
+aoU
+aoU
+aAM
anV
-apb
-aoU
-aoU
-aoU
-asG
-atH
-aoW
-aoW
-aoW
-aoW
-azy
-aoW
-aBY
-aDd
+aDc
aEs
-aFM
+aFL
aHq
-aIl
-aJu
-aKA
+aIk
+aJt
+aKz
aHp
-adZ
aez
aez
-apx
-cOz
-afV
+aez
+cYj
+cYu
+aXh
+afS
adZ
afS
+aez
+aez
afV
-afS
-aWo
-afK
-afV
-afS
-afS
-afV
-alx
-alx
+aez
+and
+and
alx
alx
alx
+and
+and
+and
alx
aaa
aaa
@@ -151445,48 +156457,48 @@ akR
alx
alx
anV
-apc
-apS
-apS
-arN
-arN
-cLU
-arN
-arN
-apS
-apS
-azz
-apS
-aBZ
-aDe
-aEu
-aFN
+apb
+aoU
+aoU
+aoU
+asG
+atH
+aoW
+aoW
+aoW
+aoW
+azy
+aoW
+aBY
+aDd
+aEs
+aFM
aHq
-aIm
+aIl
aJu
-aKB
+aKA
aHp
adZ
+aez
+aez
+apx
+cOz
afV
-afV
-alR
-amK
-alS
-afV
-akp
-akp
-akp
-akq
-avh
-awu
-alr
-aOF
+adZ
afS
afV
afS
+aWo
+afK
afV
-akR
-akR
+afS
+afS
+afV
+alx
+alx
+alx
+alx
+alx
akR
aaa
aaa
@@ -151698,50 +156710,50 @@ aaa
aaa
aaa
akR
-alx
+akR
alx
alx
anV
-apd
-aoU
-aoU
-arO
-arO
-aoU
-arO
-arO
-aoU
-axU
-azA
-aoU
-aBX
-aoU
-aEn
-aFO
+apc
+apS
+apS
+arN
+arN
+cLU
+arN
+arN
+apS
+apS
+azz
+apS
+aBZ
+aDe
+aEu
+aFN
aHq
aIm
aJu
-aKC
+aKB
aHp
-aHp
-aNw
-afS
-alS
-amK
-akp
-aOH
-akp
-akp
-cYl
-akp
-afp
+adZ
afV
+afV
+alR
+amK
+alS
+afV
+akp
+akp
+akp
akq
-akp
+avh
+awu
+alr
+aOF
afS
-akp
-akp
-ajo
+afV
+afS
+afV
akR
akR
aaa
@@ -151955,52 +156967,52 @@ aaa
aaa
aaa
akR
-akR
+alx
alx
alx
anV
-ape
-ape
-aqQ
-arP
-asH
-atI
-auN
-cZe
-apQ
-axV
-azB
-aAS
-aBW
-aDf
-aEv
-aFP
+apd
+aoU
+aoU
+arO
+arO
+aoU
+arO
+arO
+aoU
+axU
+azA
+aoU
+aBX
+aoU
+aEn
+aFO
aHq
-aIn
-aJv
-aKD
-cNU
-cOb
-cOf
-aOE
-cOs
-cYK
-afS
-afV
-afV
-afV
-aez
-afS
-afV
+aIm
+aJu
+aKC
+aHp
+aHp
+aNw
afS
+alS
+amK
akp
-aXg
+aOH
akp
akp
+cYl
+akp
+afp
+afV
+akq
+akp
+afS
+akp
akp
ajo
-aaa
-aaa
+akR
+akR
aaa
aaa
aaa
@@ -152211,49 +157223,49 @@ aaa
aaa
aaa
aaa
-aaa
akR
akR
-ank
-ank
-apf
-apf
-aqR
-ank
-ank
-ank
-ank
-ank
-ank
-ank
-azC
-ank
-ank
+alx
+alx
anV
-anV
-anV
-aHp
-aHp
-aHp
-aHp
-aHp
-aHp
-cYn
-aCr
-apu
-dbk
+ape
+ape
+aqQ
+arP
+asH
+atI
+auN
+cZe
+apQ
+axV
+azB
+aAS
+aBW
+aDf
+aEv
+aFP
+aHq
+aIn
+aJv
+aKD
+cNU
+cOb
+cOf
+aOE
+cOs
+cYK
afS
-alx
-and
-and
-and
-alx
-alx
+afV
+afV
+afV
+aez
+afS
+afV
afS
akp
-aXh
-afV
-aXQ
+aXg
+akp
+akp
akp
ajo
aaa
@@ -152469,49 +157481,49 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
+akR
+akR
ank
-anW
-apg
-apT
-aqS
-aph
ank
-atJ
-atJ
-avV
-axd
-axW
-azD
-aAT
+apf
+apf
+aqR
ank
-adZ
+ank
+ank
+ank
+ank
+ank
+ank
+azC
+ank
+ank
+anV
+anV
+anV
+aHp
+aHp
+aHp
+aHp
+aHp
+aHp
+cYn
+aCr
+apu
+dbk
afS
-afV
-adZ
-adZ
-aJw
-aCr
-day
-aCr
-aNx
-aus
-afq
-afV
-aez
alx
and
and
and
-and
+alx
alx
afS
-aRj
-aXi
-afS
-ala
-ajr
+akp
+aXh
+afV
+aXQ
+akp
ajo
aaa
aaa
@@ -152729,69 +157741,69 @@ aaa
aaa
aaa
ank
-anX
+anW
+apg
+apT
+aqS
aph
-apU
-aqT
-arQ
-asI
-atK
-auO
-auO
-auO
-avW
-azE
-avW
ank
-cZB
-cYl
-aoR
-ahr
-aqj
-apu
-akq
-alS
-akp
-aNy
-afS
+atJ
+atJ
+avV
+axd
+axW
+azD
+aAT
+ank
adZ
+afS
+afV
+adZ
+adZ
+aJw
+aCr
+day
+aCr
+aNx
+aus
+afq
+afV
aez
-and
alx
and
and
and
and
alx
-afV
-afV
-afV
-afV
-afV
-afV
-afV
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-bbp
+afS
+aRj
+aXi
+afS
+ala
+ajr
+ajo
+aaa
+aaa
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+bbo
bbo
bbq
bgp
@@ -152983,72 +157995,72 @@ aaa
aaa
aaa
aaa
-akR
-akR
+aaa
+aaa
ank
-anY
-api
-apV
-apV
-apV
-asJ
-atL
-atL
-avX
-atL
-atL
-azF
-aAU
+anX
+aph
+apU
+aqT
+arQ
+asI
+atK
+auO
+auO
+auO
+avW
+azE
+avW
ank
-aDg
-auE
+cZB
+cYl
+aoR
+ahr
+aqj
apu
-aqH
-afq
-afq
-aKE
-adZ
+akq
+alS
+akp
+aNy
+afS
adZ
+aez
+and
+alx
+and
+and
+and
+and
+alx
afV
-adZ
-alx
-alx
-alx
-alx
-and
-and
-and
-and
-alx
-alx
-akR
-akR
-alx
-alx
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-baW
+afV
+afV
+afV
+afV
+afV
+afV
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+bbp
bbo
bbq
bbq
@@ -153241,29 +158253,32 @@ aaa
aaa
aaa
akR
-alx
+akR
ank
-anZ
-apj
-apW
-aqU
-arR
+anY
+api
+apV
+apV
+apV
+asJ
+atL
+atL
+avX
+atL
+atL
+azF
+aAU
ank
-atM
-auP
-avW
-avW
-axX
-azG
-aAV
-ank
-afK
-aUW
-aoy
-apx
-anN
+aDg
+auE
+apu
+aqH
+afq
+afq
+aKE
+adZ
+adZ
afV
-afS
adZ
alx
alx
@@ -153273,15 +158288,12 @@ and
and
and
and
-and
-and
-and
+alx
alx
akR
akR
-akR
-akR
-akR
+alx
+alx
aaa
aaa
aaa
@@ -153496,31 +158508,31 @@ aaa
aaa
aaa
aaa
-akR
+aaa
akR
alx
ank
+anZ
+apj
+apW
+aqU
+arR
ank
+atM
+auP
+avW
+avW
+axX
+azG
+aAV
ank
-ank
-ank
-ank
-ank
-ank
-auQ
-avY
-auQ
-ank
-ank
-ank
-ank
+afK
+aUW
+aoy
+apx
+anN
afV
afS
-afS
-adZ
-adZ
-adZ
-adZ
adZ
alx
alx
@@ -153534,7 +158546,7 @@ and
and
and
alx
-alx
+akR
akR
akR
akR
@@ -153754,46 +158766,46 @@ aaa
aaa
aaa
akR
+akR
+alx
+ank
+ank
+ank
+ank
+ank
+ank
+ank
+ank
+auQ
+avY
+auQ
+ank
+ank
+ank
+ank
+afV
+afS
+afS
+adZ
+adZ
+adZ
+adZ
+adZ
alx
alx
alx
alx
-alx
+and
+and
+and
+and
+and
+and
+and
alx
alx
akR
akR
-atN
-auR
-avW
-avW
-atN
-akR
-akR
-alx
-alx
-and
-and
-and
-alx
-alx
-alx
-alx
-and
-and
-and
-and
-and
-and
-and
-and
-alx
-alx
-alx
-alx
-alx
-alx
-alx
akR
akR
aaa
@@ -154010,32 +159022,32 @@ aaa
aaa
aaa
aaa
-aaa
-alF
akR
-alF
alx
alx
alx
alx
-aaa
+alx
+alx
+alx
+akR
akR
atN
-auS
+auR
+avW
avW
-axe
atN
-aaa
akR
akR
alx
+alx
and
and
and
-and
-and
-and
-and
+alx
+alx
+alx
+alx
and
and
and
@@ -154051,8 +159063,8 @@ alx
alx
alx
alx
-alx
-alx
+akR
+akR
aaa
aaa
aaa
@@ -154268,48 +159280,48 @@ aaa
aaa
aaa
aaa
-abC
-aaa
-abC
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-atN
-atN
-avZ
-atN
-atN
-aaa
+alF
+akR
+alF
+alx
+alx
+alx
+alx
aaa
akR
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
+atN
+auS
+avW
+axe
+atN
aaa
+akR
+akR
+alx
+and
+and
+and
+and
+and
+and
+and
+and
+and
+and
+and
+and
+and
+and
+and
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
aaa
aaa
aaa
@@ -154533,19 +159545,19 @@ aaa
aaa
aaa
aaa
-asK
-asK
-asL
-awa
-asL
-asK
-asK
-aaa
-aaa
-aaa
-aaa
+aaa
+atN
+atN
+avZ
+atN
+atN
aaa
aaa
+akR
+alx
+alx
+alx
+alx
alx
alx
alx
@@ -154791,11 +159803,11 @@ aaa
aaa
aaa
asK
-atO
-auT
-auT
-auU
-axY
+asK
+asL
+awa
+asL
+asK
asK
aaa
aaa
@@ -154803,52 +159815,52 @@ aaa
aaa
aaa
aaa
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
aaa
aaa
aaa
aaa
-alx
-alx
-alx
-alx
-alx
-and
-alx
-alx
-alx
-and
-alx
-alF
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-bbp
+aaa
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+bbo
bbo
bbq
bgs
@@ -155047,16 +160059,13 @@ aaa
aaa
aaa
aaa
-asL
-atP
-auU
+asK
+atO
+auT
auT
auU
-axZ
-azH
-aaa
-aaa
-aaa
+axY
+asK
aaa
aaa
aaa
@@ -155072,41 +160081,44 @@ alx
alx
alx
alx
+and
alx
alx
alx
+and
alx
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-bbo
+alF
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+bbp
bbq
bgp
bit
@@ -155304,14 +160316,13 @@ aaa
aaa
aaa
aaa
-asK
-atQ
-auT
+asL
+atP
+auU
auT
auU
-aya
-asK
-aaa
+axZ
+azH
aaa
aaa
aaa
@@ -155329,6 +160340,11 @@ alx
alx
alx
alx
+alx
+alx
+alx
+alx
+alx
aaa
aaa
aaa
@@ -155338,10 +160354,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aac
aab
aaa
aaa
@@ -155562,11 +160574,11 @@ aaa
aaa
aaa
asK
-asK
-asL
-awb
-asL
-asK
+atQ
+auT
+auT
+auU
+aya
asK
aaa
aaa
@@ -155577,9 +160589,15 @@ aaa
aaa
aaa
aad
-aab
-aab
-aab
+aaa
+aaa
+aaa
+aaa
+aaa
+alx
+alx
+alx
+alx
aaa
aaa
aaa
@@ -155592,13 +160610,7 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aab
-aaa
-aaa
+aac
aaa
aac
aad
@@ -155818,13 +160830,13 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+asK
+asK
+asL
+awb
+asL
+asK
+asK
aaa
aaa
aaa
@@ -155853,7 +160865,7 @@ aaa
aaa
aaa
aaa
-aaa
+aab
aaa
aaa
aab
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 4382ec68d4..f30c7b69f3 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -128204,7 +128204,7 @@ cRi
cRi
daP
cLE
-cRi
+dlV
aaa
aaa
aaf
@@ -128460,7 +128460,7 @@ daF
daJ
cRi
bvT
-dlV
+cRi
cRi
cRi
cRi
@@ -128717,7 +128717,7 @@ cSn
cSn
cRi
dmq
-dlV
+cRi
cZv
cZv
cRi
@@ -129745,7 +129745,7 @@ cSn
daN
cRi
dmr
-dlV
+cRi
cZv
dbw
cRi
@@ -130002,7 +130002,7 @@ daI
daM
cRi
cTA
-dlV
+cRi
cRi
cRi
cRi
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index 7c66721381..2af4f3bd30 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -41962,6 +41962,262 @@
/obj/machinery/light,
/turf/open/floor/plasteel/neutral/side,
/area/shuttle/escape)
+"bvS" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bvT" = (
+/obj/structure/grille,
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/transport)
+"bvU" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bvV" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bvW" = (
+/obj/machinery/door/airlock/external,
+/turf/open/floor/pod/dark,
+/area/shuttle/transport)
+"bvX" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bvY" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bvZ" = (
+/obj/structure/grille,
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/transport)
+"bwa" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bwb" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8;
+ icon_state = "propulsion_l"
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/transport)
+"bwc" = (
+/obj/structure/shuttle/engine/heater{
+ icon_state = "heater";
+ dir = 8
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/plating/airless,
+/area/shuttle/transport)
+"bwd" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bwe" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bwf" = (
+/obj/structure/chair,
+/turf/open/floor/pod/dark,
+/area/shuttle/transport)
+"bwg" = (
+/obj/structure/chair,
+/turf/open/floor/pod/dark,
+/area/shuttle/transport)
+"bwh" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwi" = (
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwj" = (
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwk" = (
+/obj/structure/chair,
+/turf/open/floor/pod/dark,
+/area/shuttle/transport)
+"bwl" = (
+/obj/structure/chair,
+/turf/open/floor/pod/dark,
+/area/shuttle/transport)
+"bwm" = (
+/obj/structure/grille,
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/transport)
+"bwn" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8;
+ icon_state = "propulsion_l"
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/transport)
+"bwo" = (
+/obj/structure/shuttle/engine/heater{
+ icon_state = "heater";
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/transport)
+"bwp" = (
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwq" = (
+/obj/machinery/light/small,
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwr" = (
+/obj/machinery/door/airlock/titanium,
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bws" = (
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwt" = (
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwu" = (
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwv" = (
+/obj/machinery/computer/shuttle/ferry/request,
+/turf/open/floor/pod/dark,
+/area/shuttle/transport)
+"bww" = (
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwx" = (
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwy" = (
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwz" = (
+/obj/machinery/door/airlock/titanium,
+/obj/docking_port/mobile{
+ dir = 8;
+ dwidth = 2;
+ height = 13;
+ id = "ferry";
+ name = "ferry shuttle";
+ port_angle = 0;
+ preferred_direction = 4;
+ roundstart_move = "ferry_away";
+ width = 5
+ },
+/obj/docking_port/stationary{
+ dir = 8;
+ dwidth = 2;
+ height = 13;
+ id = "ferry_home";
+ name = "port bay 2";
+ turf_type = /turf/open/space;
+ width = 5
+ },
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwA" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8;
+ icon_state = "propulsion_l"
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/transport)
+"bwB" = (
+/obj/structure/shuttle/engine/heater{
+ icon_state = "heater";
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1;
+ pixel_y = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/transport)
+"bwC" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bwD" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bwE" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/transport)
+"bwF" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/transport)
+"bwG" = (
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwH" = (
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwI" = (
+/obj/machinery/light,
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwJ" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/transport)
+"bwK" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/transport)
+"bwL" = (
+/obj/structure/grille,
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/transport)
+"bwM" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bwN" = (
+/obj/structure/grille,
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/transport)
+"bwO" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bwP" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bwQ" = (
+/obj/machinery/door/airlock/external,
+/turf/open/floor/pod/light,
+/area/shuttle/transport)
+"bwR" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bwS" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"bwT" = (
+/obj/structure/grille,
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/transport)
+"bwU" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
(1,1,1) = {"
aaa
@@ -77332,7 +77588,7 @@ aaa
aaa
aaa
aaa
-aaa
+bwn
aaa
aaa
aaa
@@ -77588,9 +77844,9 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
+bwb
+bwo
+bwA
aaa
aaa
aaa
@@ -77845,9 +78101,9 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
+bwc
+bwp
+bwB
aaa
aaa
aaa
@@ -78102,9 +78358,9 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
+bwd
+bwq
+bwC
aaa
aaa
aaa
@@ -78358,11 +78614,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+bvS
+bwe
+bwr
+bwD
+bwM
aaa
aaa
aaa
@@ -78615,11 +78871,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+bvT
+bwf
+bws
+bwE
+bwN
aaa
aaa
aaa
@@ -78872,11 +79128,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+bvU
+bwg
+bwt
+bwF
+bwO
aaa
aaa
aaa
@@ -79129,11 +79385,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+bvV
+bwh
+bwu
+bwG
+bwP
aaa
aaa
aaa
@@ -79386,11 +79642,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+bvW
+bwi
+bwv
+bwH
+bwQ
aaa
aaa
aaa
@@ -79643,11 +79899,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+bvX
+bwj
+bww
+bwI
+bwR
aaa
aaa
aaa
@@ -79900,11 +80156,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+bvY
+bwk
+bwx
+bwJ
+bwS
aaa
aaa
aaa
@@ -80157,11 +80413,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+bvZ
+bwl
+bwy
+bwK
+bwT
aaa
aaa
aaa
@@ -80414,11 +80670,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+bwa
+bwm
+bwz
+bwL
+bwU
aaa
aaa
aaa
diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm
index eb148e7b59..ebc69a5f2b 100644
--- a/code/__DEFINES/MC.dm
+++ b/code/__DEFINES/MC.dm
@@ -13,6 +13,10 @@
#define MC_AVERAGE_FAST(average, current) (0.7 * (average) + 0.3 * (current))
#define MC_AVERAGE(average, current) (0.8 * (average) + 0.2 * (current))
#define MC_AVERAGE_SLOW(average, current) (0.9 * (average) + 0.1 * (current))
+
+#define MC_AVG_FAST_UP_SLOW_DOWN(average, current) (average > current ? MC_AVERAGE_SLOW(average, current) : MC_AVERAGE_FAST(average, current))
+#define MC_AVG_SLOW_UP_FAST_DOWN(average, current) (average < current ? MC_AVERAGE_SLOW(average, current) : MC_AVERAGE_FAST(average, current))
+
#define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){Recover();qdel(varname);}varname = src;}
#define START_PROCESSING(Processor, Datum) if (!Datum.isprocessing) {Datum.isprocessing = 1;Processor.processing += Datum}
diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm
index fd98a68e07..7cfed2b483 100644
--- a/code/__DEFINES/lighting.dm
+++ b/code/__DEFINES/lighting.dm
@@ -16,10 +16,10 @@
#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 \
) \
@@ -78,4 +78,11 @@
#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
\ No newline at end of file
+#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
\ No newline at end of file
diff --git a/code/__DEFINES/menu.dm b/code/__DEFINES/menu.dm
new file mode 100644
index 0000000000..2730adf87c
--- /dev/null
+++ b/code/__DEFINES/menu.dm
@@ -0,0 +1,3 @@
+#define CHECKBOX_NONE 0
+#define CHECKBOX_GROUP 1
+#define CHECKBOX_TOGGLE 2
\ No newline at end of file
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index 0bfbe31fb1..043158da11 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -33,4 +33,8 @@
#define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark
#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run
+#define STATUS_EFFECT_MANIAMOTOR /datum/status_effect/maniamotor //disrupts, damages, and confuses the affected as long as they're in range of the motor
+#define MAX_MANIA_SEVERITY 100 //how high the mania severity can go
+#define MANIA_DAMAGE_TO_CONVERT 90 //how much damage is required before it'll convert affected targets
+
#define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath.
diff --git a/code/__DEFINES/status_effects.dm.rej b/code/__DEFINES/status_effects.dm.rej
new file mode 100644
index 0000000000..929dfc37dc
--- /dev/null
+++ b/code/__DEFINES/status_effects.dm.rej
@@ -0,0 +1,10 @@
+diff a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm (rejected hunks)
+@@ -33,4 +33,8 @@
+ #define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark
+ #define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run
+
++#define STATUS_EFFECT_MANIAMOTOR /datum/status_effect/maniamotor //disrupts, damages, and confuses the affected as long as they're in range of the motor
++#define MAX_MANIA_SEVERITY 100 //how high the mania severity can go
++#define MANIA_DAMAGE_TO_CONVERT 90 //how much damage is required before it'll convert affected targets
++
+ #define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath.
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index c0797819bc..8f340bff46 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -457,6 +457,7 @@
#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null)
#define LAZYLEN(L) length(L)
#define LAZYCLEARLIST(L) if(L) L.Cut()
+#define SANITIZE_LIST(L) ( islist(L) ? L : list() )
/* Definining a counter as a series of key -> numeric value entries
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index 2785ba896f..a2a878211a 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -20,13 +20,13 @@
/proc/log_admin(text)
GLOB.admin_log.Add(text)
if (config.log_admin)
- GLOB.diary << "\[[time_stamp()]]ADMIN: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]ADMIN: [text]"
//Items using this proc are stripped from public logs - use with caution
/proc/log_admin_private(text)
GLOB.admin_log.Add(text)
if (config.log_admin)
- GLOB.diary << "\[[time_stamp()]]ADMINPRIVATE: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]ADMINPRIVATE: [text]"
/proc/log_adminsay(text)
if (config.log_adminchat)
@@ -38,67 +38,64 @@
/proc/log_game(text)
if (config.log_game)
- GLOB.diary << "\[[time_stamp()]]GAME: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]GAME: [text]"
/proc/log_vote(text)
if (config.log_vote)
- GLOB.diary << "\[[time_stamp()]]VOTE: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]VOTE: [text]"
/proc/log_access(text)
if (config.log_access)
- GLOB.diary << "\[[time_stamp()]]ACCESS: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]ACCESS: [text]"
/proc/log_say(text)
if (config.log_say)
- GLOB.diary << "\[[time_stamp()]]SAY: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]SAY: [text]"
/proc/log_prayer(text)
if (config.log_prayer)
- GLOB.diary << "\[[time_stamp()]]PRAY: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]PRAY: [text]"
/proc/log_law(text)
if (config.log_law)
- GLOB.diary << "\[[time_stamp()]]LAW: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]LAW: [text]"
/proc/log_ooc(text)
if (config.log_ooc)
- GLOB.diary << "\[[time_stamp()]]OOC: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]OOC: [text]"
/proc/log_whisper(text)
if (config.log_whisper)
- GLOB.diary << "\[[time_stamp()]]WHISPER: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]WHISPER: [text]"
/proc/log_emote(text)
if (config.log_emote)
- GLOB.diary << "\[[time_stamp()]]EMOTE: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]EMOTE: [text]"
/proc/log_attack(text)
if (config.log_attack)
- GLOB.diaryofmeanpeople << "\[[time_stamp()]]ATTACK: [text]"
+ GLOB.world_attack_log << "\[[time_stamp()]]ATTACK: [text]"
/proc/log_pda(text)
if (config.log_pda)
- GLOB.diary << "\[[time_stamp()]]PDA: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]PDA: [text]"
/proc/log_comment(text)
if (config.log_pda)
//reusing the PDA option because I really don't think news comments are worth a config option
- GLOB.diary << "\[[time_stamp()]]COMMENT: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]COMMENT: [text]"
/proc/log_chat(text)
if (config.log_pda)
- GLOB.diary << "\[[time_stamp()]]CHAT: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]CHAT: [text]"
/proc/log_sql(text)
if(config.sql_enabled)
- GLOB.diary << "\[[time_stamp()]]SQL: [text]"
+ GLOB.world_game_log << "\[[time_stamp()]]SQL: [text]"
//This replaces world.log so it displays both in DD and the file
/proc/log_world(text)
- if(config && config.log_runtimes)
- world.log = GLOB.runtime_diary
- world.log << text
- world.log = null
+ GLOB.world_runtime_log << text
world.log << text
// Helper procs for building detailed log lines
diff --git a/code/__HELPERS/bandetect.dm b/code/__HELPERS/bandetect.dm
deleted file mode 100644
index 19c0d37838..0000000000
--- a/code/__HELPERS/bandetect.dm
+++ /dev/null
@@ -1,37 +0,0 @@
-#define YOUNG 4
-
-
-/client/proc/join_date_check(y,m,d)
- var/datum/DBQuery/query_datediff = SSdbcore.NewQuery("SELECT DATEDIFF(Now(),'[y]-[m]-[d]')")
-
- if(!query_datediff.Execute())
- return FALSE
-
- if(query_datediff.NextRow())
- var/diff = text2num(query_datediff.item[1])
- if(config.use_account_age_for_jobs)
- player_age = max(0,diff) //So job code soesn't freak out if they are time traveling.
- if(diff < YOUNG)
- var/msg = "(IP: [address], ID: [computer_id]) is a new BYOND account made on [y]-[m]-[d]."
- if(diff < 0)
- msg += " They are also apparently from the future."
- message_admins("[key_name_admin(src)] [msg]")
- return TRUE
-#undef YOUNG
-
-
-/client/proc/findJoinDate()
- var/http[] = world.Export("http://byond.com/members/[src.ckey]?format=text")
- if(!http)
- log_world("Failed to connect to byond age check for [src.ckey]")
- return FALSE
-
- var/F = file2text(http["CONTENT"])
- if(F)
- var/regex/R = regex("joined = \"(\\d{4})-(\\d{2})-(\\d{2})\"")
- if(!R.Find(F))
- CRASH("Age check regex failed")
- var/y = R.group[1]
- var/m = R.group[2]
- var/d = R.group[3]
- return join_date_check(y,m,d)
diff --git a/code/__HELPERS/text_vr.dm b/code/__HELPERS/text_vr.dm
index 06aadb6708..7cd683f456 100644
--- a/code/__HELPERS/text_vr.dm
+++ b/code/__HELPERS/text_vr.dm
@@ -24,4 +24,4 @@ GLOBAL_LIST_EMPTY(whitelisted_species_list)
/proc/log_mentor(text)
GLOB.mentor_log.Add(text)
- GLOB.diary << "\[[time_stamp()]]MENTOR: [text]"
\ No newline at end of file
+ GLOB.world_game_log << "\[[time_stamp()]]MENTOR: [text]"
\ No newline at end of file
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index 849c5248a0..59885b3432 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -104,5 +104,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/weapon/storage/secure/briefcase = 3,
/obj/item/weapon/storage/toolbox/artistic = 2,
/obj/item/toy/eightball = 1,
+ /obj/item/weapon/storage/daki = 3,
"" = 3
))
diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm
index 35adcef36c..00665bdfe2 100644
--- a/code/_globalvars/logging.dm
+++ b/code/_globalvars/logging.dm
@@ -1,28 +1,34 @@
-GLOBAL_VAR(diary)
-GLOBAL_PROTECT(diary)
-GLOBAL_VAR(runtime_diary)
-GLOBAL_PROTECT(runtime_diary)
-GLOBAL_VAR(diaryofmeanpeople)
-GLOBAL_PROTECT(diaryofmeanpeople)
-GLOBAL_VAR(href_logfile)
-GLOBAL_PROTECT(href_logfile)
-
-GLOBAL_LIST_EMPTY(bombers)
-GLOBAL_PROTECT(bombers)
-GLOBAL_LIST_EMPTY(admin_log)
-GLOBAL_PROTECT(admin_log)
-GLOBAL_LIST_EMPTY(lastsignalers) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]"
-GLOBAL_PROTECT(lastsignalers)
-GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
-GLOBAL_PROTECT(lawchanges)
-
-GLOBAL_LIST_EMPTY(combatlog)
-GLOBAL_PROTECT(combatlog)
-GLOBAL_LIST_EMPTY(IClog)
-GLOBAL_PROTECT(IClog)
-GLOBAL_LIST_EMPTY(OOClog)
-GLOBAL_PROTECT(OOClog)
-GLOBAL_LIST_EMPTY(adminlog)
-GLOBAL_PROTECT(adminlog)
-
+GLOBAL_VAR(log_directory)
+GLOBAL_PROTECT(log_directory)
+GLOBAL_VAR(world_game_log)
+GLOBAL_PROTECT(world_game_log)
+GLOBAL_VAR(world_runtime_log)
+GLOBAL_PROTECT(world_runtime_log)
+GLOBAL_VAR(world_attack_log)
+GLOBAL_PROTECT(world_attack_log)
+GLOBAL_VAR(world_href_log)
+GLOBAL_PROTECT(world_href_log)
+GLOBAL_VAR(round_id)
+GLOBAL_PROTECT(round_id)
+GLOBAL_VAR(config_error_log)
+GLOBAL_PROTECT(config_error_log)
+
+GLOBAL_LIST_EMPTY(bombers)
+GLOBAL_PROTECT(bombers)
+GLOBAL_LIST_EMPTY(admin_log)
+GLOBAL_PROTECT(admin_log)
+GLOBAL_LIST_EMPTY(lastsignalers) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]"
+GLOBAL_PROTECT(lastsignalers)
+GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
+GLOBAL_PROTECT(lawchanges)
+
+GLOBAL_LIST_EMPTY(combatlog)
+GLOBAL_PROTECT(combatlog)
+GLOBAL_LIST_EMPTY(IClog)
+GLOBAL_PROTECT(IClog)
+GLOBAL_LIST_EMPTY(OOClog)
+GLOBAL_PROTECT(OOClog)
+GLOBAL_LIST_EMPTY(adminlog)
+GLOBAL_PROTECT(adminlog)
+
GLOBAL_LIST_EMPTY(active_turfs_startlist)
\ No newline at end of file
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 0fe37a9286..9272abbdb6 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -107,64 +107,112 @@
var/obj/item/W = get_active_held_item()
-
if(W == A)
W.attack_self(src)
update_inv_hands()
return
-
- // operate three levels deep here (item in backpack in src; item in box in backpack in src, not any deeper)
- if(A.ClickAccessible(src, depth=INVENTORY_DEPTH))
- // No adjacency needed
+
+ //These are always reachable.
+ //User itself, current loc, and user inventory
+ if(DirectAccess(A))
if(W)
- melee_item_attack_chain(src, W, A, params)
+ melee_item_attack_chain(src,W,A,params)
else
if(ismob(A))
changeNext_move(CLICK_CD_MELEE)
UnarmedAttack(A)
return
-
- if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that
+
+ //Can't reach anything else in lockers or other weirdness
+ if(!loc.AllowClick())
return
- // Allows you to click on a box's contents, if that box is on the ground, but no deeper than that
- if(isturf(A) || isturf(A.loc) || (A.loc && isturf(A.loc.loc)))
- if(Adjacent(A) || (W && CheckReach(src, A, W.reach))) //Adjacent or reaching attacks
- if(W)
- melee_item_attack_chain(src, W, A, params)
- else
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- UnarmedAttack(A, 1)
- return
- else // non-adjacent click
- if(W)
- W.afterattack(A,src,0,params) // 0: not Adjacent
- else
- RangedAttack(A, params)
+ //Standard reach turf to turf or reaching inside storage
+ if(CanReach(A,W))
+ if(W)
+ melee_item_attack_chain(src,W,A,params)
+ else
+ if(ismob(A))
+ changeNext_move(CLICK_CD_MELEE)
+ UnarmedAttack(A,1)
+ else
+ if(W)
+ W.afterattack(A,src,0,params)
+ else
+ RangedAttack(A,params)
+
+/atom/movable/proc/CanReach(atom/target,obj/item/tool,view_only = FALSE)
+ if(isturf(target) || isturf(target.loc) || DirectAccess(target)) //Directly accessible atoms
+ if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks
+ return TRUE
+ else
+ //Things inside storage insde another storage
+ //Eg Contents of a box in a backpack
+ var/atom/outer_storage = get_atom_on_turf(target)
+ if(outer_storage == target) //whatever that is we don't want infinite loop.
+ return FALSE
+ if(outer_storage && CanReach(outer_storage,tool) && outer_storage.CanReachStorage(target,src,view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH))
+ return TRUE
+ return FALSE
+
+//Can [target] in this container be reached by [user], can't be more than [depth] levels deep
+/atom/proc/CanReachStorage(atom/target,user,depth)
+ return FALSE
+
+/obj/item/weapon/storage/CanReachStorage(atom/target,user,depth)
+ while(target && depth > 0)
+ target = target.loc
+ depth--
+ if(target == src)
+ return TRUE
+ return FALSE
+
+/atom/movable/proc/DirectAccess(atom/target)
+ if(target == src)
+ return TRUE
+ if(target == loc)
+ return TRUE
+
+/mob/DirectAccess(atom/target)
+ if(..())
+ return TRUE
+ if(target in contents) //This could probably use moving down and restricting to inventory only
+ return TRUE
+ return FALSE
+
+/mob/living/DirectAccess(atom/target)
+ if(..()) //Lightweight checks first
+ return TRUE
+ if(target in GetAllContents())
+ return TRUE
+
+/atom/proc/AllowClick()
+ return FALSE
+
+/turf/AllowClick()
+ return TRUE
-/proc/CheckReach(atom/movable/here, atom/movable/there, reach)
+/proc/CheckToolReach(atom/movable/here, atom/movable/there, reach)
if(!here || !there)
return
switch(reach)
if(0)
- return here.loc == there.loc
+ return FALSE
if(1)
- return here.Adjacent(there)
+ return FALSE //here.Adjacent(there)
if(2 to INFINITY)
- var/obj/dummy = new(get_turf(here)) //We'll try to move this every tick, failing if we can't
+ var/obj/dummy = new(get_turf(here))
dummy.pass_flags |= PASSTABLE
+ dummy.invisibility = INVISIBILITY_ABSTRACT
for(var/i in 1 to reach) //Limit it to that many tries
var/turf/T = get_step(dummy, get_dir(dummy, there))
- if(dummy.loc == there.loc)
+ if(dummy.CanReach(there))
qdel(dummy)
- return 1
- if(there.density && dummy in range(1, there)) //For windows and suchlike
- qdel(dummy)
- return 1
+ return TRUE
if(!dummy.Move(T)) //we're blocked!
qdel(dummy)
return
+ qdel(dummy)
// Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click)
/mob/proc/DblClickOn(atom/A, params)
@@ -304,21 +352,6 @@
/atom/proc/CtrlShiftClick(mob/user)
return
-/*
- Helper to check can the mob click/access an item.
- Used by mob inventory and storage items.
-*/
-/atom/proc/ClickAccessible(mob/user, depth=1)
- if(src == user.loc || (src in user.contents))
- return TRUE
-
- if(loc && depth > 1)
- return loc.ClickAccessible(user, depth-1)
-
-/turf/ClickAccessible(mob/user, depth=1)
- return
-
-
/*
Misc helpers
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 9c8fe9750a..b376706a42 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -393,6 +393,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
textlist += "
"
else
textlist += "Seconds until Ratvar's arrival: [G.get_arrival_text(TRUE)]
"
+ break
if(unconverted_ais_exist)
if(unconverted_ais_exist > 1)
textlist += "[unconverted_ais_exist] unconverted AIs exist!
"
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 6fd3969cd3..4d9c819ef9 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -43,10 +43,8 @@
var/log_attack = 0 // log attack messages
var/log_adminchat = 0 // log admin chat messages
var/log_pda = 0 // log pda messages
- var/log_hrefs = 0 // log all links clicked in-game. Could be used for debugging and tracking down exploits
var/log_twitter = 0 // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases.
var/log_world_topic = 0 // log all world.Topic() calls
- var/log_runtimes = FALSE // log runtimes into a file
var/sql_enabled = 0 // for sql switching
var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour
var/allow_vote_restart = 0 // allow votes to restart
@@ -129,6 +127,7 @@
var/forbid_peaceborg = 0
var/panic_bunker = 0 // prevents new people it hasn't seen before from connecting
var/notify_new_player_age = 0 // how long do we notify admins of a new player
+ var/notify_new_player_account_age = 0 // how long do we notify admins of a new byond account
var/irc_first_connection_alert = 0 // do we notify the irc channel when somebody is connecting for the first time?
var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors
@@ -269,7 +268,7 @@
if(M.config_tag)
if(!(M.config_tag in modes)) // ensure each mode is added only once
- GLOB.diary << "Adding game mode [M.name] ([M.config_tag]) to configuration."
+ GLOB.config_error_log << "Adding game mode [M.name] ([M.config_tag]) to configuration."
modes += M.config_tag
mode_names[M.config_tag] = M.name
probabilities[M.config_tag] = M.probability
@@ -358,8 +357,6 @@
log_adminchat = 1
if("log_pda")
log_pda = 1
- if("log_hrefs")
- log_hrefs = 1
if("log_twitter")
log_twitter = 1
if("log_world_topic")
@@ -476,6 +473,8 @@
panic_bunker = 1
if("notify_new_player_age")
notify_new_player_age = text2num(value)
+ if("notify_new_player_account_age")
+ notify_new_player_account_age = text2num(value)
if("irc_first_connection_alert")
irc_first_connection_alert = 1
if("check_randomizer")
@@ -493,12 +492,6 @@
ipintel_save_bad = text2num(value)
if("aggressive_changelog")
aggressive_changelog = 1
- if("log_runtimes")
- log_runtimes = TRUE
- var/newlog = file("data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log")
- if(GLOB.runtime_diary != newlog)
- world.log << "Now logging runtimes to data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log"
- GLOB.runtime_diary = newlog
if("autoconvert_notes")
autoconvert_notes = 1
if("allow_webclient")
@@ -542,7 +535,7 @@
if("error_msg_delay")
error_msg_delay = text2num(value)
else
- GLOB.diary << "Unknown setting in configuration: '[name]'"
+ GLOB.config_error_log << "Unknown setting in configuration: '[name]'"
else if(type == "game_options")
switch(name)
@@ -605,13 +598,13 @@
if(mode_name in modes)
continuous[mode_name] = 1
else
- GLOB.diary << "Unknown continuous configuration definition: [mode_name]."
+ GLOB.config_error_log << "Unknown continuous configuration definition: [mode_name]."
if("midround_antag")
var/mode_name = lowertext(value)
if(mode_name in modes)
midround_antag[mode_name] = 1
else
- GLOB.diary << "Unknown midround antagonist configuration definition: [mode_name]."
+ GLOB.config_error_log << "Unknown midround antagonist configuration definition: [mode_name]."
if("midround_antag_time_check")
midround_antag_time_check = text2num(value)
if("midround_antag_life_check")
@@ -627,9 +620,9 @@
if(mode_name in modes)
min_pop[mode_name] = text2num(mode_value)
else
- GLOB.diary << "Unknown minimum population configuration definition: [mode_name]."
+ GLOB.config_error_log << "Unknown minimum population configuration definition: [mode_name]."
else
- GLOB.diary << "Incorrect minimum population configuration definition: [mode_name] [mode_value]."
+ GLOB.config_error_log << "Incorrect minimum population configuration definition: [mode_name] [mode_value]."
if("max_pop")
var/pop_pos = findtext(value, " ")
var/mode_name = null
@@ -641,9 +634,9 @@
if(mode_name in modes)
max_pop[mode_name] = text2num(mode_value)
else
- GLOB.diary << "Unknown maximum population configuration definition: [mode_name]."
+ GLOB.config_error_log << "Unknown maximum population configuration definition: [mode_name]."
else
- GLOB.diary << "Incorrect maximum population configuration definition: [mode_name] [mode_value]."
+ GLOB.config_error_log << "Incorrect maximum population configuration definition: [mode_name] [mode_value]."
if("shuttle_refuel_delay")
shuttle_refuel_delay = text2num(value)
if("show_game_type_odds")
@@ -671,9 +664,9 @@
if(prob_name in modes)
probabilities[prob_name] = text2num(prob_value)
else
- GLOB.diary << "Unknown game mode probability configuration definition: [prob_name]."
+ GLOB.config_error_log << "Unknown game mode probability configuration definition: [prob_name]."
else
- GLOB.diary << "Incorrect probability configuration definition: [prob_name] [prob_value]."
+ GLOB.config_error_log << "Incorrect probability configuration definition: [prob_name] [prob_value]."
if("protect_roles_from_antagonist")
protect_roles_from_antagonist = 1
@@ -720,7 +713,7 @@
// Value is in the form "LAWID,NUMBER"
var/list/L = splittext(value, ",")
if(L.len != 2)
- GLOB.diary << "Invalid LAW_WEIGHT: " + t
+ GLOB.config_error_log << "Invalid LAW_WEIGHT: " + t
continue
var/lawid = L[1]
var/weight = text2num(L[2])
@@ -776,8 +769,8 @@
mentors_mobname_only = 1
if ("mentor_legacy_system")
mentor_legacy_system = 1
- else
- GLOB.diary << "Unknown setting in configuration: '[name]'"
+ // else
+ // GLOB.config_error_log << "Adding game mode [M.name] ([M.config_tag]) to configuration."
fps = round(fps)
if(fps <= 0)
@@ -831,7 +824,7 @@
maplist[currentmap.map_name] = currentmap
currentmap = null
else
- GLOB.diary << "Unknown command in map vote config: '[command]'"
+ GLOB.config_error_log << "Unknown command in map vote config: '[command]'"
/datum/configuration/proc/loadsql(filename)
@@ -875,7 +868,7 @@
if("feedback_tableprefix")
global.sqlfdbktableprefix = value
else
- GLOB.diary << "Unknown setting in configuration: '[name]'"
+ GLOB.config_error_log << "Unknown setting in configuration: '[name]'"
/datum/configuration/proc/pick_mode(mode_name)
// I wish I didn't have to instance the game modes in order to look up
diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm
index cd86e0d97c..89f8a81f20 100644
--- a/code/controllers/globals.dm
+++ b/code/controllers/globals.dm
@@ -52,6 +52,12 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars)
/datum/controller/global_vars/Initialize()
gvars_datum_init_order = list()
gvars_datum_protected_varlist = list("gvars_datum_protected_varlist")
+
+ //See https://github.com/tgstation/tgstation/issues/26954
+ for(var/I in typesof(/datum/controller/global_vars/proc))
+ var/CLEANBOT_RETURNS = "[I]"
+ pass(CLEANBOT_RETURNS)
+
for(var/I in vars - gvars_datum_in_built_vars)
var/start_tick = world.time
call(src, "InitGlobal[I]")()
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index 01d0ac3447..0df2c8cc73 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -280,7 +280,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
// because sleeps are processed in the order received, so longer sleeps are more likely to run first
if (world.tick_usage > TICK_LIMIT_MC)
sleep_delta += 2
- GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.5)
+ GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING * 0.5
sleep(world.tick_lag * (processing + sleep_delta))
continue
@@ -421,26 +421,31 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
else
tick_precentage = tick_remaining
- GLOB.CURRENT_TICKLIMIT = world.tick_usage + tick_precentage
+ tick_precentage = max(tick_precentage*0.5, tick_precentage-queue_node.tick_overrun)
+
+ GLOB.CURRENT_TICKLIMIT = round(world.tick_usage + tick_precentage)
if (!(queue_node_flags & SS_TICKER))
ran_non_ticker = TRUE
ran = TRUE
- tick_usage = world.tick_usage
+
queue_node_paused = (queue_node.state == SS_PAUSED || queue_node.state == SS_PAUSING)
last_type_processed = queue_node
queue_node.state = SS_RUNNING
+ tick_usage = world.tick_usage
var/state = queue_node.ignite(queue_node_paused)
+ tick_usage = world.tick_usage - tick_usage
+
if (state == SS_RUNNING)
state = SS_IDLE
current_tick_budget -= queue_node_priority
- tick_usage = world.tick_usage - tick_usage
+
if (tick_usage < 0)
tick_usage = 0
-
+ queue_node.tick_overrun = max(0, MC_AVG_FAST_UP_SLOW_DOWN(queue_node.tick_overrun, tick_usage-tick_precentage))
queue_node.state = state
if (state == SS_PAUSED)
@@ -467,13 +472,13 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
queue_node.times_fired++
if (queue_node_flags & SS_TICKER)
- queue_node.next_fire = world.time + (world.tick_lag * queue_node.wait)
+ queue_node.next_fire = world.time + (world.tick_lag * (queue_node.wait + (queue_node.tick_overrun/100)))
else if (queue_node_flags & SS_POST_FIRE_TIMING)
- queue_node.next_fire = world.time + queue_node.wait
+ queue_node.next_fire = world.time + queue_node.wait + (world.tick_lag * (queue_node.tick_overrun/100))
else if (queue_node_flags & SS_KEEP_TIMING)
queue_node.next_fire += queue_node.wait
else
- queue_node.next_fire = queue_node.queued_time + queue_node.wait
+ queue_node.next_fire = queue_node.queued_time + queue_node.wait + (world.tick_lag * (queue_node.tick_overrun/100))
queue_node.queued_time = 0
diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm
index f37a9159ef..3332b1c45d 100644
--- a/code/controllers/subsystem.dm
+++ b/code/controllers/subsystem.dm
@@ -17,6 +17,7 @@
var/next_fire = 0 //scheduled world.time for next fire()
var/cost = 0 //average time to execute
var/tick_usage = 0 //average tick usage
+ var/tick_overrun = 0 //average tick overrun
var/state = SS_IDLE //tracks the current state of the ss, running, paused, etc.
var/paused_ticks = 0 //ticks this ss is taking to run right now.
var/paused_tick_usage //total tick_usage of all of our runs while pausing this run
@@ -168,7 +169,7 @@
if(can_fire && !(SS_NO_FIRE in flags))
- msg = "[round(cost,1)]ms|[round(tick_usage,1)]%|[round(ticks,0.1)]\t[msg]"
+ msg = "[round(cost,1)]ms|[round(tick_usage,1)]%([round(tick_overrun,1)]%)|[round(ticks,0.1)]\t[msg]"
else
msg = "OFFLINE\t[msg]"
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index 1b14b352df..a807202c9e 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -42,6 +42,7 @@ SUBSYSTEM_DEF(blackbox)
msg_cargo = SSblackbox.msg_cargo
msg_other = SSblackbox.msg_other
+
feedback = SSblackbox.feedback
//no touchie
@@ -84,25 +85,13 @@ SUBSYSTEM_DEF(blackbox)
if (!SSdbcore.Connect())
return
- var/round_id
-
- var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]")
- if(!query_feedback_max_id.Execute())
- return
- while (query_feedback_max_id.NextRow())
- round_id = query_feedback_max_id.item[1]
-
- if (!isnum(round_id))
- round_id = text2num(round_id)
- round_id++
-
var/sqlrowlist = ""
for (var/datum/feedback_variable/FV in feedback)
if (sqlrowlist != "")
sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error
- sqlrowlist += "(null, Now(), [round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")"
+ sqlrowlist += "(null, Now(), [GLOB.round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")"
if (sqlrowlist == "")
return
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index a3255b73e4..32d53884f5 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -287,6 +287,8 @@ SUBSYSTEM_DEF(job)
if(PopcapReached())
RejectPlayer(player)
+ var/datum/job/validjob
+
// Loop through all jobs
for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY
if(!job)
@@ -308,16 +310,24 @@ SUBSYSTEM_DEF(job)
Debug("DO non-human failed, 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]")
- AssignRole(player, job.title)
- unassigned -= player
- break
+
+ validjob = job
+
+ //Is the Job empty? Stop Looking Then!
+ if (!job.current_positions)
+ break
+
+ //Assign us the last job we found
+ if (validjob)
+ Debug("DO pass, Player: [player], Level:[level], Job:[validjob.title]")
+ AssignRole(player, validjob.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
diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm
index eb61e5ef39..35d8a3d08f 100644
--- a/code/controllers/subsystem/lighting.dm
+++ b/code/controllers/subsystem/lighting.dm
@@ -36,18 +36,10 @@ SUBSYSTEM_DEF(lighting)
for (i in 1 to GLOB.lighting_update_lights.len)
var/datum/light_source/L = GLOB.lighting_update_lights[i]
- if (L.check() || QDELETED(L) || L.force_update)
- L.remove_lum()
- if (!QDELETED(L))
- L.apply_lum()
+ L.update_corners()
- else if (L.vis_update) //We smartly update only tiles that became (in) visible to use.
- L.smart_vis_update()
+ L.needs_update = LIGHTING_NO_UPDATE
- L.vis_update = FALSE
- L.force_update = FALSE
- L.needs_update = FALSE
-
if(init_tick_checks)
CHECK_TICK
else if (MC_TICK_CHECK)
diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm
index dfb41c8905..ea6d57088f 100644
--- a/code/controllers/subsystem/pai.dm
+++ b/code/controllers/subsystem/pai.dm
@@ -150,7 +150,7 @@ SUBSYSTEM_DEF(pai)
if(!(ROLE_PAI in G.client.prefs.be_special))
continue
//G << 'sound/misc/server-ready.ogg' //Alerting them to their consideration
- to_chat(G, "Someone is requesting a pAI personality! Use the pAI button to submit yourself as one.")
+ to_chat(G, "[user] is requesting a pAI personality! Use the pAI button to submit yourself as one.")
addtimer(CALLBACK(src, .proc/spam_again), spam_delay)
var/list/available = list()
for(var/datum/paiCandidate/c in SSpai.candidates)
diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm
index c42dfc38e2..ec76d623b1 100644
--- a/code/controllers/subsystem/persistence.dm
+++ b/code/controllers/subsystem/persistence.dm
@@ -9,7 +9,6 @@ SUBSYSTEM_DEF(persistence)
var/list/obj/structure/chisel_message/chisel_messages = list()
var/list/saved_messages = list()
- var/savefile/chisel_messages_sav
var/savefile/trophy_sav
var/list/saved_trophies = list()
@@ -75,14 +74,14 @@ SUBSYSTEM_DEF(persistence)
break //Who's been duping the bird?!
/datum/controller/subsystem/persistence/proc/LoadChiselMessages()
- chisel_messages_sav = new /savefile("data/npc_saves/ChiselMessages.sav")
+ var/savefile/chisel_messages_sav = new /savefile("data/npc_saves/ChiselMessages.sav")
var/saved_json
chisel_messages_sav[SSmapping.config.map_name] >> saved_json
if(!saved_json)
return
- var/saved_messages = json_decode(saved_json)
+ var/list/saved_messages = json_decode(saved_json)
for(var/item in saved_messages)
if(!islist(item))
@@ -104,10 +103,10 @@ SUBSYSTEM_DEF(persistence)
var/obj/structure/chisel_message/M = new(T)
- M.unpack(item)
- if(!M.loc)
- M.persists = FALSE
- qdel(M)
+ if(!QDELETED(M))
+ M.unpack(item)
+
+ log_world("Loaded [saved_messages.len] engraved messages on map [SSmapping.config.map_name]")
/datum/controller/subsystem/persistence/proc/LoadTrophies()
trophy_sav = new /savefile("data/npc_saves/TrophyItems.sav")
@@ -175,9 +174,13 @@ SUBSYSTEM_DEF(persistence)
secret_satchels[SSmapping.config.map_name] << old_secret_satchels
/datum/controller/subsystem/persistence/proc/CollectChiselMessages()
+ var/savefile/chisel_messages_sav = new /savefile("data/npc_saves/ChiselMessages.sav")
+
for(var/obj/structure/chisel_message/M in chisel_messages)
saved_messages += list(M.pack())
+ log_world("Saved [saved_messages.len] engraved messages on map [SSmapping.config.map_name]")
+
chisel_messages_sav[SSmapping.config.map_name] << json_encode(saved_messages)
/datum/controller/subsystem/persistence/proc/SaveChiselMessage(obj/structure/chisel_message/M)
@@ -193,4 +196,4 @@ SUBSYSTEM_DEF(persistence)
data["path"] = T.showpiece.type
data["message"] = T.trophy_message
data["placer_key"] = T.placer_key
- saved_trophies += list(data)
\ No newline at end of file
+ saved_trophies += list(data)
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index b9358817e3..b90e2ec652 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -75,10 +75,12 @@
if(GLOB.revdata.parentcommit)
to_chat(src, "Server revision compiled on: [GLOB.revdata.date]")
+ var/prefix = ""
if(GLOB.revdata.testmerge.len)
to_chat(src, GLOB.revdata.GetTestMergeInfo())
- to_chat(src, "Based off master commit:")
- to_chat(src, "[GLOB.revdata.parentcommit]")
+ prefix = "Based off master commit: "
+ var/pc = GLOB.revdata.parentcommit
+ to_chat(src, "[prefix][copytext(pc, 1, min(length(pc), 7))]")
else
to_chat(src, "Revision unknown")
to_chat(src, "Current Infomational Settings:")
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 6d6b1104dc..24774da158 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -35,6 +35,7 @@
if(!dialed_holopads.len)
calling_pad.say("Connection failure.")
qdel(src)
+ return
testing("Holocall started")
@@ -104,19 +105,18 @@
if(connected_holopad)
CRASH("Multi-connection holocall")
- connected_holopad = H
for(var/I in dialed_holopads)
if(I == H)
continue
- var/obj/machinery/holopad/Holo = I
- LAZYREMOVE(Holo.holo_calls, src)
- dialed_holopads -= Holo
+ Disconnect(I)
for(var/I in H.holo_calls)
var/datum/holocall/HC = I
if(HC != src)
HC.Disconnect(H)
+ connected_holopad = H
+
if(!Check())
return
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index e99d5bb59a..f4eff12f38 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -272,7 +272,7 @@
creator.faction |= current.faction
if(creator.mind.special_role)
- message_admins("[key_name_admin(current)](?) has been created by [key_name_admin(creator)](?), an antagonist.")
+ message_admins("[ADMIN_LOOKUPFLW(current)] has been created by [ADMIN_LOOKUPFLW(creator)], an antagonist.")
to_chat(current, "Despite your creators current allegiances, your true master remains [creator.real_name]. If their loyalities change, so do yours. This will never change unless your creator's body is destroyed.")
/datum/mind/proc/show_memory(mob/recipient, window=1)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 8eec853047..9f6e481edb 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -76,3 +76,89 @@
/datum/status_effect/belligerent/on_remove()
if(owner.m_intent == MOVE_INTENT_WALK)
owner.toggle_move_intent()
+
+
+/datum/status_effect/maniamotor
+ id = "maniamotor"
+ duration = -1
+ tick_interval = 10
+ status_type = STATUS_EFFECT_MULTIPLE
+ alert_type = null
+ var/obj/structure/destructible/clockwork/powered/mania_motor/motor
+ var/severity = 0 //goes up to a maximum of MAX_MANIA_SEVERITY
+ var/warned_turnoff = FALSE //if we've warned that the motor is off
+ var/warned_outofsight = FALSE //if we've warned that the target is out of sight of the motor
+ var/static/list/mania_messages = list("Go nuts.", "Take a crack at crazy.", "Make a bid for insanity.", "Get kooky.", "Move towards mania.", "Become bewildered.", "Wax wild.", \
+ "Go round the bend.", "Land in lunacy.", "Try dementia.", "Strive to get a screw loose.", "Advance forward.", "Approach the transmitter.", "Touch the antennae.", \
+ "Move towards the mania motor.", "Come closer.", "Get over here already!", "Keep your eyes on the motor.")
+ var/static/list/flee_messages = list("Oh, NOW you flee.", "Get back here!", "If you were smarter, you'd come back.", "Only fools run.", "You'll be back.")
+ var/static/list/turnoff_messages = list("Why would they turn it-", "What are these idi-", "Fools, fools, all of-", "Are they trying to c-", "All this effort just f-")
+ var/static/list/powerloss_messages = list("\"Oh, the id**ts di***t s***e en**** pow**...\"", "\"D*dn't **ey mak* an **te***c*i*n le**?\"", "\"The** f**ls for**t t* make a ***** *f-\"", \
+ "\"No, *O, you **re so cl***-\"", "You hear a yell of frustration, cut off by static.")
+
+/datum/status_effect/maniamotor/Destroy()
+ motor = null
+ return ..()
+
+/datum/status_effect/maniamotor/tick()
+ var/is_servant = is_servant_of_ratvar(owner)
+ var/span_part = severity > 50 ? "" : "_small" //let's save like one check
+ if(QDELETED(motor))
+ if(!is_servant)
+ to_chat(owner, "You feel a frustrated voice quietly fade from your mind...")
+ qdel(src)
+ return
+ if(!motor.active) //it being off makes it fall off much faster
+ if(!is_servant && !warned_turnoff)
+ if(motor.total_accessable_power() > motor.mania_cost)
+ to_chat(owner, "\"[text2ratvar(pick(turnoff_messages))]\"")
+ else
+ to_chat(owner, "[text2ratvar(pick(powerloss_messages))]")
+ warned_turnoff = TRUE
+ severity = max(severity - 2, 0)
+ if(!severity)
+ qdel(src)
+ return
+ else
+ if(prob(severity * 2))
+ warned_turnoff = FALSE
+ if(!(owner in viewers(7, motor))) //not being in range makes it fall off slightly faster
+ if(!is_servant && !warned_outofsight)
+ to_chat(owner, "\"[text2ratvar(pick(flee_messages))]\"")
+ warned_outofsight = TRUE
+ severity = max(severity - 1, 0)
+ if(!severity)
+ qdel(src)
+ return
+ else if(prob(severity * 2))
+ warned_outofsight = FALSE
+ if(is_servant) //heals servants of braindamage, hallucination, druggy, dizziness, and confusion
+ if(owner.hallucination)
+ owner.hallucination = 0
+ if(owner.druggy)
+ owner.adjust_drugginess(-owner.druggy)
+ if(owner.dizziness)
+ owner.dizziness = 0
+ if(owner.confused)
+ owner.confused = 0
+ severity = 0
+ else if(!owner.null_rod_check() && owner.stat != DEAD && severity)
+ var/static/hum = get_sfx('sound/effects/screech.ogg') //same sound for every proc call
+ if(owner.getToxLoss() > MANIA_DAMAGE_TO_CONVERT)
+ if(is_eligible_servant(owner))
+ to_chat(owner, "\"[text2ratvar("You are mine and his, now.")]\"")
+ add_servant_of_ratvar(owner)
+ owner.Paralyse(5)
+ else
+ if(prob(severity * 0.15))
+ to_chat(owner, "\"[text2ratvar(pick(mania_messages))]\"")
+ owner.playsound_local(get_turf(motor), hum, severity, 1)
+ owner.adjust_drugginess(Clamp(max(severity * 0.075, 1), 0, max(0, 50 - owner.druggy))) //7.5% of severity per second, minimum 1
+ if(owner.hallucination < 50)
+ owner.hallucination = min(owner.hallucination + max(severity * 0.075, 1), 50) //7.5% of severity per second, minimum 1
+ if(owner.dizziness < 50)
+ owner.dizziness = min(owner.dizziness + round(severity * 0.05, 1), 50) //5% of severity per second above 10 severity
+ if(owner.confused < 25)
+ owner.confused = min(owner.confused + round(severity * 0.025, 1), 25) //2.5% of severity per second above 20 severity
+ owner.adjustToxLoss(severity * 0.02, TRUE, TRUE) //2% of severity per second
+ severity--
diff --git a/code/datums/status_effects/debuffs.dm.rej b/code/datums/status_effects/debuffs.dm.rej
new file mode 100644
index 0000000000..c70c0c6eec
--- /dev/null
+++ b/code/datums/status_effects/debuffs.dm.rej
@@ -0,0 +1,75 @@
+diff a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm (rejected hunks)
+@@ -108,20 +108,6 @@
+ to_chat(owner, "You feel a frustrated voice quietly fade from your mind...")
+ qdel(src)
+ return
+- if(!(owner in viewers(7, motor))) //not being in range makes it fall off much faster
+- if(!is_servant && !warned_outofsight)
+- to_chat(owner, "\"[text2ratvar(pick(flee_messages))]\"")
+- warned_outofsight = TRUE
+- if(severity)
+- severity--
+- if(!severity)
+- qdel(src)
+- return
+- else
+- qdel(src)
+- return
+- else if(prob(severity * 2))
+- warned_outofsight = FALSE
+ if(!motor.active) //it being off makes it fall off much faster
+ if(!is_servant && !warned_turnoff)
+ if(motor.total_accessable_power() > motor.mania_cost)
+@@ -129,20 +115,24 @@
+ else
+ to_chat(owner, "[text2ratvar(pick(powerloss_messages))]")
+ warned_turnoff = TRUE
+- if(severity)
+- severity--
++ severity = max(severity - 2, 0)
++ if(!severity)
++ qdel(src)
++ return
++ else
++ if(prob(severity * 2))
++ warned_turnoff = FALSE
++ if(!(owner in viewers(7, motor))) //not being in range makes it fall off slightly faster
++ if(!is_servant && !warned_outofsight)
++ to_chat(owner, "\"[text2ratvar(pick(flee_messages))]\"")
++ warned_outofsight = TRUE
++ severity = max(severity - 1, 0)
+ if(!severity)
+ qdel(src)
+ return
+- else
+- qdel(src)
+- return
+- else if(prob(severity * 2))
+- warned_turnoff = FALSE
++ else if(prob(severity * 2))
++ warned_outofsight = FALSE
+ if(is_servant) //heals servants of braindamage, hallucination, druggy, dizziness, and confusion
+- var/brainloss = owner.getBrainLoss()
+- if(brainloss)
+- owner.adjustBrainLoss(-brainloss)
+ if(owner.hallucination)
+ owner.hallucination = 0
+ if(owner.druggy)
+@@ -163,14 +153,12 @@
+ if(prob(severity * 0.15))
+ to_chat(owner, "\"[text2ratvar(pick(mania_messages))]\"")
+ owner.playsound_local(get_turf(motor), hum, severity, 1)
+- if(owner.getBrainLoss() <= 50)
+- owner.adjustBrainLoss(severity * 0.025) //2.5% of severity per second
+ owner.adjust_drugginess(Clamp(max(severity * 0.075, 1), 0, max(0, 50 - owner.druggy))) //7.5% of severity per second, minimum 1
+ if(owner.hallucination < 50)
+ owner.hallucination = min(owner.hallucination + max(severity * 0.075, 1), 50) //7.5% of severity per second, minimum 1
+- if(owner.dizziness < 25)
+- owner.dizziness = min(owner.dizziness + Floor(severity * 0.025), 25) //2.5% of severity per second above 20 severity
++ if(owner.dizziness < 50)
++ owner.dizziness = min(owner.dizziness + round(severity * 0.05, 1), 50) //5% of severity per second above 10 severity
+ if(owner.confused < 25)
+- owner.confused = min(owner.confused + Floor(severity * 0.025), 25) //2.5% of severity per second above 20 severity
++ owner.confused = min(owner.confused + round(severity * 0.025, 1), 25) //2.5% of severity per second above 20 severity
+ owner.adjustToxLoss(severity * 0.02, TRUE, TRUE) //2% of severity per second
+ severity--
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index 10dbd1a602..61c8607975 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -106,3 +106,11 @@
for(var/datum/status_effect/S in status_effects)
if(initial(S1.id) == S.id)
return S
+
+/mob/living/proc/has_status_effect_list(effect) //returns a list of effects with matching IDs that the mod owns; use for effects there can be multiple of
+ . = list()
+ if(status_effects)
+ var/datum/status_effect/S1 = effect
+ for(var/datum/status_effect/S in status_effects)
+ if(initial(S1.id) == S.id)
+ . += S
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index ab0038f7be..e4adbb91ef 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -274,6 +274,7 @@
return
/atom/proc/ex_act(severity, target)
+ set waitfor = FALSE
contents_explosion(severity, target)
/atom/proc/blob_act(obj/structure/blob/B)
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
index e3c456460c..120ed0ff60 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
@@ -22,6 +22,12 @@
else
for(var/i in GLOB.clockwork_component_cache)
.[i] = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*GLOB.clockwork_component_cache[i], 1)
+ for(var/obj/structure/destructible/clockwork/massive/celestial_gateway/G in GLOB.all_clockwork_objects)
+ if(G.still_needs_components())
+ for(var/i in G.required_components)
+ if(!G.required_components[i])
+ . -= i
+ break
. = pickweight(.)
//returns a component name from a component id
@@ -37,6 +43,8 @@
return "Replicant Alloy"
if(HIEROPHANT_ANSIBLE)
return "Hierophant Ansible"
+ else
+ return null
//returns a component acronym from a component id
/proc/get_component_acronym(id)
@@ -51,6 +59,8 @@
return "RA"
if(HIEROPHANT_ANSIBLE)
return "HA"
+ else
+ return null
//returns a component id from a component name
/proc/get_component_id(name)
@@ -65,6 +75,8 @@
return REPLICANT_ALLOY
if("Hierophant Ansible")
return HIEROPHANT_ANSIBLE
+ else
+ return null
//returns a component spanclass from a component id
/proc/get_component_span(id)
@@ -121,6 +133,8 @@
return /obj/effect/overlay/temp/ratvar/component/alloy
if(HIEROPHANT_ANSIBLE)
return /obj/effect/overlay/temp/ratvar/component/ansible
+ else
+ return null
//returns a type for a component from a component id
/proc/get_component_type(id)
@@ -134,4 +148,6 @@
if(REPLICANT_ALLOY)
return /obj/item/clockwork/component/replicant_alloy
if(HIEROPHANT_ANSIBLE)
- return /obj/item/clockwork/component/hierophant_ansible
\ No newline at end of file
+ return /obj/item/clockwork/component/hierophant_ansible
+ else
+ return null
\ No newline at end of file
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
index c1b5c0cfff..aa1a07ac2f 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
@@ -218,22 +218,22 @@
/datum/clockwork_scripture/create_object/mania_motor
descname = "Powered Structure, Area Denial"
name = "Mania Motor"
- desc = "Creates a mania motor which will cause brain damage and hallucinations in nearby non-Servant humans. It will also try to convert humans directly adjecent to the motor."
+ desc = "Creates a mania motor which causes minor damage and a variety of negative mental effects in nearby non-Servant humans, potentially up to and including conversion."
invocations = list("May this transmitter...", "...break the will of all who oppose us!")
channel_time = 80
consumed_components = list(GEIS_CAPACITOR = 5, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2)
object_path = /obj/structure/destructible/clockwork/powered/mania_motor
- creator_message = "You form a mania motor which will cause brain damage and hallucinations in nearby humans while active."
+ creator_message = "You form a mania motor, which causes minor damage and negative mental effects in non-Servants."
observer_message = "A two-pronged machine rises from the ground!"
invokers_required = 2
multiple_invokers_used = TRUE
- usage_tip = "Eligible non-Servant humans next to the motor will be converted at an additional power cost. It will also cure hallucinations and brain damage in nearby Servants."
+ usage_tip = "It will also cure hallucinations and brain damage in nearby Servants."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
primary_component = GEIS_CAPACITOR
sort_priority = 8
quickbind = TRUE
- quickbind_desc = "Creates a Mania Motor, which can convert adjacent non-Servants with power."
+ quickbind_desc = "Creates a Mania Motor, which causes minor damage and negative mental effects in non-Servants."
//Tinkerer's Daemon: Creates an efficient machine that rapidly produces components at a power cost.
diff --git a/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm b/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm
index 09372044a9..dd26b5d404 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm
@@ -1,8 +1,8 @@
-//Mania Motor: A pair of antenna that, while active, cause braindamage and hallucinations in nearby human mobs.
+//Mania Motor: A pair of antenna that, while active, cause a variety of negative mental effects in nearby human mobs.
/obj/structure/destructible/clockwork/powered/mania_motor
name = "mania motor"
desc = "A pair of antenna with what appear to be sockets around the base. It reminds you of an antlion."
- clockwork_desc = "A transmitter that allows Sevtug to whisper into the minds of nearby non-servants, causing hallucinations and brain damage as long as it remains powered."
+ clockwork_desc = "A transmitter that allows Sevtug to whisper into the minds of nearby non-servants, causing a variety of negative mental effects, up to and including conversion."
icon_state = "mania_motor_inactive"
active_icon = "mania_motor"
inactive_icon = "mania_motor_inactive"
@@ -16,22 +16,11 @@
/obj/item/clockwork/alloy_shards/small = 2, \
/obj/item/clockwork/component/geis_capacitor/antennae = 1)
var/mania_cost = 150
- var/convert_cost = 150
- var/static/list/mania_messages = list("Go nuts.", "Take a crack at crazy.", "Make a bid for insanity.", "Get kooky.", "Move towards mania.", "Become bewildered.", "Wax wild.", \
- "Go round the bend.", "Land in lunacy.", "Try dementia.", "Strive to get a screw loose.")
- var/static/list/compel_messages = list("Come closer.", "Approach the transmitter.", "Touch the antennae.", "I always have to deal with idiots. Move towards the mania motor.", \
- "Advance forward and place your head between the antennae - that's all it's good for.", "If you were smarter, you'd be over here already.", "Move FORWARD, you fool.")
- var/static/list/convert_messages = list("You won't do. Go to sleep while I tell these nitwits how to convert you.", "You are insufficient. I must instruct these idiots in the art of conversion.", \
- "Oh of course, someone we can't convert. These servants are fools.", "How hard is it to use a Sigil, anyway? All it takes is dragging someone onto it.", \
- "How do they fail to use a Sigil of Accession, anyway?", "Why is it that all servants are this inept?", "It's quite likely you'll be stuck here for a while.")
- var/static/list/close_messages = list("Well, you can't reach the motor from THERE, you moron.", "Interesting location. I'd prefer if you went somewhere you could ACTUALLY TOUCH THE ANTENNAE!", \
- "Amazing. You somehow managed to wedge yourself somewhere you can't actually reach the motor from.", "Such a show of idiocy is unparalleled. Perhaps I should put you on display?", \
- "Did you do this on purpose? I can't imagine you doing so accidentally. Oh, wait, I can.", "How is it that such smart creatures can still do something AS STUPID AS THIS!")
/obj/structure/destructible/clockwork/powered/mania_motor/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "It requires [mania_cost]W to run, and at least [convert_cost]W to attempt to convert humans adjacent to it.")
+ to_chat(user, "It requires [mania_cost]W to run.")
/obj/structure/destructible/clockwork/powered/mania_motor/forced_disable(bad_effects)
if(active)
@@ -60,82 +49,17 @@
if(!try_use_power(mania_cost))
forced_disable(FALSE)
return
- var/turf/T = get_turf(src)
- var/hum = get_sfx('sound/effects/screech.ogg') //like playsound, same sound for everyone affected
var/efficiency = get_efficiency_mod()
for(var/mob/living/carbon/human/H in viewers(7, src))
- if(is_servant_of_ratvar(H)) //heals servants of braindamage, hallucination, druggy, dizziness, and confusion
- var/brainloss = H.getBrainLoss()
- if(brainloss)
- H.adjustBrainLoss(-brainloss)
- if(H.hallucination)
- H.hallucination = 0
- if(H.druggy)
- H.adjust_drugginess(-H.druggy)
- if(H.dizziness)
- H.dizziness = 0
- if(H.confused)
- H.confused = 0
- else if(!H.null_rod_check() && H.stat != DEAD)
- var/distance = 0 + get_dist(T, get_turf(H))
- var/falloff_distance = min((110) - distance * 10, 80)
- var/sound_distance = falloff_distance * 0.5
- var/targetbrainloss = H.getBrainLoss()
- if(distance > 3 && prob(falloff_distance * 0.5))
- to_chat(H, "\"[text2ratvar(pick(mania_messages))]\"")
- if(distance <= 1)
- if(!H.Adjacent(src))
- to_chat(H, "\"[text2ratvar(pick(close_messages))]\"")
- H.playsound_local(T, hum, sound_distance, 1)
- else if(!try_use_power(convert_cost))
- visible_message("[src]'s antennae fizzle quietly.")
- playsound(src, 'sound/effects/light_flicker.ogg', 50, 1)
- else
- H.playsound_local(T, hum, 80, 1)
- if(!H.stat)
- if(H.getBrainLoss() < 100)
- H.adjustBrainLoss(20 * efficiency)
- H.visible_message("[H] reaches out and touches [src].", "You touch [src] involuntarily.")
- else
- H.Paralyse(3)
- else if(is_eligible_servant(H))
- to_chat(H, "\"[text2ratvar("You are mine and his, now.")]\"")
- add_servant_of_ratvar(H)
- H.Paralyse(5)
- else
- H.playsound_local(T, hum, sound_distance, 1)
- switch(distance)
- if(0 to 3)
- if(prob(falloff_distance * 0.5))
- if(prob(falloff_distance))
- to_chat(H, "\"[text2ratvar(pick(mania_messages))]\"")
- else
- to_chat(H, "\"[text2ratvar(pick(compel_messages))]\"")
- if(targetbrainloss <= 40)
- H.adjustBrainLoss(3 * efficiency)
- H.adjust_drugginess(Clamp(7 * efficiency, 0, 50 - H.druggy))
- H.hallucination = min(H.hallucination + (7 * efficiency), 50)
- H.dizziness = min(H.dizziness + (3 * efficiency), 20)
- H.confused = min(H.confused + (3 * efficiency), 20)
- if(3 to 5)
- if(targetbrainloss <= 20)
- H.adjustBrainLoss(2 * efficiency)
- H.adjust_drugginess(Clamp(5 * efficiency, 0, 25 - H.druggy))
- H.hallucination = min(H.hallucination + (5 * efficiency), 25)
- H.dizziness = min(H.dizziness + (2 * efficiency), 10)
- H.confused = min(H.confused + (2 * efficiency), 10)
- if(5 to 6)
- if(targetbrainloss <= 10)
- H.adjustBrainLoss(1 * efficiency)
- H.adjust_drugginess(Clamp(2 * efficiency, 0, 20 - H.druggy))
- H.hallucination = min(H.hallucination + (2 * efficiency), 20)
- H.dizziness = min(H.dizziness + (2 * efficiency), 5)
- H.confused = min(H.confused + (2 * efficiency), 5)
- if(6 to 7)
- if(targetbrainloss <= 5)
- H.adjustBrainLoss(1 * efficiency)
- H.adjust_drugginess(Clamp(2 * efficiency, 0, 10 - H.druggy))
- H.hallucination = min(H.hallucination + (2 * efficiency), 10)
- if(7 to INFINITY)
- H.adjust_drugginess(Clamp(2 * efficiency, 0, 5 - H.druggy))
- H.hallucination = min(H.hallucination + (2 * efficiency), 5)
+ if(is_servant_of_ratvar(H))
+ continue
+ var/list/effects = H.has_status_effect_list(STATUS_EFFECT_MANIAMOTOR)
+ var/datum/status_effect/maniamotor/M
+ for(var/datum/status_effect/maniamotor/MM in effects)
+ if(MM.motor == src)
+ M = MM
+ break
+ if(!M)
+ M = H.apply_status_effect(STATUS_EFFECT_MANIAMOTOR)
+ M.motor = src
+ M.severity = Clamp(M.severity + ((11 - get_dist(src, H)) * efficiency * efficiency), 0, MAX_MANIA_SEVERITY)
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 3a80ed54b3..8eb08cfa84 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -148,8 +148,7 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/proc/fail_invoke()
//This proc contains the effects of a rune if it is not invoked correctly, through either invalid wording or not enough cultists. By default, it's just a basic fizzle.
- visible_message("The markings pulse with a \
- small flash of red light, then fall dark.")
+ visible_message("The markings pulse with a small flash of red light, then fall dark.")
var/oldcolor = color
color = rgb(255, 0, 0)
animate(src, color = oldcolor, time = 5)
@@ -309,10 +308,11 @@ structure_check() searches for nearby cultist structures required for the invoca
A.forceMove(target)
if(movedsomething)
..()
- visible_message("There is a sharp crack of inrushing air, and everything above the rune disappears!")
+ visible_message("There is a sharp crack of inrushing air, and everything above the rune disappears!", null, "You hear a sharp crack.")
to_chat(user, "You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].")
if(moveuserlater)
user.forceMove(target)
+ target.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.")
else
fail_invoke()
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 9645b4bbce..166cb6f528 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -147,9 +147,10 @@
if(is_blocked_turf(target, TRUE))
to_chat(user, "The target rune is blocked. Attempting to teleport to it would be massively unwise.")
return ..(user, 0)
- user.visible_message("Dust flows from [user]'s hand, and [user.p_they()] disappear in a flash of red light!", \
- "You speak the words of the talisman and find yourself somewhere else!")
+ user.visible_message("Dust flows from [user]'s hand, and [user.p_they()] disappear with a sharp crack!", \
+ "You speak the words of the talisman and find yourself somewhere else!", "You hear a sharp crack.")
user.forceMove(target)
+ target.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.")
return ..()
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index a496715af2..6029ec2c6d 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -85,7 +85,6 @@
SSblackbox.set_details("game_mode","[SSticker.mode]")
if(GLOB.revdata.commit)
SSblackbox.set_details("revision","[GLOB.revdata.commit]")
- SSblackbox.set_details("server_ip","[world.internet_address]:[world.port]")
if(report)
addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h))
generate_station_goals()
diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm
index 54099070cd..3b9dce8c3b 100644
--- a/code/game/gamemodes/gang/dominator.dm
+++ b/code/game/gamemodes/gang/dominator.dm
@@ -1,3 +1,5 @@
+#define DOM_BLOCKED_SPAM_CAP 6
+
/obj/machinery/dominator
name = "dominator"
desc = "A visibly sinister device. Looks like you can break it if you hit it enough."
@@ -13,9 +15,20 @@
var/datum/gang/gang
var/operating = 0 //0=standby or broken, 1=takeover
var/warned = 0 //if this device has set off the warning at <3 minutes yet
+ var/spam_prevention = DOM_BLOCKED_SPAM_CAP //first message is immediate
var/datum/effect_system/spark_spread/spark_system
var/obj/effect/countdown/dominator/countdown
+/proc/dominator_excessive_walls(atom/A)
+ var/open = 0
+ for(var/turf/T in circleviewturfs(center=A,radius=3))
+ if(!istype(T, /turf/closed))
+ open++
+ if(open < 40)
+ return TRUE
+ else
+ return FALSE
+
/obj/machinery/dominator/tesla_act()
qdel(src)
@@ -48,6 +61,16 @@
if(gang && gang.is_dominating)
var/time_remaining = gang.domination_time_remaining()
if(time_remaining > 0)
+ if(dominator_excessive_walls(src))
+ gang.domination_timer += 2
+ playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
+ if(spam_prevention < DOM_BLOCKED_SPAM_CAP)
+ spam_prevention++
+ else
+ gang.message_gangtools("Warning: There are too many walls around your gang's dominator, its signal is being blocked!")
+ say("Error: Takeover signal is currently blocked! There are too many walls within 3 standard units of this device.")
+ spam_prevention = 0
+ return
. = TRUE
playsound(loc, 'sound/items/timer.ogg', 10, 0)
if(!warned && (time_remaining < 180))
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index 20cce72b4e..12191ac44a 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -312,7 +312,9 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","
G.domination(0.5)
priority_announce("Multiple station takeover attempts have made simultaneously. Conflicting takeover attempts appears to have restarted.","Network Alert")
else
+ var/datum/gang/G = winners[1]
+ G.is_dominating = FALSE
SSticker.mode.explosion_in_progress = 1
- SSticker.station_explosion_cinematic(1)
+ SSticker.station_explosion_cinematic(1,"gang war", null)
SSticker.mode.explosion_in_progress = 0
- SSticker.force_ending = pick(winners)
+ SSticker.force_ending = TRUE
diff --git a/code/game/gamemodes/gang/gang_items.dm b/code/game/gamemodes/gang/gang_items.dm
index c0bb1824b2..724191c642 100644
--- a/code/game/gamemodes/gang/gang_items.dm
+++ b/code/game/gamemodes/gang/gang_items.dm
@@ -305,7 +305,11 @@
if(obj.density)
to_chat(user, "There's not enough room here!")
return FALSE
-
+
+ if(dominator_excessive_walls(user))
+ to_chat(user, "span class='warning'>The dominator will not function here! The dominator requires an open space within three standard units so that walls do not interfere with the signal.")
+ return FALSE
+
if(!(usrarea.type in gang.territory|gang.territory_new))
to_chat(user, "The dominator can be spawned only on territory controlled by your gang!")
return FALSE
diff --git a/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm
index aa633e1ef5..574e48fc68 100644
--- a/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm
+++ b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm
@@ -20,7 +20,7 @@
explanation_text = "Your brain is broken... you can only communicate in"
/datum/objective/abductee/speech/New()
- var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon"))
+ var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon", "three word sentences"))
explanation_text+= " [style]."
/datum/objective/abductee/capture
@@ -146,3 +146,25 @@
/datum/objective/abductee/sixthsense
explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo."
+
+/datum/objective/abductee/toupefallacy
+ explanation_text = "There are alien parasites masquerading as people's hair. Save people from this invasion."
+
+/datum/objective/abductee/everyoneisthesame
+ explanation_text = "There is only one other person in existence, he is just really good at pretending to be multiple people."
+
+/datum/objective/abductee/forbiddennumber
+ explanation_text = "Numbers, how do they work?" //Shouldn't ever see this.
+
+/datum/objective/abductee/forbiddennumber/New()
+ var/number = rand(2,10)
+ explanation_text = "Ignore anything in a set of [number], they don't exist."
+
+/datum/objective/abductee/foreignname
+ explanation_text = "No matter how they say it, other people keep mispronouncing your name. Be sure to correct them whenever possible."
+
+/datum/objective/abductee/pairoff
+ explanation_text = "Being alone and in large groups are both frightening. Try to be alone with only one other person whenever possible."
+
+/datum/objective/abductee/takeblame
+ explanation_text = "Try to get formally executed for a crime you didn't commit, without a false confession."
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
index 193aecd9ce..8f3dfb7ac3 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
@@ -116,12 +116,13 @@
else
dat += "
Subject Status :
"
dat += "[occupant.name] => "
- switch(occupant.stat)
- if(0)
+ var/mob/living/mob_occupant = occupant
+ switch(mob_occupant.stat)
+ if(CONSCIOUS)
dat += "Conscious"
- if(1)
+ if(UNCONSCIOUS)
dat += "Unconscious"
- else
+ else // DEAD
dat += "Deceased"
dat += "
"
dat += "[flash]"
@@ -146,9 +147,11 @@
if(href_list["close"])
close_machine()
return
- if(occupant && occupant.stat != DEAD)
- if(href_list["experiment"])
- flash = Experiment(occupant,href_list["experiment"])
+ if(occupant)
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant.stat != DEAD)
+ if(href_list["experiment"])
+ flash = Experiment(occupant,href_list["experiment"])
updateUsrDialog()
add_fingerprint(usr)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 5dc8ea3f20..d45859a371 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -79,7 +79,8 @@
/obj/machinery/sleeper/close_machine(mob/user)
if((isnull(user) || istype(user)) && state_open && !panel_open)
..(user)
- if(occupant && occupant.stat != DEAD)
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant && mob_occupant.stat != DEAD)
to_chat(occupant, "You feel cool air surround you. You go numb as your senses turn inward.")
/obj/machinery/sleeper/emp_act(severity)
@@ -128,27 +129,30 @@
data["chems"] += list(list("name" = R.name, "id" = R.id, "allowed" = chem_allowed(chem)))
data["occupant"] = list()
- if(occupant)
- data["occupant"]["name"] = occupant.name
- data["occupant"]["stat"] = occupant.stat
- data["occupant"]["health"] = occupant.health
- data["occupant"]["maxHealth"] = occupant.maxHealth
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant)
+ data["occupant"]["name"] = mob_occupant.name
+ data["occupant"]["stat"] = mob_occupant.stat
+ data["occupant"]["health"] = mob_occupant.health
+ data["occupant"]["maxHealth"] = mob_occupant.maxHealth
data["occupant"]["minHealth"] = HEALTH_THRESHOLD_DEAD
- data["occupant"]["bruteLoss"] = occupant.getBruteLoss()
- data["occupant"]["oxyLoss"] = occupant.getOxyLoss()
- data["occupant"]["toxLoss"] = occupant.getToxLoss()
- data["occupant"]["fireLoss"] = occupant.getFireLoss()
- data["occupant"]["cloneLoss"] = occupant.getCloneLoss()
- data["occupant"]["brainLoss"] = occupant.getBrainLoss()
+ data["occupant"]["bruteLoss"] = mob_occupant.getBruteLoss()
+ data["occupant"]["oxyLoss"] = mob_occupant.getOxyLoss()
+ data["occupant"]["toxLoss"] = mob_occupant.getToxLoss()
+ data["occupant"]["fireLoss"] = mob_occupant.getFireLoss()
+ data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss()
+ data["occupant"]["brainLoss"] = mob_occupant.getBrainLoss()
data["occupant"]["reagents"] = list()
if(occupant.reagents.reagent_list.len)
- for(var/datum/reagent/R in occupant.reagents.reagent_list)
+ for(var/datum/reagent/R in mob_occupant.reagents.reagent_list)
data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume))
return data
/obj/machinery/sleeper/ui_act(action, params)
if(..())
return
+ var/mob/living/mob_occupant = occupant
+
switch(action)
if("door")
if(state_open)
@@ -158,9 +162,9 @@
. = TRUE
if("inject")
var/chem = params["chem"]
- if(!is_operational() || !occupant)
+ if(!is_operational() || !mob_occupant)
return
- if(occupant.health < min_health && chem != "epinephrine")
+ if(mob_occupant.health < min_health && chem != "epinephrine")
return
if(inject_chem(chem))
. = TRUE
@@ -177,10 +181,11 @@
return TRUE
/obj/machinery/sleeper/proc/chem_allowed(chem)
- if(!occupant)
+ var/mob/living/mob_occupant = occupant
+ if(!mob_occupant)
return
- var/amount = occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency
- var/occ_health = occupant.health > min_health || chem == "epinephrine"
+ var/amount = mob_occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency
+ var/occ_health = mob_occupant.health > min_health || chem == "epinephrine"
return amount && occ_health
/obj/machinery/sleeper/proc/reset_chem_buttons()
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 824b50b168..0e5b78af7c 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -121,10 +121,12 @@
/obj/machinery/clonepod/examine(mob/user)
..()
+ var/mob/living/mob_occupant = occupant
if(mess)
to_chat(user, "It's filled with blood and viscera. You swear you can see it moving...")
- if (is_operational() && (!isnull(occupant)) && (occupant.stat != DEAD))
- to_chat(user, "Current clone cycle is [round(get_completion())]% complete.")
+ if(is_operational() && mob_occupant)
+ if(mob_occupant.stat != DEAD)
+ to_chat(user, "Current clone cycle is [round(get_completion())]% complete.")
/obj/machinery/clonepod/return_air()
// We want to simulate the clone not being in contact with
@@ -136,7 +138,10 @@
return GM
/obj/machinery/clonepod/proc/get_completion()
- . = (100 * ((occupant.health + 100) / (heal_level + 100)))
+ . = FALSE
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant)
+ . = (100 * ((mob_occupant.health + 100) / (heal_level + 100)))
/obj/machinery/clonepod/attack_ai(mob/user)
return examine(user)
@@ -172,11 +177,11 @@
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
- if(clonemind.changeling)
- var/obj/item/organ/brain/B = H.getorganslot("brain")
- B.vital = FALSE
- B.decoy_override = TRUE
-
+ if(clonemind.changeling)
+ var/obj/item/organ/brain/B = H.getorganslot("brain")
+ B.vital = FALSE
+ B.decoy_override = TRUE
+
H.hardset_dna(ui, se, H.real_name, null, mrace, features)
if(efficiency > 2)
@@ -204,13 +209,13 @@
clonemind.transfer_to(H)
- if(grab_ghost_when == CLONER_FRESH_CLONE)
- H.grab_ghost()
- to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?")
+ if(grab_ghost_when == CLONER_FRESH_CLONE)
+ H.grab_ghost()
+ to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?")
if(grab_ghost_when == CLONER_MATURE_CLONE)
- H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost
- to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.")
+ H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost
+ to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.")
if(H)
H.faction |= factions
@@ -223,25 +228,26 @@
//Grow clones to maturity then kick them out. FREELOADERS
/obj/machinery/clonepod/process()
+ var/mob/living/mob_occupant = occupant
if(!is_operational()) //Autoeject if power is lost
- if (occupant)
+ if(mob_occupant)
go_out()
connected_message("Clone Ejected: Loss of power.")
- else if((occupant) && (occupant.loc == src))
- if((occupant.stat == DEAD) || (occupant.suiciding) || occupant.hellbound) //Autoeject corpses and suiciding dudes.
+ else if(mob_occupant && (mob_occupant.loc == src))
+ if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes.
connected_message("Clone Rejected: Deceased.")
- SPEAK("The cloning of [occupant.real_name] has been \
+ SPEAK("The cloning of [mob_occupant.real_name] has been \
aborted due to unrecoverable tissue failure.")
go_out()
- else if(occupant.cloneloss > (100 - heal_level))
- occupant.Paralyse(4)
+ else if(mob_occupant.cloneloss > (100 - heal_level))
+ mob_occupant.Paralyse(4)
//Slowly get that clone healed and finished.
- occupant.adjustCloneLoss(-((speed_coeff/2) * config.damage_multiplier))
- var/progress = CLONE_INITIAL_DAMAGE - occupant.getCloneLoss()
+ mob_occupant.adjustCloneLoss(-((speed_coeff/2) * config.damage_multiplier))
+ var/progress = CLONE_INITIAL_DAMAGE - mob_occupant.getCloneLoss()
// To avoid the default cloner making incomplete clones
progress += (100 - MINIMUM_HEAL_LEVEL)
var/milestone = CLONE_INITIAL_DAMAGE / flesh_number
@@ -252,24 +258,24 @@
var/obj/item/I = pick_n_take(unattached_flesh)
if(isorgan(I))
var/obj/item/organ/O = I
- O.Insert(occupant)
+ O.Insert(mob_occupant)
else if(isbodypart(I))
var/obj/item/bodypart/BP = I
- BP.attach_limb(occupant)
+ BP.attach_limb(mob_occupant)
//Premature clones may have brain damage.
- occupant.adjustBrainLoss(-((speed_coeff/2) * config.damage_multiplier))
+ mob_occupant.adjustBrainLoss(-((speed_coeff/2) * config.damage_multiplier))
check_brine()
use_power(7500) //This might need tweaking.
- else if((occupant.cloneloss <= (100 - heal_level)))
+ else if((mob_occupant.cloneloss <= (100 - heal_level)))
connected_message("Cloning Process Complete.")
- SPEAK("The cloning cycle of [occupant.real_name] is complete.")
+ SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.")
go_out()
- else if ((!occupant) || (occupant.loc != src))
+ else if (!mob_occupant || mob_occupant.loc != src)
occupant = null
if (!mess && !panel_open)
icon_state = "pod_0"
@@ -305,16 +311,19 @@
to_chat(user, "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-")
return
+ var/mob/living/mob_occupant = occupant
if(W.GetID())
if(!check_access(W))
to_chat(user, "Access Denied.")
return
- if(!(occupant || mess))
+ if(!(mob_occupant || mess))
to_chat(user, "Error: Pod has no occupant.")
return
else
connected_message("Authorized Ejection")
- SPEAK("An authorized ejection of [clonemind.name] has occurred.")
+
+ SPEAK("An authorized ejection of [clonemind.name] has occurred.")
+
to_chat(user, "You force an emergency ejection. ")
go_out()
else
@@ -339,54 +348,63 @@
/obj/machinery/clonepod/proc/go_out()
countdown.stop()
+ var/mob/living/mob_occupant = occupant
if(mess) //Clean that mess and dump those gibs!
mess = FALSE
- new /obj/effect/gibspawner/generic(loc)
+ new /obj/effect/gibspawner/generic(loc)
audible_message("You hear a splat.")
icon_state = "pod_0"
return
- if(!occupant)
+ if(!mob_occupant)
return
- if(grab_ghost_when == CLONER_MATURE_CLONE)
- occupant.grab_ghost()
- to_chat(occupant, "There is a bright flash!
You feel like a new being.")
- occupant.flash_act()
- var/turf/T = get_turf(src)
+ if(grab_ghost_when == CLONER_MATURE_CLONE)
+ mob_occupant.grab_ghost()
+ to_chat(occupant, "There is a bright flash!
You feel like a new being.")
+ mob_occupant.flash_act()
+
+ var/turf/T = get_turf(src)
occupant.forceMove(T)
icon_state = "pod_0"
- occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest.
+ mob_occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest.
+
occupant = null
/obj/machinery/clonepod/proc/malfunction()
- if(occupant)
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant)
connected_message("Critical Error!")
SPEAK("Critical error! Please contact a Thinktronic Systems \
technician, as your warranty may be affected.")
mess = TRUE
- for(var/obj/item/O in unattached_flesh)
- qdel(O)
+
+ for(var/obj/item/O in unattached_flesh)
+ qdel(O)
+
icon_state = "pod_g"
- if(occupant.mind != clonemind)
- clonemind.transfer_to(occupant)
- occupant.grab_ghost() // We really just want to make you suffer.
- flash_color(occupant, flash_color="#960000", flash_time=100)
- to_chat(occupant, "Agony blazes across your consciousness as your body is torn apart.
Is this what dying is like? Yes it is.")
+ if(mob_occupant.mind != clonemind)
+ clonemind.transfer_to(mob_occupant)
+ mob_occupant.grab_ghost() // We really just want to make you suffer.
+ flash_color(mob_occupant, flash_color="#960000", flash_time=100)
+ to_chat(mob_occupant, "Agony blazes across your consciousness as your body is torn apart.
Is this what dying is like? Yes it is.")
playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 50, 0)
- occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50)
- QDEL_IN(occupant, 40)
+ mob_occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50)
+ QDEL_IN(mob_occupant, 40)
/obj/machinery/clonepod/relaymove(mob/user)
if(user.stat == CONSCIOUS)
go_out()
/obj/machinery/clonepod/emp_act(severity)
- if((occupant || mess) && prob(100/(severity*efficiency)))
+
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant && prob(100/(severity*efficiency)))
connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
- SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [clonemind.name] prematurely." ,0))
+ SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0))
+
go_out()
..()
diff --git a/code/game/machinery/cloning.dm.rej b/code/game/machinery/cloning.dm.rej
new file mode 100644
index 0000000000..74ef688700
--- /dev/null
+++ b/code/game/machinery/cloning.dm.rej
@@ -0,0 +1,38 @@
+diff a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm (rejected hunks)
+@@ -311,15 +311,15 @@
+ to_chat(user, "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-")
+ return
+
++ var/mob/living/mob_occupant = occupant
+ if(W.GetID())
+ if(!check_access(W))
+ to_chat(user, "Access Denied.")
+ return
+- if(!(occupant || mess))
++ if(!(mob_occupant || mess))
+ to_chat(user, "Error: Pod has no occupant.")
+ return
+ else
+- var/mob/living/mob_occupant
+ connected_message("Authorized Ejection")
+ SPEAK("An authorized ejection of [clonemind.name] has occurred.")
+ to_chat(user, "You force an emergency ejection. ")
+@@ -395,16 +395,10 @@
+ go_out()
+
+ /obj/machinery/clonepod/emp_act(severity)
+-<<<<<<< HEAD
+- if((occupant || mess) && prob(100/(severity*efficiency)))
+- connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
+- SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [clonemind.name] prematurely." ,0))
+-=======
+- if(isliving(occupant) && prob(100/(severity*efficiency)))
+- var/mob/living/mob_occupant = occupant
++ var/mob/living/mob_occupant = occupant
++ if(mob_occupant && prob(100/(severity*efficiency)))
+ connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
+ SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0))
+->>>>>>> Changes /obj/machinery to have atom/movable occupants
+ go_out()
+ ..()
+
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index afa054428a..48819f91e2 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -186,21 +186,23 @@
// Scanner
if (!isnull(src.scanner))
+ var/mob/living/scanner_occupant = scanner.occupant
+
dat += "Scanner Functions
"
dat += ""
- if (!src.scanner.occupant)
+ if(!scanner_occupant)
dat += "Scanner Unoccupied"
else if(loading)
- dat += "[src.scanner.occupant] => Scanning..."
+ dat += "[scanner_occupant] => Scanning..."
else
- if (src.scanner.occupant.ckey != scantemp_ckey)
+ if(scanner_occupant.ckey != scantemp_ckey)
scantemp = "Ready to Scan"
- scantemp_ckey = src.scanner.occupant.ckey
- dat += "[src.scanner.occupant] => [scantemp]"
+ scantemp_ckey = scanner_occupant.ckey
+ dat += "[scanner_occupant] => [scantemp]"
dat += "
"
- if (src.scanner.occupant)
+ if(scanner_occupant)
dat += "Start Scan"
dat += "
[src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]"
else
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 3772dacbdb..0c2894f056 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -113,7 +113,8 @@
to_chat(R.connected_ai, "
ALERT - Cyborg detonation detected: [R.name]
")
R.ResetSecurityCodes()
else
- message_admins("[key_name_admin(usr)] (FLW) detonated [key_name(R, R.client)](JMP)!")
+ var/turf/T = get_turf(R)
+ message_admins("[ADMIN_LOOKUPFLW(usr)] detonated [key_name(R, R.client)][ADMIN_JMP(T)]!")
log_game("\[key_name(usr)] detonated [key_name(R)]!")
if(R.connected_ai)
to_chat(R.connected_ai, "
ALERT - Cyborg detonation detected: [R.name]
")
@@ -127,7 +128,7 @@
if(can_control(usr, R))
var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
if(choice == "Confirm" && can_control(usr, R) && !..())
- message_admins("[key_name_admin(usr)] (FLW) [R.canmove ? "locked down" : "released"] [key_name(R, R.client)](FLW)!")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] [R.canmove ? "locked down" : "released"] [key_name(R, R.client)][ADMIN_LOOKUPFLW(R)]!")
log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R)]!")
R.SetLockdown(!R.lockcharge)
to_chat(R, "[!R.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]")
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index af59f63888..d572b3e9dc 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -105,13 +105,14 @@
..()
// search for ghosts, if the corpse is empty and the scanner is connected to a cloner
- if(occupant)
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant)
if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \
|| locate(/obj/machinery/computer/cloning, get_step(src, SOUTH)) \
|| locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \
|| locate(/obj/machinery/computer/cloning, get_step(src, WEST)))
- if(!occupant.suiciding && !(occupant.disabilities & NOCLONE) && !occupant.hellbound)
- occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src)
+ if(!mob_occupant.suiciding && !(mob_occupant.disabilities & NOCLONE) && !mob_occupant.hellbound)
+ mob_occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src)
var/obj/machinery/computer/scan_consolenew/console
for(dir in list(NORTH,EAST,SOUTH,WEST))
@@ -157,4 +158,4 @@
if(..(user,1,0)) //don't set the machine, since there's no dialog
return
- toggle_open(user)
\ No newline at end of file
+ toggle_open(user)
diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm
index 92a550b17c..5979abdc29 100644
--- a/code/game/machinery/gulag_teleporter.dm
+++ b/code/game/machinery/gulag_teleporter.dm
@@ -136,13 +136,14 @@ The console is located at computer/gulag_teleporter.dm
/obj/machinery/gulag_teleporter/proc/strip_occupant()
if(linked_reclaimer)
linked_reclaimer.stored_items[occupant] = list()
- for(var/obj/item/W in occupant)
- if(!is_type_in_typecache(W, required_items) && occupant.temporarilyRemoveItemFromInventory(W))
+ var/mob/living/mob_occupant = occupant
+ for(var/obj/item/W in mob_occupant)
+ if(!is_type_in_typecache(W, required_items) && mob_occupant.temporarilyRemoveItemFromInventory(W))
if(istype(W, /obj/item/weapon/restraints/handcuffs))
W.forceMove(get_turf(src))
continue
if(linked_reclaimer)
- linked_reclaimer.stored_items[occupant] += W
+ linked_reclaimer.stored_items[mob_occupant] += W
linked_reclaimer.contents += W
W.forceMove(linked_reclaimer)
else
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index bc73c41f08..03ec33ca25 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -61,6 +61,7 @@ GLOBAL_LIST_EMPTY(holopads)
/obj/machinery/holopad/Destroy()
if(outgoing_call)
LAZYADD(holo_calls, outgoing_call)
+ outgoing_call = null
for(var/I in holo_calls)
var/datum/holocall/HC = I
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 6cd8e75798..96b0029134 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -1,8 +1,8 @@
/*
Overview:
- Used to create objects that need a per step proc call. Default definition of 'New()'
+ Used to create objects that need a per step proc call. Default definition of 'Initialize()'
stores a reference to src machine in global 'machines list'. Default definition
- of 'Del' removes reference to src machine in global 'machines list'.
+ of 'Destroy' removes reference to src machine in global 'machines list'.
Class Variables:
use_power (num)
@@ -44,7 +44,7 @@ Class Variables:
EMPED:16 -- temporary broken by EMP pulse
Class Procs:
- New() 'game/machinery/machine.dm'
+ Initialize() 'game/machinery/machine.dm'
Destroy() 'game/machinery/machine.dm'
@@ -118,14 +118,15 @@ Class Procs:
var/panel_open = 0
var/state_open = 0
var/critical_machine = FALSE //If this machine is critical to station operation and should have the area be excempted from power failures.
- var/mob/living/occupant = null
+ var/list/occupant_typecache = list(/mob/living) // turned into typecache in Initialize
+ var/atom/movable/occupant = null
var/unsecuring_tool = /obj/item/weapon/wrench
var/interact_open = 0 // Can the machine be interacted with when in maint/when the panel is open.
var/interact_offline = 0 // Can the machine be interacted with while de-powered.
var/speed_process = 0 // Process as fast as possible?
/obj/machinery/Initialize()
- if (!armor)
+ if(!armor)
armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
. = ..()
GLOB.machines += src
@@ -135,6 +136,8 @@ Class Procs:
START_PROCESSING(SSfastprocess, src)
power_change()
+ occupant_typecache = typecacheof(occupant_typecache)
+
/obj/machinery/Destroy()
GLOB.machines.Remove(src)
if(!speed_process)
@@ -176,16 +179,24 @@ Class Procs:
L.update_canmove()
occupant = null
-/obj/machinery/proc/close_machine(mob/living/target = null)
+/obj/machinery/proc/close_machine(atom/movable/target = null)
state_open = 0
density = 1
if(!target)
- for(var/mob/living/carbon/C in loc)
- if(C.buckled || C.has_buckled_mobs())
+ for(var/am in loc)
+ if(!is_type_in_typecache(am, occupant_typecache))
continue
- else
- target = C
- if(target && !target.buckled && !target.has_buckled_mobs())
+ var/atom/movable/AM = am
+ if(AM.has_buckled_mobs())
+ continue
+ if(isliving(AM))
+ var/mob/living/L = am
+ if(L.buckled)
+ continue
+ target = am
+
+ var/mob/living/mobtarget = target
+ if(target && !target.has_buckled_mobs() && (!isliving(target) || !mobtarget.buckled))
occupant = target
target.forceMove(src)
updateUsrDialog()
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 727124276b..56b13f0e46 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -1,6 +1,9 @@
#define TURRET_STUN 0
#define TURRET_LETHAL 1
+#define POPUP_ANIM_TIME 5
+#define POPDOWN_ANIM_TIME 5 //Be sure to change the icon animation at the same time or it'll look bad
+
/obj/machinery/porta_turret
name = "turret"
icon = 'icons/obj/turrets.dmi'
@@ -422,7 +425,7 @@
raising = 1
if(cover)
flick("popup", cover)
- sleep(10)
+ sleep(POPUP_ANIM_TIME)
raising = 0
if(cover)
cover.icon_state = "openTurretCover"
@@ -438,7 +441,7 @@
raising = 1
if(cover)
flick("popdown", cover)
- sleep(10)
+ sleep(POPDOWN_ANIM_TIME)
raising = 0
if(cover)
cover.icon_state = "turretCover"
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 57e6ee3f09..c65c0029ff 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -121,7 +121,7 @@
var/atom/movable/AM = i
var/obj/item/bodypart/head/as_head = AM
var/obj/item/device/mmi/as_mmi = AM
- var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain)
+ var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /mob/living/brain)
if(isliving(AM) || brain_holder)
if(emagged)
if(!brain_holder)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 7fc0f98b1c..e81774e147 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -211,13 +211,13 @@
uv = TRUE
locked = TRUE
update_icon()
- if(occupant)
+ if(occupant)
+ var/mob/living/mob_occupant = occupant
if(uv_super)
- occupant.adjustFireLoss(rand(20, 36))
+ mob_occupant.adjustFireLoss(rand(20, 36))
else
- occupant.adjustFireLoss(rand(10, 16))
- if(iscarbon(occupant))
- occupant.emote("scream")
+ mob_occupant.adjustFireLoss(rand(10, 16))
+ mob_occupant.emote("scream")
addtimer(CALLBACK(src, .proc/cook), 50)
else
uv_cycles = initial(uv_cycles)
@@ -368,14 +368,15 @@
else if(!helmet && !mask && !suit && !storage && !occupant)
return
else
- if(occupant)
- to_chat(occupant, "[src]'s confines grow warm, then hot, then scorching. You're being burned [!occupant.stat ? "alive" : "away"]!")
+ if(occupant)
+ var/mob/living/mob_occupant = occupant
+ to_chat(mob_occupant, "[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!")
cook()
. = TRUE
if("dispense")
if(!state_open)
return
-
+
var/static/list/valid_items = list("helmet", "suit", "mask", "storage")
var/item_name = params["item"]
if(item_name in valid_items)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index aad16f7e24..fd40f7e273 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -737,8 +737,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "sustenance"
products = list(/obj/item/weapon/reagent_containers/food/snacks/tofu = 24,
/obj/item/weapon/reagent_containers/food/drinks/ice = 12,
- /obj/item/weapon/reagent_containers/food/snacks/candy_corn = 6,
- /obj/item/weapon/reagent_containers/glass/beaker/waterbottle = 10)
+ /obj/item/weapon/reagent_containers/food/snacks/candy_corn = 6,
+ /obj/item/weapon/reagent_containers/glass/beaker/waterbottle = 10)
contraband = list(/obj/item/weapon/kitchen/knife = 6,
/obj/item/weapon/reagent_containers/food/drinks/coffee = 12,
/obj/item/weapon/tank/internals/emergency_oxygen = 6,
@@ -755,7 +755,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
products = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/starkist = 10,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_up = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
- /obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,/obj/item/weapon/reagent_containers/glass/beaker/waterbottle = 10)
+ /obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,/obj/item/weapon/reagent_containers/glass/beaker/waterbottle = 10)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/shamblers = 6)
premium = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/air = 1)
refill_canister = /obj/item/weapon/vending_refill/cola
@@ -1128,7 +1128,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/clothing/head/beanie=1, /obj/item/clothing/head/beanie/black=1, /obj/item/clothing/head/beanie/red=1, /obj/item/clothing/head/beanie/green=1, /obj/item/clothing/head/beanie/darkblue=1,
/obj/item/clothing/head/beanie/purple=1, /obj/item/clothing/head/beanie/yellow=1, /obj/item/clothing/head/beanie/orange=1, /obj/item/clothing/head/beanie/cyan=1, /obj/item/clothing/head/beanie/christmas=1,
/obj/item/clothing/head/beanie/striped=1, /obj/item/clothing/head/beanie/stripedred=1, /obj/item/clothing/head/beanie/stripedblue=1, /obj/item/clothing/head/beanie/stripedgreen=1,
- /obj/item/clothing/suit/jacket/letterman_red=1)
+ /obj/item/clothing/suit/jacket/letterman_red=1, /obj/item/clothing/head/hunter=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/weapon/storage/belt/fannypack/black=2,/obj/item/clothing/suit/jacket/letterman_syndie=1,/obj/item/clothing/under/jabroni=1, /obj/item/clothing/suit/vapeshirt=1, /obj/item/clothing/under/geisha=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/suit/jacket/leather/overcoat=1,/obj/item/clothing/under/pants/mustangjeans=1,/obj/item/clothing/neck/necklace/dope=3,/obj/item/clothing/suit/jacket/letterman_nanotrasen=1)
refill_canister = /obj/item/weapon/vending_refill/clothing
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 658a6a7692..bf90f0a569 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -337,8 +337,8 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/proj_init(var/obj/item/weapon/grenade/flashbang/F)
var/turf/T = get_turf(src)
- message_admins("[key_name(chassis.occupant, chassis.occupant.client)](?) fired a [src] in ([T.x],[T.y],[T.z] - JMP)",0,1)
- log_game("[key_name(chassis.occupant)] fired a [src] ([T.x],[T.y],[T.z])")
+ message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] fired a [src] in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("[key_name(chassis.occupant)] fired a [src] [COORD(T)]")
addtimer(CALLBACK(F, /obj/item/weapon/grenade/flashbang.proc/prime), det_time)
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang //Because I am a heartless bastard -Sieve //Heartless? for making the poor man's honkblast? - Kaze
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
index 7727b4d9e9..a39c4fbe93 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -129,7 +129,7 @@
name = "footprints"
icon = 'icons/effects/footprints.dmi'
icon_state = "nothingwhatsoever"
- desc = "where might they lead?"
+ desc = "WHOSE FOOTPRINTS ARE THESE?"
random_icon_states = null
var/entered_dirs = 0
var/exited_dirs = 0
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index a34e30e689..9324c6edb7 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -74,7 +74,7 @@
/obj/effect/particle_effect/smoke/proc/spread_smoke()
var/turf/t_loc = get_turf(src)
if(!t_loc)
- return
+ return
var/list/newsmokes = list()
for(var/turf/T in t_loc.GetAtmosAdjacentTurfs())
var/obj/effect/particle_effect/smoke/foundsmoke = locate() in T //Don't spread smoke where there's already smoke!
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index a6517ccdb5..f7faa0e5e5 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -611,6 +611,18 @@
icon_state = "shieldsparkles"
duration = 6
+/obj/effect/overlay/temp/heart
+ name = "heart"
+ icon = 'icons/mob/animal.dmi'
+ icon_state = "heart"
+ duration = 25
+
+/obj/effect/overlay/temp/heart/Initialize(mapload)
+ . = ..()
+ pixel_x = rand(-4,4)
+ pixel_y = rand(-4,4)
+
+ animate(src, pixel_y = pixel_y + 32, alpha = 0, time = 25)
/obj/effect/overlay/palmtree_r
name = "Palm tree"
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index e8c86390ea..2290456d78 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -63,7 +63,7 @@
return
if (istype(M, /atom/movable))
if(ismegafauna(M))
- message_admins("[M] (FLW) has teleported through [src].")
+ message_admins("[M] [ADMIN_FLW(M)] has teleported through [src].")
do_teleport(M, target, precision) ///You will appear adjacent to the beacon
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index 07ffe61689..11079bf847 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -1,10 +1,15 @@
-/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)
+/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range, silent = 0, smoke = 1)
set waitfor = 0
src = null //so we don't abort once src is deleted
epicenter = get_turf(epicenter)
if(!epicenter)
return
+ if(isnull(flame_range))
+ flame_range = light_impact_range
+ if(isnull(flash_range))
+ flash_range = devastation_range
+
// Archive the uncapped explosion for the doppler array
var/orig_dev_range = devastation_range
var/orig_heavy_range = heavy_impact_range
diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm
index 0cf73fd9ff..36efee0092 100644
--- a/code/game/objects/items/charter.dm
+++ b/code/game/objects/items/charter.dm
@@ -7,6 +7,7 @@
desc = "An official document entrusting the governance of the station \
and surrounding space to the Captain. "
var/used = FALSE
+ var/name_type = "station"
var/unlimited_uses = FALSE
var/ignores_timeout = FALSE
@@ -33,10 +34,10 @@
/obj/item/station_charter/attack_self(mob/living/user)
if(used)
- to_chat(user, "This charter has already been used to name the station.")
+ to_chat(user, "The [name_type] has already been named.")
return
if(!ignores_timeout && (world.time-SSticker.round_start_time > STATION_RENAME_TIME_LIMIT)) //5 minutes
- to_chat(user, "The crew has already settled into the shift. It probably wouldn't be good to rename the station right now.")
+ to_chat(user, "The crew has already settled into the shift. It probably wouldn't be good to rename the [name_type] right now.")
return
if(response_timer_id)
to_chat(user, "You're still waiting for approval from your employers about your proposed name change, it'd be best to wait for now.")
@@ -60,7 +61,7 @@
to_chat(user, "Your name has been sent to your employers for approval.")
// Autoapproves after a certain time
response_timer_id = addtimer(CALLBACK(src, .proc/rename_station, new_name, user.name, user.real_name, key_name(user)), approval_time, TIMER_STOPPABLE)
- to_chat(GLOB.admins, "CUSTOM STATION RENAME:[key_name_admin(user)] (?) proposes to rename the station to [new_name] (will autoapprove in [approval_time / 10] seconds). [ADMIN_SMITE(user)] (REJECT) (RPLY)")
+ to_chat(GLOB.admins, "CUSTOM STATION RENAME:[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [new_name] (will autoapprove in [approval_time / 10] seconds). [ADMIN_SMITE(user)] (REJECT) [ADMIN_CENTCOM_REPLY(user)]")
/obj/item/station_charter/proc/reject_proposed(user)
if(!user)
@@ -94,4 +95,27 @@
unlimited_uses = TRUE
ignores_timeout = TRUE
+
+/obj/item/weapon/station_charter/flag
+ name = "nanotrasen banner"
+ icon = 'icons/obj/items.dmi'
+ var/name_type = "planet"
+ icon_state = "banner"
+ item_state = "banner"
+ desc = "A cunning device used to claim ownership of planets."
+ w_class = 5
+ force = 15
+
+/obj/item/station_charter/flag/rename_station(designation, uname, ureal_name, ukey)
+ set_station_name(designation)
+ minor_announce("[ureal_name] has designated the planet as [station_name()]", "Captain's Banner", 0)
+ log_game("[ukey] has renamed the planet as [station_name()].")
+ name = "banner of [station_name()]"
+ desc = "The banner bears the official coat of arms of Nanotrasen, signifying that [station_name()] has been claimed by Captain [uname] in the name of the company."
+ SSblackbox.set_details("station_renames","[station_name()]")
+ if(!unlimited_uses)
+ used = TRUE
+
+
+
#undef STATION_RENAME_TIME_LIMIT
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index 2764d54d82..e1cf6bb8c8 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -7,6 +7,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
origin_tech = "materials=2;magnets=1;bluespace=2"
+ unique_rename = TRUE
var/gpstag = "COM0"
var/emped = FALSE
var/turf/locked_location
@@ -135,10 +136,9 @@ GLOBAL_LIST_EMPTY(GPS_list)
..()
if(href_list["tag"] )
var/a = input("Please enter desired tag.", name, gpstag) as text
- a = uppertext(copytext(sanitize(a), 1, 5))
+ a = copytext(sanitize(a), 1, 20)
if(in_range(src, usr))
gpstag = a
- name = "global positioning system ([gpstag])"
attack_self(usr)
/obj/item/device/gps/science
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index 18658ceeb3..f7d11d2f47 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -95,8 +95,8 @@
"[user] activates \the [src]!", \
"You activate \the [src].",
"You hear a click.")
- message_admins("Power sink activated by [key_name_admin(user)](?) (FLW) at ([x],[y],[z] - JMP)")
- log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])")
+ message_admins("Power sink activated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(src)]")
+ log_game("Power sink activated by [key_name(user)] at [COORD(src)]")
set_mode(OPERATING)
if(OPERATING)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 1f2f86e42a..de0692d8e7 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -296,6 +296,7 @@
// --- Cold, emotionless machines. ---
else if(isobj(M))
jobname = "Machine"
+ voice = capitalize(voice)
// --- Unidentifiable mob ---
else
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index 257418eaa7..8d37640b6d 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -178,21 +178,21 @@
var/log_attacher = ""
if(attacher)
- log_attacher = "(?) (FLW)"
+ log_attacher = "[ADMIN_QUE(attacher)] [ADMIN_FLW(attacher)]"
var/mob/mob = get_mob_by_key(src.fingerprintslast)
var/last_touch_info = ""
if(mob)
- last_touch_info = "(?) (FLW)"
+ last_touch_info = "[ADMIN_QUE(mob)] [ADMIN_FLW(mob)]"
var/log_str3 = " Last touched by: [key_name_admin(mob)]"
- var/bomb_message = "[log_str1] [A.name] [log_str2][log_attacher] [log_str3][last_touch_info]"
+ var/bomb_message = "[log_str1] [A.name][ADMIN_JMP(bombturf)] [log_str2][log_attacher] [log_str3][last_touch_info]"
GLOB.bombers += bomb_message
message_admins(bomb_message, 0, 1)
- log_game("[log_str1] [A.name]([A.x],[A.y],[A.z]) [log_str2] [log_str3]")
+ log_game("[log_str1] [A.name][COORD(bombturf)] [log_str2] [log_str3]")
merge_gases()
spawn(20) // In case one tank bursts
for (var/i=0,i<5,i++)
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index e76def6eee..436bc5ff59 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -155,8 +155,9 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \
/obj/item/stack/sheet/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma sheets ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma sheets ignited by [key_name(user)] in ([x],[y],[z])")
+ var/turf/T = get_turf(src)
+ message_admins("Plasma sheets ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Plasma sheets ignited by [key_name(user)] in [COORD(T)]")
fire_act()
else
return ..()
diff --git a/code/game/objects/items/weapons/clown.dm b/code/game/objects/items/weapons/clown.dm
new file mode 100644
index 0000000000..a01a0f18b6
--- /dev/null
+++ b/code/game/objects/items/weapons/clown.dm
@@ -0,0 +1,46 @@
+
+/obj/item/weapon/pie_cannon
+ name = "pie cannon"
+ desc = "Load cream pie for optimal results"
+ force = 10
+ icon_state = "piecannon"
+ item_state = "powerfist"
+ var/obj/item/weapon/reagent_containers/food/snacks/pie/loaded = null
+
+/obj/item/weapon/pie_cannon/attackby(obj/item/I, mob/living/L)
+ if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/pie))
+ if(!loaded)
+ L.transferItemToLoc(I, src)
+ loaded = I
+ to_chat(L, "You load the [I] into the [src]!")
+ return
+ return ..()
+
+/obj/item/weapon/pie_cannon/afterattack(atom/target, mob/living/user, flag, params)
+ if(!loaded)
+ return ..()
+ var/obj/item/projectile/pie/launched = new /obj/item/projectile/pie(src)
+ launched.P = loaded
+ loaded.forceMove(launched)
+ launched.appearance = loaded.appearance
+ loaded = null
+ launched.preparePixelProjectile(target, get_turf(target), user, params, 0)
+ launched.forceMove(get_turf(src))
+ launched.fire()
+ user.visible_message("[user] fires the [src] at [target]!")
+
+/obj/item/projectile/pie
+ name = "pie"
+ desc = "Think fast!"
+ var/obj/item/weapon/reagent_containers/food/snacks/pie/P = null
+
+/obj/item/projectile/pie/on_hit(atom/A)
+ . = ..()
+ if(P)
+ A.visible_message("[P] smashes into [A] at high velocity!")
+ P.forceMove(get_turf(A))
+ P.throw_impact(A)
+ if(ismovableatom(A))
+ var/atom/movable/AM = A
+ if(!AM.anchored)
+ AM.throw_at(get_edge_target_turf(get_dir(src, AM), 3, 2))
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index ac53eb25ff..aab6c9db48 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -158,7 +158,7 @@
if(lit)
START_PROCESSING(SSobj, src)
if(!warned_admins)
- message_admins("[key_name_admin(usr)]? (FLW) has lit a flamethrower.")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] has lit a flamethrower.")
warned_admins = 1
if(href_list["amount"])
throw_amount = throw_amount + text2num(href_list["amount"])
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 1ef83f3ac1..42362c1e55 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -36,8 +36,8 @@
else if(clown_check(user))
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
- message_admins("[key_name_admin(usr)]? (FLW) has primed a [name] for detonation at [A.name] (JMP).")
- log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] has primed a [name] for detonation at [A.name][ADMIN_JMP(bombturf)].")
+ log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].")
to_chat(user, "You prime the [name]! [det_time / 10] second\s!")
playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1)
active = 1
@@ -177,12 +177,12 @@
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)](?) (FLW) and last touched by [key_name_admin(last)](?) (FLW) ([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])")
+ message_admins("grenade primed by an assembly, attached by [ADMIN_LOOKUPFLW(M)] and last touched by [ADMIN_LOOKUPFLW(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [ADMIN_JMP(T)].")
+ 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] [COORD(T)]")
var/turf/DT = get_turf(src)
var/area/DA = get_area(DT)
- log_game("A grenade detonated at [DA.name] ([DT.x], [DT.y], [DT.z])")
+ log_game("A grenade detonated at [DA.name] [COORD(DT)]")
update_mob()
diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm
index 023635c977..09b9d6aa33 100644
--- a/code/game/objects/items/weapons/grenades/plastic.dm
+++ b/code/game/objects/items/weapons/grenades/plastic.dm
@@ -119,8 +119,8 @@
qdel(src) //How?
/obj/item/weapon/grenade/plastic/suicide_act(mob/user)
- message_admins("[key_name_admin(user)](?) (FLW) suicided with [src] at ([user.x],[user.y],[user.z] - JMP)",0,1)
- message_admins("[key_name(user)] suicided with [src] at ([user.x],[user.y],[user.z])")
+ message_admins("[ADMIN_LOOKUPFLW(user)] suicided with [src] at [ADMIN_COORDJMP(user)]",0,1)
+ log_game("[key_name(user)] suicided with [src] at [COORD(user)]")
user.visible_message("[user] activates the [src] and holds it above [user.p_their()] head! It looks like [user.p_theyre()] going out with a bang!")
var/message_say = "FOR NO RAISIN!"
if(user.mind)
diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm
index 369effbe7c..009aae3b54 100644
--- a/code/game/objects/items/weapons/implants/implant_explosive.dm
+++ b/code/game/objects/items/weapons/implants/implant_explosive.dm
@@ -44,7 +44,7 @@
active = TRUE
var/turf/boomturf = get_turf(imp_in)
var/area/A = get_area(boomturf)
- message_admins("[key_name_admin(imp_in)]? (FLW) has activated their [name] at [A.name] (JMP).")
+ message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [A.name] [ADMIN_JMP(boomturf)].")
//If the delay is short, just blow up already jeez
if(delay <= 7)
explosion(src,heavy,medium,weak,weak, flame_range = weak)
diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm
index 6f1a43a93a..a3b72d55bd 100644
--- a/code/game/objects/items/weapons/implants/implantchair.dm
+++ b/code/game/objects/items/weapons/implants/implantchair.dm
@@ -41,9 +41,10 @@
data["open"] = state_open
data["occupant"] = list()
- if(occupant)
- data["occupant"]["name"] = occupant.name
- data["occupant"]["stat"] = occupant.stat
+ if(occupant)
+ var/mob/living/mob_occupant = occupant
+ data["occupant"]["name"] = mob_occupant.name
+ data["occupant"]["stat"] = mob_occupant.stat
data["special_name"] = special ? special_name : null
data["ready_implants"] = ready_implants
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 56c53e9cd8..fd8c5483a2 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -16,7 +16,7 @@
var/brightness_on = 3
/obj/item/weapon/melee/energy/Initialize()
- ..()
+ . = ..()
if(LAZYLEN(possible_colors))
item_color = pick(possible_colors)
switch(item_color)//Only run this check if the color was picked randomly, so that colors can be manually set for non-random colored energy weapons.
@@ -183,8 +183,8 @@
light_color = "#40ceff"
possible_colors = null
-/obj/item/weapon/melee/energy/sword/cyborg/saw/New()
- ..()
+/obj/item/weapon/melee/energy/sword/cyborg/saw/Initialize()
+ . = ..()
icon_state = "esaw_0"
item_color = null
@@ -207,19 +207,9 @@
/obj/item/weapon/melee/energy/sword/saber/attackby(obj/item/weapon/W, mob/living/user, params)
- if(istype(W, /obj/item/weapon/melee/energy/sword/saber))
- to_chat(user, "You attach the ends of the two energy swords, making a single double-bladed weapon! You're cool.")
- var/obj/item/weapon/melee/energy/sword/saber/other_esword = W
- var/obj/item/weapon/twohanded/dualsaber/newSaber = new(user.loc)
- if(hacked || other_esword.hacked)
- newSaber.hacked = TRUE
- newSaber.item_color = "rainbow"
- qdel(W)
- qdel(src)
- user.put_in_hands(newSaber)
- else if(istype(W, /obj/item/device/multitool))
- if(hacked == 0)
- hacked = 1
+ if(istype(W, /obj/item/device/multitool))
+ if(!hacked)
+ hacked = TRUE
item_color = "rainbow"
to_chat(user, "RNBW_ENGAGE")
@@ -253,14 +243,12 @@
sharpness = IS_SHARP
//Most of the other special functions are handled in their own files. aka special snowflake code so kewl
-/obj/item/weapon/melee/energy/blade/New()
+/obj/item/weapon/melee/energy/blade/Initialize()
+ . = ..()
spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
-/obj/item/weapon/melee/energy/blade/dropped()
- ..()
-
/obj/item/weapon/melee/energy/blade/attack_self(mob/user)
return
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 61e68934b9..86c517aa99 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -1,3 +1,7 @@
+
+#define PCANNON_FIREALL 1
+#define PCANNON_FILO 2
+#define PCANNON_FIFO 3
/obj/item/weapon/pneumatic_cannon
name = "pneumatic cannon"
desc = "A gas-powered cannon that can fire any object loaded into it."
@@ -16,7 +20,15 @@
var/gasPerThrow = 3 //How much gas is drawn from a tank's pressure to fire
var/list/loadedItems = list() //The items loaded into the cannon that will be fired out
var/pressureSetting = 1 //How powerful the cannon is - higher pressure = more gas but more powerful throws
+ var/checktank = TRUE
+ var/range_multiplier = 1
+ var/throw_amount = 20 //How many items to throw per fire
+ var/fire_mode = PCANNON_FIREALL
+ var/automatic = FALSE
+ var/clumsyCheck = TRUE
+/obj/item/weapon/pneumatic_cannon/CanItemAutoclick()
+ return automatic
/obj/item/weapon/pneumatic_cannon/examine(mob/user)
..()
@@ -30,6 +42,8 @@
/obj/item/weapon/pneumatic_cannon/attackby(obj/item/weapon/W, mob/user, params)
+ if(user.a_intent == INTENT_HARM)
+ return ..()
if(istype(W, /obj/item/weapon/tank/internals))
if(!tank)
var/obj/item/weapon/tank/internals/IT = W
@@ -55,19 +69,31 @@
to_chat(user, "\The [src] can't hold any more items!")
else if(istype(W, /obj/item))
var/obj/item/IW = W
- if((loadedWeightClass + IW.w_class) > maxWeightClass)
- to_chat(user, "\The [IW] won't fit into \the [src]!")
- return
- if(IW.w_class > src.w_class)
- to_chat(user, "\The [IW] is too large to fit into \the [src]!")
- return
- if(!user.transferItemToLoc(W, src))
- return
- to_chat(user, "You load \the [IW] into \the [src].")
- loadedItems.Add(IW)
- loadedWeightClass += IW.w_class
+ load_item(IW, user)
+/obj/item/weapon/pneumatic_cannon/proc/can_load_item(obj/item/I, mob/user)
+ if((loadedWeightClass + I.w_class) > maxWeightClass) //Only make messages if there's a user
+ if(user)
+ to_chat(user, "\The [I] won't fit into \the [src]!")
+ return FALSE
+ if(I.w_class > w_class)
+ if(user)
+ to_chat(user, "\The [I] is too large to fit into \the [src]!")
+ return FALSE
+ return TRUE
+/obj/item/weapon/pneumatic_cannon/proc/load_item(obj/item/I, mob/user)
+ if(!can_load_item(I, user))
+ return FALSE
+ if(user) //Only use transfer proc if there's a user, otherwise just set loc.
+ if(!user.transferItemToLoc(I, src))
+ return FALSE
+ to_chat(user, "You load \the [I] into \the [src].")
+ else
+ I.forceMove(src)
+ loadedItems += I
+ loadedWeightClass += I.w_class
+ return TRUE
/obj/item/weapon/pneumatic_cannon/afterattack(atom/target, mob/living/carbon/human/user, flag, params)
if(flag && user.a_intent == INTENT_HARM) //melee attack
@@ -76,7 +102,6 @@
return
Fire(user, target)
-
/obj/item/weapon/pneumatic_cannon/proc/Fire(mob/living/carbon/human/user, var/atom/target)
if(!istype(user) && !target)
return
@@ -90,13 +115,13 @@
if(!loadedItems || !loadedWeightClass)
to_chat(user, "\The [src] has nothing loaded.")
return
- if(!tank)
+ if(!tank && checktank)
to_chat(user, "\The [src] can't fire without a source of gas.")
return
if(tank && !tank.air_contents.remove(gasPerThrow * pressureSetting))
to_chat(user, "\The [src] lets out a weak hiss and doesn't react!")
return
- if(user.disabilities & CLUMSY && prob(75))
+ if(user.disabilities & CLUMSY && prob(75) && clumsyCheck)
user.visible_message("[user] loses their grip on [src], causing it to go off!", "[src] slips out of your hands and goes off!")
user.drop_item()
if(prob(10))
@@ -109,17 +134,48 @@
user.visible_message("[user] fires \the [src]!", \
"You fire \the [src]!")
add_logs(user, target, "fired at", src)
+ var/turf/T = get_target(target, get_turf(src))
playsound(src.loc, 'sound/weapons/sonic_jackhammer.ogg', 50, 1)
- for(var/obj/item/ITD in loadedItems) //Item To Discharge
- loadedItems.Remove(ITD)
- loadedWeightClass -= ITD.w_class
- ITD.throw_speed = pressureSetting * 2
- ITD.loc = get_turf(src)
- ITD.throw_at(target, pressureSetting * 5, pressureSetting * 2,user)
+ fire_items(T, user)
if(pressureSetting >= 3 && user)
user.visible_message("[user] is thrown down by the force of the cannon!", "[src] slams into your shoulder, knocking you down!")
user.Weaken(3)
+/obj/item/weapon/pneumatic_cannon/proc/fire_items(turf/target, mob/user)
+ if(fire_mode == PCANNON_FIREALL)
+ for(var/obj/item/ITD in loadedItems) //Item To Discharge
+ if(!throw_item(target, ITD, user))
+ break
+ else
+ for(var/i in 1 to throw_amount)
+ if(!loadedItems.len)
+ break
+ var/obj/item/I
+ if(fire_mode == PCANNON_FILO)
+ I = loadedItems[loadedItems.len]
+ else
+ I = loadedItems[1]
+ if(!throw_item(target, I, user))
+ break
+
+/obj/item/weapon/pneumatic_cannon/proc/throw_item(turf/target, obj/item/I, mob/user)
+ if(!istype(I))
+ return FALSE
+ loadedItems -= I
+ loadedWeightClass -= I.w_class
+ I.forceMove(get_turf(src))
+ I.throw_at(target, pressureSetting * 10 * range_multiplier, pressureSetting * 2, user)
+ return TRUE
+
+/obj/item/weapon/pneumatic_cannon/proc/get_target(turf/target, turf/starting)
+ if(range_multiplier == 1)
+ return target
+ var/x_o = (target.x - starting.x)
+ var/y_o = (target.y - starting.y)
+ var/new_x = Clamp((starting.x + (x_o * range_multiplier)), 0, world.maxx)
+ var/new_y = Clamp((starting.y + (y_o * range_multiplier)), 0, world.maxy)
+ var/turf/newtarget = locate(new_x, new_y, starting.z)
+ return newtarget
/obj/item/weapon/pneumatic_cannon/ghetto //Obtainable by improvised methods; more gas per use, less capacity, but smaller
name = "improvised pneumatic cannon"
@@ -164,3 +220,35 @@
return
add_overlay(tank.icon_state)
src.update_icon()
+
+/obj/item/weapon/pneumatic_cannon/proc/fill_with_type(type, amount)
+ if(!ispath(type, /obj/item))
+ return FALSE
+ var/loaded = 0
+ for(var/i in 1 to amount)
+ var/obj/item/I = new type
+ if(!load_item(I, null))
+ qdel(I)
+ return loaded
+ loaded++
+ CHECK_TICK
+ return loaded
+
+/obj/item/weapon/pneumatic_cannon/pie
+ name = "pie cannon"
+ desc = "Load cream pie for optimal results"
+ force = 10
+ icon_state = "piecannon"
+ gasPerThrow = 0
+ checktank = FALSE
+ range_multiplier = 3
+ fire_mode = PCANNON_FIFO
+ throw_amount = 1
+ maxWeightClass = 100 //50 pies. :^)
+ clumsyCheck = FALSE
+
+/obj/item/weapon/pneumatic_cannon/pie/can_load_item(obj/item/I, mob/user)
+ if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/pie))
+ return ..()
+ to_chat(user, "[src] only accepts pies!")
+ return FALSE
diff --git a/code/game/objects/items/weapons/storage/dakis.dm b/code/game/objects/items/weapons/storage/dakis.dm
new file mode 100644
index 0000000000..a238304cac
--- /dev/null
+++ b/code/game/objects/items/weapons/storage/dakis.dm
@@ -0,0 +1,48 @@
+//////////////////////////////////
+//dakimakuras
+//////////////////////////////////
+
+/obj/item/weapon/storage/daki
+ name = "dakimakura"
+ desc = "A large pillow depicting a girl in a compromising position. Featuring as many dimensions as you."
+ icon = 'icons/obj/daki.dmi'
+ icon_state = "daki_base"
+ slot_flags = SLOT_BACK
+ storage_slots = 3
+ w_class = 4
+ max_w_class = 3
+ max_combined_w_class = 21
+ var/cooldowntime = 20
+ var/static/list/dakimakura_options = list("Callie","Casca","Chaika","Elisabeth","Foxy Grandpa","Haruko","Holo","Ian","Jolyne","Kurisu","Marie","Mugi","Nar'Sie","Patchouli","Plutia","Rei","Reisen","Naga","Squid","Squigly","Tomoko","Toriel","Umaru","Yaranaika","Yoko") //Kurisu is the ideal girl." - Me, Logos.
+
+/obj/item/weapon/storage/daki/attack_self(mob/living/user)
+ var/body_choice
+ var/custom_name
+
+ if(icon_state == "daki_base")
+ body_choice = input("Pick a body.") in dakimakura_options
+ icon_state = "daki_[body_choice]"
+ custom_name = stripped_input(user, "What's her name?")
+ if(length(custom_name) > MAX_NAME_LEN)
+ to_chat(user,"Name is too long!")
+ return FALSE
+ if(custom_name)
+ name = custom_name
+ desc = "A large pillow depicting [custom_name] in a compromising position. Featuring as many dimensions as you."
+ else
+ switch(user.a_intent)
+ if(INTENT_HELP)
+ user.visible_message("[user] hugs the [name].")
+ playsound(src, "rustle", 50, 1, -5)
+ if(INTENT_DISARM)
+ user.visible_message("[user] kisses the [name].")
+ playsound(src, "rustle", 50, 1, -5)
+ if(INTENT_GRAB)
+ user.visible_message("[user] holds the [name]!")
+ playsound(src, 'sound/items/bikehorn.ogg', 50, 1)
+ if(INTENT_HARM)
+ user.visible_message("[user] punches the [name]!")
+ playsound(src, 'sound/effects/shieldbash.ogg', 50, 1)
+ user.changeNext_move(CLICK_CD_MELEE)
+
+////////////////////////////
diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm
index 540ff0f206..cfdc6cc354 100644
--- a/code/game/objects/items/weapons/storage/internal.dm
+++ b/code/game/objects/items/weapons/storage/internal.dm
@@ -5,10 +5,6 @@
w_class = WEIGHT_CLASS_BULKY
rustle_jimmies = FALSE
-/obj/item/weapon/storage/internal/ClickAccessible(mob/user, depth=1)
- if(loc)
- return loc.ClickAccessible(user, depth)
-
/obj/item/weapon/storage/internal/Adjacent(A)
if(loc)
return loc.Adjacent(A)
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 08e947c45d..b1378617b8 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -38,7 +38,7 @@
return
// this must come before the screen objects only block, dunno why it wasn't before
- if(over_object == M && (src.ClickAccessible(M, depth=STORAGE_VIEW_DEPTH) || Adjacent(M)))
+ if(over_object == M && M.CanReach(src,view_only = TRUE))
orient2hud(M)
if(M.s_active)
M.s_active.close(M)
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 9cf806f6b3..1962fbd818 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -92,8 +92,7 @@
new /obj/item/pizzabox/bomb
if("darklord") //20 tc + tk + summon item close enough for now
- new /obj/item/weapon/melee/energy/sword/saber(src)
- new /obj/item/weapon/melee/energy/sword/saber(src)
+ new /obj/item/weapon/twohanded/dualsaber(src)
new /obj/item/weapon/dnainjector/telemut/darkbundle(src)
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
new /obj/item/weapon/card/id/syndicate(src)
@@ -219,8 +218,8 @@
new /obj/item/weapon/reagent_containers/glass/bottle/polonium(src)
new /obj/item/weapon/reagent_containers/glass/bottle/venom(src)
new /obj/item/weapon/reagent_containers/glass/bottle/neurotoxin2(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/spewium(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/spewium(src)
new /obj/item/weapon/reagent_containers/glass/bottle/cyanide(src)
new /obj/item/weapon/reagent_containers/glass/bottle/histamine(src)
new /obj/item/weapon/reagent_containers/glass/bottle/initropidril(src)
@@ -297,3 +296,10 @@
/obj/item/weapon/storage/box/syndie_kit/mimery/PopulateContents()
new /obj/item/weapon/spellbook/oneuse/mimery_blockade(src)
new /obj/item/weapon/spellbook/oneuse/mimery_guns(src)
+
+/obj/item/weapon/storage/box/syndie_kit/holoparasite
+ name = "box"
+
+/obj/item/weapon/storage/box/syndie_kit/holoparasite/PopulateContents()
+ new /obj/item/weapon/guardiancreator/tech/choose/traitor(src)
+ new /obj/item/weapon/paper/guardian(src)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 002c7773b4..daa86eb833 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -262,11 +262,11 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
resistance_flags = FIRE_PROOF
var/hacked = 0
- var/brightness_on = 6//TWICE AS BRIGHT AS A REGULAR ESWORD
+ var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
var/list/possible_colors = list("red", "blue", "green", "purple")
/obj/item/weapon/twohanded/dualsaber/Initialize()
- ..()
+ . = ..()
if(LAZYLEN(possible_colors))
item_color = pick(possible_colors)
switch(item_color)
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index a0de9b5f76..e28c916ae4 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -390,7 +390,7 @@
desc = "A chainsaw that has replaced your arm."
icon_state = "chainsaw_on"
item_state = "mounted_chainsaw"
- flags = NODROP | ABSTRACT
+ flags = NODROP | ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
force = 21
throwforce = 0
@@ -400,10 +400,17 @@
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg'
-/obj/item/weapon/mounted_chainsaw/dropped()
- ..()
+/obj/item/weapon/mounted_chainsaw/Destroy()
+ var/obj/item/bodypart/part
new /obj/item/weapon/twohanded/required/chainsaw(get_turf(src))
- qdel(src)
+ if(iscarbon(loc))
+ var/mob/living/carbon/holder = loc
+ var/index = holder.get_held_index_of_item(src)
+ if(index)
+ part = holder.hand_bodyparts[index]
+ . = ..()
+ if(part)
+ part.drop_limb()
/obj/item/weapon/statuebust
name = "bust"
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 6813706ed6..89c815692d 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -106,6 +106,11 @@ LINEN BINS
icon_state = "sheetrd"
item_color = "director"
+// for Free Golems.
+/obj/item/weapon/bedsheet/rd/royal_cape
+ name = "Royal Cape of the Liberator"
+ desc = "Majestic."
+
/obj/item/weapon/bedsheet/medical
name = "medical blanket"
desc = "It's a sterilized* blanket commonly used in the Medbay. *Sterilization is voided if a virologist is present onboard the station."
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 67989257f2..5e1ea02509 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -11,6 +11,7 @@
else
new /obj/item/weapon/storage/backpack/satchel/cap(src)
new /obj/item/clothing/neck/cloak/cap(src)
+ new /obj/item/weapon/storage/daki(src)
new /obj/item/weapon/storage/backpack/dufflebag/captain(src)
new /obj/item/clothing/head/crown/fancy(src)
new /obj/item/clothing/suit/captunic(src)
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 466be07c50..389ae40e88 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -234,8 +234,9 @@
/obj/structure/falsewall/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(W.is_hot() > 300)
- message_admins("Plasma falsewall ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma falsewall ignited by [key_name(user)] in ([x],[y],[z])")
+ var/turf/T = get_turf(src)
+ message_admins("Plasma falsewall ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Plasma falsewall ignited by [key_name(user)] in [COORD(T)]")
burnbabyburn()
else
return ..()
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 129862dd62..039f3da5d7 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -188,8 +188,9 @@
/obj/structure/mineral_door/transparent/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(W.is_hot())
- message_admins("Plasma mineral door ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma mineral door ignited by [key_name(user)] in ([x],[y],[z])")
+ var/turf/T = get_turf(src)
+ message_admins("Plasma mineral door ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Plasma mineral door ignited by [key_name(user)] in [COORD(T)]")
TemperatureAct()
else
return ..()
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index f5defdab50..6909965614 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -163,18 +163,20 @@
PlasmaBurn(500)
burn = TRUE
if(burn)
+ var/turf/T = get_turf(src)
if(Proj.firer)
- message_admins("Plasma statue ignited by [key_name_admin(Proj.firer)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma statue ignited by [key_name(Proj.firer)] in ([x],[y],[z])")
+ message_admins("Plasma statue ignited by [ADMIN_LOOKUPFLW(Proj.firer)] in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Plasma statue ignited by [key_name(Proj.firer)] in [COORD(T)]")
else
- message_admins("Plasma statue ignited by [Proj]. No known firer.(?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma statue ignited by [Proj] in ([x],[y],[z]). No known firer.")
+ message_admins("Plasma statue ignited by [Proj]. No known firer, in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Plasma statue ignited by [Proj] in [COORD(T)]. No known firer.")
..()
/obj/structure/statue/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma statue ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma statue ignited by [key_name(user)] in ([x],[y],[z])")
+ var/turf/T = get_turf(src)
+ message_admins("Plasma statue ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Plasma statue ignited by [key_name(user)] in [COORD(T)]")
ignite(W.is_hot())
else
return ..()
diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm
index 3e58e62854..5024dfea90 100644
--- a/code/game/turfs/simulated/floor/mineral_floor.dm
+++ b/code/game/turfs/simulated/floor/mineral_floor.dm
@@ -44,8 +44,8 @@
/turf/open/floor/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma flooring was ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma flooring was ignited by [key_name(user)] in ([x],[y],[z])")
+ message_admins("Plasma flooring was ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("Plasma flooring was ignited by [key_name(user)] in [COORD(src)]")
ignite(W.is_hot())
return
..()
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index 398ff190f2..54f3ad5ad5 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -407,14 +407,14 @@
if(z != 5)
notify_admins = 1
if(!triggered_by_explosion)
- message_admins("[key_name_admin(user)]? (FLW) has triggered a gibtonite deposit reaction at [A.name] (JMP).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].")
else
- message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] (JMP).")
+ message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].")
if(!triggered_by_explosion)
- log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] ([A.x], [A.y], [A.z]).")
+ log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].")
else
- log_game("An explosion has triggered a gibtonite deposit reaction at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
+ log_game("An explosion has triggered a gibtonite deposit reaction at [A.name] [COORD(bombturf)]")
countdown(notify_admins)
diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm
index 355ba66a62..61a26954d3 100644
--- a/code/game/turfs/simulated/wall/mineral_walls.dm
+++ b/code/game/turfs/simulated/wall/mineral_walls.dm
@@ -101,8 +101,8 @@
/turf/closed/wall/mineral/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma wall ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma wall ignited by [key_name(user)] in ([x],[y],[z])")
+ message_admins("Plasma wall ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("Plasma wall ignited by [key_name(user)] in [COORD(src)]")
ignite(W.is_hot())
return
..()
diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm
index 9411917c39..bba253a9da 100644
--- a/code/modules/VR/vr_sleeper.dm
+++ b/code/modules/VR/vr_sleeper.dm
@@ -9,6 +9,7 @@
icon_state = "sleeper"
state_open = TRUE
anchored = TRUE
+ occupant_typecache = list(/mob/living/carbon/human) // turned into typecache in Initialize
var/you_die_in_the_game_you_die_for_real = FALSE
var/datum/effect_system/spark_spread/sparks
var/mob/living/carbon/human/virtual_reality/vr_human
@@ -92,11 +93,12 @@
return
switch(action)
if("vr_connect")
- if(ishuman(occupant) && occupant.mind)
+ var/mob/living/carbon/human/human_occupant = occupant
+ if(human_occupant && human_occupant.mind)
to_chat(occupant, "Transfering to virtual reality...")
if(vr_human)
vr_human.revert_to_reality(FALSE, FALSE)
- occupant.mind.transfer_to(vr_human)
+ human_occupant.mind.transfer_to(vr_human)
vr_human.real_me = occupant
to_chat(vr_human, "Transfer successful! you are now playing as [vr_human] in VR!")
SStgui.close_user_uis(vr_human, src)
diff --git a/code/modules/admin/DB_ban/functions.dm b/code/modules/admin/DB_ban/functions.dm
index 12517eb385..67d3b394c6 100644
--- a/code/modules/admin/DB_ban/functions.dm
+++ b/code/modules/admin/DB_ban/functions.dm
@@ -71,16 +71,13 @@
computerid = bancid
ip = banip
- var/datum/DBQuery/query_add_ban_get_id = SSdbcore.NewQuery("SELECT id FROM [format_table_name("player")] WHERE ckey = '[ckey]'")
- if(!query_add_ban_get_id.warn_execute())
+ var/datum/DBQuery/query_add_ban_get_ckey = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[ckey]'")
+ if(!query_add_ban_get_ckey.warn_execute())
return
- var/validckey = 0
- if(query_add_ban_get_id.NextRow())
- validckey = 1
- if(!validckey)
+ if(!query_add_ban_get_ckey.NextRow())
if(!banned_mob || (banned_mob && !IsGuestKey(banned_mob.key)))
- message_admins("[key_name_admin(usr)] attempted to ban [ckey], but [ckey] has not been seen yet. Please only ban actual players.",1)
- return
+ if(alert(usr, "[ckey] has not been seen before, are you sure you want to create a ban for them?", "Unknown ckey", "Yes", "No", "Cancel") != "Yes")
+ return
var/a_ckey
var/a_computerid
diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm
index 09e3629533..d4fa2e6177 100644
--- a/code/modules/admin/IsBanned.dm
+++ b/code/modules/admin/IsBanned.dm
@@ -63,7 +63,7 @@
if(!SSdbcore.Connect())
log_world("Ban database connection failure. Key [ckeytext] not checked")
- GLOB.diary << "Ban database connection failure. Key [ckeytext] not checked"
+ GLOB.world_game_log << "Ban database connection failure. Key [ckeytext] not checked"
return
var/ipquery = ""
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 0e7986ec18..7196319568 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -37,6 +37,11 @@
else
body += " \[Heal\] "
+ if(M.client)
+ body += "
\[First Seen: [M.client.player_join_date]\]\[Byond account registered on: [M.client.account_join_date]\]"
+
+
+
body += "
\[ "
body += "VV - "
body += "TP - "
@@ -804,7 +809,7 @@
return 1
/client/proc/adminGreet(logout)
- if(SSticker.HasRoundStarted())
+ if(SSticker.HasRoundStarted())
var/string
if(logout && config && config.announce_admin_logout)
string = pick(
diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
index 53fefc30bc..7aca1ececb 100644
--- a/code/modules/admin/admin_investigate.dm
+++ b/code/modules/admin/admin_investigate.dm
@@ -1,50 +1,21 @@
-//By Carnwennan
-
-//This system was made as an alternative to all the in-game lists and variables used to log stuff in-game.
-//lists and variables are great. However, they have several major flaws:
-//Firstly, they use memory. TGstation has one of the highest memory usage of all the ss13 branches.
-//Secondly, they are usually stored in an object. This means that they aren't centralised. It also means that
-//the data is lost when the object is deleted! This is especially annoying for things like the singulo engine!
-#define INVESTIGATE_DIR "data/investigate/"
-
-//SYSTEM
-/proc/investigate_subject2file(subject)
- return file("[INVESTIGATE_DIR][subject].html")
-
-/proc/investigate_reset()
- if(fdel(INVESTIGATE_DIR))
- return 1
- return 0
-
-/atom/proc/investigate_log(message, subject)
- if(!message)
- return
- var/F = investigate_subject2file(subject)
- if(!F)
+atom/proc/investigate_log(message, subject)
+ if(!message || !subject)
return
+ var/F = file("[GLOB.log_directory]/[subject].html")
F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
"
-//ADMINVERBS
-/client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "botany") )
+
+/client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "botany") )
set name = "Investigate"
set category = "Admin"
if(!holder)
return
switch(subject)
- if("singulo", "wires", "telesci", "gravity", "records", "cargo", "supermatter", "atmos", "botany") //general one-round-only stuff
- var/F = investigate_subject2file(subject)
- if(!F)
- to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.")
- return
- src << browse(F,"window=investigate[subject];size=800x300")
- if("hrefs") //persistent logs and stuff
- if(GLOB.href_logfile)
- src << browse(GLOB.href_logfile,"window=investigate[subject];size=800x300")
- else if(!config.log_hrefs)
- to_chat(src, "Href logging is off and no logfile was found.")
- return
- else
- to_chat(src, "No href logfile was found.")
- return
if("notes, memos, watchlist")
browse_messages()
+ else
+ var/F = file("[GLOB.log_directory]/[subject].html")
+ if(!fexists(F))
+ to_chat(src, "No [subject] logfile was found.")
+ return
+ src << browse(F,"window=investigate[subject];size=800x300")
\ No newline at end of file
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index b38cc4e289..d4fbd1a030 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -127,7 +127,7 @@ GLOBAL_PROTECT(admin_ranks)
else
if(!SSdbcore.Connect())
log_world("Failed to connect to database in load_admin_ranks(). Reverting to legacy system.")
- GLOB.diary << "Failed to connect to database in load_admin_ranks(). Reverting to legacy system."
+ GLOB.world_game_log << "Failed to connect to database in load_admin_ranks(). Reverting to legacy system."
config.admin_legacy_system = 1
load_admin_ranks()
return
@@ -202,7 +202,7 @@ GLOBAL_PROTECT(admin_ranks)
else
if(!SSdbcore.Connect())
log_world("Failed to connect to database in load_admins(). Reverting to legacy system.")
- GLOB.diary << "Failed to connect to database in load_admins(). Reverting to legacy system."
+ GLOB.world_game_log << "Failed to connect to database in load_admins(). Reverting to legacy system."
config.admin_legacy_system = 1
load_admins()
return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index d4ba53c6af..e5f8360527 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -4,18 +4,12 @@ GLOBAL_PROTECT(admin_verbs_default)
GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault())
/world/proc/AVerbsDefault()
return list(
- /client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
- /client/proc/toggleannouncelogin, /*toggles if an admin's login is announced during a round*/
/client/proc/deadmin, /*destroys our own admin datum so we can play as a regular player*/
/client/proc/cmd_admin_say, /*admin-only ooc chat*/
/client/proc/hide_verbs, /*hides all our adminverbs*/
/client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/
- /client/proc/deadchat, /*toggles deadchat on/off*/
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
- /client/proc/toggleprayers, /*toggles prayers on/off*/
- /client/verb/toggleprayersounds, /*Toggles prayer sounds (HALLELUJAH!)*/
- /client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/secrets,
/client/proc/restart_controller,
@@ -32,7 +26,6 @@ GLOBAL_PROTECT(admin_verbs_admin)
GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
/world/proc/AVerbsAdmin()
return list(
- /client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
// /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage
/datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/
@@ -46,16 +39,14 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
/datum/admins/proc/set_admin_notice,/*announcement all clients see when joining the server.*/
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
/client/proc/toggle_view_range, /*changes how far we can see*/
- /datum/admins/proc/view_txt_log, /*shows the server log (diary) for today*/
+ /datum/admins/proc/view_txt_log, /*shows the server log (world_game_log) for today*/
/datum/admins/proc/view_atk_log, /*shows the server combat-log, doesn't do anything presently*/
/client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
/client/proc/cmd_admin_check_contents, /*displays the contents of an instance*/
/client/proc/check_antagonists, /*shows all antags*/
/datum/admins/proc/access_news_network, /*allows access of newscasters*/
- /client/proc/giveruntimelog, /*allows us to give access to runtime logs to somebody*/
- /client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/
- /client/proc/getserverlog, /*allows us to fetch server logs (diary) for other days*/
+ /client/proc/getserverlog, /*allows us to fetch server logs (world_game_log) for other days*/
/client/proc/jumptocoord, /*we ghost and jump to a coordinate*/
/client/proc/Getmob, /*teleports a mob to our location*/
/client/proc/Getkey, /*teleports a mob with a certain ckey to our location*/
@@ -116,7 +107,6 @@ GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
/datum/admins/proc/end_round,
/datum/admins/proc/delay,
/datum/admins/proc/toggleaban,
- /client/proc/toggle_log_hrefs,
/client/proc/everyone_random,
/datum/admins/proc/toggleAI,
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
@@ -182,9 +172,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/set_ooc,
/client/proc/reset_ooc,
/client/proc/deadmin,
- /client/proc/deadchat,
- /client/proc/toggleprayers,
- /client/proc/toggle_hear_radio,
/datum/admins/proc/show_traitor_panel,
/datum/admins/proc/toggleenter,
/datum/admins/proc/toggleguests,
@@ -223,7 +210,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/datum/admins/proc/restart,
/datum/admins/proc/delay,
/datum/admins/proc/toggleaban,
- /client/proc/toggle_log_hrefs,
/client/proc/everyone_random,
/datum/admins/proc/toggleAI,
/client/proc/restart_controller,
@@ -398,13 +384,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
mob.invisibility = INVISIBILITY_OBSERVER
to_chat(mob, "Invisimin on. You are now as invisible as a ghost.")
-/client/proc/player_panel_new()
- set name = "Player Panel"
- set category = "Admin"
- if(holder)
- holder.player_panel_new()
- SSblackbox.add_details("admin_verb","Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
/client/proc/check_antagonists()
set name = "Check Antagonists"
set category = "Admin"
@@ -638,19 +617,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
togglebuildmode(src.mob)
SSblackbox.add_details("admin_verb","Toggle Build Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/toggle_log_hrefs()
- set name = "Toggle href logging"
- set category = "Server"
- if(!holder)
- return
- if(config)
- if(config.log_hrefs)
- config.log_hrefs = 0
- to_chat(src, "Stopped logging hrefs")
- else
- config.log_hrefs = 1
- to_chat(src, "Started logging hrefs")
-
/client/proc/check_ai_laws()
set name = "Check AI Laws"
set category = "Admin"
diff --git a/code/modules/admin/adminmenu.dm b/code/modules/admin/adminmenu.dm
new file mode 100644
index 0000000000..fc7a57e212
--- /dev/null
+++ b/code/modules/admin/adminmenu.dm
@@ -0,0 +1,11 @@
+/datum/menu/Admin/Generate_list(client/C)
+ if (C.holder)
+ . = ..()
+
+/datum/menu/Admin/verb/playerpanel()
+ set name = "Player Panel"
+ set desc = "Player Panel"
+ set category = "Admin"
+ usr.client.holder.player_panel_new()
+ SSblackbox.add_details("admin_verb","Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ return
\ No newline at end of file
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index a59f40e35a..70ef44576c 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -71,7 +71,7 @@
if("select", "delete", "update")
select_types = query_tree[query_tree[1]]
- from_objs = SDQL_from_objs(query_tree["from"])
+ from_objs = world.SDQL_from_objs(query_tree["from"])
var/list/objs = list()
@@ -101,7 +101,7 @@
if("call")
for(var/datum/d in objs)
try
- SDQL_var(d, query_tree["call"][1], source = d)
+ world.SDQL_var(d, query_tree["call"][1], source = d)
catch(var/exception/e)
runtime_tracker += SDQL_parse_exception(e)
runtimes++
@@ -177,15 +177,6 @@
returning += "Description: [E.desc]
"
return returning
-/proc/SDQL_callproc_global(procname,args_list)
- set waitfor = FALSE
- WrapAdminProcCall(GLOBAL_PROC, procname, args_list)
-
-/proc/SDQL_callproc(thing, procname, args_list)
- set waitfor = FALSE
- if(hascall(thing, procname))
- WrapAdminProcCall(thing, procname, args_list)
-
/proc/SDQL_parse(list/query_list)
var/datum/SDQL_parser/parser = new()
var/list/querys = list()
@@ -249,15 +240,10 @@
-/proc/SDQL_from_objs(list/tree)
+/world/proc/SDQL_from_objs(list/tree)
if("world" in tree)
- if(IsAdminAdvancedProcCall())
- var/msg = "WARNING: Attempt to retrieve world reference made by [usr]!"
- log_admin(msg)
- message_admins(msg)
- return
- return world
- return SDQL_expression(world, tree)
+ return src
+ return SDQL_expression(src, tree)
/proc/SDQL_get_all(type, location)
var/list/out = list()
@@ -417,12 +403,12 @@
result = dummy
val += result
else
- val = SDQL_var(object, expression, i, object)
+ val = world.SDQL_var(object, expression, i, object)
i = expression.len
return list("val" = val, "i" = i)
-/proc/SDQL_var(datum/object, list/expression, start = 1, source)
+/world/proc/SDQL_var(datum/object, list/expression, start = 1, source)
var/v
var/long = start < expression.len
if(object == world && long && expression[start + 1] == ".")
@@ -456,11 +442,6 @@
else
return null
if("world")
- if(IsAdminAdvancedProcCall())
- var/msg = "WARNING: Attempt to retrieve world reference made by [usr]!"
- log_admin(msg)
- message_admins(msg)
- return
v = world
if("global")
v = GLOB
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 6b642d4fdd..db9eaa6458 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -479,7 +479,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
current_ticket.MessageNoRecipient(msg)
current_ticket.TimeoutVerb()
return
- else
+ else
to_chat(usr, "Ticket not found, creating new one...")
else
current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.")
diff --git a/code/modules/admin/verbs/adminhelp.dm.rej b/code/modules/admin/verbs/adminhelp.dm.rej
new file mode 100644
index 0000000000..3c6cec82d9
--- /dev/null
+++ b/code/modules/admin/verbs/adminhelp.dm.rej
@@ -0,0 +1,55 @@
+diff a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm (rejected hunks)
+@@ -67,7 +67,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
+ for(var/I in l2b)
+ var/datum/admin_help/AH = I
+ dat += "Ticket #[AH.id]: [AH.initiator_key_name]: [AH.name]
"
+-
++
+ usr << browse(dat.Join(), "window=ahelp_list[state];size=600x480")
+
+ //Tickets statpanel
+@@ -253,7 +253,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
+ if(state == AHELP_ACTIVE)
+ to_chat(usr, "This ticket is already open.")
+ return
+-
++
+ if(GLOB.ahelp_tickets.CKey2ActiveTicket(initiator_ckey))
+ to_chat(usr, "This user already has an active ticket, cannot reopen this one.")
+ return
+@@ -310,7 +310,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
+ RemoveActive()
+ state = AHELP_RESOLVED
+ GLOB.ahelp_tickets.ListInsert(src)
+-
++
+ if(initiator)
+ initiator.giveadminhelpverb()
+
+@@ -325,7 +325,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
+ /datum/admin_help/proc/Reject(key_name = key_name_admin(usr))
+ if(state != AHELP_ACTIVE)
+ return
+-
++
+ if(initiator)
+ initiator.giveadminhelpverb()
+
+@@ -494,7 +494,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
+
+ if(!check_rights(R_ADMIN, TRUE))
+ return
+-
++
+ var/browse_to
+
+ switch(input("Display which ticket list?") as null|anything in list("Active Tickets", "Closed Tickets", "Resolved Tickets"))
+@@ -506,7 +506,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
+ browse_to = AHELP_RESOLVED
+ else
+ return
+-
++
+ GLOB.ahelp_tickets.BrowseTickets(browse_to)
+
+ //
diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm
index 7624a9443e..24cb4275b8 100644
--- a/code/modules/admin/verbs/getlogs.dm
+++ b/code/modules/admin/verbs/getlogs.dm
@@ -1,62 +1,3 @@
-/*
- HOW DO I LOG RUNTIMES?
- Firstly, start dreamdeamon if it isn't already running. Then select "world>Log Session" (or press the F3 key)
- navigate the popup window to the data/logs/runtimes/ folder from where your tgstation .dmb is located.
- (you may have to make this folder yourself)
-
- OPTIONAL: you can select the little checkbox down the bottom to make dreamdeamon save the log everytime you
- start a world. Just remember to repeat these steps with a new name when you update to a new revision!
-
- Save it with the name of the revision your server uses (e.g. r3459.txt).
- Game Masters will now be able to grant access any runtime logs you have archived this way!
- This will allow us to gather information on bugs across multiple servers and make maintaining the TG
- codebase for the entire /TG/station commuity a TONNE easier :3 Thanks for your help!
-*/
-
-
-//This proc allows Game Masters to grant a client access to the .getruntimelog verb
-//Permissions expire at the end of each round.
-//Runtimes can be used to meta or spot game-crashing exploits so it's advised to only grant coders that
-//you trust access. Also, it may be wise to ensure that they are not going to play in the current round.
-/client/proc/giveruntimelog()
- set name = ".giveruntimelog"
- set desc = "Give somebody access to any session logfiles saved to the /log/runtime/ folder."
- set category = null
-
- if(!src.holder)
- to_chat(src, "Only Admins may use this command.")
- return
-
- var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in GLOB.clients
- if(!istype(target,/client))
- to_chat(src, "Error: giveruntimelog(): Client not found.")
- return
-
- target.verbs |= /client/proc/getruntimelog
- to_chat(target, "You have been granted access to runtime logs. Please use them responsibly or risk being banned.")
- return
-
-
-//This proc allows download of runtime logs saved within the data/logs/ folder by dreamdeamon.
-//It works similarly to show-server-log.
-/client/proc/getruntimelog()
- set name = ".getruntimelog"
- set desc = "Retrieve any session logfiles saved by dreamdeamon."
- set category = null
-
- var/path = browse_files("data/logs/runtimes/")
- if(!path)
- return
-
- if(file_spam_check())
- return
-
- message_admins("[key_name_admin(src)] accessed file: [path]")
- src << ftp(file(path))
- to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.")
- return
-
-
//This proc allows download of past server logs saved within the data/logs/ folder.
//It works similarly to show-server-log.
/client/proc/getserverlog()
@@ -83,10 +24,10 @@
/datum/admins/proc/view_txt_log()
set category = "Admin"
set name = "Show Server Log"
- set desc = "Shows today's server log."
+ set desc = "Shows server log for this round."
- if(fexists("[GLOB.diary]"))
- src << ftp(GLOB.diary)
+ if(fexists("[GLOB.world_game_log]"))
+ src << ftp(GLOB.world_game_log)
else
to_chat(src, "Server log not found, try using .getserverlog.")
return
@@ -97,10 +38,10 @@
/datum/admins/proc/view_atk_log()
set category = "Admin"
set name = "Show Server Attack Log"
- set desc = "Shows today's server attack log."
+ set desc = "Shows server attack log for this round."
- if(fexists("[GLOB.diaryofmeanpeople]"))
- src << ftp(GLOB.diaryofmeanpeople)
+ if(fexists("[GLOB.world_attack_log]"))
+ src << ftp(GLOB.world_attack_log)
else
to_chat(src, "Server attack log not found, try using .getserverlog.")
return
diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm
index 9fdb316971..ba50ecae32 100644
--- a/code/modules/admin/verbs/map_template_loadverb.dm
+++ b/code/modules/admin/verbs/map_template_loadverb.dm
@@ -19,7 +19,7 @@
usr.client.images += preview
if(alert(usr,"Confirm location.","Template Confirm","Yes","No") == "Yes")
if(template.load(T, centered = TRUE))
- message_admins("[key_name_admin(usr)] has placed a map template ([template.name]) at (JMP)")
+ message_admins("[key_name_admin(usr)] has placed a map template ([template.name]) at [ADMIN_COORDJMP(T)]")
else
to_chat(usr, "Failed to place map")
usr.client.images -= preview
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index f1bf4d6969..288027454a 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -112,6 +112,7 @@
message_admins(" LocalNarrate: [key_name_admin(usr)] at [get_area(A)][ADMIN_JMP(A)]: [msg]
")
SSblackbox.add_details("admin_verb","Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
/client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list)
set category = "Special Verbs"
set name = "Godmode"
@@ -700,7 +701,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Make Everyone Random"
set desc = "Make everyone have a random appearance. You can only use this before rounds!"
- if(SSticker.HasRoundStarted())
+ if(SSticker.HasRoundStarted())
to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!")
return
diff --git a/code/modules/admin/verbs/randomverbs.dm.rej b/code/modules/admin/verbs/randomverbs.dm.rej
new file mode 100644
index 0000000000..b4cc8e90b5
--- /dev/null
+++ b/code/modules/admin/verbs/randomverbs.dm.rej
@@ -0,0 +1,12 @@
+diff a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm (rejected hunks)
+@@ -108,8 +108,8 @@
+ for(var/mob/M in view(range,A))
+ to_chat(M, msg)
+
+- log_admin("LocalNarrate: [key_name(usr)] at ([get_area(A)]): [msg]")
+- message_admins(" LocalNarrate: [key_name_admin(usr)] at ([get_area(A)]): [msg]
")
++ log_admin("LocalNarrate: [key_name(usr)] at [get_area(A)][COORD(A)]: [msg]")
++ message_admins(" LocalNarrate: [key_name_admin(usr)] at [get_area(A)][ADMIN_JMP(A)]: [msg]
")
+ SSblackbox.add_details("admin_verb","Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+ /client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list)
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index 897812db5c..c1fd6de4a5 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -93,10 +93,10 @@
if(href_list["time"])
timing = text2num(href_list["time"])
if(timing && istype(holder, /obj/item/device/transfer_valve))
- var/timer_message = "[key_name_admin(usr)](?) (FLW) activated [src] attachment on [holder]."
+ var/timer_message = "[ADMIN_LOOKUPFLW(usr)] activated [src] attachment on [holder]."
message_admins(timer_message)
GLOB.bombers += timer_message
- log_game("[key_name(usr)] activated [src] attachment for [loc]")
+ log_game("[key_name(usr)] activated [src] attachment on [holder]")
update_icon()
if(href_list["repeat"])
loop = text2num(href_list["repeat"])
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 2a67b5fe13..3a9eb1a028 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -1,7 +1,7 @@
/obj/machinery/atmospherics/components/unary/cryo_cell
name = "cryo cell"
icon = 'icons/obj/cryogenics.dmi'
- icon_state = "pod0"
+ icon_state = "cell-off"
density = 1
anchored = 1
obj_integrity = 350
@@ -12,7 +12,6 @@
state_open = FALSE
var/autoeject = FALSE
var/volume = 100
- var/running_bob_animation = FALSE
var/efficiency = 1
var/sleep_factor = 750
@@ -88,59 +87,17 @@
beaker = null
/obj/machinery/atmospherics/components/unary/cryo_cell/update_icon()
- handle_update_icon()
-
-/obj/machinery/atmospherics/components/unary/cryo_cell/proc/handle_update_icon() //making another proc to avoid spam in update_icon
- overlays.Cut() //empty the overlay proc, just in case
-
if(panel_open)
- icon_state = "pod0-o"
+ icon_state = "cell-o"
else if(state_open)
- icon_state = "pod0"
+ icon_state = "cell-open"
else if(on && is_operational())
if(occupant)
- var/image/pickle = image(occupant.icon, occupant.icon_state)
- pickle.overlays = occupant.overlays
- pickle.pixel_y = 22
- overlays += pickle
- icon_state = "pod1"
- var/up = 0 //used to see if we are going up or down, 1 is down, 2 is up
- spawn(0) // Without this, the icon update will block. The new thread will die once the occupant leaves.
- running_bob_animation = TRUE
- while(occupant)
- overlays -= "lid1" //have to remove the overlays first, to force an update- remove cloning pod overlay
- overlays -= pickle //remove mob overlay
-
- switch(pickle.pixel_y) //this looks messy as fuck but it works, switch won't call itself twice
-
- if(23) //inbetween state, for smoothness
- switch(up) //this is set later in the switch, to keep track of where the mob is supposed to go
- if(2) //2 is up
- pickle.pixel_y = 24 //set to highest
-
- if(1) //1 is down
- pickle.pixel_y = 22 //set to lowest
-
- if(22) //mob is at it's lowest
- pickle.pixel_y = 23 //set to inbetween
- up = 2 //have to go up
-
- if(24) //mob is at it's highest
- pickle.pixel_y = 23 //set to inbetween
- up = 1 //have to go down
-
- overlays += pickle //re-add the mob to the icon
- overlays += "lid1" //re-add the overlay of the pod, they are inside it, not floating
-
- sleep(7) //don't want to jiggle violently, just slowly bob
- return
- running_bob_animation = FALSE
+ icon_state = "cell-occupied"
else
- icon_state = "pod1"
- overlays += "lid0" //have to remove the overlays first, to force an update- remove cloning pod overlay
+ icon_state = "cell-on"
else
- icon_state = "pod0"
- overlays += "lid0" //if no occupant, just put the lid overlay on, and ignore the rest
+ icon_state = "cell-off"
/obj/machinery/atmospherics/components/unary/cryo_cell/process()
..()
@@ -153,25 +110,26 @@
return
var/datum/gas_mixture/air1 = AIR1
var/turf/T = get_turf(src)
- if(occupant)
- if(occupant.health >= 100) // Don't bother with fully healed people.
+ if(isliving(occupant))
+ var/mob/living/mob_occupant
+ if(mob_occupant.health >= 100) // Don't bother with fully healed people.
on = FALSE
update_icon()
- playsound(T, 'sound/machines/cryo_warning.ogg', volume, 1) // Bug the doctors.
- radio.talk_into(src, "Patient fully restored", radio_channel)
+ playsound(T, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors.
+ radio.talk_into(src, "Patient fully restored", radio_channel, get_spans(), get_default_language())
if(autoeject) // Eject if configured.
- radio.talk_into(src, "Auto ejecting patient now", radio_channel,get_spans(), get_default_language())
+ radio.talk_into(src, "Auto ejecting patient now", radio_channel, get_spans(), get_default_language())
open_machine()
return
- else if(occupant.stat == DEAD) // We don't bother with dead people.
+ else if(mob_occupant.stat == DEAD) // We don't bother with dead people.
return
if(autoeject) // Eject if configured.
open_machine()
return
if(air1.gases.len)
- if(occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic.
- occupant.Sleeping((occupant.bodytemperature / sleep_factor) * 100)
- occupant.Paralyse((occupant.bodytemperature / paralyze_factor) * 100)
+ if(mob_occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic.
+ mob_occupant.Sleeping((mob_occupant.bodytemperature / sleep_factor) * 100)
+ mob_occupant.Paralyse((mob_occupant.bodytemperature / paralyze_factor) * 100)
if(beaker)
if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic.
@@ -191,20 +149,21 @@
on = FALSE
update_icon()
return
- if(occupant)
+ if(isliving(occupant))
+ var/mob/living/mob_occupant = occupant
var/cold_protection = 0
var/mob/living/carbon/human/H = occupant
if(istype(H))
cold_protection = H.get_cold_protection(air1.temperature)
- var/temperature_delta = air1.temperature - occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant.
+ var/temperature_delta = air1.temperature - mob_occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant.
if(abs(temperature_delta) > 1)
var/air_heat_capacity = air1.heat_capacity()
var/heat = ((1 - cold_protection) / 10 + conduction_coefficient) \
* temperature_delta * \
(air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity))
air1.temperature = max(air1.temperature - heat / air_heat_capacity, TCMB)
- occupant.bodytemperature = max(occupant.bodytemperature + heat / heat_capacity, TCMB)
+ mob_occupant.bodytemperature = max(mob_occupant.bodytemperature + heat / heat_capacity, TCMB)
air1.gases["o2"][MOLES] -= 0.5 / efficiency // Magically consume gas? Why not, we run on cryo magic.
@@ -242,7 +201,7 @@
..()
if(occupant)
if(on)
- to_chat(user, "[occupant] is inside [src]!")
+ to_chat(user, "Someone's inside [src]!")
else
to_chat(user, "You can barely make out a form floating in [src].")
else
@@ -265,9 +224,11 @@
I.loc = src
user.visible_message("[user] places [I] in [src].", \
"You place [I] in [src].")
+ var/reagentlist = pretty_string_from_reagent_list(I.reagents.reagent_list)
+ log_game("[key_name(user)] added an [I] to cyro containing [reagentlist]")
return
if(!on && !occupant && !state_open)
- if(default_deconstruction_screwdriver(user, "pod0-o", "pod0", I))
+ if(default_deconstruction_screwdriver(user, "cell-o", "cell-off", I))
return
if(exchange_parts(user, I))
return
@@ -294,17 +255,18 @@
data["autoEject"] = autoeject
var/list/occupantData = list()
- if(occupant)
- occupantData["name"] = occupant.name
- occupantData["stat"] = occupant.stat
- occupantData["health"] = occupant.health
- occupantData["maxHealth"] = occupant.maxHealth
+ if(isliving(occupant))
+ var/mob/living/mob_occupant = occupant
+ occupantData["name"] = mob_occupant.name
+ occupantData["stat"] = mob_occupant.stat
+ occupantData["health"] = mob_occupant.health
+ occupantData["maxHealth"] = mob_occupant.maxHealth
occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD
- occupantData["bruteLoss"] = occupant.getBruteLoss()
- occupantData["oxyLoss"] = occupant.getOxyLoss()
- occupantData["toxLoss"] = occupant.getToxLoss()
- occupantData["fireLoss"] = occupant.getFireLoss()
- occupantData["bodyTemperature"] = occupant.bodytemperature
+ occupantData["bruteLoss"] = mob_occupant.getBruteLoss()
+ occupantData["oxyLoss"] = mob_occupant.getOxyLoss()
+ occupantData["toxLoss"] = mob_occupant.getToxLoss()
+ occupantData["fireLoss"] = mob_occupant.getFireLoss()
+ occupantData["bodyTemperature"] = mob_occupant.bodytemperature
data["occupant"] = occupantData
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm.rej b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm.rej
new file mode 100644
index 0000000000..ef4176d273
--- /dev/null
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm.rej
@@ -0,0 +1,12 @@
+diff a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm (rejected hunks)
+@@ -110,8 +110,8 @@
+ return
+ var/datum/gas_mixture/air1 = AIR1
+ var/turf/T = get_turf(src)
+- if(isliving(occupant))
+- var/mob/living/mob_occupant
++ if(occupant)
++ var/mob/living/mob_occupant = occupant
+ if(mob_occupant.health >= 100) // Don't bother with fully healed people.
+ on = FALSE
+ update_icon()
diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm
index f9e3b79ed6..f5168db1c3 100644
--- a/code/modules/atmospherics/machinery/other/meter.dm
+++ b/code/modules/atmospherics/machinery/other/meter.dm
@@ -16,22 +16,17 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 40, acid = 0)
-/obj/machinery/meter/New()
- ..()
+/obj/machinery/meter/Initialize(mapload)
+ . = ..()
SSair.atmos_machinery += src
- src.target = locate(/obj/machinery/atmospherics/pipe) in loc
- return 1
+ if (mapload && !target)
+ target = locate(/obj/machinery/atmospherics/pipe) in loc
/obj/machinery/meter/Destroy()
SSair.atmos_machinery -= src
src.target = null
return ..()
-/obj/machinery/meter/Initialize(mapload)
- ..()
- if (mapload && !target)
- src.target = locate(/obj/machinery/atmospherics/pipe) in loc
-
/obj/machinery/meter/process_atmos()
if(!target)
icon_state = "meterX"
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index f5613c0b7e..7c9989c15d 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -400,8 +400,8 @@
var/bz = air_contents.gases["bz"]
var/freon = air_contents.gases["freon"]
if(n2o || plasma || bz || freon)
- message_admins("[key_name_admin(usr)] (?) (FLW) opened a canister that contains the following: (JMP)")
- log_admin("[key_name(usr)] opened a canister that contains the following at [x], [y], [z]:")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] opened a canister that contains the following: [ADMIN_JMP(src)]")
+ log_admin("[key_name(usr)] opened a canister that contains the following at [COORD(src)]:")
if(plasma)
log_admin("Plasma")
message_admins("Plasma")
diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm
index 40f88cbecb..63082d1988 100644
--- a/code/modules/atmospherics/machinery/portable/pump.dm
+++ b/code/modules/atmospherics/machinery/portable/pump.dm
@@ -103,8 +103,9 @@
var/plasma = air_contents.gases["plasma"]
var/n2o = air_contents.gases["n2o"]
if(n2o || plasma)
- message_admins("[key_name_admin(usr)] (?) (FLW) turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""]! (JMP)")
- log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [x], [y], [z]")
+ var/area/A = get_area(src)
+ message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][ADMIN_JMP(src)]")
+ log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][COORD(src)]")
. = TRUE
if("direction")
if(direction == PUMP_OUT)
diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm
index f24075702a..7a665b40f3 100644
--- a/code/modules/awaymissions/mission_code/Academy.dm
+++ b/code/modules/awaymissions/mission_code/Academy.dm
@@ -64,17 +64,18 @@
next_check = world.time + cooldown
/obj/structure/academy_wizard_spawner/proc/give_control()
+ set waitfor = FALSE
+
if(!current_wizard)
return
- spawn(0)
- var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as Wizard Academy Defender?", "wizard", null, ROLE_WIZARD, current_wizard)
- var/mob/dead/observer/chosen = null
-
- if(candidates.len)
- chosen = pick(candidates)
- message_admins("[key_name_admin(chosen)] was spawned as Wizard Academy Defender")
- current_wizard.ghostize() // on the off chance braindead defender gets back in
- current_wizard.key = chosen.key
+ var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as Wizard Academy Defender?", "wizard", null, be_special_flag = ROLE_WIZARD, M = current_wizard)
+ var/mob/dead/observer/chosen = null
+
+ if(candidates.len)
+ chosen = pick(candidates)
+ message_admins("[key_name_admin(chosen)] was spawned as Wizard Academy Defender")
+ current_wizard.ghostize() // on the off chance braindead defender gets back in
+ current_wizard.key = chosen.key
/obj/structure/academy_wizard_spawner/proc/summon_wizard()
var/turf/T = src.loc
diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm
index 707dab703c..06f2d6d019 100644
--- a/code/modules/cargo/exports/sheets.dm
+++ b/code/modules/cargo/exports/sheets.dm
@@ -88,7 +88,7 @@
// Wood. Quite expensive in the grim and dark 26 century.
/datum/export/stack/wood
- cost = 25
+ cost = 50
unit_name = "wood plank"
export_types = list(/obj/item/stack/sheet/mineral/wood)
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 895c042e00..b88cfc0315 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1688,15 +1688,6 @@
/obj/item/toy/crayon/rainbow)
crate_name = "art supply crate"
-/datum/supply_pack/misc/soapstone
- name = "Curator Engraving/Scribbling Crate"
- crate_name = "curator engraving/scribbling crate"
- cost = 3000
- contains = list(/obj/item/soapstone)
- access = GLOB.access_library
- crate_type = /obj/structure/closet/crate/secure
-
-
/datum/supply_pack/misc/bsa
name = "Bluespace Artillery Parts"
cost = 15000
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 739e0231ca..221043bd8a 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -39,9 +39,12 @@
////////////////////////////////////
//things that require the database//
////////////////////////////////////
- var/player_age = "Requires database" //So admins know why it isn't working - Used to determine how old the account is - in days.
+ var/player_age = -1 //Used to determine how old the account is - in days.
+ var/player_join_date = null //Date that this account was first seen in the server
var/related_accounts_ip = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip
var/related_accounts_cid = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id
+ var/account_join_date = null //Date of byond account creation in ISO 8601 format
+ var/account_age = -1 //Age of byond account in days
preload_rsc = PRELOAD_RSC
@@ -62,4 +65,4 @@
var/connection_timeofday //world.timeofday they connected
var/inprefs = FALSE
- var/list/topiclimiter
\ No newline at end of file
+ var/list/topiclimiter
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 4f6642f051..0d5e93fba7 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -80,8 +80,7 @@
*/
//Logs all hrefs
- if(config && config.log_hrefs && GLOB.href_logfile)
- GLOB.href_logfile << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
"
+ GLOB.world_href_log << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
"
// Admin PM
if(href_list["priv_msg"])
@@ -289,16 +288,11 @@ GLOBAL_LIST(external_rsc_urls)
mentor_memo_output("Show") */
add_verbs_from_config()
- set_client_age_from_db()
+ set_client_age_from_db(tdata)
var/cached_player_age = player_age //we have to cache this because other shit may change it and we need it's current value now down below.
if (isnum(cached_player_age) && cached_player_age == -1) //first connection
- player_age = 0
- if(!IsGuestKey(key) && SSdbcore.IsConnected())
- findJoinDate()
+ player_age = 0
- sync_client_with_db(tdata)
-
-
if (isnum(cached_player_age) && cached_player_age == -1) //first connection
if (config.panic_bunker && !holder && !(ckey in GLOB.deadmins))
log_access("Failed Login: [key] - New account attempting to connect during panic bunker")
@@ -311,20 +305,19 @@ GLOBAL_LIST(external_rsc_urls)
qdel(src)
return 0
+
if (config.notify_new_player_age >= 0)
message_admins("New user: [key_name_admin(src)] is connecting here for the first time.")
if (config.irc_first_connection_alert)
send2irc_adminless_only("New-user", "[key_name(src)] is connecting for the first time!")
-
- player_age = 0 // set it from -1 to 0 so the job selection code doesn't have a panic attack
-
- else if (isnum(player_age) && player_age < config.notify_new_player_age)
- message_admins("New user: [key_name_admin(src)] just connected with an age of [player_age] day[(player_age==1?"":"s")]")
-
- if(!IsGuestKey(key) && SSdbcore.IsConnected())
- findJoinDate()
-
- sync_client_with_db(tdata)
+ else if (isnum(cached_player_age) && cached_player_age < config.notify_new_player_age)
+ message_admins("New user: [key_name_admin(src)] just connected with an age of [cached_player_age] day[(player_age==1?"":"s")]")
+ if(config.use_account_age_for_jobs && account_age >= 0)
+ player_age = account_age
+ if(account_age >= 0 && account_age < config.notify_new_player_account_age)
+ message_admins("[key_name_admin(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age==1?"":"s")] old, created on [account_join_date].")
+ if (config.irc_first_connection_alert)
+ send2irc_adminless_only("new_byond_user", "[key_name(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age==1?"":"s")] old, created on [account_join_date].")
get_message_output("watchlist entry", ckey)
check_ip_intel()
@@ -360,6 +353,27 @@ GLOBAL_LIST(external_rsc_urls)
hook_vr("client_new",list(src))
+ var/list/topmenus = GLOB.menulist[/datum/menu]
+ for (var/thing in topmenus)
+ var/datum/menu/topmenu = thing
+ var/topmenuname = "[topmenu]"
+ if (topmenuname == "[topmenu.type]")
+ var/list/tree = splittext(topmenuname, "/")
+ topmenuname = tree[tree.len]
+ winset(src, "[topmenu.type]", "parent=menu;name=[url_encode(topmenuname)]")
+ var/list/entries = topmenu.Generate_list(src)
+ for (var/child in entries)
+ winset(src, "[url_encode(child)]", "[entries[child]]")
+ if (!ispath(child, /datum/menu))
+ var/atom/verb/verbpath = child
+ if (copytext(verbpath.name,1,2) != "@")
+ new child(src)
+
+ for (var/thing in prefs.menuoptions)
+ var/datum/menu/menuitem = GLOB.menulist[thing]
+ if (menuitem)
+ menuitem.Load_checked(src)
+
//////////////
//DISCONNECT//
//////////////
@@ -370,8 +384,8 @@ GLOBAL_LIST(external_rsc_urls)
adminGreet(1)
holder.owner = null
GLOB.admins -= src
-
- if (!GLOB.admins.len && SSticker.current_state == GAME_STATE_PLAYING) //Only report this stuff if we are currently playing.
+
+ if (!GLOB.admins.len && SSticker.IsRoundInProgress()) //Only report this stuff if we are currently playing.
if(!GLOB.admins.len) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell.
var/cheesy_message = pick(
"I have no admins online!",\
@@ -396,7 +410,7 @@ GLOBAL_LIST(external_rsc_urls)
"Sometimes when I have sex, I think about putting an entire peanut butter and jelly sandwich in the VCR.",\
"Forever alone :("\
)
-
+
send2irc("Server", "[cheesy_message] (No admins online)")
GLOB.ahelp_tickets.ClientLogout(src)
@@ -410,70 +424,86 @@ GLOBAL_LIST(external_rsc_urls)
/client/Destroy()
return QDEL_HINT_HARDDEL_NOW
-/client/proc/set_client_age_from_db()
+/client/proc/set_client_age_from_db(connectiontopic)
if (IsGuestKey(src.key))
return
-
if(!SSdbcore.Connect())
return
-
var/sql_ckey = sanitizeSQL(src.ckey)
-
- var/datum/DBQuery/query_get_client_age = SSdbcore.NewQuery("SELECT id, datediff(Now(),firstseen) as age FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'")
- if(!query_get_client_age.Execute())
- return
-
- while(query_get_client_age.NextRow())
- player_age = text2num(query_get_client_age.item[2])
- return
-
- //no match mark it as a first connection for use in client/New()
- player_age = -1
-
-
-/client/proc/sync_client_with_db(connectiontopic)
- if (IsGuestKey(src.key))
- return
-
- if (!SSdbcore.Connect())
- return
-
- var/sql_ckey = sanitizeSQL(ckey)
-
- var/datum/DBQuery/query_get_ip = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ip = INET_ATON('[address]') AND ckey != '[sql_ckey]'")
- query_get_ip.Execute()
+ var/datum/DBQuery/query_get_related_ip = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ip = INET_ATON('[address]') AND ckey != '[sql_ckey]'")
+ query_get_related_ip.Execute()
related_accounts_ip = ""
- while(query_get_ip.NextRow())
- related_accounts_ip += "[query_get_ip.item[1]], "
-
- var/datum/DBQuery/query_get_cid = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE computerid = '[computer_id]' AND ckey != '[sql_ckey]'")
- if(!query_get_cid.Execute())
+ while(query_get_related_ip.NextRow())
+ related_accounts_ip += "[query_get_related_ip.item[1]], "
+ var/datum/DBQuery/query_get_related_cid = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE computerid = '[computer_id]' AND ckey != '[sql_ckey]'")
+ if(!query_get_related_cid.Execute())
return
related_accounts_cid = ""
- while (query_get_cid.NextRow())
- related_accounts_cid += "[query_get_cid.item[1]], "
-
+ while (query_get_related_cid.NextRow())
+ related_accounts_cid += "[query_get_related_cid.item[1]], "
var/admin_rank = "Player"
if (src.holder && src.holder.rank)
admin_rank = src.holder.rank.name
else
if (check_randomizer(connectiontopic))
return
-
- var/sql_ip = sanitizeSQL(src.address)
- var/sql_computerid = sanitizeSQL(src.computer_id)
+ var/sql_ip = sanitizeSQL(address)
+ var/sql_computerid = sanitizeSQL(computer_id)
var/sql_admin_rank = sanitizeSQL(admin_rank)
-
-
- var/datum/DBQuery/query_log_player = SSdbcore.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[sql_ckey]', Now(), Now(), INET_ATON('[sql_ip]'), '[sql_computerid]', '[sql_admin_rank]') ON DUPLICATE KEY UPDATE lastseen = VALUES(lastseen), ip = VALUES(ip), computerid = VALUES(computerid), lastadminrank = VALUES(lastadminrank)")
- if(!query_log_player.Execute())
+ var/new_player
+ var/datum/DBQuery/query_client_in_db = SSdbcore.NewQuery("SELECT 1 FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'")
+ if(!query_client_in_db.Execute())
return
-
- //Logging player access
-
+ if(!query_client_in_db.NextRow())
+ new_player = 1
+ account_join_date = sanitizeSQL(findJoinDate())
+ var/datum/DBQuery/query_add_player = SSdbcore.NewQuery("INSERT INTO [format_table_name("player")] (`ckey`, `firstseen`, `lastseen`, `ip`, `computerid`, `lastadminrank`, `accountjoindate`) VALUES ('[sql_ckey]', Now(), Now(), INET_ATON('[sql_ip]'), '[sql_computerid]', '[sql_admin_rank]', [account_join_date ? "'[account_join_date]'" : "NULL"])")
+ if(!query_add_player.Execute())
+ return
+ if(!account_join_date)
+ account_join_date = "Error"
+ account_age = -1
+ var/datum/DBQuery/query_get_client_age = SSdbcore.NewQuery("SELECT firstseen, DATEDIFF(Now(),firstseen), accountjoindate, DATEDIFF(Now(),accountjoindate) FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'")
+ if(!query_get_client_age.Execute())
+ return
+ if(query_get_client_age.NextRow())
+ player_join_date = query_get_client_age.item[1]
+ player_age = text2num(query_get_client_age.item[2])
+ if(!account_join_date)
+ account_join_date = query_get_client_age.item[3]
+ account_age = text2num(query_get_client_age.item[4])
+ if(!account_age)
+ account_join_date = sanitizeSQL(findJoinDate())
+ if(!account_join_date)
+ account_age = -1
+ else
+ var/datum/DBQuery/query_datediff = SSdbcore.NewQuery("SELECT DATEDIFF(Now(),[account_join_date])")
+ if(!query_datediff.Execute())
+ return
+ if(query_datediff.NextRow())
+ account_age = text2num(query_datediff.item[1])
+ if(!new_player)
+ var/datum/DBQuery/query_log_player = SSdbcore.NewQuery("UPDATE [format_table_name("player")] SET lastseen = Now(), ip = INET_ATON('[sql_ip]'), computerid = '[sql_computerid]', lastadminrank = '[sql_admin_rank]', accountjoindate = [account_join_date ? "'[account_join_date]'" : "NULL"] WHERE ckey = '[sql_ckey]'")
+ if(!query_log_player.Execute())
+ return
+ if(!account_join_date)
+ account_join_date = "Error"
var/datum/DBQuery/query_log_connection = SSdbcore.NewQuery("INSERT INTO `[format_table_name("connection_log")]` (`id`,`datetime`,`server_ip`,`server_port`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),INET_ATON('[world.internet_address]'),'[world.port]','[sql_ckey]',INET_ATON('[sql_ip]'),'[sql_computerid]')")
query_log_connection.Execute()
+/client/proc/findJoinDate()
+ var/list/http = world.Export("http://byond.com/members/[ckey]?format=text")
+ if(!http)
+ log_world("Failed to connect to byond age check for [ckey]")
+ return
+ var/F = file2text(http["CONTENT"])
+ if(F)
+ var/regex/R = regex("joined = \"(\\d{4}-\\d{2}-\\d{2})\"")
+ if(R.Find(F))
+ . = R.group[1]
+ else
+ CRASH("Age check regex failed for [src.ckey]")
+
/client/proc/check_randomizer(topic)
. = FALSE
if (connection != "seeker")
diff --git a/code/modules/client/client_procs.dm.rej b/code/modules/client/client_procs.dm.rej
new file mode 100644
index 0000000000..7c12c8bc58
--- /dev/null
+++ b/code/modules/client/client_procs.dm.rej
@@ -0,0 +1,46 @@
+diff a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm (rejected hunks)
+@@ -266,17 +266,11 @@ GLOBAL_LIST(external_rsc_urls)
+ if((global.comms_key == "default_pwd" || length(global.comms_key) <= 6) && global.comms_allowed) //It's the default value or less than 6 characters long, but it somehow didn't disable comms.
+ to_chat(src, "The server's API key is either too short or is the default value! Consider changing it immediately!")
+
+- add_verbs_from_config()
++ add_verbs_from_config(tdata)
+ set_client_age_from_db()
+ var/cached_player_age = player_age //we have to cache this because other shit may change it and we need it's current value now down below.
+ if (isnum(cached_player_age) && cached_player_age == -1) //first connection
+- player_age = 0
+- if(!IsGuestKey(key) && SSdbcore.IsConnected())
+- findJoinDate()
+-
+- sync_client_with_db(tdata)
+-
+-
++ player_age = 0
+ if (isnum(cached_player_age) && cached_player_age == -1) //first connection
+ if (config.panic_bunker && !holder && !(ckey in GLOB.deadmins))
+ log_access("Failed Login: [key] - New account attempting to connect during panic bunker")
+@@ -295,7 +289,14 @@ GLOBAL_LIST(external_rsc_urls)
+ send2irc_adminless_only("New-user", "[key_name(src)] is connecting for the first time!")
+ else if (isnum(cached_player_age) && cached_player_age < config.notify_new_player_age)
+ message_admins("New user: [key_name_admin(src)] just connected with an age of [cached_player_age] day[(player_age==1?"":"s")]")
+-
++ if(config.use_account_age_for_jobs && account_age >= 0)
++ player_age = account_age
++ if(account_age >= 0 && account_age < config.notify_new_player_account_age)
++ message_admins("[key_name_admin(src)] (IP: [address], ID: [computer_id]) is a new BYOND account day[(account_age==1?"":"s")] old, created on [account_join_date].")
++ if (config.irc_first_connection_alert)
++ send2irc_adminless_only("new_byond_user", "[key_name(src)] (IP: [address], ID: [computer_id]) is a new BYOND account day[(account_age==1?"":"s")] old, created on [account_join_date].")
++ else //We failed to get an age for this user, let admins know they need to keep an eye on them
++ message_admins("Failed to get BYOND account age for [key_name_admin(src)]")
+ get_message_output("watchlist entry", ckey)
+ check_ip_intel()
+
+@@ -340,7 +341,7 @@ GLOBAL_LIST(external_rsc_urls)
+ adminGreet(1)
+ holder.owner = null
+ GLOB.admins -= src
+-
++
+ GLOB.ahelp_tickets.ClientLogout(src)
+ GLOB.directory -= ckey
+ GLOB.clients -= src
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 631871288d..8d5bbde4b3 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -168,6 +168,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/uplink_spawn_loc = UPLINK_PDA
+ var/list/menuoptions
+
//citadel code
var/arousable = TRUE //Allows players to disable arousal from the character creation menu
var/flavor_text = ""
@@ -194,6 +196,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(!loaded_preferences_successfully)
save_preferences()
save_character() //let's save this new random character so it doesn't keep generating new ones.
+ menuoptions = list()
return
/datum/preferences/proc/ShowChoices(mob/user)
@@ -790,7 +793,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(href_list["jobbancheck"])
var/job = sanitizeSQL(href_list["jobbancheck"])
var/sql_ckey = sanitizeSQL(user.ckey)
- var/datum/DBQuery/query_get_jobban = SSdbcore.NewQuery("SELECT reason, bantime, duration, expiration_time, a_ckey FROM [format_table_name("ban")] WHERE ckey = '[sql_ckey]' AND (bantype = 'JOB_PERMABAN' OR (bantype = 'JOB_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned) AND job = '[job]'")
+ var/datum/DBQuery/query_get_jobban = SSdbcore.NewQuery("SELECT reason, bantime, duration, expiration_time, a_ckey FROM [format_table_name("ban")] WHERE ckey = '[sql_ckey]' AND (bantype = 'JOB_PERMABAN' OR (bantype = 'JOB_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned) AND job = '[job]'")
if(!query_get_jobban.warn_execute())
return
if(query_get_jobban.NextRow())
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 128a07ebd1..076761f93f 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -1,5 +1,5 @@
//This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped.
-#define SAVEFILE_VERSION_MIN 10
+#define SAVEFILE_VERSION_MIN 15
//This is the current version, anything below this will attempt to update (if it's not obsolete)
#define SAVEFILE_VERSION_MAX 20
@@ -88,15 +88,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/update_preferences(current_version, savefile/S)
- if(current_version < 10)
- toggles |= MEMBER_PUBLIC
- if(current_version < 11)
- chat_toggles = TOGGLES_DEFAULT_CHAT
- toggles = TOGGLES_DEFAULT
- if(current_version < 12)
- ignoring = list()
- if(current_version < 15)
- toggles |= SOUND_ANNOUNCEMENTS
//should this proc get fairly long (say 3 versions long),
@@ -106,16 +97,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//It's only really meant to avoid annoying frequent players
//if your savefile is 3 months out of date, then 'tough shit'.
/datum/preferences/proc/update_character(current_version, savefile/S)
- if(pref_species && !(pref_species.id in GLOB.roundstart_species))
- var/rando_race = pick(config.roundstart_races)
- pref_species = new rando_race()
-
- if(current_version < 13 || !istext(backbag))
- switch(backbag)
- if(2)
- backbag = DSATCHEL
- else
- backbag = DBACKPACK
if(current_version < 16)
var/berandom
S["userandomjob"] >> berandom
@@ -186,12 +167,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["tgui_fancy"] >> tgui_fancy
S["tgui_lock"] >> tgui_lock
S["windowflash"] >> windowflashing
+ S["be_special"] >> be_special
- if(islist(S["be_special"]))
- S["be_special"] >> be_special
- else //force update and store the old bitflag version of be_special
- needs_update = 12
- S["be_special"] >> old_be_special
S["default_slot"] >> default_slot
S["chat_toggles"] >> chat_toggles
@@ -207,6 +184,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["uses_glasses_colour"]>> uses_glasses_colour
S["clientfps"] >> clientfps
S["parallax"] >> parallax
+ S["menuoptions"] >> menuoptions
//citadel code
S["arousable"] >> arousable
@@ -231,6 +209,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit))
ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION)
ghost_others = sanitize_inlist(ghost_others, GLOB.ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION)
+ menuoptions = SANITIZE_LIST(menuoptions)
+ be_special = SANITIZE_LIST(be_special)
+
return 1
@@ -267,6 +248,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["uses_glasses_colour"]<< uses_glasses_colour
S["clientfps"] << clientfps
S["parallax"] << parallax
+ S["menuoptions"] << menuoptions
//citadel code
S["arousable"] << arousable
@@ -299,9 +281,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(config.mutant_races && species_id && (species_id in GLOB.roundstart_species))
var/newtype = GLOB.roundstart_species[species_id]
pref_species = new newtype()
- else
+ else if (config.roundstart_races.len)
var/rando_race = pick(config.roundstart_races)
- pref_species = new rando_race()
+ if (rando_race)
+ pref_species = new rando_race()
if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000")
S["features["mcolor"]"] << "#FFF"
@@ -565,7 +548,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
#undef SAVEFILE_VERSION_MAX
#undef SAVEFILE_VERSION_MIN
-/*
+
+#ifdef TESTING
//DEBUG
//Some crude tools for testing savefiles
//path is the savefile path
@@ -576,4 +560,5 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/client/verb/savefile_import(path as text)
var/savefile/S = new /savefile(path)
S.ImportText("/",file("[path].txt"))
-*/
+
+#endif
\ No newline at end of file
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 74cbc70b87..eb244937e6 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -1,162 +1,249 @@
-//toggles
-/client/verb/toggle_ghost_ears()
- set name = "Show/Hide GhostEars"
- set category = "Preferences"
- set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs"
- prefs.chat_toggles ^= CHAT_GHOSTEARS
- to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].")
- prefs.save_preferences()
- SSblackbox.add_details("preferences_verb","Toggle Ghost Ears|[prefs.chat_toggles & CHAT_GHOSTEARS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+//this works as is to create a single checked item, but has no back end code for toggleing the check yet
+#define TOGGLE_CHECKBOX(PARENT, CHILD) PARENT/CHILD/abstract = TRUE;PARENT/CHILD/checkbox = CHECKBOX_TOGGLE;PARENT/CHILD/verb/CHILD
-/client/verb/toggle_ghost_sight()
- set name = "Show/Hide GhostSight"
- set category = "Preferences"
- set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs"
- prefs.chat_toggles ^= CHAT_GHOSTSIGHT
- to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].")
- prefs.save_preferences()
- SSblackbox.add_details("preferences_verb","Toggle Ghost Sight|[prefs.chat_toggles & CHAT_GHOSTSIGHT]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+//Example usage TOGGLE_CHECKBOX(datum/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)()
-/client/verb/toggle_ghost_whispers()
- set name = "Show/Hide GhostWhispers"
- set category = "Preferences"
- set desc = ".Toggle between hearing all whispers, and only whispers of nearby mobs"
- prefs.chat_toggles ^= CHAT_GHOSTWHISPER
- to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"].")
- prefs.save_preferences()
- SSblackbox.add_details("preferences_verb","Toggle Ghost Whispers|[prefs.chat_toggles & CHAT_GHOSTWHISPER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+//override because we don't want to save preferences twice.
+/datum/menu/Settings/Set_checked(client/C, verbpath)
+ if (checkbox == CHECKBOX_GROUP)
+ C.prefs.menuoptions[type] = verbpath
+ else if (checkbox == CHECKBOX_TOGGLE)
+ var/checked = Get_checked(C)
+ C.prefs.menuoptions[type] = !checked
+ winset(C, "[verbpath]", "is-checked = [!checked]")
-/client/verb/toggle_ghost_radio()
- set name = "Show/Hide GhostRadio"
+/datum/menu/Settings/verb/setup_character()
+ set name = "Game Preferences"
set category = "Preferences"
- set desc = ".Enable or disable hearing radio chatter as a ghost"
- prefs.chat_toggles ^= CHAT_GHOSTRADIO
- to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTRADIO) ? "see radio chatter" : "not see radio chatter"].")
- prefs.save_preferences()
- SSblackbox.add_details("preferences_verb","Toggle Ghost Radio|[prefs.chat_toggles & CHAT_GHOSTRADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1
+ set desc = "Open Game Preferences Window"
+ usr.client.prefs.current_tab = 1
+ usr.client.prefs.ShowChoices(usr)
+
+//toggles
+/datum/menu/Settings/Ghost/chatterbox
+ name = "Chat Box Spam"
-/client/verb/toggle_ghost_pda()
+TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)()
+ set name = "Show/Hide GhostEars"
+ set category = "Preferences"
+ set desc = "See All Speech"
+ usr.client.prefs.chat_toggles ^= CHAT_GHOSTEARS
+ to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].")
+ usr.client.prefs.save_preferences()
+ SSblackbox.add_details("preferences_verb","Toggle Ghost Ears|[usr.client.prefs.chat_toggles & CHAT_GHOSTEARS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_ears/Get_checked(client/C)
+ return C.prefs.chat_toggles & CHAT_GHOSTEARS
+
+TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_sight)()
+ set name = "Show/Hide GhostSight"
+ set category = "Preferences"
+ set desc = "See All Emotes"
+ usr.client.prefs.chat_toggles ^= CHAT_GHOSTSIGHT
+ to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].")
+ usr.client.prefs.save_preferences()
+ SSblackbox.add_details("preferences_verb","Toggle Ghost Sight|[usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_sight/Get_checked(client/C)
+ return C.prefs.chat_toggles & CHAT_GHOSTSIGHT
+
+TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_whispers)()
+ set name = "Show/Hide GhostWhispers"
+ set category = "Preferences"
+ set desc = "See All Whispers"
+ usr.client.prefs.chat_toggles ^= CHAT_GHOSTWHISPER
+ to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"].")
+ usr.client.prefs.save_preferences()
+ SSblackbox.add_details("preferences_verb","Toggle Ghost Whispers|[usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_whispers/Get_checked(client/C)
+ return C.prefs.chat_toggles & CHAT_GHOSTWHISPER
+
+TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_radio)()
+ set name = "Show/Hide GhostRadio"
+ set category = "Preferences"
+ set desc = "See All Radio Chatter"
+ usr.client.prefs.chat_toggles ^= CHAT_GHOSTRADIO
+ to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO) ? "see radio chatter" : "not see radio chatter"].")
+ usr.client.prefs.save_preferences()
+ SSblackbox.add_details("preferences_verb","Toggle Ghost Radio|[usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1
+/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_radio/Get_checked(client/C)
+ return C.prefs.chat_toggles & CHAT_GHOSTRADIO
+
+TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_pda)()
set name = "Show/Hide GhostPDA"
- set category = "Preferences"
- set desc = ".Toggle Between seeing all mob pda messages, and only pda messages of nearby mobs"
- prefs.chat_toggles ^= CHAT_GHOSTPDA
- to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTPDA) ? "see all pda messages in the world" : "only see pda messages from nearby mobs"].")
- prefs.save_preferences()
- SSblackbox.add_details("preferences_verb","Toggle Ghost PDA|[prefs.chat_toggles & CHAT_GHOSTPDA]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ set category = "Preferences"
+ set desc = "See All PDA Messages"
+ usr.client.prefs.chat_toggles ^= CHAT_GHOSTPDA
+ to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTPDA) ? "see all pda messages in the world" : "only see pda messages from nearby mobs"].")
+ usr.client.prefs.save_preferences()
+ SSblackbox.add_details("preferences_verb","Toggle Ghost PDA|[usr.client.prefs.chat_toggles & CHAT_GHOSTPDA]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_pda/Get_checked(client/C)
+ return C.prefs.chat_toggles & CHAT_GHOSTPDA
+
+/datum/menu/Settings/Ghost/chatterbox/Events
+ name = "Events"
//please be aware that the following two verbs have inverted stat output, so that "Toggle Deathrattle|1" still means you activated it
-/client/verb/toggle_deathrattle()
+TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox/Events, toggle_deathrattle)()
set name = "Toggle Deathrattle"
- set category = "Preferences"
- set desc = "Toggle recieving a message in deadchat when sentient mobs die."
- prefs.toggles ^= DISABLE_DEATHRATTLE
- prefs.save_preferences()
- to_chat(usr, "You will [(prefs.toggles & DISABLE_DEATHRATTLE) ? "no longer" : "now"] get messages when a sentient mob dies.")
- SSblackbox.add_details("preferences_verb", "Toggle Deathrattle|[!(prefs.toggles & DISABLE_DEATHRATTLE)]") //If you are copy-pasting this, maybe you should spend some time reading the comments.
-
-/client/verb/toggle_arrivalrattle()
+ set category = "Preferences"
+ set desc = "Death"
+ usr.client.prefs.toggles ^= DISABLE_DEATHRATTLE
+ usr.client.prefs.save_preferences()
+ to_chat(usr, "You will [(usr.client.prefs.toggles & DISABLE_DEATHRATTLE) ? "no longer" : "now"] get messages when a sentient mob dies.")
+ SSblackbox.add_details("preferences_verb", "Toggle Deathrattle|[!(usr.client.prefs.toggles & DISABLE_DEATHRATTLE)]") //If you are copy-pasting this, maybe you should spend some time reading the comments.
+/datum/menu/Settings/Ghost/chatterbox/Events/toggle_deathrattle/Get_checked(client/C)
+ return !(C.prefs.toggles & DISABLE_DEATHRATTLE)
+
+TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox/Events, toggle_arrivalrattle)()
set name = "Toggle Arrivalrattle"
- set category = "Preferences"
- set desc = "Toggle recieving a message in deadchat when someone joins the station."
- prefs.toggles ^= DISABLE_ARRIVALRATTLE
- to_chat(usr, "You will [(prefs.toggles & DISABLE_ARRIVALRATTLE) ? "no longer" : "now"] get messages when someone joins the station.")
- prefs.save_preferences()
- SSblackbox.add_details("preferences_verb", "Toggle Arrivalrattle|[!(prefs.toggles & DISABLE_ARRIVALRATTLE)]") //If you are copy-pasting this, maybe you should rethink where your life went so wrong.
-
-/client/verb/togglemidroundantag()
+ set category = "Preferences"
+ set desc = "New Player Arrival"
+ usr.client.prefs.toggles ^= DISABLE_ARRIVALRATTLE
+ to_chat(usr, "You will [(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE) ? "no longer" : "now"] get messages when someone joins the station.")
+ usr.client.prefs.save_preferences()
+ SSblackbox.add_details("preferences_verb", "Toggle Arrivalrattle|[!(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE)]") //If you are copy-pasting this, maybe you should rethink where your life went so wrong.
+/datum/menu/Settings/Ghost/chatterbox/Events/toggle_arrivalrattle/Get_checked(client/C)
+ return !(C.prefs.toggles & DISABLE_ARRIVALRATTLE)
+
+TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost, togglemidroundantag)()
set name = "Toggle Midround Antagonist"
- set category = "Preferences"
- set desc = "Toggles whether or not you will be considered for antagonist status given during a round."
- prefs.toggles ^= MIDROUND_ANTAG
- prefs.save_preferences()
- to_chat(src, "You will [(prefs.toggles & MIDROUND_ANTAG) ? "now" : "no longer"] be considered for midround antagonist positions.")
- SSblackbox.add_details("preferences_verb","Toggle Midround Antag|[prefs.toggles & MIDROUND_ANTAG]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/toggletitlemusic()
+ set category = "Preferences"
+ set desc = "Midround Antagonist"
+ usr.client.prefs.toggles ^= MIDROUND_ANTAG
+ usr.client.prefs.save_preferences()
+ to_chat(usr, "You will [(usr.client.prefs.toggles & MIDROUND_ANTAG) ? "now" : "no longer"] be considered for midround antagonist positions.")
+ SSblackbox.add_details("preferences_verb","Toggle Midround Antag|[usr.client.prefs.toggles & MIDROUND_ANTAG]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/menu/Settings/Ghost/togglemidroundantag/Get_checked(client/C)
+ return C.prefs.toggles & MIDROUND_ANTAG
+
+TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggletitlemusic)()
set name = "Hear/Silence LobbyMusic"
set category = "Preferences"
- set desc = "Toggles hearing the GameLobby music"
- prefs.toggles ^= SOUND_LOBBY
- prefs.save_preferences()
- if(prefs.toggles & SOUND_LOBBY)
- to_chat(src, "You will now hear music in the game lobby.")
- if(isnewplayer(mob))
- playtitlemusic()
+ set desc = "Hear Music In Lobby"
+ usr.client.prefs.toggles ^= SOUND_LOBBY
+ usr.client.prefs.save_preferences()
+ if(usr.client.prefs.toggles & SOUND_LOBBY)
+ to_chat(usr, "You will now hear music in the game lobby.")
+ if(isnewplayer(usr))
+ usr.client.playtitlemusic()
else
- to_chat(src, "You will no longer hear music in the game lobby.")
- mob.stop_sound_channel(CHANNEL_LOBBYMUSIC)
- SSblackbox.add_details("preferences_verb","Toggle Lobby Music|[prefs.toggles & SOUND_LOBBY]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ to_chat(usr, "You will no longer hear music in the game lobby.")
+ usr.stop_sound_channel(CHANNEL_LOBBYMUSIC)
+ SSblackbox.add_details("preferences_verb","Toggle Lobby Music|[usr.client.prefs.toggles & SOUND_LOBBY]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/menu/Settings/Sound/toggletitlemusic/Get_checked(client/C)
+ return C.prefs.toggles & SOUND_LOBBY
+
-/client/verb/togglemidis()
+TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, togglemidis)()
set name = "Hear/Silence Midis"
set category = "Preferences"
- set desc = "Toggles hearing sounds uploaded by admins"
- prefs.toggles ^= SOUND_MIDI
- prefs.save_preferences()
- if(prefs.toggles & SOUND_MIDI)
- to_chat(src, "You will now hear any sounds uploaded by admins.")
+ set desc = "Hear Admin Triggered Sounds (Midis)"
+ usr.client.prefs.toggles ^= SOUND_MIDI
+ usr.client.prefs.save_preferences()
+ if(usr.client.prefs.toggles & SOUND_MIDI)
+ to_chat(usr, "You will now hear any sounds uploaded by admins.")
else
- to_chat(src, "You will no longer hear sounds uploaded by admins")
- mob.stop_sound_channel(CHANNEL_ADMIN)
- SSblackbox.add_details("preferences_verb","Toggle Hearing Midis|[prefs.toggles & SOUND_MIDI]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ to_chat(usr, "You will no longer hear sounds uploaded by admins")
+ usr.stop_sound_channel(CHANNEL_ADMIN)
+ SSblackbox.add_details("preferences_verb","Toggle Hearing Midis|[usr.client.prefs.toggles & SOUND_MIDI]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/menu/Settings/Sound/togglemidis/Get_checked(client/C)
+ return C.prefs.toggles & SOUND_MIDI
-/client/verb/stop_client_sounds()
- set name = "Stop Sounds"
+
+TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_instruments)()
+ set name = "Hear/Silence Instruments"
set category = "Preferences"
- set desc = "Kills all currently playing sounds, use if admin taste in midis a shite"
- src << sound(null)
- SSblackbox.add_details("preferences_verb","Stop Self Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ set desc = "Hear In-game Instruments"
+ usr.client.prefs.toggles ^= SOUND_INSTRUMENTS
+ usr.client.prefs.save_preferences()
+ if(usr.client.prefs.toggles & SOUND_INSTRUMENTS)
+ to_chat(usr, "You will now hear people playing musical instruments.")
+ else
+ to_chat(usr, "You will no longer hear musical instruments.")
+ SSblackbox.add_details("preferences_verb","Toggle Instruments|[usr.client.prefs.toggles & SOUND_INSTRUMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/menu/Settings/Sound/toggle_instruments/Get_checked(client/C)
+ return C.prefs.toggles & SOUND_INSTRUMENTS
+
-/client/verb/listen_ooc()
- set name = "Show/Hide OOC"
- set category = "Preferences"
- set desc = "Toggles seeing OutOfCharacter chat"
- prefs.chat_toggles ^= CHAT_OOC
- prefs.save_preferences()
- to_chat(src, "You will [(prefs.chat_toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.")
- SSblackbox.add_details("preferences_verb","Toggle Seeing OOC|[prefs.chat_toggles & CHAT_OOC]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful
+TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, Toggle_Soundscape)()
set name = "Hear/Silence Ambience"
set category = "Preferences"
- set desc = "Toggles hearing ambient sound effects"
- prefs.toggles ^= SOUND_AMBIENCE
- prefs.save_preferences()
- if(prefs.toggles & SOUND_AMBIENCE)
- to_chat(src, "You will now hear ambient sounds.")
+ set desc = "Hear Ambient Sound Effects"
+ usr.client.prefs.toggles ^= SOUND_AMBIENCE
+ usr.client.prefs.save_preferences()
+ if(usr.client.prefs.toggles & SOUND_AMBIENCE)
+ to_chat(usr, "You will now hear ambient sounds.")
else
- to_chat(src, "You will no longer hear ambient sounds.")
- src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
- src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
- SSblackbox.add_details("preferences_verb","Toggle Ambience|[prefs.toggles & SOUND_AMBIENCE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ to_chat(usr, "You will no longer hear ambient sounds.")
+ usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
+ usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
+ SSblackbox.add_details("preferences_verb","Toggle Ambience|[usr.client.prefs.toggles & SOUND_AMBIENCE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/menu/Settings/Sound/Toggle_Soundscape/Get_checked(client/C)
+ return C.prefs.toggles & SOUND_AMBIENCE
-// This needs a toggle because you people are awful and spammed terrible music
-/client/verb/toggle_instruments()
- set name = "Hear/Silence Instruments"
+
+TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_ship_ambience)()
+ set name = "Hear/Silence Ship Ambience"
set category = "Preferences"
- set desc = "Toggles hearing musical instruments like the violin and piano"
- prefs.toggles ^= SOUND_INSTRUMENTS
- prefs.save_preferences()
- if(prefs.toggles & SOUND_INSTRUMENTS)
- to_chat(src, "You will now hear people playing musical instruments.")
+ set desc = "Hear Ship Ambience Roar"
+ usr.client.prefs.toggles ^= SOUND_SHIP_AMBIENCE
+ usr.client.prefs.save_preferences()
+ if(usr.client.prefs.toggles & SOUND_SHIP_AMBIENCE)
+ to_chat(usr, "You will now hear ship ambience.")
else
- to_chat(src, "You will no longer hear musical instruments.")
- SSblackbox.add_details("preferences_verb","Toggle Instruments|[prefs.toggles & SOUND_INSTRUMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ to_chat(usr, "You will no longer hear ship ambience.")
+ usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
+ usr.client.ambience_playing = 0
+ SSblackbox.add_details("preferences_verb", "Toggle Ship Ambience|[usr.client.prefs.toggles & SOUND_SHIP_AMBIENCE]") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^)
+/datum/menu/Settings/Sound/toggle_ship_ambience/Get_checked(client/C)
+ return C.prefs.toggles & SOUND_SHIP_AMBIENCE
-//Lots of people get headaches from the normal ship ambience, this is to prevent that
-/client/verb/toggle_ship_ambience()
- set name = "Hear/Silence Ship Ambience"
+
+TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_announcement_sound)()
+ set name = "Hear/Silence Announcements"
set category = "Preferences"
- set desc = "Toggles hearing generalized ship ambience, no matter your area."
- prefs.toggles ^= SOUND_SHIP_AMBIENCE
- prefs.save_preferences()
- if(prefs.toggles & SOUND_SHIP_AMBIENCE)
- to_chat(src, "You will now hear ship ambience.")
+ set desc = "Hear Announcement Sound"
+ usr.client.prefs.toggles ^= SOUND_ANNOUNCEMENTS
+ to_chat(usr, "You will now [(usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS) ? "hear announcement sounds" : "no longer hear announcements"].")
+ usr.client.prefs.save_preferences()
+ SSblackbox.add_details("preferences_verb","Toggle Announcement Sound|[usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/menu/Settings/Sound/toggle_announcement_sound/Get_checked(client/C)
+ return C.prefs.toggles & SOUND_ANNOUNCEMENTS
+
+
+TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggleprayersounds)()
+ set name = "Hear/Silence Prayer Sounds"
+ set category = "Preferences"
+ set desc = "Hear Prayer Sounds"
+ usr.client.prefs.toggles ^= SOUND_PRAYERS
+ usr.client.prefs.save_preferences()
+ if(usr.client.prefs.toggles & SOUND_PRAYERS)
+ to_chat(usr, "You will now hear prayer sounds.")
else
- to_chat(src, "You will no longer hear ship ambience.")
- src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
- src.ambience_playing = 0
- SSblackbox.add_details("preferences_verb", "Toggle Ship Ambience|[prefs.toggles & SOUND_SHIP_AMBIENCE]") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^)
+ to_chat(usr, "You will no longer prayer sounds.")
+ SSblackbox.add_details("admin_toggle", "Toggle Prayer Sounds|[usr.client.prefs.toggles & SOUND_PRAYERS]")
+/datum/menu/Settings/Sound/toggleprayersounds/Get_checked(client/C)
+ return C.prefs.toggles & SOUND_PRAYERS
+
+
+/datum/menu/Settings/Sound/verb/stop_client_sounds()
+ set name = "Stop Sounds"
+ set category = "Preferences"
+ set desc = "Stop Current Sounds"
+ usr << sound(null)
+ SSblackbox.add_details("preferences_verb","Stop Self Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+
+TOGGLE_CHECKBOX(/datum/menu/Settings, listen_ooc)()
+ set name = "Show/Hide OOC"
+ set category = "Preferences"
+ set desc = "Show OOC Chat"
+ usr.client.prefs.chat_toggles ^= CHAT_OOC
+ usr.client.prefs.save_preferences()
+ to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.")
+ SSblackbox.add_details("preferences_verb","Toggle Seeing OOC|[usr.client.prefs.chat_toggles & CHAT_OOC]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/menu/Settings/listen_ooc/Get_checked(client/C)
+ return C.prefs.chat_toggles & CHAT_OOC
+
GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \
"ghost_blue","ghost_yellow","ghost_green","ghost_pink", \
@@ -246,13 +333,6 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
prefs.save_preferences()
SSblackbox.add_details("preferences_verb","Toggle Intent Selection|[prefs.toggles & INTENT_STYLE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/verb/setup_character()
- set name = "Game Preferences"
- set category = "Preferences"
- set desc = "Allows you to access the Setup Character screen. Changes to your character won't take effect until next round, but other changes will."
- prefs.current_tab = 1
- prefs.ShowChoices(usr)
-
/client/verb/toggle_ghost_hud_pref()
set name = "Toggle Ghost HUD"
set category = "Preferences"
@@ -278,15 +358,6 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
to_chat(src, "You will no longer examine things you click on.")
SSblackbox.add_details("preferences_verb","Toggle Ghost Inquisitiveness|[prefs.inquisitive_ghost]")
-/client/verb/toggle_announcement_sound()
- set name = "Hear/Silence Announcements"
- set category = "Preferences"
- set desc = ".Toggles hearing Central Command, Captain, VOX, and other announcement sounds"
- prefs.toggles ^= SOUND_ANNOUNCEMENTS
- to_chat(src, "You will now [(prefs.toggles & SOUND_ANNOUNCEMENTS) ? "hear announcement sounds" : "no longer hear announcements"].")
- prefs.save_preferences()
- SSblackbox.add_details("preferences_verb","Toggle Announcement Sound|[prefs.toggles & SOUND_ANNOUNCEMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
//Admin Preferences
/client/proc/toggleadminhelpsound()
set name = "Hear/Silence Adminhelps"
@@ -338,14 +409,3 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
to_chat(src, "You will [(prefs.chat_toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.")
SSblackbox.add_details("admin_toggle","Toggle Prayer Visibility|[prefs.chat_toggles & CHAT_PRAYER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/verb/toggleprayersounds()
- set name = "Hear/Silence Prayer Sounds"
- set category = "Preferences"
- set desc = "Toggles hearing pray sounds."
- prefs.toggles ^= SOUND_PRAYERS
- prefs.save_preferences()
- if(prefs.toggles & SOUND_PRAYERS)
- to_chat(src, "You will now hear prayer sounds.")
- else
- to_chat(src, "You will no longer prayer sounds.")
- SSblackbox.add_details("admin_toggle", "Toggle Prayer Sounds|[prefs.toggles & SOUND_PRAYERS]")
diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm
index a7b1a9ac53..1614966726 100644
--- a/code/modules/client/verbs/who.dm
+++ b/code/modules/client/verbs/who.dm
@@ -33,7 +33,7 @@
entry += " - DEAD"
if(is_special_character(C.mob))
entry += " - Antagonist"
- entry += " (?)"
+ entry += " [ADMIN_QUE(C.mob)]"
entry += " ([round(C.avgping, 1)]ms)"
Lines += entry
else//If they don't have +ADMIN, only show hidden admins
diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm
index 6720663fb7..6a9ac41a0d 100644
--- a/code/modules/clothing/glasses/engine_goggles.dm
+++ b/code/modules/clothing/glasses/engine_goggles.dm
@@ -18,6 +18,7 @@
vision_flags = 0
darkness_view = 2
invis_view = SEE_INVISIBLE_LIVING
+ lighting_alpha = null
to_chat(user, "You toggle the goggles' scanning mode to \[T-Ray].")
else
STOP_PROCESSING(SSobj, src)
diff --git a/code/modules/clothing/head/cit_hats.dm b/code/modules/clothing/head/cit_hats.dm
new file mode 100644
index 0000000000..d562802db1
--- /dev/null
+++ b/code/modules/clothing/head/cit_hats.dm
@@ -0,0 +1,5 @@
+/obj/item/clothing/head/hunter
+ name = "hunter hat"
+ desc = "It's a flimsy looking hat."
+ icon_state = "hunter"
+ icon = 'icons/obj/clothing/cit_hats.dmi'
\ No newline at end of file
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 6f8e365bd9..65920a06d0 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -158,4 +158,5 @@
name = "treasure hunter's fedora"
desc = "You got red text today kid, but it doesn't mean you have to like it."
icon_state = "curator"
- armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 50)
\ No newline at end of file
+ armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 50)
+ pockets = /obj/item/weapon/storage/internal/pocket/small
\ No newline at end of file
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 22741f18f3..526a15e7f5 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -182,7 +182,7 @@
item_state = "curator"
blood_overlay_type = "coat"
body_parts_covered = CHEST|ARMS
- allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/weapon/melee/curator_whip)
+ allowed = list(/obj/item/weapon/tank/internals, /obj/item/weapon/melee/curator_whip)
armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 45)
cold_protection = CHEST|ARMS
heat_protection = CHEST|ARMS
diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm
index b48dd40e09..e2cce14db3 100644
--- a/code/modules/error_handler/error_handler.dm
+++ b/code/modules/error_handler/error_handler.dm
@@ -6,7 +6,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0)
if(!istype(E)) //Something threw an unusual exception
log_world("\[[time_stamp()]] Uncaught exception: [E]")
return ..()
-
+
var/static/list/error_last_seen = list()
var/static/list/error_cooldown = list() /* Error_cooldown items will either be positive(cooldown time) or negative(silenced error)
If negative, starts at -1, and goes down by 1 each time that error gets skipped*/
@@ -107,9 +107,8 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0)
if (split[i] != "")
split[i] = "\[[time2text(world.timeofday,"hh:mm:ss")]\][split[i]]"
E.desc = jointext(split, "\n")
- if(config && config.log_runtimes)
- world.log = GLOB.runtime_diary
- ..(E)
+ world.log = GLOB.world_runtime_log
+ ..(E)
world.log = null
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index bbeedee68f..b43bf3fe3a 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -362,8 +362,6 @@
for(var/datum/spacevine_mutation/SM in mutations)
override += SM.on_eat(src, eater)
if(!override)
- if(prob(10))
- eater.say("Nom")
qdel(src)
/obj/structure/spacevine/attackby(obj/item/weapon/W, mob/user, params)
diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
index e1c463becc..baa804a4de 100644
--- a/code/modules/food_and_drinks/food/condiment.dm
+++ b/code/modules/food_and_drinks/food/condiment.dm
@@ -23,7 +23,8 @@
"sodiumchloride" = list("saltshakersmall", "salt shaker", "Salt. From space oceans, presumably"),
"blackpepper" = list("peppermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"),
"cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"),
- "sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"))
+ "sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"),
+ "mayonnaise" = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks."))
var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters.
/obj/item/weapon/reagent_containers/food/condiment/attack(mob/M, mob/user, def_zone)
@@ -207,6 +208,13 @@
list_reagents = list("soysauce" = 50)
possible_states = list()
+/obj/item/weapon/reagent_containers/food/condiment/mayonnaise
+ name = "mayonnaise"
+ desc = "An oily condiment made from egg yolks."
+ icon_state = "mayonnaise"
+ list_reagents = list("mayonnaise" = 50)
+ possible_states = list()
+
//Food packs. To easily apply deadly toxi... delicious sauces to your food!
diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm
index b2664e5b5a..b76b896803 100644
--- a/code/modules/food_and_drinks/food/snacks_bread.dm
+++ b/code/modules/food_and_drinks/food/snacks_bread.dm
@@ -164,3 +164,24 @@
icon = 'icons/obj/food/food.dmi'
icon_state = ""
bitesize = 2
+
+/obj/item/weapon/reagent_containers/food/snacks/butteredtoast
+ name = "buttered toast"
+ desc = "Butter lightly spread over a piece of toast."
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "butteredtoast"
+ bitesize = 3
+ filling_color = "#FFA500"
+ list_reagents = list("nutriment" = 4)
+ bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
+ tastes = list("butter" = 1, "toast" = 1)
+
+/obj/item/weapon/reagent_containers/food/snacks/butterbiscuit
+ name = "butter biscuit"
+ desc = "Well butter my biscuit!"
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "butterbiscuit"
+ filling_color = "#F0E68C"
+ list_reagents = list("nutriment" = 5)
+ bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
+ tastes = list("butter" = 1, "biscuit" = 1)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index d7ebd364a3..e050ecd72b 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -236,3 +236,12 @@
var/shape = pick("lump", "star", "lizard", "corgi")
desc = "A 'chicken' nugget vaguely shaped like a [shape]."
icon_state = "nugget_[shape]"
+
+/obj/item/weapon/reagent_containers/food/snacks/pigblanket
+ name = "pig in a blanket"
+ desc = "A tiny sausage wrapped in a flakey, buttery roll. Free this pig from its blanket prison by eating it."
+ icon_state = "pigblanket"
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+ bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
+ filling_color = "#800000"
+ tastes = list("meat" = 1, "butter" = 1)
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index 6ec7fd9a1e..7cfce5419d 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -468,3 +468,11 @@
list_reagents = list("nutriment" = 3, "vitamin" = 2, "sodiumchloride" = 5)
bonus_reagents = list("sodiumchloride" = 10)
tastes = list("bran" = 4, "raisins" = 3, "salt" = 1)
+
+/obj/item/weapon/reagent_containers/food/snacks/butter
+ name = "stick of butter"
+ desc = "A stick of delicious, golden, fatty goodness."
+ icon_state = "butter"
+ list_reagents = list("nutriment" = 5)
+ filling_color = "#FFD700"
+ tastes = list("butter" = 1)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks_spaghetti.dm b/code/modules/food_and_drinks/food/snacks_spaghetti.dm
index dc3aa60115..8cd4665918 100644
--- a/code/modules/food_and_drinks/food/snacks_spaghetti.dm
+++ b/code/modules/food_and_drinks/food/snacks_spaghetti.dm
@@ -85,3 +85,12 @@
trash = /obj/item/weapon/reagent_containers/glass/bowl
bonus_reagents = list("nutriment" = 5, "vitamin" = 6, "liquidgibs" = 3)
tastes = list("noodle" = 1, "meat" = 1)
+
+/obj/item/weapon/reagent_containers/food/snacks/butternoodles
+ name = "butter noodles"
+ desc = "Noodles covered in savory butter. Simple and slippery, but delicious."
+ icon = 'icons/obj/food/pizzaspaghetti.dmi'
+ icon_state = "butternoodles"
+ trash = /obj/item/trash/plate
+ bonus_reagents = list("nutriment" = 8, "vitamin" = 1)
+ tastes = list("noodle" = 1, "butter" = 1)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index a4d9a32d3d..43cf70bbe2 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -31,7 +31,7 @@
break
if(!input_plate)
- GLOB.diary << "a [src] didn't find an input plate."
+ GLOB.world_game_log << "a [src] didn't find an input plate."
return
/obj/machinery/gibber/autogibber/Bumped(atom/A)
@@ -168,13 +168,14 @@
var/offset = prob(50) ? -2 : 2
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
- var/sourcename = src.occupant.real_name
+ var/mob/living/mob_occupant = occupant
+ var/sourcename = mob_occupant.real_name
var/sourcejob
if(ishuman(occupant))
var/mob/living/carbon/human/gibee = occupant
sourcejob = gibee.job
- var/sourcenutriment = src.occupant.nutrition / 15
- var/sourcetotalreagents = src.occupant.reagents.total_volume
+ var/sourcenutriment = mob_occupant.nutrition / 15
+ var/sourcetotalreagents = mob_occupant.reagents.total_volume
var/gibtype = /obj/effect/decal/cleanable/blood/gibs
var/typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human
var/typeofskin = /obj/item/stack/sheet/animalhide/human
@@ -212,8 +213,8 @@
allskin = newskin
add_logs(user, occupant, "gibbed")
- src.occupant.death(1)
- src.occupant.ghostize()
+ mob_occupant.death(1)
+ mob_occupant.ghostize()
qdel(src.occupant)
spawn(src.gibtime)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
index d6f6c0f32e..7bdd62211b 100644
--- a/code/modules/food_and_drinks/pizzabox.dm
+++ b/code/modules/food_and_drinks/pizzabox.dm
@@ -67,6 +67,7 @@
var/mutable_appearance/bomb_overlay = mutable_appearance(bomb.icon, bomb.icon_state)
bomb_overlay.pixel_y = 5
add_overlay(bomb_overlay)
+ else
icon_state = "pizzabox[boxes.len + 1]"
var/obj/item/pizzabox/box = boxes.len ? boxes[boxes.len] : src
if(box.boxtag != "")
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
index e35d5c89e6..d0682ced1e 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
@@ -74,3 +74,22 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/mimana
category = CAT_BREAD
+
+/datum/crafting_recipe/food/butteredtoast
+ name = "Buttered Toast"
+ reqs = list(
+ /obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/butter = 1
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/butteredtoast
+ category = CAT_BREAD
+
+/datum/crafting_recipe/food/butterbiscuit
+ name = "Butter Biscuit"
+ reqs = list(
+ /obj/item/weapon/reagent_containers/food/snacks/bun = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/butter = 1
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/butterbiscuit
+ category = CAT_BREAD
+
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
index d2245a0ecd..878dda1804 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
@@ -160,3 +160,13 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/rawkhinkali
category = CAT_MEAT
+
+/datum/crafting_recipe/food/pigblanket
+ name = "Pig in a Blanket"
+ reqs = list(
+ /obj/item/weapon/reagent_containers/food/snacks/bun = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/butter = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 1
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/pigblanket
+ category = CAT_MEAT
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
index 85d2ee6d65..412157033b 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
@@ -59,3 +59,12 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/chowmein
category = CAT_SPAGHETTI
+
+/datum/crafting_recipe/food/butternoodles
+ name = "Butter Noodles"
+ reqs = list(
+ /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/butter = 1
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/butternoodles
+ category = CAT_SPAGHETTI
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm
index 554cba9f47..51b8f3c43e 100644
--- a/code/modules/hydroponics/grown/ambrosia.dm
+++ b/code/modules/hydroponics/grown/ambrosia.dm
@@ -59,7 +59,7 @@
species = "ambrosia_gaia"
plantname = "Ambrosia Gaia"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia
- mutatelist = list()
+ mutatelist = list(/obj/item/seeds/ambrosia/deus)
reagents_add = list("earthsblood" = 0.05, "nutriment" = 0.06, "vitamin" = 0.05)
rarity = 30 //These are some pretty good plants right here
genes = list()
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index 71e6debf25..a67fef2473 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -123,8 +123,8 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user)
var/area/A = get_area(user)
user.visible_message("[user] plucks the stem from [src]!", "You pluck the stem from [src], which begins to hiss loudly!")
- message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) (JMP)")
- log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] primed a cherry bomb for detonation at [A] [ADMIN_COORDJMP(user)]")
+ log_game("[key_name(user)] primed a cherry bomb for detonation at [A] [COORD(user)].")
prime()
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/deconstruct(disassembled = TRUE)
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index 264261dd69..82cc192344 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -50,17 +50,22 @@
/obj/item/weapon/grown/nettle/pickup(mob/living/user)
..()
if(!iscarbon(user))
- return 0
+ return FALSE
var/mob/living/carbon/C = user
if(C.gloves)
- return 0
+ return FALSE
+ if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ if(H.dna && H.dna.species)
+ if(PIERCEIMMUNE in H.dna.species.species_traits)
+ return FALSE
var/hit_zone = (C.held_index_to_dir(C.active_hand_index) == "l" ? "l_":"r_") + "arm"
var/obj/item/bodypart/affecting = C.get_bodypart(hit_zone)
if(affecting)
if(affecting.receive_damage(0, force))
C.update_damage_overlays()
to_chat(C, "The nettle burns your bare hand!")
- return 1
+ return TRUE
/obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user,proximity)
if(!proximity) return
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index b26a911b3a..317b954c91 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -27,6 +27,8 @@
var/unwrenchable = 1
var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant
var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses
+ var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood.
+ var/self_sufficiency_progress = 0
var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
@@ -329,6 +331,9 @@
if(!self_sustaining)
to_chat(user, "Water: [waterlevel]/[maxwater]")
to_chat(user, "Nutrient: [nutrilevel]/[maxnutri]")
+ if(self_sufficiency_progress > 0)
+ var/percent_progress = round(self_sufficiency_progress * 100 / self_sufficiency_req)
+ to_chat(user, "Treatment for self-sustenance are [percent_progress]% complete.")
else
to_chat(user, "It doesn't require any water or nutrients.")
@@ -504,6 +509,14 @@
yieldmod = 1.3
mutmod = 0
adjustNutri(round(S.get_reagent_amount("robustharvestnutriment") *1 ))
+
+ // Ambrosia Gaia produces earthsblood.
+ if(S.has_reagent("earthsblood"))
+ self_sufficiency_progress += S.get_reagent_amount("earthsblood")
+ if(self_sufficiency_progress >= self_sufficiency_req)
+ become_self_sufficient()
+ else if(!self_sustaining)
+ to_chat(user, "[src] warms as it might on a spring day under a genuine Sun.")
// Antitoxin binds shit pretty well. So the tox goes significantly down
if(S.has_reagent("charcoal", 1))
@@ -675,33 +688,7 @@
/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params)
//Called when mob user "attacks" it with object O
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia)) //Checked early on so it doesn't have to deal with composting checks
- if(self_sustaining)
- to_chat(user, "This [name] is already self-sustaining!")
- return
- if(myseed || weedlevel)
- to_chat(user, "[src] needs to be clear of plants and weeds!")
- return
- if(alert(user, "This will make [src] self-sustaining but consume [O] forever. Are you sure?", "[name]", "I'm Sure", "Abort") == "Abort" || !user)
- return
- if(!O || QDELETED(O))
- return
- if(!Adjacent(user))
- return
- if(self_sustaining)
- to_chat(user, "This [name] is already self-sustaining!")
- return
- if(myseed || weedlevel)
- to_chat(user, "[src] needs to be clear of plants and weeds!")
- return
- user.visible_message("[user] gently pulls open the soil for [O] and places it inside.", "You tenderly root [O] into [src].")
- user.drop_item()
- qdel(O)
- visible_message("[src] begins to glow with a beautiful light!")
- self_sustaining = TRUE
- update_icon()
-
- else if(istype(O, /obj/item/weapon/reagent_containers) ) // Syringe stuff (and other reagent containers now too)
+ if(istype(O, /obj/item/weapon/reagent_containers) ) // Syringe stuff (and other reagent containers now too)
var/obj/item/weapon/reagent_containers/reagent_source = O
if(istype(reagent_source, /obj/item/weapon/reagent_containers/syringe))
@@ -930,6 +917,10 @@
var/mob/living/simple_animal/hostile/C = new chosen
C.faction = list("plants")
+/obj/machinery/hydroponics/proc/become_self_sufficient() // Ambrosia Gaia effect
+ visible_message("[src] begins to glow with a beautiful light!")
+ self_sustaining = TRUE
+ update_icon()
///////////////////////////////////////////////////////////////////////////////
/obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk!
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 31bb564a06..5f4a79b661 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -268,7 +268,7 @@
rate = 0.03
examine_line = "It emits a soft glow."
trait_id = "glow"
- var/glow_color = "#AAD84B"
+ var/glow_color = "#C3E381"
/datum/plant_gene/trait/glow/proc/glow_range(obj/item/seeds/S)
return 1.4 + S.potency*rate
@@ -285,6 +285,7 @@
//adds -potency*(rate*0.05) light power to products
name = "Shadow Emission"
rate = 0.04
+ glow_color = "#AAD84B"
/datum/plant_gene/trait/glow/shadow/glow_power(obj/item/seeds/S)
return -max(S.potency*(rate*0.05), 0.075)
diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm
index a863f983cf..b606000ef4 100644
--- a/code/modules/jobs/job_types/cargo_service.dm
+++ b/code/modules/jobs/job_types/cargo_service.dm
@@ -277,4 +277,4 @@ Janitor
belt = /obj/item/device/pda/janitor
ears = /obj/item/device/radio/headset/headset_srv
uniform = /obj/item/clothing/under/rank/janitor
- backpack_contents = list(/obj/item/device/modular_computer/tablet/preset/advanced=1, /obj/item/soapstone/empty=1)
+ backpack_contents = list(/obj/item/device/modular_computer/tablet/preset/advanced=1)
diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm
index 467f0194d2..7d983e5519 100644
--- a/code/modules/jobs/job_types/civilian.dm
+++ b/code/modules/jobs/job_types/civilian.dm
@@ -35,7 +35,8 @@ Clown
/obj/item/weapon/reagent_containers/spray/waterflower = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1,
/obj/item/device/megaphone/clown = 1,
- /obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter = 1
+ /obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter = 1,
+ /obj/item/weapon/pneumatic_cannon/pie = 1
)
implants = list(/obj/item/weapon/implant/sad_trombone)
@@ -128,7 +129,7 @@ Curator
outfit = /datum/outfit/job/curator
access = list(GLOB.access_library)
- minimal_access = list(GLOB.access_library)
+ minimal_access = list(GLOB.access_library, GLOB.access_construction,GLOB.access_mining_station)
/datum/outfit/job/curator
name = "Curator"
diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm
index d8899285a2..5efc9c1dd3 100644
--- a/code/modules/library/soapstone.dm
+++ b/code/modules/library/soapstone.dm
@@ -1,5 +1,5 @@
/obj/item/soapstone
- name = "chisel"
+ name = "soapstone"
desc = "Leave informative messages for the crew, including the crew of future shifts!\nEven if out of uses, it can still be used to remove messages.\n(Not suitable for engraving on shuttles, off station or on cats. Side effects may include beatings, bannings and orbital bombardment.)"
icon = 'icons/obj/items.dmi'
icon_state = "soapstone"
@@ -9,36 +9,9 @@
var/tool_speed = 50
var/remaining_uses = 3
- var/non_dull_name
- var/w_engrave = "engrave"
- var/w_engraving = "engraving"
- var/w_chipping = "chipping"
- var/w_dull = "dull"
-
-/obj/item/soapstone/New()
+/obj/item/soapstone/Initialize(mapload)
. = ..()
- random_name()
- check_name() // could start empty
-
-/obj/item/soapstone/proc/random_name()
- name = pick("soapstone", "chisel", "chalk", "magic marker")
- non_dull_name = name
- if(name == "chalk" || name == "magic marker")
- desc = replacetext(desc, "engraving", "scribbling")
- w_engrave = "scribble"
- w_engraving = "scribbling"
- w_chipping = "sketching"
- if(name == "chalk")
- w_dull = "used"
- if(name == "magic marker")
- w_dull = "empty"
-
- if(name == "soapstone" || name == "chisel")
- desc = replacetext(desc, "scribbling", "engraving")
- w_engrave = initial(w_engrave)
- w_engraving = initial(w_engraving)
- w_chipping = initial(w_chipping)
- w_dull = "dull"
+ check_name()
/obj/item/soapstone/examine(mob/user)
. = ..()
@@ -57,11 +30,11 @@
return
if(!good_chisel_message_location(T))
- to_chat(user, "It's not appropriate to [w_engrave] on [T].")
+ to_chat(user, "It's not appropriate to engrave on [T].")
return
if(existing_message)
- user.visible_message("[user] starts erasing [existing_message].", "You start erasing [existing_message].", "You hear a [w_chipping] sound.")
+ user.visible_message("[user] starts erasing [existing_message].", "You start erasing [existing_message].", "You hear a chipping sound.")
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
if(do_after(user, tool_speed, target = existing_message))
user.visible_message("[user] erases [existing_message].", "You erase [existing_message][existing_message.creator_key == user.ckey ? ", refunding a use" : ""].")
@@ -72,19 +45,19 @@
refund_use()
return
- var/message = stripped_input(user, "What would you like to [w_engrave]?", "Leave a message")
+ var/message = stripped_input(user, "What would you like to engrave?", "Leave a message")
if(!message)
- to_chat(user, "You decide not to [w_engrave] anything.")
+ to_chat(user, "You decide not to engrave anything.")
return
if(!target.Adjacent(user) && locate(/obj/structure/chisel_message) in T)
to_chat(user, "Someone wrote here before you chose! Find another spot.")
return
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
- user.visible_message("[user] starts [w_engraving] a message into [T]...", "You start [w_engraving] a message into [T]...", "You hear a [w_chipping] sound.")
+ user.visible_message("[user] starts engraving a message into [T]...", "You start engraving a message into [T]...", "You hear a chipping sound.")
if(can_use() && do_after(user, tool_speed, target = T) && can_use()) //This looks messy but it's actually really clever!
if(!locate(/obj/structure/chisel_message in T))
- user.visible_message("[user] leaves a message for future spacemen!", "You [w_engrave] a message into [T]!", "You hear a [w_chipping] sound.")
+ user.visible_message("[user] leaves a message for future spacemen!", "You engrave a message into [T]!", "You hear a chipping sound.")
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
var/obj/structure/chisel_message/M = new(T)
M.register(user, message)
@@ -107,9 +80,10 @@
/obj/item/soapstone/proc/check_name()
if(remaining_uses)
- name = non_dull_name
+ // This will mess up RPG loot names, but w/e
+ name = initial(name)
else
- name = "[w_dull] [name]"
+ name = "dull [initial(name)]"
/* Persistent engraved messages, etched onto the station turfs to serve
as instructions and/or memes for the next generation of spessmen.
@@ -127,10 +101,6 @@
/proc/good_chisel_message_location(turf/T)
if(!T)
. = FALSE
- else if(T.z != ZLEVEL_STATION)
- . = FALSE
- else if(istype(get_area(T), /area/shuttle))
- . = FALSE
else if(!(isfloorturf(T) || iswallturf(T)))
. = FALSE
else
@@ -142,9 +112,8 @@
icon = 'icons/obj/stationobjs.dmi'
icon_state = "soapstone_message"
layer = HIGH_OBJ_LAYER
- density = 0
- anchored = 1
- luminosity = 1
+ density = FALSE
+ anchored = TRUE
obj_integrity = 30
max_integrity = 30
@@ -157,17 +126,18 @@
var/list/like_keys = list()
var/list/dislike_keys = list()
-/obj/structure/chisel_message/New(newloc)
- ..()
+ var/turf/original_turf
+
+/obj/structure/chisel_message/Initialize(mapload)
+ . = ..()
SSpersistence.chisel_messages += src
var/turf/T = get_turf(src)
+ original_turf = T
+
if(!good_chisel_message_location(T))
persists = FALSE
qdel(src)
-/obj/structure/chisel_message/singularity_pull()
- return
-
/obj/structure/chisel_message/proc/register(mob/user, newmessage)
hidden_message = newmessage
creator_name = user.real_name
@@ -181,6 +151,8 @@
var/hash = md5(hidden_message)
var/newcolor = copytext(hash, 1, 7)
add_atom_colour("#[newcolor]", FIXED_COLOUR_PRIORITY)
+ light_color = "#[newcolor]"
+ set_light(1)
/obj/structure/chisel_message/proc/pack()
var/list/data = list()
@@ -189,12 +161,12 @@
data["creator_key"] = creator_key
data["realdate"] = realdate
data["map"] = SSmapping.config.map_name
- var/turf/T = get_turf(src)
- data["x"] = T.x
- data["y"] = T.y
- data["z"] = T.z
+ data["x"] = original_turf.x
+ data["y"] = original_turf.y
+ data["z"] = original_turf.z
data["like_keys"] = like_keys
data["dislike_keys"] = dislike_keys
+ return data
/obj/structure/chisel_message/proc/unpack(list/data)
if(!islist(data))
diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm
index 2f431e884a..c51e7feb7a 100644
--- a/code/modules/lighting/lighting_corner.dm
+++ b/code/modules/lighting/lighting_corner.dm
@@ -6,8 +6,8 @@
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
@@ -25,11 +25,9 @@ GLOBAL_LIST_INIT(LIGHTING_CORNER_DIAGONAL, list(NORTHEAST, SOUTHEAST, SOUTHWEST,
var/cache_b = LIGHTING_SOFT_THRESHOLD
var/cache_mx = 0
- var/update_gen = 0
-
/datum/lighting_corner/New(var/turf/new_turf, var/diagonal)
. = ..()
-
+ masters = list()
masters[new_turf] = turn(diagonal, 180)
z = new_turf.z
diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm
index 369129fc57..b0b0b32285 100644
--- a/code/modules/lighting/lighting_object.dm
+++ b/code/modules/lighting/lighting_object.dm
@@ -6,6 +6,7 @@ GLOBAL_LIST_EMPTY(all_lighting_objects) // Global list of lighting objects.
anchored = TRUE
icon = LIGHTING_ICON
+ icon_state = "transparent"
color = LIGHTING_BASE_MATRIX
plane = LIGHTING_PLANE
mouse_opacity = 0
@@ -16,7 +17,7 @@ GLOBAL_LIST_EMPTY(all_lighting_objects) // Global list of lighting objects.
var/needs_update = FALSE
-/atom/movable/lighting_object/Initialize(mapload, var/no_update = FALSE)
+/atom/movable/lighting_object/Initialize(mapload)
. = ..()
verbs.Cut()
GLOB.all_lighting_objects += src
@@ -28,10 +29,8 @@ GLOBAL_LIST_EMPTY(all_lighting_objects) // Global list of lighting objects.
for(var/turf/open/space/S in RANGE_TURFS(1, src)) //RANGE_TURFS is in code\__HELPERS\game.dm
S.update_starlight()
- if (no_update)
- return
-
- update()
+ needs_update = TRUE
+ GLOB.lighting_update_objects += src
/atom/movable/lighting_object/Destroy(var/force)
if (force)
@@ -69,10 +68,17 @@ GLOBAL_LIST_EMPTY(all_lighting_objects) // Global list of lighting objects.
// 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/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/list/corners = T.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)
diff --git a/code/modules/lighting/lighting_setup.dm b/code/modules/lighting/lighting_setup.dm
index fe9bdb5609..5086b0c9d2 100644
--- a/code/modules/lighting/lighting_setup.dm
+++ b/code/modules/lighting/lighting_setup.dm
@@ -8,6 +8,6 @@
if(!IS_DYNAMIC_LIGHTING(T))
continue
- new/atom/movable/lighting_object(T, TRUE)
+ new/atom/movable/lighting_object(T)
CHECK_TICK
CHECK_TICK
diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm
index 1cf14c3c47..63457a1ce9 100644
--- a/code/modules/lighting/lighting_source.dm
+++ b/code/modules/lighting/lighting_source.dm
@@ -26,22 +26,15 @@
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/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)
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
@@ -52,20 +45,18 @@
parse_light_color()
- effect_str = list()
- affecting_turfs = list()
-
update()
return ..()
/datum/light_source/Destroy(force)
- force_update()
+ remove_lum()
if (source_atom)
- 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(!force)
return QDEL_HINT_IWILLGC
@@ -73,79 +64,34 @@
// 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 \
- if (!needs_update) \
- { \
- GLOB.lighting_update_lights += src; \
- needs_update = TRUE; \
- }
+#define EFFECT_UPDATE(level) \
+ if (needs_update == LIGHTING_NO_UPDATE) \
+ GLOB.lighting_update_lights += src; \
+ if (needs_update < level) \
+ needs_update = level; \
+
// 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 && top_atom.light_sources) // Remove ourselves from the light sources of that top atom.
- top_atom.light_sources -= src
+ LAZYREMOVE(top_atom.light_sources, src)
top_atom = new_top_atom
if (top_atom != source_atom)
LAZYADD(top_atom.light_sources, src) // Add ourselves to the light sources of our new top atom.
- EFFECT_UPDATE
+ 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
+ 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
-
-// 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)
- qdel(src)
- return 1
-
- if (!top_atom)
- top_atom = source_atom
- . = 1
-
- if (isturf(top_atom))
- if (source_turf != top_atom)
- source_turf = top_atom
- pixel_turf = source_turf
- . = 1
- else if (top_atom.loc != source_turf)
- source_turf = top_atom.loc
- pixel_turf = get_turf_pixel(top_atom)
- . = 1
- else
- var/P = get_turf_pixel(top_atom)
- if (P != pixel_turf)
- . = 1
- pixel_turf = get_turf_pixel(top_atom)
-
- 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()
@@ -164,48 +110,47 @@
// 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, pixel_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.
-
+/*
/datum/light_source/proc/apply_lum()
var/static/update_gen = 1
applied = 1
// 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
var/thing
var/datum/lighting_corner/C
+ var/corners = list()
+ LAZYINITLIST(effect_str)
FOR_DVIEW(var/turf/T, light_range+1, source_turf, INVISIBILITY_LIGHTING)
- if (!T.lighting_corners_initialised)
- T.generate_missing_corners()
+ var/list/turf_corners = T.get_corners()
- for (thing in T.get_corners())
+ for (thing in turf_corners)
C = thing
if (C.update_gen == update_gen)
continue
@@ -220,9 +165,13 @@
APPLY_CORNER(C)
LAZYADD(T.affecting_lights, src)
- affecting_turfs += T
+ LAZYADD(affecting_turfs, T)
FOR_DVIEW_END
update_gen++
+ applied_lum_r = lum_r
+ applied_lum_g = lum_g
+ applied_lum_b = lum_b
+*/
/datum/light_source/proc/remove_lum()
applied = FALSE
@@ -231,7 +180,7 @@
var/turf/T = thing
LAZYREMOVE(T.affecting_lights, src)
- affecting_turfs.Cut()
+ affecting_turfs = null
var/datum/lighting_corner/C
for (thing in effect_str)
@@ -240,30 +189,93 @@
LAZYREMOVE(C.affecting, src)
- effect_str.Cut()
+ effect_str = null
/datum/light_source/proc/recalc_corner(var/datum/lighting_corner/C)
- if (effect_str.Find(C)) // Already have one.
+ 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
+
+ if (!source_atom || 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
-/datum/light_source/proc/smart_vis_update()
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)
+ for(T in view(Ceiling(light_range), source_turf))
+ for (thing in T.get_corners(source_turf))
+ C = thing
+ corners[C] = 0
+ turfs += T
+ source_turf.luminosity = oldlum
- FOR_DVIEW(T, light_range+1, source_turf, 0)
- if (!T.lighting_corners_initialised)
- T.generate_missing_corners()
- for (thing in T.get_corners(source_turf))
- C = thing
- corners[C] = 0
- turfs += T
- FOR_DVIEW_END
-
+ 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)
@@ -276,22 +288,45 @@
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)
- 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)
-
- for (thing in effect_str - corners) // Old, now gone, corners.
+ L = effect_str - corners
+ for (thing in L) // Old, now gone, corners.
C = thing
REMOVE_CORNER(C)
LAZYREMOVE(C.affecting, src)
- effect_str -= C
+ effect_str -= L
+
+ applied_lum_r = lum_r
+ applied_lum_g = lum_g
+ applied_lum_b = lum_b
+
+ UNSETEMPTY(effect_str)
+ UNSETEMPTY(affecting_turfs)
#undef EFFECT_UPDATE
#undef LUM_FALLOFF
diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm
index 65b1ec2615..ca6866c48e 100644
--- a/code/modules/lighting/lighting_turf.dm
+++ b/code/modules/lighting/lighting_turf.dm
@@ -33,7 +33,7 @@
return
var/area/A = loc
- if (!IS_DYNAMIC_LIGHTING(A))
+ if (!IS_DYNAMIC_LIGHTING(A) && !light_sources)
return
if (!lighting_corners_initialised)
@@ -113,12 +113,18 @@
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)
diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm
index 81c0a7e54d..d08161916c 100644
--- a/code/modules/mapping/ruins.dm
+++ b/code/modules/mapping/ruins.dm
@@ -20,7 +20,7 @@
if(ruins && ruins.len)
ruin = ruins[pick(ruins)]
else
- world.log << "Ruin loader had no ruins to pick from with [budget] left to spend."
+ log_world("Ruin loader had no ruins to pick from with [budget] left to spend.")
break
// Can we afford it
if(ruin.cost > budget)
@@ -47,7 +47,7 @@
if(!valid)
continue
- world.log << "Ruin \"[ruin.name]\" placed at ([T.x], [T.y], [T.z])"
+ log_world("Ruin \"[ruin.name]\" placed at ([T.x], [T.y], [T.z])")
var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T)
R.Load(ruins,ruin)
@@ -57,7 +57,7 @@
break
if(!overall_sanity)
- world.log << "Ruin loader gave up with [budget] left to spend."
+ log_world("Ruin loader gave up with [budget] left to spend.")
/obj/effect/ruin_loader
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 6b1179a585..4999f796c5 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -10,7 +10,7 @@
desc = "It's watching you suspiciously."
/obj/structure/closet/crate/necropolis/tendril/PopulateContents()
- var/loot = rand(1,25)
+ var/loot = rand(1,26)
switch(loot)
if(1)
new /obj/item/device/shared_storage/red(src)
@@ -33,7 +33,7 @@
if(9)
new /obj/item/organ/brain/alien(src)
if(10)
- new /obj/item/organ/heart/cursed(src)
+ new /obj/item/organ/heart/cursed/wizard(src)
if(11)
new /obj/item/ship_in_a_bottle(src)
if(12)
@@ -65,6 +65,8 @@
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src)
if(25)
new /obj/item/weapon/spellbook/oneuse/summonitem(src)
+ if(26)
+ new /obj/item/book_of_babel(src)
@@ -343,6 +345,24 @@
add_fingerprint(usr)
+
+
+//Book of Babel
+
+/obj/item/book_of_babel
+ name = "Book of Babel"
+ desc = "An ancient tome written in countless tongues."
+ icon = 'icons/obj/library.dmi'
+ icon_state = "book1"
+ w_class = 2
+
+/obj/item/book_of_babel/attack_self(mob/user)
+ to_chat(user, "You flip through the pages of the book, quickly and conveniently learning every language in existence. Somewhat less conveniently, the aging book crumbles to dust in the process. Whoops.")
+ user.grant_all_languages(omnitongue=TRUE)
+ new /obj/effect/decal/cleanable/ash(get_turf(user))
+ qdel(src)
+
+
//Boat
/obj/vehicle/lavaboat
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 34cff30324..ae0ad90dfe 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -212,11 +212,10 @@
new /datum/data/mining_equipment("Monkey Cube", /obj/item/weapon/reagent_containers/food/snacks/monkeycube, 300),
new /datum/data/mining_equipment("Toolbelt", /obj/item/weapon/storage/belt/utility, 350),
new /datum/data/mining_equipment("Sulphuric Acid", /obj/item/weapon/reagent_containers/glass/beaker/sulphuric, 500),
- new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
new /datum/data/mining_equipment("Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1700),
new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/weapon/storage/box/rndboards, 2000),
-
+ new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/weapon/bedsheet/rd/royal_cape, 500)
)
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem(null)
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 2bb438639b..d15896a8db 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -278,8 +278,8 @@
var/turf/T = deploy_location
if(T.z != ZLEVEL_MINING && T.z != ZLEVEL_LAVALAND)//only report capsules away from the mining/lavaland level
- message_admins("[key_name_admin(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]")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] activated a bluespace capsule away from the mining level! [ADMIN_JMP(T)]")
+ log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [get_area(T)][COORD(T)]")
template.load(deploy_location, centered = TRUE)
new /obj/effect/particle_effect/smoke(get_turf(src))
qdel(src)
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 1e7f01d7a3..b1ba6680c2 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -248,18 +248,18 @@
if(notify_admins)
if(triggered_by == 1)
- message_admins("An explosion has triggered a [name] to detonate at [A.name] (JMP).")
+ message_admins("An explosion has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)].")
else if(triggered_by == 2)
- message_admins("A signal has triggered a [name] to detonate at [A.name] (JMP). Igniter attacher: [key_name_admin(attacher)]? (FLW)")
+ message_admins("A signal has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)]. Igniter attacher: [ADMIN_LOOKUPFLW(attacher)]")
else
- message_admins("[key_name_admin(user)]? (FLW) has triggered a [name] to detonate at [A.name] (JMP).")
+ message_admins("[ADMIN_LOOKUPFLW(attacher)] has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)].")
if(triggered_by == 1)
- log_game("An explosion has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
+ log_game("An explosion has primed a [name] for detonation at [A][COORD(bombturf)]")
else if(triggered_by == 2)
- log_game("A signal has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z]). Igniter attacher: [key_name(attacher)].")
+ log_game("A signal has primed a [name] for detonation at [A][COORD(bombturf)]. Igniter attacher: [key_name(attacher)].")
else
user.visible_message("[user] strikes \the [src], causing a chain reaction!", "You strike \the [src], causing a chain reaction.")
- log_game("[key_name(user)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
+ log_game("[key_name(user)] has primed a [name] for detonation at [A][COORD(bombturf)]")
spawn(det_time)
if(primed)
if(quality == 3)
diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm
index dcd4762d64..45a64bbfde 100644
--- a/code/modules/mob/dead/dead.dm
+++ b/code/modules/mob/dead/dead.dm
@@ -1,49 +1,51 @@
//Dead mobs can exist whenever. This is needful
-INITIALIZE_IMMEDIATE(/mob/dead)
-
-/mob/dead/Initialize()
- if(initialized)
- stack_trace("Warning: [src]([type]) initialized multiple times!")
- tag = "mob_[next_mob_id++]"
- GLOB.mob_list += src
+
INITIALIZE_IMMEDIATE(/mob/dead)
- prepare_huds()
+
/mob/dead/Initialize()
+
if(initialized)
+
stack_trace("Warning: [src]([type]) initialized multiple times!")
+
initialized = TRUE
+
tag = "mob_[next_mob_id++]"
+
GLOB.mob_list += src
- if(config.cross_allowed)
- verbs += /mob/dead/proc/server_hop
- return INITIALIZE_HINT_NORMAL
+
prepare_huds()
-/mob/dead/dust() //ghosts can't be vaporised.
- return
-
-/mob/dead/gib() //ghosts can't be gibbed.
- return
+
if(config.cross_allowed)
+
verbs += /mob/dead/proc/server_hop
+
return INITIALIZE_HINT_NORMAL
-/mob/dead/ConveyorMove() //lol
- return
+
/mob/dead/dust() //ghosts can't be vaporised.
+
return
+
+
/mob/dead/gib() //ghosts can't be gibbed.
+
return
+
+
/mob/dead/ConveyorMove() //lol
+
return
-/mob/dead/proc/server_hop()
- set category = "OOC"
- set name = "Server Hop!"
- set desc= "Jump to the other server"
- if(notransform)
- return
- if(!config.cross_allowed)
- verbs -= /mob/dead/proc/server_hop
- to_chat(src, "Server Hop has been disabled.")
- return
- if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes")
- return 0
- if (client && config.cross_allowed)
- to_chat(src, "Sending you to [config.cross_address].")
- new /obj/screen/splash(client)
- notransform = TRUE
- sleep(29) //let the animation play
- notransform = FALSE
- winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
- client << link(config.cross_address + "?server_hop=[key]")
- else
- to_chat(src, "There is no other server configured!")
+
/mob/dead/proc/server_hop()
+
set category = "OOC"
+
set name = "Server Hop!"
+
set desc= "Jump to the other server"
+
if(notransform)
+
return
+
if(!config.cross_allowed)
+
verbs -= /mob/dead/proc/server_hop
+
to_chat(src, "Server Hop has been disabled.")
+
return
+
if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes")
+
return 0
+
if (client && config.cross_allowed)
+
to_chat(src, "Sending you to [config.cross_address].")
+
new /obj/screen/splash(client)
+
notransform = TRUE
+
sleep(29) //let the animation play
+
notransform = FALSE
+
winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
+
client << link(config.cross_address + "?server_hop=[key]")
+
else
+
to_chat(src, "There is no other server configured!")
+
\ No newline at end of file
diff --git a/code/modules/mob/dead/dead.dm.rej b/code/modules/mob/dead/dead.dm.rej
new file mode 100644
index 0000000000..4a71374804
--- /dev/null
+++ b/code/modules/mob/dead/dead.dm.rej
@@ -0,0 +1,9 @@
+diff a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm (rejected hunks)
+@@ -5,6 +5,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
+ /mob/dead/Initialize()
+ if(initialized)
+ stack_trace("Warning: [src]([type]) initialized multiple times!")
++ initialized = TRUE
+ tag = "mob_[next_mob_id++]"
+ GLOB.mob_list += src
+
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 7331312173..00df173551 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -54,7 +54,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
var/deadchat_name
/mob/dead/observer/Initialize()
- invisibility = GLOB.observer_default_invisibility
+ set_invisibility(GLOB.observer_default_invisibility)
verbs += /mob/dead/observer/proc/dead_tele
@@ -788,13 +788,25 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!invisibility)
to_chat(user, "It seems extremely obvious.")
+/mob/dead/observer/proc/set_invisibility(value)
+ invisibility = value
+ if(!value)
+ set_light(1, 2)
+ else
+ set_light(0, 0)
+
// Ghosts have no momentum, being massless ectoplasm
/mob/dead/observer/Process_Spacemove(movement_dir)
return 1
+/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.invisibility = amount
+ G.set_invisibility(amount)
if(message)
to_chat(G, message)
GLOB.observer_default_invisibility = amount
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
index 6247083747..9cad58c201 100644
--- a/code/modules/mob/living/brain/MMI.dm
+++ b/code/modules/mob/living/brain/MMI.dm
@@ -31,13 +31,10 @@
else
icon_state = "mmi_empty"
-/obj/item/device/mmi/New()
- ..()
+/obj/item/device/mmi/Initialize()
+ . = ..()
radio = new(src) //Spawns a radio inside the MMI.
radio.broadcasting = 0 //researching radio mmis turned the robofabs into radios because this didnt start as 0.
-
-/obj/item/device/mmi/Initialize()
- ..()
laws.set_laws_config()
/obj/item/device/mmi/attackby(obj/item/O, mob/user, params)
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 331fc5fc95..77ac31812a 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -142,10 +142,12 @@
return not_handled //For future deeper overrides
/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE)
+ var/index = get_held_index_of_item(I)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
if(!. || !I)
return
-
+ if(index && dna.species.mutanthands)
+ put_in_hand(new dna.species.mutanthands(), index)
if(I == wear_suit)
if(s_store && invdrop)
dropItemToGround(s_store, TRUE) //It makes no sense for your suit storage to stay on you if you drop your suit.
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 48f0dc8477..1704595d79 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -71,6 +71,9 @@
//Ears
var/obj/item/organ/ears/mutantears = /obj/item/organ/ears
+ //Hands
+ var/obj/item/mutanthands = null
+
//Citadel snowflake
var/fixed_mut_color2 = ""
var/fixed_mut_color3 = ""
@@ -145,15 +148,16 @@
qdel(lungs)
lungs = null
- if(eyes)
- qdel(eyes)
- eyes = new mutanteyes
- eyes.Insert(C)
+ if(C.get_bodypart("head"))
+ if(eyes)
+ qdel(eyes)
+ eyes = new mutanteyes
+ eyes.Insert(C)
- if(ears)
- qdel(ears)
- ears = new mutantears
- ears.Insert(C)
+ if(ears)
+ qdel(ears)
+ ears = new mutantears
+ ears.Insert(C)
if((!(NOBREATH in species_traits)) && !lungs)
if(mutantlungs)
@@ -175,6 +179,21 @@
if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype)
C.dna.blood_type = exotic_bloodtype
+ if(old_species.mutanthands)
+ for(var/obj/item/I in C.held_items)
+ if(istype(I, old_species.mutanthands))
+ qdel(I)
+
+ if(mutanthands)
+ // Drop items in hands
+ // If you're lucky enough to have a NODROP item, then it stays.
+ for(var/V in C.held_items)
+ var/obj/item/I = V
+ if(istype(I))
+ C.dropItemToGround(I)
+ else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
+ C.put_in_hands(new mutanthands())
+
if(NOAROUSAL in species_traits)
C.canbearoused = FALSE
else
diff --git a/code/modules/mob/living/carbon/human/species.dm.rej b/code/modules/mob/living/carbon/human/species.dm.rej
new file mode 100644
index 0000000000..25968a6a31
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species.dm.rej
@@ -0,0 +1,33 @@
+diff a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm (rejected hunks)
+@@ -173,14 +173,18 @@
+ if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype)
+ C.dna.blood_type = exotic_bloodtype
+
++ if(old_species.mutanthands)
++ for(var/obj/item/I in C.held_items)
++ if(istype(I, old_species.mutanthands))
++ qdel(I)
++
+ if(mutanthands)
+ // Drop items in hands
+ // If you're lucky enough to have a NODROP item, then it stays.
+ for(var/V in C.held_items)
+ var/obj/item/I = V
+ if(istype(I))
+- if(C.dropItemToGround(I))
+- C.put_in_hands(new mutanthands())
++ C.dropItemToGround(I)
+ else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
+ C.put_in_hands(new mutanthands())
+
+@@ -189,10 +193,6 @@
+ C.dna.blood_type = random_blood_type()
+ if(DIGITIGRADE in species_traits)
+ C.Digitigrade_Leg_Swap(TRUE)
+- if(mutanthands)
+- for(var/obj/item/I in C.held_items)
+- if(istype(I, mutanthands))
+- qdel(I)
+
+ /datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour)
+ H.remove_overlay(HAIR_LAYER)
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 573b58159a..6b56fa9ca4 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -13,9 +13,11 @@
name = "Infectious Zombie"
id = "memezombies"
limbs_id = "zombie"
+ mutanthands = /obj/item/zombie_hand
no_equip = list(slot_wear_mask, slot_head)
armor = 20 // 120 damage to KO a zombie, which kills it
speedmod = 2
+ mutanteyes = /obj/item/organ/eyes/night_vision/zombie
/datum/species/zombie/infectious/spec_life(mob/living/carbon/C)
. = ..()
@@ -27,29 +29,15 @@
/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
- // Drop items in hands
- // If you're a zombie lucky enough to have a NODROP item, then it stays.
- for(var/V in C.held_items)
- var/obj/item/I = V
- if(istype(I))
- if(C.dropItemToGround(I))
- var/obj/item/zombie_hand/zh = new /obj/item/zombie_hand()
- C.put_in_hands(zh)
- else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
- var/obj/item/zombie_hand/zh = new /obj/item/zombie_hand()
- C.put_in_hands(zh)
- // Next, deal with the source of this zombie corruption
+ // Deal with the source of this zombie corruption
+ // Infection organ needs to be handled separately from mutant_organs
+ // because it persists through species transitions
var/obj/item/organ/zombie_infection/infection
infection = C.getorganslot("zombie_infection")
if(!infection)
- infection = new(C)
-
-/datum/species/zombie/infectious/on_species_loss(mob/living/carbon/C)
- . = ..()
- for(var/obj/item/I in C.held_items)
- if(istype(I, /obj/item/zombie_hand))
- qdel(I)
+ infection = new()
+ infection.Insert(C)
// Your skin falls off
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index fe0f5b3918..75f29408fe 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -450,7 +450,7 @@
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()
- if (s_active && !(s_active.ClickAccessible(src, depth=STORAGE_VIEW_DEPTH) || s_active.Adjacent(src)))
+ if (s_active && !(CanReach(s_active,view_only = TRUE)))
s_active.close(src)
/mob/living/movement_delay(ignorewalk = 0)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 14b854d2a2..768ff69166 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1143,7 +1143,7 @@
M.visible_message("Unfortunately, [M] just can't seem to hold onto [src]!")
return
if(iscarbon(M) && (!riding_datum.equip_buckle_inhands(M, 1)))
- M.visible_message("[M] can't climb onto [src] because his hands are full!")
+ M.visible_message("[M] can't climb onto [src] because [M.p_their()] hands are full!")
return
. = ..(M, force, check_loc)
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 89dedede13..c08f291cee 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -216,7 +216,7 @@
if(change)
if(change > 0)
if(M && stat != DEAD)
- flick_overlay(image('icons/mob/animal.dmi', src, "heart-ani2", ABOVE_MOB_LAYER), list(M.client), 20)
+ new /obj/effect/overlay/temp/heart(loc)
emote("me", 1, "purrs!")
else
if(M && stat != DEAD)
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index c6aa754b6e..eb6feb00be 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -553,7 +553,7 @@
if(change)
if(change > 0)
if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454
- flick_overlay(image('icons/mob/animal.dmi',src,"heart-ani2",ABOVE_MOB_LAYER), list(M.client), 20)
+ new /obj/effect/overlay/temp/heart(loc)
emote("me", 1, "yaps happily!")
else
if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
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 50711f25ea..427d9ddaa4 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -51,14 +51,12 @@
src.visible_message("[src] calms down.")
if(stat == CONSCIOUS)
udder.generateMilk()
- var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
- if(SV)
- SV.eat(src)
+ 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)
+ 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/Retaliate()
@@ -68,9 +66,22 @@
/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/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/attackby(obj/item/O, mob/user, params)
if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
@@ -300,8 +311,7 @@
name = "udder"
/obj/item/udder/Initialize()
- reagents = new(50)
- reagents.my_atom = src
+ create_reagents(50)
reagents.add_reagent("milk", 20)
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index e7ab6e1b56..51e782b019 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -133,6 +133,7 @@
loc = BB
target = null
wanted_objects -= typecacheof(/obj/structure/beebox) //so we don't attack beeboxes when not going home
+ return //no don't attack the goddamm box
else
. = ..()
if(. && beegent && isliving(target))
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm
index f3b5866ec6..b9731f7418 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm
@@ -40,6 +40,7 @@
/mob/living/simple_animal/hostile/retaliate/ghost/Initialize()
. = ..()
+ set_light(1, 2)
if(!random)
give_hair()
else
@@ -60,4 +61,4 @@
ghost_facial_hair = mutable_appearance('icons/mob/human_face.dmi', "facial_[ghost_facial_hair_style]", -HAIR_LAYER)
ghost_facial_hair.alpha = 200
ghost_facial_hair.color = ghost_facial_hair_color
- add_overlay(ghost_facial_hair)
\ No newline at end of file
+ add_overlay(ghost_facial_hair)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 819f7f3db2..c24ee7acd2 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -578,6 +578,7 @@
var/datum/map_config/cached = SSmapping.next_map_config
if(cached)
stat(null, "Next Map: [cached.map_name]")
+ stat("Round ID:", "[GLOB.round_id ? GLOB.round_id : "NULL"]")
stat(null, "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]")
stat(null, "Station Time: [worldtime2text()]")
stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)")
diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm
index 66fc0cf32a..de3d48f28b 100644
--- a/code/modules/paperwork/clipboard.dm
+++ b/code/modules/paperwork/clipboard.dm
@@ -12,16 +12,20 @@
slot_flags = SLOT_BELT
resistance_flags = FLAMMABLE
-/obj/item/weapon/clipboard/New()
+/obj/item/weapon/clipboard/Initialize()
update_icon()
- ..()
+ . = ..()
+/obj/item/weapon/clipboard/Destroy()
+ QDEL_NULL(haspen)
+ QDEL_NULL(toppaper) //let movable/Destroy handle the rest
+ return ..()
/obj/item/weapon/clipboard/update_icon()
cut_overlays()
if(toppaper)
add_overlay(toppaper.icon_state)
- add_overlay(toppaper.overlays)
+ copy_overlays(toppaper)
if(haspen)
add_overlay("clipboard_pen")
add_overlay("clipboard_over")
@@ -115,4 +119,4 @@
//Update everything
attack_self(usr)
- update_icon()
\ No newline at end of file
+ update_icon()
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 6ca3c8f620..4bd8bb56b0 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -98,7 +98,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
//
/obj/machinery/gravity_generator/main/station/Initialize()
- . = ..()
+ . = ..()
setup_parts()
middle.add_overlay("activated")
update_list()
@@ -303,17 +303,17 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
use_power = on ? 2 : 1
// Sound the alert if gravity was just enabled or disabled.
var/alert = 0
- var/area/area = get_area(src)
- if(on && SSticker.IsRoundInProgress()) // If we turned on and the game is live.
+ var/area/A = get_area(src)
+ if(on && SSticker.IsRoundInProgress()) // If we turned on and the game is live.
if(gravity_in_level() == 0)
alert = 1
investigate_log("was brought online and is now producing gravity for this level.", "gravity")
- message_admins("The gravity generator was brought online. ([area.name])")
+ message_admins("The gravity generator was brought online [A][ADMIN_COORDJMP(src)]")
else
if(gravity_in_level() == 1)
alert = 1
investigate_log("was brought offline and there is now no gravity for this level.", "gravity")
- message_admins("The gravity generator was brought offline with no backup generator. ([area.name])")
+ message_admins("The gravity generator was brought offline with no backup generator. [A][ADMIN_COORDJMP(src)]")
update_icon()
update_list()
diff --git a/code/modules/power/gravitygenerator.dm.rej b/code/modules/power/gravitygenerator.dm.rej
new file mode 100644
index 0000000000..510190ad8b
--- /dev/null
+++ b/code/modules/power/gravitygenerator.dm.rej
@@ -0,0 +1,22 @@
+diff a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm (rejected hunks)
+@@ -303,17 +303,17 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
+ use_power = on ? 2 : 1
+ // Sound the alert if gravity was just enabled or disabled.
+ var/alert = 0
+- var/area/area = get_area(src)
++ var/area/A = get_area(src)
+ if(on && SSticker.IsRoundInProgress()) // If we turned on and the game is live.
+ if(gravity_in_level() == 0)
+ alert = 1
+ investigate_log("was brought online and is now producing gravity for this level.", "gravity")
+- message_admins("The gravity generator was brought online. ([area.name])")
++ message_admins("The gravity generator was brought online [A][ADMIN_COORDJMP(src)]")
+ else
+ if(gravity_in_level() == 1)
+ alert = 1
+ investigate_log("was brought offline and there is now no gravity for this level.", "gravity")
+- message_admins("The gravity generator was brought offline with no backup generator. ([area.name])")
++ message_admins("The gravity generator was brought offline with no backup generator. [A][ADMIN_COORDJMP(src)]")
+
+ update_icon()
+ update_list()
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index cfe57d0607..b7a298d6b3 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -93,7 +93,7 @@
connect_to_network()
sparks = new
- sparks.attach(src)
+ sparks.attach(src)
sparks.set_up(5, TRUE, src)
/obj/machinery/power/emitter/Destroy()
@@ -121,8 +121,8 @@
if(src.active==1)
src.active = 0
to_chat(user, "You turn off \the [src].")
- message_admins("Emitter turned off by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Emitter turned off by [key_name(user)] in ([x],[y],[z])")
+ message_admins("Emitter turned off by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("Emitter turned off by [key_name(user)] in [COORD(src)]")
investigate_log("turned off by [key_name(user)] at [get_area(src)]","singulo")
else
src.active = 1
diff --git a/code/modules/power/singularity/emitter.dm.rej b/code/modules/power/singularity/emitter.dm.rej
new file mode 100644
index 0000000000..9387d35f17
--- /dev/null
+++ b/code/modules/power/singularity/emitter.dm.rej
@@ -0,0 +1,15 @@
+diff a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm (rejected hunks)
+@@ -98,9 +98,10 @@
+
+ /obj/machinery/power/emitter/Destroy()
+ if(SSticker && SSticker.IsRoundInProgress())
+- message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1)
+- log_game("Emitter deleted at ([x],[y],[z])")
+- investigate_log("deleted at ([x],[y],[z]) at [get_area(src)]","singulo")
++ var/turf/T = get_turf(src)
++ message_admins("Emitter deleted at [ADMIN_COORDJMP(T)]",0,1)
++ log_game("Emitter deleted at [COORD(T)]")
++ investigate_log("deleted at [get_area(src)] [COORD(T)]","singulo")
+ QDEL_NULL(sparks)
+ return ..()
+
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 3b36e436ee..dc3da6db8d 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -117,8 +117,8 @@
strength++
strength_change()
- message_admins("PA Control Computer increased to [strength] by [key_name_admin(usr)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("PA Control Computer increased to [strength] by [key_name(usr)] in ([x],[y],[z])")
+ message_admins("PA Control Computer increased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("PA Control Computer increased to [strength] by [key_name(usr)] in [COORD(src)]")
investigate_log("increased to [strength] by [key_name(usr)]","singulo")
@@ -127,8 +127,8 @@
strength--
strength_change()
- message_admins("PA Control Computer decreased to [strength] by [key_name_admin(usr)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in ([x],[y],[z])")
+ message_admins("PA Control Computer decreased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in [COORD(src)]")
investigate_log("decreased to [strength] by [key_name(usr)]","singulo")
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 1e1737661e..ea95b08269 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -170,7 +170,7 @@
//crowbarring it !
var/turf/T = get_turf(src)
if(default_deconstruction_crowbar(I))
- message_admins("[src] has been deconstructed by [key_name_admin(user)](?) (FLW) in ([T.x],[T.y],[T.z] - JMP)",0,1)
+ message_admins("[src] has been deconstructed by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
log_game("[src] has been deconstructed by [key_name(user)]")
investigate_log("SMES deconstructed by [key_name(user)]","singulo")
return
@@ -256,9 +256,9 @@
input_available = terminal.surplus()
if(inputting)
- if(input_available > 0 && input_available >= input_level) // if there's power available, try to charge
+ if(input_available > 0) // if there's power available, try to charge
- var/load = min((capacity-charge)/SMESRATE, input_level) // charge at set rate, limited to spare capacity
+ var/load = min(min((capacity-charge)/SMESRATE, input_level), input_available) // charge at set rate, limited to spare capacity
charge += load * SMESRATE // increase the charge
@@ -268,7 +268,7 @@
inputting = 0 // stop inputting
else
- if(input_attempt && input_available > 0 && input_available >= input_level)
+ if(input_attempt && input_available > 0)
inputting = 1
else
inputting = 0
diff --git a/code/modules/power/smes.dm.rej b/code/modules/power/smes.dm.rej
new file mode 100644
index 0000000000..d381204e44
--- /dev/null
+++ b/code/modules/power/smes.dm.rej
@@ -0,0 +1,17 @@
+diff a/code/modules/power/smes.dm b/code/modules/power/smes.dm (rejected hunks)
+@@ -192,10 +192,11 @@
+
+ /obj/machinery/power/smes/Destroy()
+ if(SSticker && SSticker.IsRoundInProgress())
+- var/area/area = get_area(src)
+- message_admins("SMES deleted at ([area.name])")
+- log_game("SMES deleted at ([area.name])")
+- investigate_log("deleted at ([area.name])","singulo")
++ var/area/A = get_area(src)
++ var/turf/T = get_turf(src)
++ message_admins("SMES deleted at [A][ADMIN_JMP(T)]")
++ log_game("SMES deleted at [A][COORD(T)]")
++ investigate_log("deleted at [A][COORD(T)]","singulo")
+ if(terminal)
+ disconnect_terminal()
+ return ..()
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index a580b63e55..712cd5cd41 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -344,7 +344,7 @@
lastwarning = REALTIMEOFDAY
if(!has_reached_emergency)
investigate_log("has reached the emergency point for the first time.", "supermatter")
- message_admins("[src] has reached the emergency point (JMP).")
+ message_admins("[src] has reached the emergency point [ADMIN_JMP(src)].")
has_reached_emergency = 1
else if(damage >= damage_archived) // The damage is still going up
SPEAK("[warning_alert] Instability: [stability]%")
@@ -391,7 +391,7 @@
power += Proj.damage * config_bullet_energy
if(!has_been_powered)
investigate_log("has been powered for the first time.", "supermatter")
- message_admins("[src] has been powered for the first time (JMP).")
+ message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].")
has_been_powered = 1
else if(takes_damage)
damage += Proj.damage * config_bullet_energy
@@ -490,7 +490,7 @@
/obj/machinery/power/supermatter_shard/proc/Consume(atom/movable/AM)
if(isliving(AM))
var/mob/living/user = AM
- message_admins("[src] has consumed [key_name_admin(user)]? (FLW) (JMP).")
+ message_admins("[src] has consumed [key_name_admin(user)] [ADMIN_JMP(src)].")
investigate_log("has consumed [key_name(user)].", "supermatter")
user.dust()
matter_power += 200
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index 69a9ca2a8a..8a94c2b849 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -19,15 +19,12 @@
/obj/item/weapon/gun/energy/pulse/prize/New()
. = ..()
GLOB.poi_list |= src
- var/msg = "A pulse rifle prize has been created at ([x],[y],[z] - (\
- \
- JMP)"
+ var/msg = "A pulse rifle prize has been created at [ADMIN_COORDJMP(src)]"
message_admins(msg)
log_game(msg)
- notify_ghosts("Someone won a pulse rifle as a prize!", source = src,
- action = NOTIFY_ORBIT)
+ notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT)
/obj/item/weapon/gun/energy/pulse/prize/Destroy()
GLOB.poi_list -= src
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index da1eb90685..99056eb1dc 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -367,3 +367,9 @@
desc = "Creates and dispenses mutagen."
dispensable_reagents = list("mutagen")
emagged_reagents = list("plasma")
+
+
+/obj/machinery/chem_dispenser/mutagensaltpeter
+ name = "mutagen and saltpeter dispenser"
+ desc = "Creates and dispenses mutagen and even saltpeter."
+ dispensable_reagents = list("mutagen", "saltpetre")
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index a8ab8fd426..b929337a13 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -10,7 +10,7 @@
active_power_usage = 100
pass_flags = PASSTABLE
resistance_flags = ACID_PROOF
- var/operating = 0
+ var/operating = FALSE
var/obj/item/weapon/reagent_containers/beaker = null
var/limit = 10
var/list/blend_items = list (
@@ -220,9 +220,12 @@
[processing_chamber]
[beaker_contents]
"}
- if (is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
- dat += "Grind the reagents
"
- dat += "Juice the reagents
"
+ if (is_beaker_ready)
+ if(!is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
+ dat += "Grind the reagents
"
+ dat += "Juice the reagents
"
+ else if (beaker.reagents.total_volume)
+ dat += "Mix the reagents
"
if(holdingitems && holdingitems.len > 0)
dat += "Eject the reagents
"
if (beaker)
@@ -248,6 +251,8 @@
grind()
if("juice")
juice()
+ if("mix")
+ mix()
if("eject")
eject()
if ("detach")
@@ -327,11 +332,11 @@
playsound(src.loc, 'sound/machines/juicer.ogg', 20, 1)
var/offset = prob(50) ? -2 : 2
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 250) //start shaking
- operating = 1
+ operating = TRUE
updateUsrDialog()
spawn(50)
pixel_x = initial(pixel_x) //return to its spot after shaking
- operating = 0
+ operating = FALSE
updateUsrDialog()
//Snacks
@@ -365,11 +370,11 @@
playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
var/offset = prob(50) ? -2 : 2
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 250) //start shaking
- operating = 1
+ operating = TRUE
updateUsrDialog()
spawn(60)
pixel_x = initial(pixel_x) //return to its spot after shaking
- operating = 0
+ operating = FALSE
updateUsrDialog()
//Snacks and Plants
@@ -467,3 +472,33 @@
break
beaker.reagents.add_reagent(r_id, min(O.reagent_contents[r_id], space))
remove_object(O)
+
+/obj/machinery/reagentgrinder/proc/mix()
+
+ //For butter and other things that would change upon shaking or mixing
+ power_change()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if (!beaker)
+ return
+ playsound(src.loc, 'sound/machines/juicer.ogg', 20, 1)
+ var/offset = prob(50) ? -2 : 2
+ animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 250) //start shaking
+ operating = TRUE
+ updateUsrDialog()
+ addtimer(CALLBACK(src, /obj/machinery/reagentgrinder/proc/mix_complete), 50)
+
+/obj/machinery/reagentgrinder/proc/mix_complete()
+ pixel_x = initial(pixel_x) //return to its spot after shaking
+ operating = FALSE
+ updateUsrDialog()
+ if (beaker.reagents.total_volume)
+ //Recipe to make Butter
+ while(beaker.reagents.get_reagent_amount("milk") >= 15)
+ beaker.reagents.remove_reagent("milk", 15)
+ new /obj/item/weapon/reagent_containers/food/snacks/butter(src.loc)
+ //Recipe to make Mayonnaise
+ if (beaker.reagents.has_reagent("eggyolk"))
+ var/amount = beaker.reagents.get_reagent_amount("eggyolk")
+ beaker.reagents.remove_reagent("eggyolk", amount)
+ beaker.reagents.add_reagent("mayonnaise", amount)
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
old mode 100644
new mode 100755
index 56a89fe389..d2f78002a1
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -516,17 +516,27 @@
/datum/reagent/consumable/honey
name = "honey"
id = "honey"
- description = "Sweet sweet honey, decays into sugar."
+ description = "Sweet sweet honey, decays into sugar and has natural healing properties."
color = "#d3a308"
nutriment_factor = 15 * REAGENTS_METABOLISM
+ metabolization_rate = 1 * REAGENTS_METABOLISM
taste_description = "sweetness"
/datum/reagent/consumable/honey/on_mob_life(mob/living/M)
M.reagents.add_reagent("sugar",3)
- if(prob(20))
- M.heal_bodypart_damage(3,1)
+ if(prob(55))
+ M.adjustBruteLoss(-1*REM, 0)
+ M.adjustFireLoss(-1*REM, 0)
+ M.adjustOxyLoss(-1*REM, 0)
+ M.adjustToxLoss(-1*REM, 0)
..()
+/datum/reagent/consumable/mayonnaise
+ name = "Mayonnaise"
+ id = "mayonnaise"
+ description = "An white and oily mixture of mixed egg yolks."
+ color = "#DFDFDF"
+ taste_description = "mayonnaise"
////Lavaland Flora Reagents////
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index ac259e58c2..f359a1fc37 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1110,8 +1110,9 @@
id = "nitrous_oxide"
description = "A potent oxidizer used as fuel in rockets and as an anaesthetic during surgery."
reagent_state = LIQUID
+ metabolization_rate = 1.5 * REAGENTS_METABOLISM
color = "#808080"
- taste_description = "numbness"
+ taste_description = "sweetness"
/datum/reagent/nitrous_oxide/reaction_obj(obj/O, reac_volume)
if((!O) || (!reac_volume))
@@ -1122,7 +1123,19 @@
if(istype(T))
T.atmos_spawn_air("n2o=[reac_volume/5];TEMP=[T20C]")
-
+/datum/reagent/nitrous_oxide/reaction_mob(mob/M, method=TOUCH, reac_volume)
+ if(method == VAPOR)
+ M.drowsyness += max(round(reac_volume, 1), 2)
+
+/datum/reagent/nitrous_oxide/on_mob_life(mob/living/M)
+ M.drowsyness += 2
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.blood_volume = max(H.blood_volume - 2.5, 0)
+ if(prob(20))
+ M.losebreath += 2
+ M.confused = min(M.confused + 2, 5)
+ ..()
/////////////////////////Coloured Crayon Powder////////////////////////////
//For colouring in /proc/mix_color_from_reagents
@@ -1533,7 +1546,9 @@
/datum/reagent/romerol/on_mob_life(mob/living/carbon/human/H)
// Silently add the zombie infection organ to be activated upon death
- new /obj/item/organ/zombie_infection(H)
+ if(!H.getorganslot("zombie_infection"))
+ var/obj/item/organ/zombie_infection/ZI = new()
+ ZI.Insert(H)
..()
/datum/reagent/growthserum
diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm
index 9e0bb2d0e4..c13ff096e4 100644
--- a/code/modules/reagents/chemistry/recipes.dm
+++ b/code/modules/reagents/chemistry/recipes.dm
@@ -36,12 +36,12 @@
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
var/area/my_area = get_area(T)
- var/message = "A [reaction_name] reaction has occurred in [my_area.name]. (JMP)"
+ var/message = "A [reaction_name] reaction has occurred in [my_area.name] [ADMIN_COORDJMP(T)]"
message += " (VV)"
var/mob/M = get(A, /mob)
if(M)
- message += " - Carried By: [key_name_admin(M)](?) (FLW)"
+ message += " - Carried By: [ADMIN_LOOKUPFLW(M)]"
else
message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 805aa936d4..6cfdd80cf5 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -6,6 +6,7 @@
/datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume)
var/turf/T = get_turf(holder.my_atom)
+ var/area/A = get_area(T)
var/inside_msg
if(ismob(holder.my_atom))
var/mob/M = holder.my_atom
@@ -14,9 +15,9 @@
var/touch_msg = "N/A"
if(lastkey)
var/mob/toucher = get_mob_by_key(lastkey)
- touch_msg = "[key_name_admin(lastkey)]? (FLW)"
- message_admins("Reagent explosion reaction occurred at [T.loc.name] (JMP)[inside_msg]. Last Fingerprint: [touch_msg].")
- log_game("Reagent explosion reaction occurred at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"]." )
+ touch_msg = "[ADMIN_LOOKUPFLW(toucher)]"
+ message_admins("Reagent explosion reaction occurred at [A] [ADMIN_COORDJMP(T)][inside_msg]. Last Fingerprint: [touch_msg].")
+ log_game("Reagent explosion reaction occurred at [A] [COORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"]." )
var/datum/effect_system/reagents_explosion/e = new()
e.set_up(modifier + round(created_volume/strengthdiv, 1), T, 0, 0)
e.start()
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index c507dd6794..f06dff50cf 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -437,13 +437,14 @@
/datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
+ var/area/A = get_area(T)
var/lastkey = holder.my_atom.fingerprintslast
var/touch_msg = "N/A"
if(lastkey)
var/mob/toucher = get_mob_by_key(lastkey)
- touch_msg = "[key_name_admin(lastkey)]?(FLW)."
- message_admins("Slime Explosion reaction started at [T.loc.name] (JMP). Last Fingerprint: [touch_msg]")
- log_game("Slime Explosion reaction started at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"].")
+ touch_msg = "[ADMIN_LOOKUPFLW(toucher)]."
+ message_admins("Slime Explosion reaction started at [A] [ADMIN_COORDJMP(T)]. Last Fingerprint: [touch_msg]")
+ log_game("Slime Explosion reaction started at [A] [COORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"].")
T.visible_message("The slime extract begins to vibrate violently !")
addtimer(CALLBACK(src, .proc/boom, holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
old mode 100644
new mode 100755
index 6ea2673004..d61217f006
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -155,6 +155,12 @@
filling.color = mix_color_from_reagents(reagents.reagent_list)
add_overlay(filling)
+/obj/item/weapon/reagent_containers/glass/beaker/jar
+ name = "honey jar"
+ desc = "A jar for honey. It can hold up to 50 units of sweet delight."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "vapour"
+
/obj/item/weapon/reagent_containers/glass/beaker/large
name = "large beaker"
desc = "A large beaker. Can hold up to 100 units."
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 34d422da92..92e01f4824 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -48,15 +48,16 @@
user.changeNext_move(CLICK_CD_RANGE*2)
user.newtonian_move(get_dir(A, user))
var/turf/T = get_turf(src)
+ var/area/area = get_area(src)
if(reagents.has_reagent("sacid"))
- message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src] at ([get_area(src)] ([T.x], [T.y], [T.z])).")
- log_game("[key_name(user)] fired sulphuric acid from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired sulphuric acid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired sulphuric acid from \a [src] at [area] ([T.x], [T.y], [T.z]).")
if(reagents.has_reagent("facid"))
- message_admins("[key_name_admin(user)] fired Fluacid from \a [src] at ([get_area(src)] ([T.x], [T.y], [T.z])).")
- log_game("[key_name(user)] fired Fluacid from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired Fluacid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired Fluacid from \a [src] at [area] [COORD(T)].")
if(reagents.has_reagent("lube"))
- message_admins("[key_name_admin(user)] fired Space lube from \a [src] at ([get_area(src)] ([T.x], [T.y], [T.z])).")
- log_game("[key_name(user)] fired Space lube from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired Space lube from \a [src] at [area] [COORD(T)].")
return
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 15d8e5e80c..54984227ad 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -47,7 +47,7 @@ other types of metals and chemistry for reagents).
////////////////////////////////////////
/obj/item/weapon/disk/design_disk
- name = "component design disk"
+ name = "Component Design Disk"
desc = "A disk for storing device design data for construction in lathes."
icon_state = "datadisk1"
materials = list(MAT_METAL=300, MAT_GLASS=100)
@@ -62,7 +62,7 @@ other types of metals and chemistry for reagents).
blueprints += null
/obj/item/weapon/disk/design_disk/adv
- name = "advanced component design disk"
+ name = "Advanced Component Design Disk"
desc = "A disk for storing device design data for construction in lathes. This one has extra storage space."
materials = list(MAT_METAL=300, MAT_GLASS=100, MAT_SILVER = 50)
max_blueprints = 5
@@ -587,7 +587,7 @@ other types of metals and chemistry for reagents).
category = list("Equipment")
/datum/design/diskplantgene
- name = "Plant data disk"
+ name = "Plant Data Disk"
desc = "A disk for storing plant genetic data."
id = "diskplantgene"
req_tech = list("programming" = 4, "biotech" = 3)
@@ -595,7 +595,7 @@ other types of metals and chemistry for reagents).
materials = list(MAT_METAL=200, MAT_GLASS=100)
build_path = /obj/item/weapon/disk/plantgene
category = list("Electronics")
-
+
/////////////////////////////////////////
////////////Janitor Designs//////////////
/////////////////////////////////////////
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 9f2fbda1f3..7fbc8309a8 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -11,7 +11,7 @@
category = list("initial","Tools")
/datum/design/crowbar
- name = "Pocket crowbar"
+ name = "Pocket Crowbar"
id = "crowbar"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50)
@@ -27,7 +27,7 @@
category = list("initial","Tools")
/datum/design/extinguisher
- name = "Fire extinguisher"
+ name = "Fire Extinguisher"
id = "extinguisher"
build_type = AUTOLATHE
materials = list(MAT_METAL = 90)
@@ -51,7 +51,7 @@
category = list("initial","Tools")
/datum/design/tscanner
- name = "T-ray scanner"
+ name = "T-Ray Scanner"
id = "tscanner"
build_type = AUTOLATHE
materials = list(MAT_METAL = 150)
@@ -59,7 +59,7 @@
category = list("initial","Tools")
/datum/design/weldingtool
- name = "Welding tool"
+ name = "Welding Tool"
id = "welding_tool"
build_type = AUTOLATHE
materials = list(MAT_METAL = 70, MAT_GLASS = 20)
@@ -67,7 +67,7 @@
category = list("initial","Tools")
/datum/design/mini_weldingtool
- name = "Emergency welding tool"
+ name = "Emergency Welding Tool"
id = "mini_welding_tool"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 10)
@@ -99,7 +99,7 @@
category = list("initial","Tools")
/datum/design/welding_helmet
- name = "Welding helmet"
+ name = "Welding Helmet"
id = "welding_helmet"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1750, MAT_GLASS = 400)
@@ -107,7 +107,7 @@
category = list("initial","Tools")
/datum/design/cable_coil
- name = "Cable coil"
+ name = "Cable Coil"
id = "cable_coil"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10, MAT_GLASS = 5)
@@ -124,7 +124,7 @@
category = list("initial","Tools")
/datum/design/console_screen
- name = "Console screen"
+ name = "Console Screen"
id = "console_screen"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 200)
@@ -132,7 +132,7 @@
category = list("initial", "Electronics")
/datum/design/apc_board
- name = "APC module"
+ name = "APC Module"
id = "power control"
build_type = AUTOLATHE
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
@@ -140,7 +140,7 @@
category = list("initial", "Electronics")
/datum/design/airlock_board
- name = "Airlock electronics"
+ name = "Airlock Electronics"
id = "airlock_board"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
@@ -148,7 +148,7 @@
category = list("initial", "Electronics")
/datum/design/firelock_board
- name = "Firelock circuitry"
+ name = "Firelock Circuitry"
id = "firelock_board"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
@@ -156,7 +156,7 @@
category = list("initial", "Electronics")
/datum/design/airalarm_electronics
- name = "Air alarm electronics"
+ name = "Air Alarm Electronics"
id = "airalarm_electronics"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
@@ -164,7 +164,7 @@
category = list("initial", "Electronics")
/datum/design/firealarm_electronics
- name = "Fire alarm electronics"
+ name = "Fire Alarm Electronics"
id = "firealarm_electronics"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
@@ -180,7 +180,7 @@
category = list("initial", "Misc")
/datum/design/pipe_painter
- name = "Pipe painter"
+ name = "Pipe Painter"
id = "pipe_painter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 2000)
@@ -188,7 +188,7 @@
category = list("initial", "Misc")
/datum/design/airlock_painter
- name = "Airlock painter"
+ name = "Airlock Painter"
id = "airlock_painter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
@@ -214,7 +214,7 @@
maxstack = 50
/datum/design/rglass
- name = "Reinforced glass"
+ name = "Reinforced Glass"
id = "rglass"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
@@ -223,7 +223,7 @@
maxstack = 50
/datum/design/rods
- name = "Metal rod"
+ name = "Metal Rod"
id = "rods"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1000)
@@ -232,7 +232,7 @@
maxstack = 50
/datum/design/rcd_ammo
- name = "Compressed matter cardridge"
+ name = "Compressed Matter Cartridge"
id = "rcd_ammo"
build_type = AUTOLATHE
materials = list(MAT_METAL = 3000, MAT_GLASS=2000)
@@ -240,7 +240,7 @@
category = list("initial","Construction")
/datum/design/kitchen_knife
- name = "Kitchen knife"
+ name = "Kitchen Knife"
id = "kitchen_knife"
build_type = AUTOLATHE
materials = list(MAT_METAL = 12000)
@@ -272,7 +272,7 @@
category = list("initial","Dinnerware")
/datum/design/drinking_glass
- name = "Drinking glass"
+ name = "Drinking Glass"
id = "drinking_glass"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 500)
@@ -280,7 +280,7 @@
category = list("initial","Dinnerware")
/datum/design/shot_glass
- name = "Shot glass"
+ name = "Shot Glass"
id = "shot_glass"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 100)
@@ -304,7 +304,7 @@
category = list("initial","Misc")
/datum/design/plant_analyzer
- name = "Plant analyzer"
+ name = "Plant Analyzer"
id = "plant_analyzer"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
@@ -344,7 +344,7 @@
category = list("initial", "Medical")
/datum/design/circular_saw
- name = "Circular saw"
+ name = "Circular Saw"
id = "circular_saw"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
@@ -352,7 +352,7 @@
category = list("initial", "Medical")
/datum/design/surgicaldrill
- name = "Surgical drill"
+ name = "Surgical Drill"
id = "surgicaldrill"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
@@ -392,7 +392,7 @@
category = list("initial", "Medical")
/datum/design/large_beaker
- name = "Large beaker"
+ name = "Large Beaker"
id = "large_beaker"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 2500)
@@ -408,7 +408,7 @@
category = list("initial", "Medical")
/datum/design/beanbag_slug
- name = "Beanbag slug"
+ name = "Beanbag Slug"
id = "beanbag_slug"
build_type = AUTOLATHE
materials = list(MAT_METAL = 250)
@@ -416,7 +416,7 @@
category = list("initial", "Security")
/datum/design/rubbershot
- name = "Rubber shot"
+ name = "Rubber Shot"
id = "rubber_shot"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
@@ -424,7 +424,7 @@
category = list("initial", "Security")
/datum/design/c38
- name = "Speed loader (.38)"
+ name = "Speed Loader (.38)"
id = "c38"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
@@ -432,7 +432,7 @@
category = list("initial", "Security")
/datum/design/recorder
- name = "Universal recorder"
+ name = "Universal Recorder"
id = "recorder"
build_type = AUTOLATHE
materials = list(MAT_METAL = 60, MAT_GLASS = 30)
@@ -456,7 +456,7 @@
category = list("initial", "Misc")
/datum/design/signaler
- name = "Remote signaling device"
+ name = "Remote Signaling Device"
id = "signaler"
build_type = AUTOLATHE
materials = list(MAT_METAL = 400, MAT_GLASS = 120)
@@ -464,7 +464,7 @@
category = list("initial", "T-Comm")
/datum/design/radio_headset
- name = "Radio headset"
+ name = "Radio Headset"
id = "radio_headset"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75)
@@ -472,7 +472,7 @@
category = list("initial", "T-Comm")
/datum/design/bounced_radio
- name = "Station bounced radio"
+ name = "Station Bounced Radio"
id = "bounced_radio"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75, MAT_GLASS = 25)
@@ -480,7 +480,7 @@
category = list("initial", "T-Comm")
/datum/design/infrared_emitter
- name = "Infrared emitter"
+ name = "Infrared Emitter"
id = "infrared_emitter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
@@ -488,7 +488,7 @@
category = list("initial", "Misc")
/datum/design/health_sensor
- name = "Health sensor"
+ name = "Health Sensor"
id = "health_sensor"
build_type = AUTOLATHE
materials = list(MAT_METAL = 800, MAT_GLASS = 200)
@@ -504,7 +504,7 @@
category = list("initial", "Misc")
/datum/design/voice_analyser
- name = "Voice analyser"
+ name = "Voice Analyser"
id = "voice_analyser"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 50)
@@ -512,7 +512,7 @@
category = list("initial", "Misc")
/datum/design/light_tube
- name = "Light tube"
+ name = "Light Tube"
id = "light_tube"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 100)
@@ -520,7 +520,7 @@
category = list("initial", "Construction")
/datum/design/light_bulb
- name = "Light bulb"
+ name = "Light Bulb"
id = "light_bulb"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 100)
@@ -528,7 +528,7 @@
category = list("initial", "Construction")
/datum/design/camera_assembly
- name = "Camera assembly"
+ name = "Camera Assembly"
id = "camera_assembly"
build_type = AUTOLATHE
materials = list(MAT_METAL = 400, MAT_GLASS = 250)
@@ -536,7 +536,7 @@
category = list("initial", "Construction")
/datum/design/newscaster_frame
- name = "Newscaster frame"
+ name = "Newscaster Frame"
id = "newscaster_frame"
build_type = AUTOLATHE
materials = list(MAT_METAL = 14000, MAT_GLASS = 8000)
@@ -552,7 +552,7 @@
category = list("initial", "Medical")
/datum/design/prox_sensor
- name = "Proximity sensor"
+ name = "Proximity Sensor"
id = "prox_sensor"
build_type = AUTOLATHE
materials = list(MAT_METAL = 800, MAT_GLASS = 200)
@@ -577,7 +577,7 @@
category = list("hacked", "Weapons and ammo")
/datum/design/rcd
- name = "Rapid construction device (RCD)"
+ name = "Rapid Construction Device (RCD)"
id = "rcd"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
@@ -585,7 +585,7 @@
category = list("hacked", "Construction")
/datum/design/rpd
- name = "Rapid pipe dispenser (RPD)"
+ name = "Rapid Pipe Dispenser (RPD)"
id = "rpd"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75000, MAT_GLASS = 37500)
@@ -601,7 +601,7 @@
category = list("hacked", "Tools")
/datum/design/large_welding_tool
- name = "Industrial welding tool"
+ name = "Industrial Welding Tool"
id = "large_welding_tool"
build_type = AUTOLATHE
materials = list(MAT_METAL = 70, MAT_GLASS = 60)
@@ -625,7 +625,7 @@
category = list("hacked", "Security")
/datum/design/shotgun_slug
- name = "Shotgun slug"
+ name = "Shotgun Slug"
id = "shotgun_slug"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
@@ -633,7 +633,7 @@
category = list("hacked", "Security")
/datum/design/buckshot_shell
- name = "Buckshot shell"
+ name = "Buckshot Shell"
id = "buckshot_shell"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
@@ -641,7 +641,7 @@
category = list("hacked", "Security")
/datum/design/shotgun_dart
- name = "Shotgun dart"
+ name = "Shotgun Dart"
id = "shotgun_dart"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
@@ -649,7 +649,7 @@
category = list("hacked", "Security")
/datum/design/incendiary_slug
- name = "Incendiary slug"
+ name = "Incendiary Slug"
id = "incendiary_slug"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
@@ -657,7 +657,7 @@
category = list("hacked", "Security")
/datum/design/riot_dart
- name = "Foam riot dart"
+ name = "Foam Riot Dart"
id = "riot_dart"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1000) //Discount for making individually - no box = less metal!
@@ -665,7 +665,7 @@
category = list("hacked", "Security")
/datum/design/riot_darts
- name = "Foam riot dart box"
+ name = "Foam Riot Dart Box"
id = "riot_darts"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50000) //Comes with 40 darts
@@ -673,7 +673,7 @@
category = list("hacked", "Security")
/datum/design/a357
- name = "Ammo box (.357)"
+ name = "Ammo Box (.357)"
id = "a357"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
@@ -681,7 +681,7 @@
category = list("hacked", "Security")
/datum/design/c10mm
- name = "Ammo box (10mm)"
+ name = "Ammo Box (10mm)"
id = "c10mm"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
@@ -689,7 +689,7 @@
category = list("hacked", "Security")
/datum/design/c45
- name = "Ammo box (.45)"
+ name = "Ammo Box (.45)"
id = "c45"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
@@ -697,7 +697,7 @@
category = list("hacked", "Security")
/datum/design/c9mm
- name = "Ammo box (9mm)"
+ name = "Ammo Box (9mm)"
id = "c9mm"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
@@ -705,7 +705,7 @@
category = list("hacked", "Security")
/datum/design/cleaver
- name = "Butcher's cleaver"
+ name = "Butcher's Cleaver"
id = "cleaver"
build_type = AUTOLATHE
materials = list(MAT_METAL = 18000)
@@ -721,7 +721,7 @@
category = list("initial", "Tools")
/datum/design/desttagger
- name = "Destination tagger"
+ name = "Destination Tagger"
id = "desttagger"
build_type = AUTOLATHE
materials = list(MAT_METAL = 250, MAT_GLASS = 125)
@@ -729,7 +729,7 @@
category = list("initial", "Electronics")
/datum/design/handlabeler
- name = "Hand labeler"
+ name = "Hand Labeler"
id = "handlabel"
build_type = AUTOLATHE
materials = list(MAT_METAL = 150, MAT_GLASS = 125)
@@ -737,7 +737,7 @@
category = list("initial", "Electronics")
/datum/design/geiger
- name = "Geiger counter"
+ name = "Geiger Counter"
id = "geigercounter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 150, MAT_GLASS = 150)
@@ -745,7 +745,7 @@
category = list("initial", "Tools")
/datum/design/turret_control_frame
- name = "Turret control frame"
+ name = "Turret Control Frame"
id = "turret_control"
build_type = AUTOLATHE
materials = list(MAT_METAL = 12000)
@@ -753,7 +753,7 @@
category = list("initial", "Construction")
/datum/design/conveyor_belt
- name = "Conveyor belt"
+ name = "Conveyor Belt"
id = "conveyor_belt"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000)
@@ -761,7 +761,7 @@
category = list("initial", "Construction")
/datum/design/conveyor_switch
- name = "Conveyor belt switch"
+ name = "Conveyor Belt Switch"
id = "conveyor_switch"
build_type = AUTOLATHE
materials = list(MAT_METAL = 450, MAT_GLASS = 190)
@@ -783,3 +783,12 @@
materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
build_path = /obj/item/device/modular_computer/tablet
category = list("initial","Misc")
+
+/datum/design/slime_scanner
+ name = "Slime Scanner"
+ id = "slime_scanner"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 300, MAT_GLASS = 200)
+ build_path = /obj/item/device/slime_scanner
+ category = list("initial", "Misc")
+
\ No newline at end of file
diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm
index d293101229..af1d942e90 100644
--- a/code/modules/research/designs/biogenerator_designs.dm
+++ b/code/modules/research/designs/biogenerator_designs.dm
@@ -3,7 +3,7 @@
///////////////////////////////////
/datum/design/milk
- name = "10 milk"
+ name = "10 Milk"
id = "milk"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 20)
@@ -11,7 +11,7 @@
category = list("initial","Food")
/datum/design/cream
- name = "10 cream"
+ name = "10 Cream"
id = "cream"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 30)
@@ -19,7 +19,7 @@
category = list("initial","Food")
/datum/design/milk_carton
- name = "Milk carton"
+ name = "Milk Carton"
id = "milk_carton"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 100)
@@ -27,7 +27,7 @@
category = list("initial","Food")
/datum/design/cream_carton
- name = "Cream carton"
+ name = "Cream Carton"
id = "cream_carton"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 300)
@@ -35,7 +35,7 @@
category = list("initial","Food")
/datum/design/black_pepper
- name = "10u black pepper"
+ name = "10u Black Pepper"
id = "black_pepper"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 25)
@@ -43,7 +43,7 @@
category = list("initial","Food")
/datum/design/pepper_mill
- name = "Pepper mill"
+ name = "Pepper Mill"
id = "pepper_mill"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 50)
@@ -52,7 +52,7 @@
category = list("initial","Food")
/datum/design/monkey_cube
- name = "Monkey cube"
+ name = "Monkey Cube"
id = "mcube"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 250)
@@ -60,7 +60,7 @@
category = list("initial", "Food")
/datum/design/ez_nut
- name = "E-Z-Nutrient"
+ name = "E-Z Nutrient"
id = "ez_nut"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 10)
@@ -108,7 +108,7 @@
category = list("initial", "Botany Chemicals")
/datum/design/cloth
- name = "Roll of cloth"
+ name = "Roll of Cloth"
id = "cloth"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 50)
@@ -124,7 +124,7 @@
category = list("initial","Leather and Cloth")
/datum/design/botany_gloves
- name = "Botanical gloves"
+ name = "Botanical Gloves"
id = "botany_gloves"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 150)
@@ -140,7 +140,7 @@
category = list("initial","Leather and Cloth")
/datum/design/secbelt
- name = "Security belt"
+ name = "Security Belt"
id = "secbelt"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 300)
@@ -148,7 +148,7 @@
category = list("initial","Leather and Cloth")
/datum/design/medbelt
- name = "Medical belt"
+ name = "Medical Belt"
id = "medbel"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 300)
@@ -156,7 +156,7 @@
category = list("initial","Leather and Cloth")
/datum/design/janibelt
- name = "Janitorial belt"
+ name = "Janitorial Belt"
id = "janibelt"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 300)
@@ -164,7 +164,7 @@
category = list("initial","Leather and Cloth")
/datum/design/bandolier
- name = "Bandolier belt"
+ name = "Bandolier Belt"
id = "bandolier"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 300)
@@ -172,7 +172,7 @@
category = list("initial","Leather and Cloth")
/datum/design/s_holster
- name = "Shoulder holster"
+ name = "Shoulder Holster"
id = "s_holster"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 400)
@@ -180,7 +180,7 @@
category = list("initial","Leather and Cloth")
/datum/design/leather_satchel
- name = "Leather satchel"
+ name = "Leather Satchel"
id = "leather_satchel"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 400)
@@ -188,7 +188,7 @@
category = list("initial","Leather and Cloth")
/datum/design/leather_jacket
- name = "Leather jacket"
+ name = "Leather Jacket"
id = "leather_jacket"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 500)
@@ -196,7 +196,7 @@
category = list("initial","Leather and Cloth")
/datum/design/leather_overcoat
- name = "Leather overcoat"
+ name = "Leather Overcoat"
id = "leather_overcoat"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 1000)
@@ -204,7 +204,7 @@
category = list("initial","Leather and Cloth")
/datum/design/rice_hat
- name = "Rice hat"
+ name = "Rice Hat"
id = "rice_hat"
build_type = BIOGENERATOR
materials = list(MAT_BIOMASS = 300)
diff --git a/code/modules/research/designs/computer_part_designs.dm b/code/modules/research/designs/computer_part_designs.dm
index cd75eada7a..dbdd15817c 100644
--- a/code/modules/research/designs/computer_part_designs.dm
+++ b/code/modules/research/designs/computer_part_designs.dm
@@ -3,7 +3,7 @@
////////////////////////////////////////
/datum/design/disk/normal
- name = "hard disk drive"
+ name = "Hard Disk Drive"
id = "hdd_basic"
req_tech = list("programming" = 1, "engineering" = 1)
build_type = PROTOLATHE
@@ -12,7 +12,7 @@
category = list("Computer Parts")
/datum/design/disk/advanced
- name = "advanced hard disk drive"
+ name = "Advanced Hard Disk Drive"
id = "hdd_advanced"
req_tech = list("programming" = 2, "engineering" = 2)
build_type = PROTOLATHE
@@ -21,7 +21,7 @@
category = list("Computer Parts")
/datum/design/disk/super
- name = "super hard disk drive"
+ name = "Super Hard Disk Drive"
id = "hdd_super"
req_tech = list("programming" = 3, "engineering" = 3)
build_type = PROTOLATHE
@@ -30,7 +30,7 @@
category = list("Computer Parts")
/datum/design/disk/cluster
- name = "cluster hard disk drive"
+ name = "Cluster Hard Disk Drive"
id = "hdd_cluster"
req_tech = list("programming" = 4, "engineering" = 4)
build_type = PROTOLATHE
@@ -39,7 +39,7 @@
category = list("Computer Parts")
/datum/design/disk/small
- name = "solid state drive"
+ name = "Solid State Drive"
id = "ssd_small"
req_tech = list("programming" = 2, "engineering" = 2)
build_type = PROTOLATHE
@@ -48,7 +48,7 @@
category = list("Computer Parts")
/datum/design/disk/micro
- name = "micro solid state drive"
+ name = "Micro Solid State Drive"
id = "ssd_micro"
req_tech = list("programming" = 1, "engineering" = 1)
build_type = PROTOLATHE
@@ -59,7 +59,7 @@
// Network cards
/datum/design/netcard/basic
- name = "network card"
+ name = "Network Card"
id = "netcard_basic"
req_tech = list("programming" = 2, "engineering" = 1)
build_type = IMPRINTER
@@ -69,7 +69,7 @@
category = list("Computer Parts")
/datum/design/netcard/advanced
- name = "advanced network card"
+ name = "Advanced Network Card"
id = "netcard_advanced"
req_tech = list("programming" = 4, "engineering" = 2)
build_type = IMPRINTER
@@ -79,7 +79,7 @@
category = list("Computer Parts")
/datum/design/netcard/wired
- name = "wired network card"
+ name = "Wired Network Card"
id = "netcard_wired"
req_tech = list("programming" = 5, "engineering" = 3)
build_type = IMPRINTER
@@ -91,7 +91,7 @@
// Data disks
/datum/design/portabledrive/basic
- name = "data disk"
+ name = "Data Disk"
id = "portadrive_basic"
req_tech = list("programming" = 1)
build_type = IMPRINTER
@@ -101,7 +101,7 @@
category = list("Computer Parts")
/datum/design/portabledrive/advanced
- name = "advanced data disk"
+ name = "Advanced Data Disk"
id = "portadrive_advanced"
req_tech = list("programming" = 2)
build_type = IMPRINTER
@@ -111,7 +111,7 @@
category = list("Computer Parts")
/datum/design/portabledrive/super
- name = "super data disk"
+ name = "Super Data Disk"
id = "portadrive_super"
req_tech = list("programming" = 4)
build_type = IMPRINTER
@@ -123,7 +123,7 @@
// Card slot
/datum/design/cardslot
- name = "ID card slot"
+ name = "ID Card Slot"
id = "cardslot"
req_tech = list("programming" = 2)
build_type = PROTOLATHE
@@ -133,7 +133,7 @@
// Intellicard slot
/datum/design/aislot
- name = "Intellicard slot"
+ name = "Intellicard Slot"
id = "aislot"
req_tech = list("programming" = 2)
build_type = PROTOLATHE
@@ -143,7 +143,7 @@
// Mini printer
/datum/design/miniprinter
- name = "miniprinter"
+ name = "Miniprinter"
id = "miniprinter"
req_tech = list("programming" = 2, "engineering" = 2)
build_type = PROTOLATHE
@@ -154,7 +154,7 @@
// APC Link
/datum/design/APClink
- name = "area power connector"
+ name = "Area Power Connector"
id = "APClink"
req_tech = list("programming" = 2, "powerstorage" = 3, "engineering" = 2)
build_type = PROTOLATHE
@@ -165,7 +165,7 @@
// Batteries
/datum/design/battery/controller
- name = "power cell controller"
+ name = "Power Cell Controller"
id = "bat_control"
req_tech = list("powerstorage" = 1, "engineering" = 1)
build_type = PROTOLATHE
@@ -174,7 +174,7 @@
category = list("Computer Parts")
/datum/design/battery/normal
- name = "battery module"
+ name = "Battery Module"
id = "bat_normal"
req_tech = list("powerstorage" = 1, "engineering" = 1)
build_type = PROTOLATHE
@@ -183,7 +183,7 @@
category = list("Computer Parts")
/datum/design/battery/advanced
- name = "advanced battery module"
+ name = "Advanced Battery Module"
id = "bat_advanced"
req_tech = list("powerstorage" = 2, "engineering" = 2)
build_type = PROTOLATHE
@@ -192,7 +192,7 @@
category = list("Computer Parts")
/datum/design/battery/super
- name = "super battery module"
+ name = "Super Battery Module"
id = "bat_super"
req_tech = list("powerstorage" = 3, "engineering" = 3)
build_type = PROTOLATHE
@@ -201,7 +201,7 @@
category = list("Computer Parts")
/datum/design/battery/nano
- name = "nano battery module"
+ name = "Nano Battery Module"
id = "bat_nano"
req_tech = list("powerstorage" = 1, "engineering" = 1)
build_type = PROTOLATHE
@@ -210,7 +210,7 @@
category = list("Computer Parts")
/datum/design/battery/micro
- name = "micro battery module"
+ name = "Micro Battery Module"
id = "bat_micro"
req_tech = list("powerstorage" = 2, "engineering" = 2)
build_type = PROTOLATHE
@@ -221,7 +221,7 @@
// Processor unit
/datum/design/cpu
- name = "processor board"
+ name = "Processor Board"
id = "cpu_normal"
req_tech = list("programming" = 3, "engineering" = 2)
build_type = IMPRINTER
@@ -231,7 +231,7 @@
category = list("Computer Parts")
/datum/design/cpu/small
- name = "microprocessor"
+ name = "Microprocessor"
id = "cpu_small"
req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
@@ -241,7 +241,7 @@
category = list("Computer Parts")
/datum/design/cpu/photonic
- name = "photonic processor board"
+ name = "Photonic Processor Board"
id = "pcpu_normal"
req_tech = list("programming" = 5, "engineering" = 4)
build_type = IMPRINTER
@@ -251,7 +251,7 @@
category = list("Computer Parts")
/datum/design/cpu/photonic/small
- name = "photonic microprocessor"
+ name = "Photonic Microprocessor"
id = "pcpu_small"
req_tech = list("programming" = 4, "engineering" = 3)
build_type = IMPRINTER
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 002112b717..f72458af4e 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -96,7 +96,7 @@
category = list("Medical Designs")
/datum/design/bluespacebodybag
- name = "Bluespace body bag"
+ name = "Bluespace Body Bag"
desc = "A bluespace body bag, powered by experimental bluespace technology. It can hold loads of bodies and the largest of creatures."
id = "bluespacebodybag"
req_tech = list("bluespace" = 5, "materials" = 4, "plasmatech" = 4)
@@ -106,7 +106,7 @@
category = list("Medical Designs")
/datum/design/plasmarefiller
- name = "Plasma-man jumpsuit refill"
+ name = "Plasma-Man Jumpsuit Refill"
desc = "A refill pack for the auto-extinguisher on Plasma-man suits."
id = "plasmarefiller"
req_tech = list("materials" = 2, "plasmatech" = 3) //Why did this have no plasmatech
@@ -191,7 +191,7 @@
category = list("Misc", "Medical Designs")
/datum/design/cyberimp_breather
- name = "Breathing Tube implant"
+ name = "Breathing Tube Implant"
desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked."
id = "ci-breather"
req_tech = list("materials" = 2, "biotech" = 3)
@@ -202,7 +202,7 @@
category = list("Misc", "Medical Designs")
/datum/design/cyberimp_toolset
- name = "Toolset Arm implant"
+ name = "Toolset Arm Implant"
desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm."
id = "ci-toolset"
req_tech = list("materials" = 3, "engineering" = 4, "biotech" = 4, "powerstorage" = 4)
@@ -213,7 +213,7 @@
category = list("Misc", "Medical Designs")
/datum/design/cyberimp_medical_hud
- name = "Medical HUD implant"
+ name = "Medical HUD Implant"
desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control."
id = "ci-medhud"
req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4)
@@ -224,7 +224,7 @@
category = list("Misc", "Medical Designs")
/datum/design/cyberimp_security_hud
- name = "Security HUD implant"
+ name = "Security HUD Implant"
desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control."
id = "ci-sechud"
req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4, "combat" = 3)
@@ -235,7 +235,7 @@
category = list("Misc", "Medical Designs")
/datum/design/cyberimp_xray
- name = "X-Ray eyes"
+ name = "X-Ray Eyes"
desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile."
id = "ci-xray"
req_tech = list("materials" = 7, "programming" = 5, "biotech" = 7, "magnets" = 5,"plasmatech" = 6)
@@ -246,7 +246,7 @@
category = list("Misc", "Medical Designs")
/datum/design/cyberimp_thermals
- name = "Thermal eyes"
+ name = "Thermal Eyes"
desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included."
id = "ci-thermals"
req_tech = list("materials" = 6, "programming" = 4, "biotech" = 7, "magnets" = 5,"plasmatech" = 4)
@@ -257,7 +257,7 @@
category = list("Misc", "Medical Designs")
/datum/design/cyberimp_antidrop
- name = "Anti-Drop implant"
+ name = "Anti-Drop Implant"
desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle."
id = "ci-antidrop"
req_tech = list("materials" = 5, "programming" = 6, "biotech" = 5)
@@ -268,7 +268,7 @@
category = list("Misc", "Medical Designs")
/datum/design/cyberimp_antistun
- name = "CNS Rebooter implant"
+ name = "CNS Rebooter Implant"
desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned."
id = "ci-antistun"
req_tech = list("materials" = 6, "programming" = 5, "biotech" = 6)
@@ -279,7 +279,7 @@
category = list("Misc", "Medical Designs")
/datum/design/cyberimp_nutriment
- name = "Nutriment pump implant"
+ name = "Nutriment Pump Implant"
desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
id = "ci-nutriment"
req_tech = list("materials" = 3, "powerstorage" = 4, "biotech" = 3)
@@ -290,7 +290,7 @@
category = list("Misc", "Medical Designs")
/datum/design/cyberimp_nutriment_plus
- name = "Nutriment pump implant PLUS"
+ name = "Nutriment Pump Implant PLUS"
desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are hungry."
id = "ci-nutrimentplus"
req_tech = list("materials" = 5, "powerstorage" = 4, "biotech" = 4)
@@ -301,7 +301,7 @@
category = list("Misc", "Medical Designs")
/datum/design/cyberimp_reviver
- name = "Reviver implant"
+ name = "Reviver Implant"
desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!"
id = "ci-reviver"
req_tech = list("materials" = 5, "programming" = 4, "biotech" = 5)
@@ -312,7 +312,7 @@
category = list("Misc", "Medical Designs")
/datum/design/cyberimp_thrusters
- name = "Thrusters set implant"
+ name = "Thrusters Set Implant"
desc = "This implant will allow you to use gas from environment or your internals for propulsion in zero-gravity areas."
id = "ci-thrusters"
req_tech = list("materials" = 5, "biotech" = 5, "magnets" = 4, "engineering" = 7)
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 80863259e8..15704651f6 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -3,7 +3,7 @@
/////////////////////////////////////////
/datum/design/pin_testing
- name = "test-range firing pin"
+ name = "Test-Range Firing Pin"
desc = "This safety firing pin allows firearms to be operated within proximity to a firing range."
id = "pin_testing"
req_tech = list("combat" = 2, "materials" = 2)
@@ -13,7 +13,7 @@
category = list("Firing Pins")
/datum/design/pin_mindshield
- name = "mindshield firing pin"
+ name = "Mindshield Firing Pin"
desc = "This is a security firing pin which only authorizes users who are mindshield-implanted."
id = "pin_loyalty"
req_tech = list("combat" = 5, "materials" = 6)
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index b34986c75f..b28d388b29 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -11,7 +11,7 @@
lootcount = 1
loot = list(/obj/item/seeds/gatfruit = 10,
- /obj/item/seeds/cherry = 15,
+ /obj/item/seeds/cherry/bomb = 10,
/obj/item/seeds/berry/glow = 10,
/obj/item/seeds/sunflower/moonflower = 8
)
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index b9d284b280..6344689f0b 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -104,12 +104,8 @@
authorized += ID
- message_admins("[key_name_admin(user.client)] \
- (?) \
- (FLW) \
- has authorized early shuttle launch", 0, 1)
- log_game("[key_name(user)] has authorized early shuttle launch in \
- ([x],[y],[z])")
+ message_admins("[ADMIN_LOOKUPFLW(user)] has authorized early shuttle launch", 0, 1)
+ log_game("[key_name(user)] has authorized early shuttle launch in [COORD(src)]")
// Now check if we're on our way
. = TRUE
process()
diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm
index 2e04fdd9af..b846098fc4 100644
--- a/code/modules/shuttle/ferry.dm
+++ b/code/modules/shuttle/ferry.dm
@@ -30,4 +30,4 @@
return
last_request = world.time
to_chat(usr, "Your request has been recieved by Centcom.")
- to_chat(GLOB.admins, "FERRY: [key_name_admin(usr)] (?) (FLW) (Move Ferry) is requesting to move the transport ferry to Centcom.")
+ to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to Centcom.")
diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm
index ef40210fd1..597f3185a4 100644
--- a/code/modules/spells/spell_types/aimed.dm
+++ b/code/modules/spells/spell_types/aimed.dm
@@ -36,7 +36,7 @@
/obj/effect/proc_holder/spell/aimed/InterceptClickOn(mob/living/caller, params, atom/target)
if(..())
return FALSE
- var/ignore = (current_amount <= 0)
+ var/ignore = (current_amount >= 1)
if(!cast_check(ignore, ranged_ability_user))
remove_ranged_ability()
return FALSE
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 60edac1977..585f452de4 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -262,6 +262,8 @@
if(held_index > C.hand_bodyparts.len)
C.hand_bodyparts.len = held_index
C.hand_bodyparts[held_index] = src
+ if(C.dna.species.mutanthands && !is_pseudopart)
+ C.put_in_hand(new C.dna.species.mutanthands(), held_index)
if(C.hud_used)
var/obj/screen/inventory/hand/hand = C.hud_used.hand_slots["[held_index]"]
if(hand)
@@ -277,6 +279,9 @@
qdel(S)
break
+ for(var/obj/item/organ/O in contents)
+ O.Insert(C)
+
update_bodypart_damage_state()
C.updatehealth()
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index 2cb2dd5dc6..83b70d33d9 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -64,6 +64,9 @@
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
sight_flags = SEE_MOBS
+/obj/item/organ/eyes/night_vision/zombie
+ name = "undead eyes"
+ desc = "Somewhat counterintuitively, these half rotten eyes actually have superior vision to those of a living human."
///Robotic
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index 53520679c2..4be7b84a6c 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -72,9 +72,9 @@
user.visible_message("[user] successfully replaces [target]'s [parse_zone(target_zone)]!", "You succeed in replacing [target]'s [parse_zone(target_zone)].")
return 1
else
- target.regenerate_limb(target_zone)
- var/obj/item/bodypart/L = target.get_bodypart(target_zone)
+ var/obj/item/bodypart/L = target.newBodyPart(target_zone, FALSE, FALSE)
L.is_pseudopart = TRUE
+ L.attach_limb(target)
user.visible_message("[user] finishes attaching [tool]!", "You attach [tool].")
qdel(tool)
if(istype(tool, /obj/item/weapon/twohanded/required/chainsaw))
diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm
index 09334b24c8..98aa41e88f 100644
--- a/code/modules/uplink/uplink_item.dm
+++ b/code/modules/uplink/uplink_item.dm
@@ -44,7 +44,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
for(var/i in 1 to 3)
var/datum/uplink_item/I = pick_n_take(sale_items)
var/datum/uplink_item/A = new I.type
- var/discount = pick(4;0.75,2;0.5,1;0.25)
+ var/discount = A.get_discount()
var/list/disclaimer = list("Void where prohibited.", "Not recommended for children.", "Contains small parts.", "Check local laws for legality in region.", "Do not taunt.", "Not responsible for direct, indirect, incidental or consequential damages resulting from any defect, error or failure to perform.", "Keep away from fire or flames.", "Product is provided \"as is\" without any implied or expressed warranties.", "As seen on TV.", "For recreational use only.", "Use only as directed.", "16% sales tax will be charged for orders originating within Space Nebraska.")
A.limited_stock = 1
I.refundable = FALSE //THIS MAN USES ONE WEIRD TRICK TO GAIN FREE TC, CODERS HATES HIM!
@@ -86,6 +86,9 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
var/player_minimum //The minimum crew size needed for this item to be added to uplinks.
var/purchase_log_vis = TRUE // Visible in the purchase log?
+/datum/uplink_item/proc/get_discount()
+ return pick(4;0.75,2;0.5,1;0.25)
+
/datum/uplink_item/proc/spawn_item(turf/loc, obj/item/device/uplink/U)
if(item)
SSblackbox.add_details("traitor_uplink_items_bought", "[name]|[cost]")
@@ -276,12 +279,21 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
/datum/uplink_item/dangerous/sword
name = "Energy Sword"
desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be \
- pocketed when inactive. Activating it produces a loud, distinctive noise. One can combine two \
- energy swords to create a double energy sword, which must be wielded in two hands but is more robust \
- and deflects all energy projectiles."
+ pocketed when inactive. Activating it produces a loud, distinctive noise."
item = /obj/item/weapon/melee/energy/sword/saber
cost = 8
+/datum/uplink_item/dangerous/doublesword
+ name = "Double-Bladed Energy Sword"
+ desc = "The double-bladed energy sword does slightly more damage than a standard energy sword and will deflect \
+ all energy projectiles, but requires two hands to wield."
+ item = /obj/item/weapon/twohanded/dualsaber
+ player_minimum = 25
+ cost = 16
+
+/datum/uplink_item/dangerous/doublesword/get_discount()
+ return pick(4;0.8,2;0.65,1;0.5)
+
/datum/uplink_item/dangerous/powerfist
name = "Power Fist"
desc = "The power-fist is a metal gauntlet with a built-in piston-ram powered by an external gas supply.\
diff --git a/code/modules/uplink/uplink_item_cit.dm b/code/modules/uplink/uplink_item_cit.dm
index c74ad3ba9c..b835a21a8c 100644
--- a/code/modules/uplink/uplink_item_cit.dm
+++ b/code/modules/uplink/uplink_item_cit.dm
@@ -7,4 +7,15 @@
refundable = TRUE
cost = 10
surplus = 20 //Let's not have this be too common
+ exclude_modes = list(/datum/game_mode/nuclear)
+
+/datum/uplink_item/stealthy_tools/holoparasite
+ name="Holoparasite Injector"
+ desc="It contains an alien nanoswarm of unknown origin.\
+ Though capable of near sorcerous feats via use of hardlight holograms and nanomachines.\
+ It requires an organic host as a home base and source of fuel." //This is the description of the actual injector. Feel free to change this for uplink purposes//
+ item = /obj/item/weapon/storage/box/syndie_kit/holoparasite
+ refundable = TRUE
+ cost = 10 //I'm working off the borer. Price subject to change
+ surplus = 20 //Nobody needs a ton of parasites
exclude_modes = list(/datum/game_mode/nuclear)
\ No newline at end of file
diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm
index 1bdbd3fa45..1b93a4f685 100644
--- a/code/modules/zombie/items.dm
+++ b/code/modules/zombie/items.dm
@@ -46,7 +46,8 @@
var/obj/item/organ/zombie_infection/infection
infection = target.getorganslot("zombie_infection")
if(!infection)
- infection = new(target)
+ infection = new()
+ infection.Insert(target)
/obj/item/zombie_hand/proc/check_feast(mob/living/target, mob/living/user)
if(target.stat == DEAD)
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
index f254ef6337..3515da0dc6 100644
--- a/code/modules/zombie/organs.dm
+++ b/code/modules/zombie/organs.dm
@@ -5,7 +5,7 @@
slot = "zombie_infection"
icon_state = "blacktumor"
origin_tech = "biotech=5"
- var/datum/species/old_species
+ var/datum/species/old_species = /datum/species/human
var/living_transformation_time = 3
var/converts_living = FALSE
@@ -63,6 +63,7 @@
if(!iszombie(owner))
old_species = owner.dna.species.type
+ owner.set_species(/datum/species/zombie/infectious)
if(!converts_living && owner.stat != DEAD)
return
@@ -70,7 +71,6 @@
var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS)
owner.grab_ghost()
- owner.set_species(/datum/species/zombie/infectious)
owner.revive(full_heal = TRUE)
owner.visible_message("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!", "You HUNGER!")
playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1)
diff --git a/code/world.dm b/code/world.dm
index 29c40a5742..4489b9a1cb 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -25,37 +25,50 @@
else
external_rsc_urls.Cut(i,i+1)
#endif
- //logs
- var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day")
- GLOB.href_logfile = file("data/logs/[date_string] hrefs.htm")
- GLOB.diary = file("data/logs/[date_string].log")
- GLOB.diaryofmeanpeople = file("data/logs/[date_string] Attack.log")
- GLOB.diary << "\n\nStarting up. [time_stamp()]\n---------------------"
- GLOB.diaryofmeanpeople << "\n\nStarting up. [time_stamp()]\n---------------------"
- GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently
-
+ GLOB.config_error_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl
make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
config = new
+ GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-"
+ if(config.sql_enabled)
+ if(SSdbcore.Connect())
+ log_world("Database connection established.")
+ var/datum/DBQuery/query_feedback_create_round = SSdbcore.NewQuery("INSERT INTO [format_table_name("feedback")] SELECT null, Now(), MAX(round_id)+1, \"server_ip\", 0, \"[world.internet_address]:[world.port]\" FROM [format_table_name("feedback")]")
+ query_feedback_create_round.Execute()
+ var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) FROM [format_table_name("feedback")]")
+ query_feedback_max_id.Execute()
+ if(query_feedback_max_id.NextRow())
+ GLOB.round_id = query_feedback_max_id.item[1]
+ GLOB.log_directory += "[GLOB.round_id]"
+ else
+ log_world("Your server failed to establish a connection with the database.")
+ if(!GLOB.round_id)
+ GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]"
+ GLOB.world_game_log = file("[GLOB.log_directory]/game.log")
+ GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log")
+ GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log")
+ GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html")
+ GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
+ GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
+ GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
+ GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently
+ if(fexists(GLOB.config_error_log))
+ fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log")
+ fdel(GLOB.config_error_log)
+
+
GLOB.revdata.DownloadPRDetails()
load_mode()
load_motd()
load_admins()
+ load_menu()
//disabled to prevent runtimes until it's fixed
// load_mentors()
if(config.usewhitelist)
load_whitelist()
LoadBans()
- investigate_reset()
GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
- if(config.sql_enabled)
- if(!SSdbcore.Connect())
- log_world("Your server failed to establish a connection with the database.")
- else
- log_world("Database connection established.")
-
-
GLOB.data_core = new /datum/datacore()
Master.Initialize(10, FALSE)
@@ -63,7 +76,7 @@
#define IRC_STATUS_THROTTLE 50
/world/Topic(T, addr, master, key)
if(config && config.log_world_topic)
- GLOB.diary << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]"
+ GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]"
var/list/input = params2list(T)
var/key_valid = (global.comms_allowed && input["key"] == global.comms_key)
@@ -271,7 +284,7 @@
if(Lines.len)
if(Lines[1])
GLOB.master_mode = Lines[1]
- GLOB.diary << "Saved mode is '[GLOB.master_mode]'"
+ GLOB.world_game_log << "Saved mode is '[GLOB.master_mode]'"
/world/proc/save_mode(the_mode)
var/F = file("data/mode.txt")
@@ -332,5 +345,6 @@
status = s
+
/world/proc/has_round_started()
- return SSticker.HasRoundStarted()
\ No newline at end of file
+ return SSticker.HasRoundStarted()
diff --git a/config/config.txt b/config/config.txt
index 524802219d..68df4c81cf 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -80,9 +80,6 @@ LOG_PRAYER
## log lawchanges
LOG_LAW
-## log all Topic() calls (for use by coders in tracking down Topic issues)
-# LOG_HREFS
-
## log all world.Topic() calls
# LOG_WORLD_TOPIC
@@ -263,6 +260,10 @@ EXTREME_POPCAP_MESSAGE The server is currently serving a high number of users, f
## Requres database
NOTIFY_NEW_PLAYER_AGE 0
+## Notify admins when a player connects if their byond account was created in the last X days
+## Requires database
+NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1
+
## Notify the irc channel when a new player makes their first connection
## Requres database
#IRC_FIRST_CONNECTION_ALERT
@@ -281,9 +282,6 @@ PANIC_SERVER_NAME [Put the name here]
## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog
#AGGRESSIVE_CHANGELOG
-## Uncomment to have the game log runtimes to the log folder. (Note: this disables normal output in dd/ds, so it should be left off for testing.
-#LOG_RUNTIMES
-
## Comment this out if you've used the mass conversion sql proc for notes or want to stop converting notes
AUTOCONVERT_NOTES
diff --git a/html/changelogs/AutoChangeLog-pr-642.yml b/html/changelogs/AutoChangeLog-pr-642.yml
new file mode 100644
index 0000000000..0d442e470d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-642.yml
@@ -0,0 +1,5 @@
+author: "Cobby"
+delete-after: True
+changes:
+ - tweak: "The GPS set tag has gone from a limit of 5 characters to 20."
+ - rscadd: "The GPS can now be personalized in both name and description using a pen."
diff --git a/html/changelogs/AutoChangeLog-pr-697.yml b/html/changelogs/AutoChangeLog-pr-697.yml
new file mode 100644
index 0000000000..3967efa494
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-697.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - rscadd: "Clockcult component generation will automatically focus on components needed to activate the Ark if it exists."
diff --git a/html/changelogs/AutoChangeLog-pr-722.yml b/html/changelogs/AutoChangeLog-pr-722.yml
new file mode 100644
index 0000000000..6ade3cd92d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-722.yml
@@ -0,0 +1,6 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Investigate logs are now persistent."
+ - tweak: "Game logs are now stored per-round; use .getserverlog to access previous rounds."
+ - rscdel: ".giveruntimelog and .getruntimelog removed."
diff --git a/html/changelogs/AutoChangeLog-pr-739.yml b/html/changelogs/AutoChangeLog-pr-739.yml
new file mode 100644
index 0000000000..7e7a8cd3a5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-739.yml
@@ -0,0 +1,6 @@
+author: "Joan"
+delete-after: True
+changes:
+ - rscadd: "Mania Motors now do minor toxin damage over time and will convert those affected if the toxin damage is high enough.
+balance: The effects of a Mania Motor continue to apply to targets after they leave its range, though they will fall off extremely quickly."
+ - rscdel: "Mania Motors no longer cause brain damage."
diff --git a/html/changelogs/AutoChangeLog-pr-832.yml b/html/changelogs/AutoChangeLog-pr-832.yml
new file mode 100644
index 0000000000..bf686c0cef
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-832.yml
@@ -0,0 +1,7 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Moved to a new system to make top menu items easier to edit."
+ - tweak: "Moved icon size stuff to a sub menu"
+ - rscadd: "Added option to change icon scaling mode."
+ - bugfix: "Byond added fancy shader supported scaling(Point Sampling), this sucks because it's blurry, the default for /tg/station has changed back to the old nearest neighbor scaling."
diff --git a/html/changelogs/AutoChangeLog-pr-848.yml b/html/changelogs/AutoChangeLog-pr-848.yml
new file mode 100644
index 0000000000..0c1695adbc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-848.yml
@@ -0,0 +1,4 @@
+author: "ninjanomnom"
+delete-after: True
+changes:
+ - tweak: "Highlander no longer breaks your speakers"
diff --git a/html/changelogs/AutoChangeLog-pr-854.yml b/html/changelogs/AutoChangeLog-pr-854.yml
new file mode 100644
index 0000000000..c253fbdedd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-854.yml
@@ -0,0 +1,4 @@
+author: "Penguaro"
+delete-after: True
+changes:
+ - rscadd: "The Slime Scanner is available from the Autolathe."
diff --git a/html/changelogs/AutoChangeLog-pr-860.yml b/html/changelogs/AutoChangeLog-pr-860.yml
new file mode 100644
index 0000000000..5fbaa4435a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-860.yml
@@ -0,0 +1,4 @@
+author: "Penguaro"
+delete-after: True
+changes:
+ - tweak: "The Design Names in the various machines are now capitalized consistently"
diff --git a/html/changelogs/AutoChangeLog-pr-877.yml b/html/changelogs/AutoChangeLog-pr-877.yml
new file mode 100644
index 0000000000..436a3b32d0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-877.yml
@@ -0,0 +1,4 @@
+author: "coiax"
+delete-after: True
+changes:
+ - rscadd: "Visible ghosts emit light."
diff --git a/html/changelogs/AutoChangeLog-pr-880.yml b/html/changelogs/AutoChangeLog-pr-880.yml
new file mode 100644
index 0000000000..1b4ddc17a6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-880.yml
@@ -0,0 +1,4 @@
+author: "Penguaro"
+delete-after: True
+changes:
+ - bugfix: "The Central Command Ferry will now dock at one of the ports in Arrivals"
diff --git a/html/changelogs/AutoChangeLog-pr-882.yml b/html/changelogs/AutoChangeLog-pr-882.yml
new file mode 100644
index 0000000000..74b564cb7d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-882.yml
@@ -0,0 +1,6 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Curator's fedora has a pocket, like all the other fedoras."
+ - tweak: "Treasure hunter suits can now hold large internal tanks, to ease the exploration of lavaland."
+ - tweak: "The curator can now access the Auxillary Base and open doors on the mining station."
diff --git a/html/changelogs/AutoChangeLog-pr-883.yml b/html/changelogs/AutoChangeLog-pr-883.yml
new file mode 100644
index 0000000000..40d333fc28
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-883.yml
@@ -0,0 +1,4 @@
+author: "Penguaro"
+delete-after: True
+changes:
+ - tweak: "[Meta] The Slime Control Console boundaries have been adjusted around the Kill Room"
diff --git a/html/changelogs/AutoChangeLog-pr-884.yml b/html/changelogs/AutoChangeLog-pr-884.yml
new file mode 100644
index 0000000000..e2ec253dac
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-884.yml
@@ -0,0 +1,5 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - tweak: "Lighting now defaults to fully bright until the first update tick for that tile. This makes shuttle movements less immersion breaking."
+ - experiment: "Rather than remove the light source from the system and then re-adding it on light movements, the system now calculates and applies the difference to each tile. This should speed up lighting updates."
diff --git a/html/changelogs/AutoChangeLog-pr-885.yml b/html/changelogs/AutoChangeLog-pr-885.yml
new file mode 100644
index 0000000000..d92eda0b51
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-885.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "Fixes t-ray mode on engineering goggles not resetting the lighting override properly."
diff --git a/html/changelogs/AutoChangeLog-pr-886.yml b/html/changelogs/AutoChangeLog-pr-886.yml
new file mode 100644
index 0000000000..e87f6c5843
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-886.yml
@@ -0,0 +1,4 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - tweak: "Machine names will be capitalized when they talk on radio"
diff --git a/html/changelogs/AutoChangeLog-pr-890.yml b/html/changelogs/AutoChangeLog-pr-890.yml
new file mode 100644
index 0000000000..c54b5312a5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-890.yml
@@ -0,0 +1,5 @@
+author: "Kor"
+delete-after: True
+changes:
+ - rscadd: "a new mysterious book has been discovered in lavaland chests!"
+ - tweak: "weird purple hearts found in lavaland chests have started beating again! what could this mean?"
diff --git a/html/changelogs/AutoChangeLog-pr-891.yml b/html/changelogs/AutoChangeLog-pr-891.yml
new file mode 100644
index 0000000000..c623a1953f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-891.yml
@@ -0,0 +1,5 @@
+author: "Joan"
+delete-after: True
+changes:
+ - rscadd: "You can now buy double eswords from the uplink for 16 telecrystals. They cannot be bought below 25 players."
+ - rscdel: "You can no longer use two eswords to construct a double esword."
diff --git a/html/changelogs/AutoChangeLog-pr-895.yml b/html/changelogs/AutoChangeLog-pr-895.yml
new file mode 100644
index 0000000000..a1aafb74af
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-895.yml
@@ -0,0 +1,4 @@
+author: "Robustin"
+delete-after: True
+changes:
+ - tweak: "Dominators now require a significant amount of open (non-walled) space around them in order to operate."
diff --git a/html/changelogs/AutoChangeLog-pr-896.yml b/html/changelogs/AutoChangeLog-pr-896.yml
new file mode 100644
index 0000000000..f781a678ce
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-896.yml
@@ -0,0 +1,4 @@
+author: "TehZombehz"
+delete-after: True
+changes:
+ - rscadd: "Sticks of butter and liquid mayonnaise can now be produced via a new 'mix' function on the grinder. Please eat responsibly."
diff --git a/html/changelogs/AutoChangeLog-pr-897.yml b/html/changelogs/AutoChangeLog-pr-897.yml
new file mode 100644
index 0000000000..d1df7340c6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-897.yml
@@ -0,0 +1,4 @@
+author: "ma44"
+delete-after: True
+changes:
+ - tweak: "Doubles the amount of points wooden planks sell for (now 50 points)"
diff --git a/html/changelogs/AutoChangeLog-pr-898.yml b/html/changelogs/AutoChangeLog-pr-898.yml
new file mode 100644
index 0000000000..f744b5fe7b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-898.yml
@@ -0,0 +1,4 @@
+author: "Jay / Cecily"
+delete-after: True
+changes:
+ - rscadd: "added a hunter hat to the game. Purely cosmetic, can be found in clothesmate. Icon by Cecily Catherine."
diff --git a/html/changelogs/AutoChangeLog-pr-900.yml b/html/changelogs/AutoChangeLog-pr-900.yml
new file mode 100644
index 0000000000..e29ab96af8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-900.yml
@@ -0,0 +1,4 @@
+author: "bandit"
+delete-after: True
+changes:
+ - tweak: "Nanotrasen has enhanced personality matchmaking for its personal AIs. pAI candidates will now see who is requesting a pAI personality."
diff --git a/html/changelogs/AutoChangeLog-pr-913.yml b/html/changelogs/AutoChangeLog-pr-913.yml
new file mode 100644
index 0000000000..dd72fe0130
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-913.yml
@@ -0,0 +1,4 @@
+author: "Cebutris"
+delete-after: True
+changes:
+ - rscadd: "The Syndicate has found an abandoned storage facility filled with hundreds of holoparasite injectors. While they aren't giving them to their operatives, sleeper operatives can buy them with their uplinks! Get your holographic murder machine buddy today!"
diff --git a/html/changelogs/AutoChangeLog-pr-927.yml b/html/changelogs/AutoChangeLog-pr-927.yml
new file mode 100644
index 0000000000..bf908dd5b4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-927.yml
@@ -0,0 +1,4 @@
+author: "optional name here"
+delete-after: True
+changes:
+ - rscadd: "Zombies can now see in the dark. If you steal their eyes you'll be able to see in the dark as well!"
diff --git a/html/changelogs/AutoChangeLog-pr-931.yml b/html/changelogs/AutoChangeLog-pr-931.yml
new file mode 100644
index 0000000000..288b87f529
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-931.yml
@@ -0,0 +1,5 @@
+author: "Kingofcarrotflowerspt1"
+delete-after: True
+changes:
+ - rscadd: "Adds Dakimakuras, more colloquially known as \"anime girl body pillows\""
+ - rscadd: "They take up a hand slot and can hold a few items. Many different girls to choose from!"
diff --git a/html/changelogs/AutoChangeLog-pr-937.yml b/html/changelogs/AutoChangeLog-pr-937.yml
new file mode 100644
index 0000000000..239db4ced6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-937.yml
@@ -0,0 +1,5 @@
+author: "Tacolizard Forever: It's hip to fuck bees"
+delete-after: True
+changes:
+ - rscadd: "Added a honey jar item. It's not implemented yet.
+balance: Honey is now more robust at healing, but don't eat too much or you'll turn into a fatty landwhale."
diff --git a/html/changelogs/AutoChangeLog-pr-938.yml b/html/changelogs/AutoChangeLog-pr-938.yml
new file mode 100644
index 0000000000..b01da1649c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-938.yml
@@ -0,0 +1,4 @@
+author: "TehZombehz"
+delete-after: True
+changes:
+ - rscadd: "Butter noodles, butter biscuits, buttered toast, and pigs in a blanket can now be crafted using sticks of butter and other ingredients."
diff --git a/html/changelogs/AutoChangeLog-pr-940.yml b/html/changelogs/AutoChangeLog-pr-940.yml
new file mode 100644
index 0000000000..eb86ebd439
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-940.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Hermit ruin now includes a portable seed extractor."
diff --git a/html/changelogs/AutoChangeLog-pr-944.yml b/html/changelogs/AutoChangeLog-pr-944.yml
new file mode 100644
index 0000000000..8215cf0463
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-944.yml
@@ -0,0 +1,4 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - bugfix: "Pizza boxes once again look different when open"
diff --git a/html/changelogs/AutoChangeLog-pr-954.yml b/html/changelogs/AutoChangeLog-pr-954.yml
new file mode 100644
index 0000000000..1c3a6cc9f8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-954.yml
@@ -0,0 +1,5 @@
+author: "coiax"
+delete-after: True
+changes:
+ - rscadd: "Free Golems can purchase Royal Capes of the Liberator at their
+mining equipment vendor."
diff --git a/html/changelogs/AutoChangeLog-pr-958.yml b/html/changelogs/AutoChangeLog-pr-958.yml
new file mode 100644
index 0000000000..c0825f367f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-958.yml
@@ -0,0 +1,5 @@
+author: "coiax"
+delete-after: True
+changes:
+ - rscadd: "Goats on the station have developed a taste for glowshrooms, and
+will eat them if they encounter any."
diff --git a/html/changelogs/AutoChangeLog-pr-962.yml b/html/changelogs/AutoChangeLog-pr-962.yml
new file mode 100644
index 0000000000..a5c9db8081
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-962.yml
@@ -0,0 +1,6 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Ambrosia Deus can now mutate into Gaia, and Gaia into Deus."
+ - rscdel: "A single branch of Ambrosia Gaia will not immediately make a hydroponics tray self-sufficient.
+balance: A (total) dose of 20u Earthsblood (from Gaia) will make a hydroponics tray self-sufficient."
diff --git a/html/changelogs/AutoChangeLog-pr-963.yml b/html/changelogs/AutoChangeLog-pr-963.yml
new file mode 100644
index 0000000000..bff7ed64f6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-963.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - tweak: "Glowshrooms now have a less saturated glow."
diff --git a/html/changelogs/AutoChangeLog-pr-964.yml b/html/changelogs/AutoChangeLog-pr-964.yml
new file mode 100644
index 0000000000..2aee77b88f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-964.yml
@@ -0,0 +1,10 @@
+author: "coiax"
+delete-after: True
+changes:
+ - bugfix: "Curator soapstones now successfully leave messages for future
+shifts."
+ - rscdel: "Soapstones can no longer be purchased in cargo."
+ - rscdel: "The janitor no longer starts with an empty soapstone."
+ - experiment: "Engraved messages can be left anywhere in the world, but be
+wary that the terrain of places like lavaland and space can change shift
+to shift."
diff --git a/html/changelogs/AutoChangeLog-pr-969.yml b/html/changelogs/AutoChangeLog-pr-969.yml
new file mode 100644
index 0000000000..945463a4b1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-969.yml
@@ -0,0 +1,4 @@
+author: "McBawbaggings"
+delete-after: True
+changes:
+ - tweak: "SMES units will now accept charge from the power network even if the available load is less than the input rate. Credit to Zaers for the original code."
diff --git a/html/changelogs/AutoChangeLog-pr-973.yml b/html/changelogs/AutoChangeLog-pr-973.yml
new file mode 100644
index 0000000000..b4b175ce05
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-973.yml
@@ -0,0 +1,6 @@
+author: "ma44"
+delete-after: True
+changes:
+ - tweak: "Seed vault remapped"
+ - tweak: "The seed vault random seed spawner can now spawn cherry bombs instead of regular cherry seeds"
+ - rscadd: "BEES to plant vault"
diff --git a/icons/emoji.dmi b/icons/emoji.dmi
old mode 100644
new mode 100755
index df89c12c94..9d3e0630a7
Binary files a/icons/emoji.dmi and b/icons/emoji.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 39f374fb52..285f936a9e 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index d28ed18c8a..9d63c276bc 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/obj/clothing/cit_hats.dmi b/icons/obj/clothing/cit_hats.dmi
new file mode 100644
index 0000000000..f9bf2a7a03
Binary files /dev/null and b/icons/obj/clothing/cit_hats.dmi differ
diff --git a/icons/obj/daki.dmi b/icons/obj/daki.dmi
new file mode 100644
index 0000000000..2b075f959c
Binary files /dev/null and b/icons/obj/daki.dmi differ
diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi
index 2672732597..68c192bec3 100644
Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index c4713bd086..e7c0e8d263 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/food/pizzaspaghetti.dmi b/icons/obj/food/pizzaspaghetti.dmi
index 8fb643c03c..245c737865 100644
Binary files a/icons/obj/food/pizzaspaghetti.dmi and b/icons/obj/food/pizzaspaghetti.dmi differ
diff --git a/icons/obj/pneumaticCannon.dmi b/icons/obj/pneumaticCannon.dmi
index 41de7677b5..86e14e19d6 100644
Binary files a/icons/obj/pneumaticCannon.dmi and b/icons/obj/pneumaticCannon.dmi differ
diff --git a/interface/menu.dm b/interface/menu.dm
new file mode 100644
index 0000000000..4bebd5b202
--- /dev/null
+++ b/interface/menu.dm
@@ -0,0 +1,203 @@
+/*
+/datum/menu/Example/verb/Example()
+ set name = "" //if this starts with @ the verb is not created and name becomes the command to invoke.
+ set desc = "" //desc is the text given to this entry in the menu
+ //You can not use src in these verbs. It will be the menu at compile time, but the client at runtime.
+*/
+
+GLOBAL_LIST_EMPTY(menulist)
+
+/world/proc/load_menu()
+ for (var/typepath in subtypesof(/datum/menu))
+ new typepath()
+
+/datum/menu
+ var/name
+ var/list/children
+ var/datum/menu/myparent
+ var/list/verblist
+ var/checkbox = CHECKBOX_NONE //checkbox type.
+ var/default //default checked type.
+ //Set to true to append our children to our parent,
+ //Rather then add us as a node (used for having more then one checkgroups in the same menu)
+ var/abstract = FALSE
+
+/datum/menu/New()
+ var/ourentry = GLOB.menulist[type]
+ children = list()
+ verblist = list()
+ if (ourentry)
+ if (islist(ourentry)) //some of our childern already loaded
+ Add_children(ourentry)
+ else
+ stack_trace("Menu item double load: [type]")
+ qdel(src)
+ return
+
+ GLOB.menulist[type] = src
+
+ Load_verbs(type, typesof("[type]/verb"))
+
+ var/datum/menu/parent = GLOB.menulist[parent_type]
+ if (!parent)
+ GLOB.menulist[parent_type] = list(src)
+ else if (islist(parent))
+ parent += src
+ else
+ parent.Add_children(list(src))
+
+/datum/menu/proc/Set_parent(datum/menu/parent)
+ myparent = parent
+ if (abstract)
+ myparent.Add_children(children)
+ var/list/verblistoftypes = list()
+ for(var/thing in verblist)
+ LAZYADD(verblistoftypes[verblist[thing]], thing)
+
+ for(var/verbparenttype in verblistoftypes)
+ myparent.Load_verbs(verbparenttype, verblistoftypes[verbparenttype])
+
+/datum/menu/proc/Add_children(list/kids)
+ if (abstract && myparent)
+ myparent.Add_children(kids)
+ return
+
+ for(var/thing in kids)
+ var/datum/menu/menuitem = thing
+ menuitem.Set_parent(src)
+ if (!menuitem.abstract)
+ children += menuitem
+
+/datum/menu/proc/Load_verbs(verb_parent_type, list/verbs)
+ if (abstract && myparent)
+ myparent.Load_verbs(verb_parent_type, verbs)
+ return
+
+ for (var/verbpath in verbs)
+ verblist[verbpath] = verb_parent_type
+
+/datum/menu/proc/Generate_list(client/C)
+ . = list()
+ if (length(children))
+ for (var/thing in children)
+ var/datum/menu/child = thing
+ var/list/childlist = child.Generate_list(C)
+ if (childlist)
+ var/childname = "[child]"
+ if (childname == "[child.type]")
+ var/list/tree = splittext(childname, "/")
+ childname = tree[tree.len]
+ .[child.type] = "parent=[url_encode(type)];name=[url_encode(childname)]"
+ . += childlist
+
+
+
+ for (var/thing in verblist)
+ var/atom/verb/verbpath = thing
+ if (!verbpath)
+ stack_trace("Bad VERB in [type] verblist: [english_list(verblist)]")
+ var/list/entry = list()
+ entry["parent"] = "[type]"
+ entry["name"] = verbpath.desc
+ if (copytext(verbpath.name,1,2) == "@")
+ entry["command"] = copytext(verbpath.name,2)
+ else
+ entry["command"] = replacetext(verbpath.name, " ", "-")
+ var/datum/menu/verb_true_parent = GLOB.menulist[verblist[verbpath]]
+ var/true_checkbox = verb_true_parent.checkbox
+ if (true_checkbox != CHECKBOX_NONE)
+ var/checkedverb = verb_true_parent.Get_checked(C)
+ if (true_checkbox == CHECKBOX_GROUP)
+ if (verbpath == checkedverb)
+ entry["is-checked"] = TRUE
+ else
+ entry["is-checked"] = FALSE
+ else if (true_checkbox == CHECKBOX_TOGGLE)
+ entry["is-checked"] = checkedverb
+
+ entry["command"] = ".updatemenuchecked \"[verb_true_parent.type]\" \"[verbpath]\"\n[entry["command"]]"
+ entry["can-check"] = TRUE
+ entry["group"] = "[verb_true_parent.type]"
+ .[verbpath] = list2params(entry)
+
+/datum/menu/proc/Get_checked(client/C)
+ return C.prefs.menuoptions[type] || default || FALSE
+
+/datum/menu/proc/Load_checked(client/C) //Loads the checked menu item into a new client. Used by icon menus to invoke the checked item.
+ return
+
+/datum/menu/proc/Set_checked(client/C, verbpath)
+ if (checkbox == CHECKBOX_GROUP)
+ C.prefs.menuoptions[type] = verbpath
+ C.prefs.save_preferences()
+ else if (checkbox == CHECKBOX_TOGGLE)
+ var/checked = Get_checked(C)
+ C.prefs.menuoptions[type] = !checked
+ C.prefs.save_preferences()
+ winset(C, "[verbpath]", "is-checked = [!checked]")
+
+/client/verb/updatemenuchecked(menutype as text, verbpath as text)
+ set name = ".updatemenuchecked"
+ menutype = text2path(menutype)
+ verbpath = text2path(verbpath)
+ if (!menutype || !verbpath)
+ return
+ var/datum/menu/M = GLOB.menulist[menutype]
+ if (!M)
+ return
+ if (!(verbpath in typesof("[menutype]/verb")))
+ return
+ M.Set_checked(src, verbpath)
+
+
+/datum/menu/Icon/Load_checked(client/C) //So we can be lazy, we invoke the "checked" menu item on menu load.
+ var/atom/verb/verbpath = Get_checked(C)
+ if (!verbpath || !(verbpath in typesof("[type]/verb")))
+ return
+ if (copytext(verbpath.name,1,2) == "@")
+ winset(C, null, "command = [copytext(verbpath.name,2)]")
+ else
+ winset(C, null, "command = [replacetext(verbpath.name, " ", "-")]")
+
+/datum/menu/Icon/Size
+ checkbox = CHECKBOX_GROUP
+ default = /datum/menu/Icon/Size/verb/iconstretchtofit
+
+/datum/menu/Icon/Size/verb/iconstretchtofit()
+ set name = "@.winset \"mapwindow.map.icon-size=0\""
+ set desc = "&Auto (stretch-to-fit)"
+
+/datum/menu/Icon/Size/verb/icon96()
+ set name = "@.winset \"mapwindow.map.icon-size=96\""
+ set desc = "&96x96 (3x)"
+
+/datum/menu/Icon/Size/verb/icon64()
+ set name = "@.winset \"mapwindow.map.icon-size=64\""
+ set desc = "&64x64 (2x)"
+
+/datum/menu/Icon/Size/verb/icon48()
+ set name = "@.winset \"mapwindow.map.icon-size=48\""
+ set desc = "&48x48 (1.5x)"
+
+/datum/menu/Icon/Size/verb/icon32()
+ set name = "@.winset \"mapwindow.map.icon-size=32\""
+ set desc = "&32x32 (1x)"
+
+
+/datum/menu/Icon/Scaling
+ checkbox = CHECKBOX_GROUP
+ name = "Scaling Mode"
+ default = /datum/menu/Icon/Scaling/verb/NN
+
+/datum/menu/Icon/Scaling/verb/NN()
+ set name = "@.winset \"mapwindow.map.zoom-mode=distort\""
+ set desc = "Nearest Neighbor"
+
+/datum/menu/Icon/Scaling/verb/PS()
+ set name = "@.winset \"mapwindow.map.zoom-mode=normal\""
+ set desc = "Point Sampling"
+
+/datum/menu/Icon/Scaling/verb/BL()
+ set name = "@.winset \"mapwindow.map.zoom-mode=blur\""
+ set desc = "Bilinear"
+
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 788ce65b71..65407cef0e 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -1062,60 +1062,6 @@ menu "menu"
group = ""
is-disabled = false
saved-params = "is-checked"
- elem
- name = "&Icons"
- command = ""
- category = ""
- is-checked = false
- can-check = false
- group = ""
- is-disabled = false
- saved-params = "is-checked"
- elem "auto"
- name = "&Auto (stretch-to-fit)"
- command = ".winset \"mapwindow.map.icon-size=0\""
- category = "&Icons"
- is-checked = true
- can-check = true
- group = "size"
- is-disabled = false
- saved-params = "is-checked"
- elem "icon96"
- name = "&96x96 (3x)"
- command = ".winset \"mapwindow.map.icon-size=96\""
- category = "&Icons"
- is-checked = false
- can-check = true
- group = "size"
- is-disabled = false
- saved-params = "is-checked"
- elem "icon64"
- name = "&64x64 (2x)"
- command = ".winset \"mapwindow.map.icon-size=64\""
- category = "&Icons"
- is-checked = false
- can-check = true
- group = "size"
- is-disabled = false
- saved-params = "is-checked"
- elem "icon48"
- name = "&48x48 (1.5x)"
- command = ".winset \"mapwindow.map.icon-size=48\""
- category = "&Icons"
- is-checked = false
- can-check = true
- group = "size"
- is-disabled = false
- saved-params = "is-checked"
- elem "icon32"
- name = "&32x32"
- command = ".winset \"mapwindow.map.icon-size=32\""
- category = "&Icons"
- is-checked = false
- can-check = true
- group = "size"
- is-disabled = false
- saved-params = "is-checked"
elem
name = "&Help"
command = ""
@@ -1383,6 +1329,7 @@ window "mapwindow"
on-show = ""
on-hide = ""
style = ""
+ zoom-mode = "distort"
window "infowindow"
elem "infowindow"
diff --git a/sound/misc/highlander.ogg b/sound/misc/highlander.ogg
index 2116f8a972..01148b55db 100644
Binary files a/sound/misc/highlander.ogg and b/sound/misc/highlander.ogg differ
diff --git a/sound/misc/highlander_delayed.ogg b/sound/misc/highlander_delayed.ogg
index d1cce70781..2645349662 100644
Binary files a/sound/misc/highlander_delayed.ogg and b/sound/misc/highlander_delayed.ogg differ
diff --git a/sound/misc/highlander_only_one.ogg b/sound/misc/highlander_only_one.ogg
index 3b69d26ade..6458d10ab6 100644
Binary files a/sound/misc/highlander_only_one.ogg and b/sound/misc/highlander_only_one.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 3a36f5cede..83c004c29e 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -47,6 +47,7 @@
#include "code\__DEFINES\maps.dm"
#include "code\__DEFINES\math.dm"
#include "code\__DEFINES\MC.dm"
+#include "code\__DEFINES\menu.dm"
#include "code\__DEFINES\misc.dm"
#include "code\__DEFINES\mobs.dm"
#include "code\__DEFINES\monkeys.dm"
@@ -75,7 +76,6 @@
#include "code\__HELPERS\_logging.dm"
#include "code\__HELPERS\_string_lists.dm"
#include "code\__HELPERS\AStar.dm"
-#include "code\__HELPERS\bandetect.dm"
#include "code\__HELPERS\cmp.dm"
#include "code\__HELPERS\files.dm"
#include "code\__HELPERS\flags.dm"
@@ -876,6 +876,7 @@
#include "code\game\objects\items\weapons\storage\book.dm"
#include "code\game\objects\items\weapons\storage\boxes.dm"
#include "code\game\objects\items\weapons\storage\briefcase.dm"
+#include "code\game\objects\items\weapons\storage\dakis.dm"
#include "code\game\objects\items\weapons\storage\fancy.dm"
#include "code\game\objects\items\weapons\storage\firstaid.dm"
#include "code\game\objects\items\weapons\storage\internal.dm"
@@ -1004,6 +1005,7 @@
#include "code\modules\admin\admin_investigate.dm"
#include "code\modules\admin\admin_ranks.dm"
#include "code\modules\admin\admin_verbs.dm"
+#include "code\modules\admin\adminmenu.dm"
#include "code\modules\admin\banjob.dm"
#include "code\modules\admin\create_mob.dm"
#include "code\modules\admin\create_object.dm"
@@ -1180,6 +1182,7 @@
#include "code\modules\clothing\gloves\miscellaneous.dm"
#include "code\modules\clothing\gloves\vg_gloves.dm"
#include "code\modules\clothing\head\beanie.dm"
+#include "code\modules\clothing\head\cit_hats.dm"
#include "code\modules\clothing\head\collectable.dm"
#include "code\modules\clothing\head\hardhat.dm"
#include "code\modules\clothing\head\helmet.dm"
@@ -2162,6 +2165,7 @@
#include "code\modules\zombie\items.dm"
#include "code\modules\zombie\organs.dm"
#include "interface\interface.dm"
+#include "interface\menu.dm"
#include "interface\stylesheet.dm"
#include "interface\skin.dmf"
// END_INCLUDE
diff --git a/tools/travis/build_byond.sh b/tools/travis/build_byond.sh
index 54add5c78d..a26fb14509 100755
--- a/tools/travis/build_byond.sh
+++ b/tools/travis/build_byond.sh
@@ -9,7 +9,7 @@ if [ "$BUILD_TOOLS" = false ]; then
echo "step_[xy] variables detected in maps, please remove them."
exit 1
fi;
- if grep '/turf\s*[,\){]' _maps/**/*.dmm; then
+ if grep '\W\/turf\s*[,\){]' _maps/**/*.dmm; then
echo "base /turf path use detected in maps, please replace with proper paths."
exit 1
fi;
diff --git a/useless.txt b/useless.txt
deleted file mode 100644
index 6be878be07..0000000000
--- a/useless.txt
+++ /dev/null
@@ -1 +0,0 @@
-no, really