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