diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index a447c7993ba..ead94c0ec9a 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -255,20 +255,15 @@ CREATE TABLE `player` ( `be_role` mediumtext, `default_slot` smallint(4) DEFAULT '1', `toggles` int(8) DEFAULT '383', + `toggles_2` int(8) DEFAULT '14', `sound` mediumint(8) DEFAULT '31', - `randomslot` tinyint(1) DEFAULT '0', `volume` smallint(4) DEFAULT '100', - `nanoui_fancy` smallint(4) DEFAULT '1', - `show_ghostitem_attack` smallint(4) DEFAULT '1', `lastchangelog` varchar(32) NOT NULL DEFAULT '0', - `windowflashing` smallint(4) DEFAULT '1', - `ghost_anonsay` tinyint(1) NOT NULL DEFAULT '0', `exp` mediumtext, `clientfps` smallint(4) DEFAULT '0', `atklog` smallint(4) DEFAULT '0', `fuid` bigint(20) NULL DEFAULT NULL, `fupdate` smallint(4) NULL DEFAULT '0', - `afk_watch` tinyint(1) NOT NULL DEFAULT '0', `parallax` tinyint(1) DEFAULT '8', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index 6096f0547e6..c8589a4c74c 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -254,20 +254,15 @@ CREATE TABLE `SS13_player` ( `be_role` mediumtext, `default_slot` smallint(4) DEFAULT '1', `toggles` int(8) DEFAULT '383', + `toggles_2` int(8) DEFAULT '14', `sound` mediumint(8) DEFAULT '31', - `randomslot` tinyint(1) DEFAULT '0', `volume` smallint(4) DEFAULT '100', - `nanoui_fancy` smallint(4) DEFAULT '1', - `show_ghostitem_attack` smallint(4) DEFAULT '1', `lastchangelog` varchar(32) NOT NULL DEFAULT '0', - `windowflashing` smallint(4) DEFAULT '1', - `ghost_anonsay` tinyint(1) NOT NULL DEFAULT '0', `exp` mediumtext, `clientfps` smallint(4) DEFAULT '0', `atklog` smallint(4) DEFAULT '0', `fuid` bigint(20) NULL DEFAULT NULL, `fupdate` smallint(4) NULL DEFAULT '0', - `afk_watch` tinyint(1) NOT NULL DEFAULT '0', `parallax` tinyint(1) DEFAULT '8', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) diff --git a/SQL/updates/12-13.sql b/SQL/updates/12-13.sql new file mode 100644 index 00000000000..efa808d3cc7 --- /dev/null +++ b/SQL/updates/12-13.sql @@ -0,0 +1,22 @@ +#Updating the SQL from version 12 to version 13. -AffectedArc07 +#Modifying the player table to remove old columns and add a new bitflag column for toggles +#Includes conversion from old to new + +ALTER TABLE `player` ADD COLUMN `toggles_2` INT NULL DEFAULT '0' AFTER `toggles`; + +# The following lines will update the new toggles_2 column based on existing data +UPDATE `player` SET `toggles_2` = `toggles_2` + 1 WHERE `randomslot` = 1; +UPDATE `player` SET `toggles_2` = `toggles_2` + 2 WHERE `nanoui_fancy` = 1; +UPDATE `player` SET `toggles_2` = `toggles_2` + 4 WHERE `show_ghostitem_attack` = 1; +UPDATE `player` SET `toggles_2` = `toggles_2` + 8 WHERE `windowflashing` = 1; +UPDATE `player` SET `toggles_2` = `toggles_2` + 16 WHERE `ghost_anonsay` = 1; +UPDATE `player` SET `toggles_2` = `toggles_2` + 32 WHERE `afk_watch` = 1; + +# Remove the old columns +ALTER TABLE `player` + DROP COLUMN `randomslot`, + DROP COLUMN `nanoui_fancy`, + DROP COLUMN `show_ghostitem_attack`, + DROP COLUMN `windowflashing`, + DROP COLUMN `ghost_anonsay`, + DROP COLUMN `afk_watch`; diff --git a/_maps/map_files/RandomRuins/SpaceRuins/golemtarget.dmm b/_maps/map_files/RandomRuins/SpaceRuins/golemtarget.dmm new file mode 100644 index 00000000000..26d466a601c --- /dev/null +++ b/_maps/map_files/RandomRuins/SpaceRuins/golemtarget.dmm @@ -0,0 +1,982 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"x" = ( +/turf/simulated/mineral/random/high_chance, +/area/ruin/unpowered) +"H" = ( +/turf/simulated/floor/plating/asteroid/airless, +/area/ruin/unpowered) +"S" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 8; + height = 20; + id = "freegolem_space"; + name = "The middle of space"; + width = 16 + }, +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +x +H +x +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +H +x +x +x +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +x +x +x +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(5,1,1) = {" +a +a +x +x +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +a +a +a +x +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(10,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(11,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(12,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(13,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(14,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(15,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(16,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(17,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(18,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(19,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(20,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(21,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +x +a +a +"} +(22,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +x +x +x +a +"} +(23,1,1) = {" +a +a +a +x +H +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +x +x +x +a +"} +(24,1,1) = {" +a +a +x +x +x +H +a +a +a +a +a +a +a +a +a +a +S +a +a +a +a +a +a +a +a +x +x +x +x +x +"} +(25,1,1) = {" +a +a +a +x +x +x +H +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +x +x +x +x +"} +(26,1,1) = {" +a +a +a +a +x +x +H +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(27,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +H +x +x +x +x +a +a +a +a +a +a +a +a +a +a +a +"} +(28,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +H +x +x +x +x +x +a +a +a +a +a +a +a +a +a +a +a +"} +(29,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +x +H +x +x +a +a +a +a +a +a +a +a +a +a +a +a +"} +(30,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm b/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm index 4361bd59785..d8d711001d0 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm @@ -9050,7 +9050,7 @@ dir = 8; dwidth = 8; height = 20; - id = "freegolem_z6"; + id = "freegolem_ussp"; name = "Near USSP Station"; width = 16 }, diff --git a/_maps/map_files/RandomZLevels/terrorspiders.dmm b/_maps/map_files/RandomZLevels/terrorspiders.dmm index 70597a56927..760daa77f1e 100644 --- a/_maps/map_files/RandomZLevels/terrorspiders.dmm +++ b/_maps/map_files/RandomZLevels/terrorspiders.dmm @@ -15,8 +15,15 @@ /turf/simulated/wall/rust, /area/awaymission/UO71/plaza) "ae" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4; + initialize_directions = 11 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10; + level = 1 + }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) "af" = ( @@ -53,8 +60,7 @@ "aj" = ( /turf/simulated/floor/plasteel{ dir = 8; - icon_state = "floorgrime"; - tag = "icon-floorgrime (WEST)" + icon_state = "floorgrime" }, /area/awaymission/UO71/plaza) "ak" = ( @@ -137,7 +143,6 @@ /area/awaymission/UO71/plaza) "ax" = ( /obj/structure/chair/comfy/beige{ - tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4 }, @@ -225,7 +230,6 @@ /area/awaymission/UO71/plaza) "aH" = ( /obj/structure/chair/wood{ - tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1 }, @@ -575,32 +579,6 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) -"bx" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/turf/simulated/wall, -/area/awaymission/UO71/plaza) -"by" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/wall, -/area/awaymission/UO71/plaza) -"bz" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/wall/rust, -/area/awaymission/UO71/plaza) -"bA" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1; - initialize_directions = 14; - tag = "icon-manifold-r-f (NORTH)" - }, -/turf/simulated/wall, -/area/awaymission/UO71/plaza) "bB" = ( /obj/machinery/door/airlock{ id_tag = "awaydormE2"; @@ -615,30 +593,16 @@ /obj/item/bedsheet, /turf/simulated/floor/carpet, /area/awaymission/UO71/plaza) -"bD" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1; - initialize_directions = 14; - tag = "icon-manifold-r-f (NORTH)" - }, -/turf/simulated/wall/rust, -/area/awaymission/UO71/plaza) -"bE" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10; - level = 1 - }, -/turf/simulated/wall, -/area/awaymission/UO71/plaza) "bF" = ( /obj/effect/landmark/damageturf, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "bG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4; + initialize_directions = 11 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) "bH" = ( @@ -649,10 +613,6 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) -"bJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/awaymission/UO71/plaza) "bK" = ( /obj/effect/landmark/burnturf, /turf/simulated/floor/plating, @@ -661,12 +621,18 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "bM" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "bN" = ( @@ -674,15 +640,19 @@ dir = 4 }, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "bO" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1; - initialize_directions = 14; - tag = "icon-manifold-b-f (NORTH)" - }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "bP" = ( @@ -693,13 +663,19 @@ req_access_txt = "0"; req_one_access_txt = "0" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "bQ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1; + initialize_directions = 14 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "bR" = ( @@ -712,19 +688,14 @@ }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) -"bT" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1; - initialize_directions = 14; - tag = "icon-manifold-b-f (NORTH)" - }, -/turf/simulated/floor/plating, -/area/awaymission/UO71/plaza) "bU" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/effect/landmark/burnturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "bV" = ( @@ -739,20 +710,23 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1; + initialize_directions = 14 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) -"bY" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/wall/rust, -/area/awaymission/UO71/plaza) "bZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10; + level = 1 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "ca" = ( @@ -760,20 +734,26 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "cb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "cc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "cd" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "ce" = ( @@ -795,17 +775,9 @@ pixel_y = 23; req_access = null }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, /turf/simulated/floor/carpet, /area/awaymission/UO71/plaza) "ch" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8; - initialize_directions = 7; - tag = "icon-manifold-b-f (WEST)" - }, /obj/structure/table/wood, /obj/machinery/newscaster{ pixel_x = -30; @@ -830,27 +802,6 @@ /obj/item/clothing/under/pj/blue, /turf/simulated/floor/carpet, /area/awaymission/UO71/plaza) -"cj" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8; - initialize_directions = 7; - tag = "icon-manifold-b-f (WEST)" - }, -/obj/structure/closet/secure_closet{ - desc = "It's a secure locker for personnel. The first card swiped gains control."; - icon_broken = "cabinetdetective_broken"; - icon_closed = "cabinetdetective"; - icon_locked = "cabinetdetective_locked"; - icon_off = "cabinetdetective_broken"; - icon_opened = "cabinetdetective_open"; - icon_state = "cabinetdetective"; - locked = 0; - name = "personal closet"; - req_access_txt = "271" - }, -/obj/item/clothing/under/suit_jacket/female, -/turf/simulated/floor/carpet, -/area/awaymission/UO71/plaza) "ck" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/table/wood, @@ -870,18 +821,13 @@ pixel_y = 23; req_access = null }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, /obj/structure/chair/wood{ - tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4 }, /turf/simulated/floor/carpet, /area/awaymission/UO71/plaza) "cm" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/grille, /obj/effect/landmark/damageturf, /turf/simulated/floor/plating, @@ -897,6 +843,9 @@ }, /obj/effect/landmark/burnturf, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "cp" = ( @@ -908,21 +857,19 @@ dir = 4 }, /obj/effect/landmark/burnturf, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "cr" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, /turf/simulated/floor/carpet, /area/awaymission/UO71/plaza) "cs" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 1; - external_pressure_bound = 101.325; - on = 1; - pressure_checks = 1 - }, /obj/structure/chair/wood{ - tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1 }, @@ -935,6 +882,10 @@ req_access_txt = "0"; specialfunctions = 4 }, +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 4; + on = 1 + }, /turf/simulated/floor/carpet, /area/awaymission/UO71/plaza) "ct" = ( @@ -952,10 +903,8 @@ /obj/structure/bed, /obj/item/bedsheet, /obj/machinery/atmospherics/unary/vent_pump{ - dir = 1; - external_pressure_bound = 101.325; - on = 1; - pressure_checks = 1 + dir = 4; + on = 1 }, /turf/simulated/floor/carpet, /area/awaymission/UO71/plaza) @@ -981,29 +930,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/plating, -/area/awaymission/UO71/plaza) -"cx" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5; - level = 2 - }, -/turf/simulated/floor/plating, -/area/awaymission/UO71/plaza) -"cy" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1; - initialize_directions = 14; - tag = "icon-manifold-b-f (NORTH)" - }, -/obj/effect/landmark/burnturf, -/turf/simulated/floor/plating, -/area/awaymission/UO71/plaza) -"cz" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1; - initialize_directions = 14; - tag = "icon-manifold-r-f (NORTH)" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) @@ -1012,34 +940,30 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/awaymission/UO71/plaza) -"cB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10; - level = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/wall/rust, +/turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "cC" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, /obj/machinery/portable_atmospherics/scrubber, -/turf/simulated/floor/plating, -/area/awaymission/UO71/plaza) -"cD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 + dir = 4 }, -/obj/effect/landmark/burnturf, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "cE" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, /obj/structure/reagent_dispensers/fueltank, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10; + level = 1 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "cF" = ( @@ -1050,11 +974,6 @@ /obj/structure/grille, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) -"cH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/grille, -/turf/simulated/floor/plating, -/area/awaymission/UO71/plaza) "cI" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/airlock{ @@ -1070,18 +989,6 @@ }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) -"cK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/wall, -/area/awaymission/UO71/plaza) -"cL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/wall/rust, -/area/awaymission/UO71/plaza) "cM" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/airlock{ @@ -1093,17 +1000,11 @@ /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) "cN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, /obj/structure/closet, /obj/item/poster/random_contraband, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "cO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, /obj/structure/table, /obj/item/stack/cable_coil, /obj/item/stack/cable_coil{ @@ -1123,32 +1024,18 @@ icon_state = "white" }, /area/awaymission/UO71/science) -"cP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/item/stack/rods, -/turf/simulated/floor/plating, -/area/awaymission/UO71/plaza) -"cQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/simulated/floor/plating, -/area/awaymission/UO71/plaza) "cR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/burnturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "cS" = ( /obj/structure/cable{ d1 = 2; d2 = 8; - icon_state = "2-8"; - tag = "" + icon_state = "2-8" }, /obj/structure/disposalpipe/segment{ dir = 2; @@ -1157,27 +1044,17 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) -"cT" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/plating, -/area/awaymission/UO71/plaza) -"cU" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/wall, -/area/awaymission/UO71/plaza) "cV" = ( /obj/structure/disposalpipe/segment{ dir = 4; icon_state = "pipe-c" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, /obj/effect/decal/warning_stripes/north, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -1200,8 +1077,7 @@ }, /turf/simulated/floor/plasteel{ dir = 2; - icon_state = "greencorner"; - tag = "icon-greencorner" + icon_state = "greencorner" }, /area/awaymission/UO71/plaza) "cY" = ( @@ -1250,10 +1126,12 @@ }, /area/awaymission/UO71/plaza) "dd" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8; + initialize_directions = 7 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) "de" = ( @@ -1261,12 +1139,12 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "df" = ( @@ -1275,32 +1153,22 @@ }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) -"dg" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/turf/simulated/floor/plasteel, -/area/awaymission/UO71/plaza) "dh" = ( /turf/simulated/floor/plasteel{ dir = 4; icon_state = "green" }, /area/awaymission/UO71/plaza) -"di" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/plasteel, -/area/awaymission/UO71/plaza) "dj" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/sink{ pixel_y = 25 }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "green" @@ -1313,6 +1181,9 @@ }, /obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "green" @@ -1349,8 +1220,7 @@ "dn" = ( /obj/structure/disposalpipe/junction{ dir = 4; - icon_state = "pipe-j2"; - tag = "icon-pipe-j1 (WEST)" + icon_state = "pipe-j2" }, /turf/simulated/floor/plasteel{ dir = 1; @@ -1382,7 +1252,6 @@ dir = 2; icon_state = "pipe-c" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/sink{ pixel_y = 25 }, @@ -1439,11 +1308,6 @@ /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "dv" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8; - initialize_directions = 7; - tag = "icon-manifold-r-f (WEST)" - }, /obj/structure/chair, /obj/structure/reagent_dispensers/peppertank{ pixel_x = 0; @@ -1482,12 +1346,6 @@ /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) "dy" = ( -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 8; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "red" @@ -1575,12 +1433,10 @@ /area/awaymission/UO71/plaza) "dJ" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 8; - icon_state = "floorgrime"; - tag = "icon-floorgrime (WEST)" + icon_state = "floorgrime" }, /area/awaymission/UO71/plaza) "dK" = ( @@ -1603,9 +1459,6 @@ }, /area/awaymission/UO71/plaza) "dL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, /obj/machinery/door/airlock/maintenance{ name = "Security Checkpoint Maintenance"; req_access_txt = "271"; @@ -1613,32 +1466,6 @@ }, /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) -"dM" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/floor/plating, -/area/awaymission/UO71/plaza) -"dN" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 8; - on = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/awaymission/UO71/plaza) -"dO" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1; - initialize_directions = 14; - tag = "icon-manifold-b-f (NORTH)" - }, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "red" - }, -/area/awaymission/UO71/plaza) "dP" = ( /turf/simulated/floor/plasteel{ dir = 4; @@ -1684,16 +1511,6 @@ }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) -"dW" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 1; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/turf/simulated/floor/plasteel, -/area/awaymission/UO71/plaza) "dX" = ( /obj/structure/table, /obj/machinery/reagentgrinder, @@ -1703,7 +1520,6 @@ }, /area/awaymission/UO71/plaza) "dY" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/chair/office/dark{ dir = 8 }, @@ -1718,7 +1534,6 @@ pixel_y = 0; req_access = null }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/security{ network = list("UO71") @@ -1743,10 +1558,19 @@ name = "Security Checkpoint"; req_access_txt = "271" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) "eb" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 4; + on = 1; + scrub_N2O = 0; + scrub_Toxins = 0 + }, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "red" @@ -1760,7 +1584,6 @@ /area/awaymission/UO71/plaza) "ed" = ( /obj/structure/chair/office{ - tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4 }, @@ -1779,7 +1602,6 @@ /area/awaymission/UO71/plaza) "eg" = ( /obj/structure/chair/office{ - tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8 }, @@ -1792,8 +1614,7 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ dir = 8; - icon_state = "floorgrime"; - tag = "icon-floorgrime (WEST)" + icon_state = "floorgrime" }, /area/awaymission/UO71/plaza) "ei" = ( @@ -1807,7 +1628,6 @@ }, /area/awaymission/UO71/plaza) "ej" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/table, /obj/machinery/recharger{ pixel_y = 4 @@ -1846,7 +1666,6 @@ /area/awaymission/UO71/plaza) "em" = ( /obj/structure/chair/office{ - tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4 }, @@ -1909,7 +1728,6 @@ /area/awaymission/UO71/plaza) "eu" = ( /obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/item/radio/off, /obj/item/screwdriver{ pixel_y = 10 @@ -1917,25 +1735,34 @@ /obj/structure/sign/poster/official/safety_report{ pixel_y = -32 }, +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 4; + on = 1 + }, /turf/simulated/floor/plasteel{ icon_state = "red" }, /area/awaymission/UO71/plaza) "ev" = ( /obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "red" }, /area/awaymission/UO71/plaza) "ew" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "red" }, /area/awaymission/UO71/plaza) "ex" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "redcorner" @@ -1951,8 +1778,7 @@ "ez" = ( /turf/simulated/floor/plasteel{ dir = 2; - icon_state = "greencorner"; - tag = "icon-greencorner" + icon_state = "greencorner" }, /area/awaymission/UO71/plaza) "eA" = ( @@ -2005,8 +1831,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -2019,8 +1844,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/extinguisher_cabinet{ pixel_x = 0; @@ -2037,8 +1861,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /turf/simulated/floor/plasteel{ dir = 2; @@ -2050,8 +1873,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /turf/simulated/floor/plasteel{ dir = 2; @@ -2062,8 +1884,7 @@ /obj/structure/cable{ d1 = 2; d2 = 8; - icon_state = "2-8"; - tag = "" + icon_state = "2-8" }, /turf/simulated/floor/plasteel{ dir = 6; @@ -2148,8 +1969,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -2167,8 +1987,7 @@ /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; - tag = "" + icon_state = "1-4" }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -2178,8 +1997,7 @@ /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; - tag = "" + icon_state = "1-4" }, /obj/structure/disposalpipe/segment{ dir = 1; @@ -2193,8 +2011,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -2202,10 +2019,8 @@ /turf/simulated/floor/plating, /area/awaymission/UO71/plaza) "eU" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8; - initialize_directions = 7; - tag = "icon-manifold-r-f (WEST)" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, /turf/simulated/floor/carpet, /area/awaymission/UO71/plaza) @@ -2227,6 +2042,9 @@ id_tag = "awaydorm3"; name = "Dorm 3" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) "eX" = ( @@ -2242,6 +2060,9 @@ req_access_txt = "0"; specialfunctions = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, /turf/simulated/floor/carpet, /area/awaymission/UO71/plaza) "eY" = ( @@ -2253,8 +2074,7 @@ "eZ" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-r-f (NORTH)" + initialize_directions = 14 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/plaza) @@ -2355,8 +2175,7 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 8; - icon_state = "floorgrime"; - tag = "icon-floorgrime (WEST)" + icon_state = "floorgrime" }, /area/awaymission/UO71/plaza) "fo" = ( @@ -2412,20 +2231,6 @@ icon_state = "showroomfloor" }, /area/awaymission/UO71/centralhall) -"fu" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5; - level = 1 - }, -/turf/simulated/wall, -/area/awaymission/UO71/centralhall) -"fv" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10; - level = 1 - }, -/turf/simulated/wall, -/area/awaymission/UO71/centralhall) "fw" = ( /obj/structure/sink/kitchen{ pixel_y = 28 @@ -2439,11 +2244,11 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "fy" = ( @@ -2451,6 +2256,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable, /obj/effect/landmark/burnturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "fz" = ( @@ -2481,19 +2287,26 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5; + level = 1 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "fD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10; + level = 1 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "fE" = ( @@ -2552,14 +2365,14 @@ /obj/structure/cable{ d1 = 2; d2 = 8; - icon_state = "2-8"; - tag = "" + icon_state = "2-8" }, /obj/structure/disposalpipe/segment{ dir = 2; icon_state = "pipe-c" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "fL" = ( @@ -2602,9 +2415,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, /obj/effect/decal/warning_stripes/north, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -2614,16 +2424,14 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "fV" = ( /obj/machinery/vending/dinnerware, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "fW" = ( @@ -2638,8 +2446,7 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "fX" = ( @@ -2652,8 +2459,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "fZ" = ( @@ -2661,8 +2467,7 @@ /obj/machinery/reagentgrinder, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "ga" = ( @@ -2673,12 +2478,12 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "gc" = ( @@ -2746,8 +2551,7 @@ "gk" = ( /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "gl" = ( @@ -2758,26 +2562,9 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) -"gm" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - pixel_y = 0; - tag = "" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/landmark/damageturf, -/turf/simulated/floor/plating, -/area/awaymission/UO71/centralhall) "gn" = ( /obj/machinery/gateway{ dir = 9 @@ -2895,7 +2682,6 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/structure/table/glass, /obj/item/reagent_containers/glass/beaker/large{ pixel_x = -3; pixel_y = 3 @@ -2905,6 +2691,7 @@ pixel_y = 2 }, /obj/item/reagent_containers/dropper, +/obj/structure/table, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "whitehall" @@ -2919,6 +2706,11 @@ pixel_y = 0; req_access = null }, +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 8; + on = 1 + }, +/mob/living/simple_animal/hostile/poison/terror_spider/gray, /turf/simulated/floor/plasteel, /area/awaymission/UO71/centralhall) "gD" = ( @@ -2929,6 +2721,10 @@ dir = 8; pixel_x = -24 }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8; + initialize_directions = 7 + }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/centralhall) "gE" = ( @@ -2996,8 +2792,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "gN" = ( @@ -3008,8 +2803,7 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "gO" = ( @@ -3017,8 +2811,7 @@ /obj/item/reagent_containers/food/snacks/applepie, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "gP" = ( @@ -3042,8 +2835,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "gQ" = ( @@ -3080,7 +2872,6 @@ scrub_Toxins = 0 }, /obj/structure/chair{ - tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8 }, @@ -3094,7 +2885,6 @@ /area/awaymission/UO71/mother) "gV" = ( /obj/structure/chair{ - tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8 }, @@ -3128,9 +2918,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, /obj/effect/decal/warning_stripes/northwestcorner, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -3186,7 +2973,6 @@ /turf/simulated/floor/plasteel, /area/awaymission/UO71/gateway) "he" = ( -/obj/structure/table/glass, /obj/item/stock_parts/manipulator, /obj/item/stock_parts/manipulator, /obj/item/stock_parts/capacitor, @@ -3194,18 +2980,15 @@ /obj/item/stock_parts/micro_laser, /obj/item/stock_parts/micro_laser, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_pump{ + on = 1 + }, +/obj/structure/table, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "whitehall" }, /area/awaymission/UO71/science) -"hf" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - on = 1 - }, -/mob/living/simple_animal/hostile/poison/terror_spider/gray, -/turf/simulated/floor/plasteel, -/area/awaymission/UO71/centralhall) "hg" = ( /obj/structure/table, /obj/item/trash/chips, @@ -3215,7 +2998,6 @@ /area/awaymission/UO71/centralhall) "hh" = ( /obj/structure/chair{ - tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8 }, @@ -3278,8 +3060,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "ho" = ( @@ -3289,8 +3070,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "hp" = ( @@ -3300,8 +3080,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "hq" = ( @@ -3309,8 +3088,7 @@ /obj/item/reagent_containers/food/snacks/mint, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "hr" = ( @@ -3331,8 +3109,7 @@ /obj/item/book/manual/chef_recipes, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "ht" = ( @@ -3340,15 +3117,14 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-b-f (EAST)" + initialize_directions = 11 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "hu" = ( @@ -3391,7 +3167,6 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/chair{ - tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8 }, @@ -3401,7 +3176,6 @@ /area/awaymission/UO71/gateway) "hy" = ( /obj/structure/chair{ - tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8 }, @@ -3433,6 +3207,9 @@ dir = 8; pixel_x = -24 }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/vault, /area/awaymission/UO71/prince) "hE" = ( @@ -3444,10 +3221,17 @@ pixel_y = 0; req_access = null }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, /turf/simulated/floor/vault, /area/awaymission/UO71/prince) "hF" = ( /obj/machinery/r_n_d/circuit_imprinter, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/science) "hG" = ( @@ -3457,18 +3241,24 @@ /turf/simulated/floor/vault, /area/awaymission/UO71/mother) "hH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, /turf/simulated/floor/plasteel{ icon_state = "white" }, /area/awaymission/UO71/science) "hI" = ( -/obj/structure/table/glass, /obj/item/stack/sheet/glass, /obj/item/stack/sheet/glass, /obj/item/stack/sheet/glass, /obj/item/stock_parts/matter_bin, /obj/item/stock_parts/matter_bin, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/structure/table, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "whitehall" @@ -3487,7 +3277,6 @@ /area/awaymission/UO71/centralhall) "hL" = ( /obj/structure/chair{ - tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8 }, @@ -3525,8 +3314,7 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "hQ" = ( @@ -3534,8 +3322,7 @@ /obj/item/kitchen/rollingpin, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "hR" = ( @@ -3545,8 +3332,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "hS" = ( @@ -3601,8 +3387,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/door/window{ dir = 2; @@ -3619,7 +3404,6 @@ "hZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/chair{ - tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8 }, @@ -3647,27 +3431,17 @@ /obj/effect/decal/warning_stripes/northeast, /turf/simulated/floor/plasteel, /area/awaymission/UO71/gateway) -"id" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/turf/simulated/wall/r_wall, -/area/awaymission/UO71/prince) -"ie" = ( -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 8; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0; - welded = 1 - }, -/turf/simulated/floor/vault, -/area/awaymission/UO71/prince) "if" = ( /obj/machinery/light/small, /turf/simulated/floor/vault, /area/awaymission/UO71/prince) "ig" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/science) "ih" = ( @@ -3695,9 +3469,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -3762,8 +3533,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "iq" = ( @@ -3773,8 +3543,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "ir" = ( @@ -3796,8 +3565,7 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "is" = ( @@ -3805,8 +3573,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -3815,6 +3582,9 @@ dir = 4 }, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "it" = ( @@ -3841,8 +3611,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/gateway) @@ -3862,10 +3631,6 @@ /area/awaymission/UO71/gateway) "iz" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id_tag = "UO71_biohazard"; - name = "biohazard containment door" - }, /obj/effect/decal/warning_stripes/yellow, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -3901,7 +3666,6 @@ "iE" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /obj/structure/chair{ - tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8 }, @@ -3909,16 +3673,11 @@ icon_state = "dark" }, /area/awaymission/UO71/gateway) -"iF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/wall/r_wall, -/area/awaymission/UO71/mother) "iG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, /obj/structure/chair{ - tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8 }, @@ -3937,47 +3696,15 @@ icon_state = "white" }, /area/awaymission/UO71/gateway) -"iI" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/wall/r_wall, -/area/awaymission/UO71/prince) "iJ" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-r-f (NORTH)" + initialize_directions = 14 }, /turf/simulated/floor/plasteel{ icon_state = "white" }, /area/awaymission/UO71/gateway) -"iK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/wall/r_wall, -/area/awaymission/UO71/prince) -"iL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 2 - }, -/turf/simulated/wall/r_wall, -/area/awaymission/UO71/prince) -"iM" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 2 - }, -/turf/simulated/mineral/random/labormineral, -/area/awaymission/UO71/outside) -"iN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 2 - }, -/turf/simulated/wall/rust, -/area/awaymission/UO71/centralhall) "iO" = ( /obj/structure/window/reinforced{ dir = 1 @@ -3985,7 +3712,6 @@ /turf/simulated/floor/plasteel, /area/awaymission/UO71/mother) "iP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/table, /obj/machinery/cell_charger, /obj/item/stock_parts/cell/high, @@ -3997,15 +3723,6 @@ icon_state = "white" }, /area/awaymission/UO71/science) -"iQ" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/unary/vent_pump{ - on = 1 - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/awaymission/UO71/science) "iR" = ( /obj/structure/window/reinforced{ dir = 1 @@ -4053,8 +3770,7 @@ /obj/structure/disposalpipe/junction, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "iW" = ( @@ -4070,8 +3786,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "iX" = ( @@ -4087,8 +3802,7 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/centralhall) "iY" = ( @@ -4098,6 +3812,7 @@ icon_state = "0-2"; d2 = 2 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "iZ" = ( @@ -4149,8 +3864,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8; - initialize_directions = 7; - tag = "icon-manifold-b-f (WEST)" + initialize_directions = 7 }, /turf/simulated/floor/plasteel{ dir = 8; @@ -4178,18 +3892,13 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8; - initialize_directions = 7; - tag = "icon-manifold-b-f (WEST)" + initialize_directions = 7 }, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "neutralcorner" }, /area/awaymission/UO71/centralhall) -"ji" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/wall, -/area/awaymission/UO71/science) "jj" = ( /obj/machinery/atmospherics/unary/vent_pump{ dir = 1; @@ -4212,25 +3921,10 @@ icon_state = "white" }, /area/awaymission/UO71/gateway) -"jl" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/mineral/random/labormineral, -/area/awaymission/UO71/outside) -"jm" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 2 - }, -/turf/simulated/shuttle/wall{ - dir = 4; - icon_state = "wall3" - }, -/area/awaymission/UO71/outside) "jn" = ( /turf/simulated/floor/plasteel, /area/awaymission/UO71/mother) "jo" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/table, /obj/item/folder/white, /obj/item/disk/tech_disk{ @@ -4245,6 +3939,7 @@ "jp" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -4293,18 +3988,6 @@ icon_state = "bar" }, /area/awaymission/UO71/centralhall) -"jw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/wall, -/area/awaymission/UO71/centralhall) -"jx" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/wall/rust, -/area/awaymission/UO71/centralhall) "jy" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/drinks/cans/beer, @@ -4312,12 +3995,6 @@ icon_state = "bar" }, /area/awaymission/UO71/centralhall) -"jz" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/wall, -/area/awaymission/UO71/centralhall) "jA" = ( /obj/machinery/camera{ c_tag = "Bar"; @@ -4332,15 +4009,11 @@ "jB" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8; - initialize_directions = 7; - tag = "icon-manifold-r-f (WEST)" - }, /obj/machinery/door/airlock{ name = "Kitchen"; req_access_txt = "271" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ icon_state = "bar" }, @@ -4350,8 +4023,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -4359,8 +4031,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/landmark/burnturf, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "jD" = ( @@ -4419,8 +4091,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-r-f (EAST)" + initialize_directions = 11 }, /obj/structure/spider/terrorweb, /turf/simulated/floor/plasteel{ @@ -4434,12 +4105,6 @@ }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/mother) -"jL" = ( -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/window/full/basic, -/turf/simulated/floor/plating, -/area/awaymission/UO71/science) "jM" = ( /obj/structure/grille, /obj/structure/window/full/basic, @@ -4454,6 +4119,7 @@ req_access_txt = "271"; req_one_access_txt = "0" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -4475,17 +4141,16 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "jR" = ( /obj/structure/chair{ - tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4 }, @@ -4531,24 +4196,25 @@ /obj/structure/cable{ d1 = 2; d2 = 4; - icon_state = "2-4"; - tag = "" + icon_state = "2-4" }, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/junction{ icon_state = "pipe-j2"; dir = 2 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8; + initialize_directions = 7 + }, /turf/simulated/floor/plasteel{ icon_state = "bar" }, @@ -4558,8 +4224,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/light/small{ dir = 1 @@ -4577,8 +4242,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -4586,6 +4250,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "jY" = ( @@ -4593,8 +4260,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -4606,22 +4272,29 @@ req_access_txt = "0"; req_one_access_txt = "0" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "jZ" = ( /obj/structure/cable{ d1 = 1; d2 = 8; - icon_state = "1-8"; - tag = "" + icon_state = "1-8" }, /obj/structure/disposalpipe/segment{ dir = 8; icon_state = "pipe-c" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "ka" = ( @@ -4629,8 +4302,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -4639,14 +4311,16 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "kb" = ( /obj/structure/cable{ d1 = 1; d2 = 8; - icon_state = "1-8"; - tag = "" + icon_state = "1-8" }, /obj/structure/disposalpipe/segment{ dir = 8; @@ -4656,6 +4330,9 @@ dir = 9 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/centralhall) "kc" = ( @@ -4671,8 +4348,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/door/airlock/command{ name = "Gateway"; @@ -4689,36 +4365,22 @@ /area/awaymission/UO71/science) "kf" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9 }, /area/awaymission/UO71/science) "kg" = ( /turf/simulated/floor/plasteel{ - tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5 }, /area/awaymission/UO71/science) -"kh" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/wall/rust, -/area/awaymission/UO71/science) "ki" = ( /obj/structure/dispenser/oxygen, /turf/simulated/floor/plating, /area/awaymission/UO71/gateway) -"kj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; - icon_state = "whitepurplecorner"; - dir = 4; - heat_capacity = 1e+006 - }, -/area/awaymission/UO71/science) "kk" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/simulated/floor/plating, @@ -4745,7 +4407,6 @@ /obj/effect/decal/cleanable/dirt, /obj/item/paper/terrorspiders5, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9 }, @@ -4756,7 +4417,6 @@ pixel_y = 8 }, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5 }, @@ -4784,10 +4444,13 @@ layer = 5 }, /obj/machinery/light/small{ - tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4 }, +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 8; + on = 1 + }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitepurplecorner" @@ -4795,7 +4458,11 @@ /area/awaymission/UO71/science) "kt" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8; + initialize_directions = 7 + }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitepurple" @@ -4848,14 +4515,12 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-r-f (EAST)" + initialize_directions = 11 }, /obj/machinery/firealarm{ dir = 4; @@ -4880,13 +4545,13 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "kC" = ( @@ -4911,7 +4576,6 @@ /area/awaymission/UO71/gateway) "kF" = ( /obj/structure/chair{ - tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8 }, @@ -4938,7 +4602,6 @@ }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -4949,7 +4612,6 @@ dir = 4 }, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -4964,7 +4626,6 @@ }, /mob/living/simple_animal/hostile/poison/terror_spider/gray, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -4981,7 +4642,6 @@ req_access = null }, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -4995,7 +4655,6 @@ dir = 4 }, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -5004,11 +4663,9 @@ "kN" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-r-f (NORTH)" + initialize_directions = 14 }, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -5023,7 +4680,6 @@ dir = 1 }, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -5035,7 +4691,6 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -5051,7 +4706,6 @@ req_access_txt = "271" }, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -5101,12 +4755,6 @@ icon_state = "white" }, /area/awaymission/UO71/gateway) -"kV" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/awaymission/UO71/science) "kW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -5116,7 +4764,6 @@ pixel_y = 30 }, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -5136,16 +4783,6 @@ dir = 4 }, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; - icon_state = "whitepurplecorner"; - dir = 4; - heat_capacity = 1e+006 - }, -/area/awaymission/UO71/science) -"kY" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -5160,7 +4797,6 @@ }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -5169,7 +4805,6 @@ "la" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -5177,7 +4812,6 @@ /area/awaymission/UO71/science) "lb" = ( /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -5186,8 +4820,7 @@ "lc" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-r-f (NORTH)" + initialize_directions = 14 }, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -5204,9 +4837,7 @@ "le" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -5270,16 +4901,14 @@ "lm" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8; - initialize_directions = 7; - tag = "icon-manifold-b-f (WEST)" + initialize_directions = 7 }, /obj/structure/sign/science{ pixel_x = -32 }, /turf/simulated/floor/plasteel{ dir = 8; - icon_state = "purplecorner"; - tag = "icon-purplecorner (WEST)" + icon_state = "purplecorner" }, /area/awaymission/UO71/centralhall) "ln" = ( @@ -5363,8 +4992,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/junction, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -5378,8 +5006,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-b-f (EAST)" + initialize_directions = 11 }, /turf/simulated/floor/plasteel{ icon_state = "bar" @@ -5401,8 +5028,7 @@ }, /turf/simulated/floor/plasteel{ dir = 4; - icon_state = "warndark"; - tag = "icon-warndark (EAST)" + icon_state = "warndark" }, /area/awaymission/UO71/gateway) "ly" = ( @@ -5410,8 +5036,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/gateway) @@ -5419,8 +5044,7 @@ /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; - tag = "" + icon_state = "1-4" }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/gateway) @@ -5435,8 +5059,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -5448,8 +5071,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -5459,8 +5081,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /turf/simulated/floor/plasteel{ @@ -5472,14 +5093,12 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/cable{ d1 = 2; d2 = 4; - icon_state = "2-4"; - tag = "" + icon_state = "2-4" }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/gateway) @@ -5489,8 +5108,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -5508,8 +5126,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -5523,8 +5140,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -5539,8 +5155,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /turf/simulated/floor/plasteel{ @@ -5553,8 +5168,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/firealarm{ dir = 1; @@ -5579,8 +5193,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1; @@ -5596,8 +5209,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -5619,8 +5231,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -5639,11 +5250,12 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /mob/living/simple_animal/hostile/poison/terror_spider/red{ wander = 0 }, @@ -5657,14 +5269,12 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/cable{ d1 = 2; d2 = 8; - icon_state = "2-8"; - tag = "" + icon_state = "2-8" }, /obj/structure/disposalpipe/segment{ dir = 4; @@ -5672,26 +5282,9 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-b-f (NORTH)" + initialize_directions = 14 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "whitepurplecorner" - }, -/area/awaymission/UO71/science) -"lP" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ dir = 2; @@ -5729,13 +5322,11 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/junction{ dir = 8; - icon_state = "pipe-j1"; - tag = "icon-pipe-j1 (EAST)" + icon_state = "pipe-j1" }, /obj/machinery/firealarm{ dir = 1; @@ -5755,8 +5346,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-b-f (NORTH)" + initialize_directions = 14 }, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -5775,9 +5365,8 @@ }, /area/awaymission/UO71/science) "lU" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 8; - on = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /turf/simulated/floor/plasteel{ dir = 2; @@ -5805,6 +5394,9 @@ dir = 1; network = list("UO71") }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plasteel{ dir = 2; icon_state = "whitepurplecorner" @@ -5847,8 +5439,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ dir = 8; - icon_state = "purple"; - tag = "icon-purple (WEST)" + icon_state = "purple" }, /area/awaymission/UO71/centralhall) "mc" = ( @@ -5861,7 +5452,6 @@ /area/awaymission/UO71/centralhall) "md" = ( /obj/structure/chair{ - tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4 }, @@ -5904,8 +5494,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -5914,20 +5503,6 @@ }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/centralhall) -"mh" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 2 - }, -/turf/simulated/floor/vault, -/area/awaymission/UO71/mother) -"mi" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/floor/vault, -/area/awaymission/UO71/mother) "mj" = ( /obj/machinery/suit_storage_unit/standard_unit, /turf/simulated/floor/plating, @@ -5940,8 +5515,7 @@ }, /turf/simulated/floor/plasteel{ dir = 4; - icon_state = "warndark"; - tag = "icon-warndark (EAST)" + icon_state = "warndark" }, /area/awaymission/UO71/gateway) "ml" = ( @@ -5953,8 +5527,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -5974,12 +5547,12 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/landmark/burnturf, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "mo" = ( @@ -6009,15 +5582,14 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, /area/awaymission/UO71/science) "ms" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/awaymission/UO71/science) @@ -6030,8 +5602,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "mu" = ( @@ -6061,20 +5632,8 @@ pixel_y = 0; req_access = null }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, /turf/simulated/floor/vault, /area/awaymission/UO71/mother) -"my" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/unary/vent_pump{ - icon_state = "weld"; - on = 1; - welded = 1 - }, -/turf/simulated/floor/vault, -/area/awaymission/UO71/prince) "mz" = ( /obj/machinery/light/small{ dir = 1 @@ -6102,8 +5661,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/loot) "mC" = ( @@ -6129,10 +5687,13 @@ pixel_x = -30; pixel_y = 0 }, -/obj/item/reagent_containers/food/pill/haloperidol, -/obj/item/reagent_containers/food/pill/haloperidol, -/obj/item/reagent_containers/food/pill/haloperidol, -/obj/item/reagent_containers/food/pill/haloperidol, +/obj/item/paper/terrorspiders4, +/obj/item/reagent_containers/food/pill/charcoal{ + pixel_x = 3 + }, +/obj/item/reagent_containers/food/pill/charcoal{ + pixel_x = -3 + }, /turf/simulated/floor/carpet, /area/awaymission/UO71/centralhall) "mF" = ( @@ -6164,7 +5725,6 @@ /obj/structure/chair/wood{ dir = 8 }, -/obj/item/paper/terrorspiders4, /turf/simulated/floor/carpet, /area/awaymission/UO71/centralhall) "mH" = ( @@ -6172,8 +5732,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -6223,8 +5782,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -6328,8 +5886,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -6337,6 +5894,7 @@ name = "Research Maintenance"; req_access_txt = "271" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "mX" = ( @@ -6357,8 +5915,7 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "mY" = ( @@ -6369,8 +5926,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "mZ" = ( @@ -6380,23 +5936,20 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "na" = ( /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "nb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "nc" = ( @@ -6406,20 +5959,11 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "nd" = ( /obj/structure/table, -/obj/machinery/door_control{ - desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; - id = "UO71_biohazard"; - name = "Biohazard Door Control"; - pixel_x = 0; - pixel_y = -6; - req_access_txt = "271" - }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "red" @@ -6431,6 +5975,12 @@ pixel_x = -30 }, /obj/item/book/manual/security_space_law, +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 1; + external_pressure_bound = 101.325; + on = 1; + pressure_checks = 1 + }, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "red" @@ -6480,7 +6030,6 @@ specialfunctions = 4 }, /obj/structure/chair/wood{ - tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1 }, @@ -6562,7 +6111,6 @@ /area/awaymission/UO71/eng) "ns" = ( /obj/structure/chair/comfy/black{ - tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4 }, @@ -6573,7 +6121,6 @@ /area/awaymission/UO71/centralhall) "nt" = ( /obj/structure/chair/comfy/black{ - tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8 }, @@ -6612,12 +6159,12 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "nz" = ( @@ -6630,8 +6177,7 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "nA" = ( @@ -6643,8 +6189,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "nB" = ( @@ -6668,7 +6213,6 @@ dir = 4 }, /turf/simulated/floor/plasteel{ - tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006 @@ -6679,8 +6223,7 @@ /obj/structure/chair, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "nE" = ( @@ -6716,8 +6259,7 @@ /obj/structure/cable{ d1 = 2; d2 = 4; - icon_state = "2-4"; - tag = "" + icon_state = "2-4" }, /obj/structure/disposalpipe/segment{ dir = 4; @@ -6726,6 +6268,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "nI" = ( @@ -6733,8 +6278,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -6742,6 +6286,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "nJ" = ( @@ -6749,12 +6296,12 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/landmark/burnturf, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "nK" = ( @@ -6762,8 +6309,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -6775,21 +6321,26 @@ req_access_txt = "0"; req_one_access_txt = "0" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "nL" = ( /obj/structure/cable{ d1 = 2; d2 = 8; - icon_state = "2-8"; - tag = "" + icon_state = "2-8" }, /obj/structure/disposalpipe/segment{ dir = 2; icon_state = "pipe-c" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4; + initialize_directions = 11 + }, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "neutral" @@ -6800,16 +6351,17 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-b-f (EAST)" + initialize_directions = 11 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, /turf/simulated/floor/plasteel{ dir = 9; @@ -6886,14 +6438,12 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-r-f (EAST)" + initialize_directions = 11 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/centralhall) @@ -6930,8 +6480,7 @@ /obj/structure/cable{ d1 = 2; d2 = 4; - icon_state = "2-4"; - tag = "" + icon_state = "2-4" }, /turf/simulated/floor/plating, /area/awaymission/UO71/eng) @@ -6939,21 +6488,18 @@ /obj/structure/cable{ d1 = 2; d2 = 4; - icon_state = "2-4"; - tag = "" + icon_state = "2-4" }, /obj/structure/cable{ d1 = 2; d2 = 8; - icon_state = "2-8"; - tag = "" + icon_state = "2-8" }, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /turf/simulated/floor/plating, /area/awaymission/UO71/eng) @@ -6961,8 +6507,7 @@ /obj/structure/cable{ d1 = 2; d2 = 8; - icon_state = "2-8"; - tag = "" + icon_state = "2-8" }, /turf/simulated/floor/plating, /area/awaymission/UO71/eng) @@ -6999,11 +6544,11 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "oh" = ( @@ -7023,8 +6568,7 @@ /obj/item/laser_pointer, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "oi" = ( @@ -7042,16 +6586,14 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "oj" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "ok" = ( @@ -7059,8 +6601,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/light/small{ dir = 4 @@ -7071,16 +6612,41 @@ /turf/simulated/floor/plasteel, /area/awaymission/UO71/centralhall) "ol" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/wall, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, /area/awaymission/UO71/science) "om" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/wall/rust, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, /area/awaymission/UO71/science) "on" = ( /obj/structure/table/reinforced, @@ -7095,8 +6661,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "oo" = ( @@ -7109,8 +6674,7 @@ /obj/item/pen, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "op" = ( @@ -7129,14 +6693,10 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "oq" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - on = 1 - }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/science) "or" = ( @@ -7168,14 +6728,16 @@ /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; - tag = "" + icon_state = "1-4" }, /obj/structure/disposalpipe/segment{ dir = 1; icon_state = "pipe-c" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5; + level = 1 + }, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "neutralcorner" @@ -7186,9 +6748,6 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, /obj/machinery/alarm/monitor{ dir = 4; frequency = 1439; @@ -7207,8 +6766,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7226,8 +6784,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7246,8 +6803,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7269,8 +6825,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7291,8 +6846,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/light/small{ dir = 1 @@ -7302,8 +6856,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-r-f (NORTH)" + initialize_directions = 14 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -7316,8 +6869,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7333,8 +6885,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7350,8 +6901,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/alarm/monitor{ frequency = 1439; @@ -7364,8 +6914,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-r-f (NORTH)" + initialize_directions = 14 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -7378,8 +6927,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7398,8 +6946,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7417,8 +6964,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7439,8 +6985,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7467,8 +7012,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7486,8 +7030,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/junction{ dir = 2; @@ -7519,18 +7062,15 @@ /obj/structure/cable{ d1 = 2; d2 = 8; - icon_state = "2-8"; - tag = "" + icon_state = "2-8" }, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/junction{ - tag = "icon-pipe-y (WEST)"; icon_state = "pipe-y"; dir = 8 }, @@ -7543,16 +7083,14 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-b-f (EAST)" + initialize_directions = 11 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/centralhall) @@ -7561,8 +7099,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /turf/simulated/floor/plating, /area/awaymission/UO71/eng) @@ -7620,8 +7157,7 @@ /obj/structure/filingcabinet/chestdrawer, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "oW" = ( @@ -7629,26 +7165,16 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/door_control{ - desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; - id = "UO71_biohazard"; - name = "Biohazard Door Control"; - pixel_x = 0; - pixel_y = 8; - req_access_txt = "271" - }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "oX" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "oY" = ( @@ -7659,28 +7185,17 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "oZ" = ( /obj/machinery/computer/aifixer, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "pa" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door_control{ - desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; - id = "UO71_biohazard"; - name = "Biohazard Door Control"; - pixel_x = 0; - pixel_y = -24; - req_access_txt = "271" - }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ icon_state = "red" @@ -7716,12 +7231,6 @@ }, /area/awaymission/UO71/science) "pd" = ( -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 2; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "red" @@ -7732,12 +7241,12 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "pf" = ( @@ -7757,8 +7266,7 @@ "ph" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-b-f (NORTH)" + initialize_directions = 14 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/centralhall) @@ -7871,8 +7379,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/alarm/monitor{ dir = 8; @@ -7896,8 +7403,7 @@ "pt" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8; - initialize_directions = 7; - tag = "icon-manifold-b-f (WEST)" + initialize_directions = 7 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -7919,8 +7425,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/light/small{ dir = 8 @@ -7968,8 +7473,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/light/small{ dir = 4 @@ -7992,42 +7496,28 @@ /turf/simulated/floor/plating, /area/awaymission/UO71/eng) "pB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, /turf/simulated/wall, /area/awaymission/UO71/science) -"pC" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/landmark/burnturf, -/turf/simulated/floor/plating, -/area/awaymission/UO71/science) "pD" = ( /obj/structure/cable{ d1 = 2; d2 = 4; - icon_state = "2-4"; - tag = "" + icon_state = "2-4" }, /obj/structure/disposalpipe/segment{ dir = 4; icon_state = "pipe-c" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light/small{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "pE" = ( @@ -8043,8 +7533,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "pF" = ( @@ -8055,8 +7544,7 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "pG" = ( @@ -8068,25 +7556,11 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/science) "pH" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/landmark/damageturf, +/obj/structure/reagent_dispensers/watertank, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "pI" = ( @@ -8183,8 +7657,7 @@ /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; - tag = "" + icon_state = "1-4" }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, @@ -8199,14 +7672,12 @@ /obj/structure/cable{ d1 = 2; d2 = 4; - icon_state = "2-4"; - tag = "" + icon_state = "2-4" }, /obj/structure/cable{ d1 = 2; d2 = 8; - icon_state = "2-8"; - tag = "" + icon_state = "2-8" }, /turf/simulated/floor/plating, /area/awaymission/UO71/eng) @@ -8214,10 +7685,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/wall, /area/awaymission/UO71/medical) -"pW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/wall/rust, -/area/awaymission/UO71/medical) "pX" = ( /turf/simulated/wall/rust, /area/awaymission/UO71/medical) @@ -8226,8 +7693,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /turf/simulated/floor/plating, /area/awaymission/UO71/eng) @@ -8235,8 +7701,7 @@ /obj/structure/cable{ d1 = 1; d2 = 8; - icon_state = "1-8"; - tag = "" + icon_state = "1-8" }, /turf/simulated/floor/plating, /area/awaymission/UO71/eng) @@ -8248,12 +7713,12 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "qc" = ( @@ -8290,8 +7755,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -8301,6 +7765,9 @@ dir = 4 }, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "qh" = ( @@ -8312,8 +7779,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -8326,6 +7792,9 @@ req_access_txt = "271" }, /obj/effect/landmark/damageturf, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/medical) "qj" = ( @@ -8490,8 +7959,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -8501,6 +7969,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/burnturf, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "qy" = ( @@ -8513,8 +7984,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/door/airlock/engineering/glass{ name = "SMES Room"; @@ -8561,8 +8031,7 @@ "qF" = ( /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/loot) "qG" = ( @@ -8582,7 +8051,6 @@ pixel_y = 23; req_access = null }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/item/hand_labeler, /obj/item/clothing/accessory/stethoscope, /turf/simulated/floor/plasteel{ @@ -8606,13 +8074,11 @@ "qK" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-b-f (EAST)" + initialize_directions = 11 }, /turf/simulated/floor/plasteel{ dir = 1; - icon_state = "purplecorner"; - tag = "icon-purplecorner (NORTH)" + icon_state = "purplecorner" }, /area/awaymission/UO71/centralhall) "qL" = ( @@ -8716,8 +8182,7 @@ /obj/structure/cable{ d1 = 1; d2 = 8; - icon_state = "1-8"; - tag = "" + icon_state = "1-8" }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/eng) @@ -8726,14 +8191,12 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/cable{ d1 = 2; d2 = 4; - icon_state = "2-4"; - tag = "" + icon_state = "2-4" }, /obj/effect/decal/cleanable/dirt, /obj/machinery/suit_storage_unit/engine, @@ -8748,7 +8211,7 @@ layer = 2.9 }, /obj/structure/closet/secure_closet/engineering_personal{ - req_access = list(201) + req_access = list(271) }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -8792,8 +8255,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/cyan, /turf/simulated/floor/plasteel{ dir = 9; - icon_state = "arrival"; - tag = "icon-arrival (NORTHWEST)" + icon_state = "arrival" }, /area/awaymission/UO71/eng) "ra" = ( @@ -8895,21 +8357,13 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, /area/awaymission/UO71/science) -"rh" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8; - initialize_directions = 7; - tag = "icon-manifold-b-f (WEST)" - }, -/turf/simulated/wall, -/area/awaymission/UO71/medical) "ri" = ( /obj/machinery/atmospherics/pipe/simple/visible{ dir = 4 @@ -8943,41 +8397,14 @@ icon_state = "dark" }, /area/awaymission/UO71/science) -"rl" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8; - initialize_directions = 11; - level = 1 - }, -/turf/simulated/wall/rust, -/area/awaymission/UO71/science) -"rm" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4; - level = 1 - }, -/turf/simulated/shuttle/wall{ - dir = 4; - icon_state = "wall3" - }, -/area/awaymission/UO71/bridge) "rn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4; - level = 1 - }, /turf/simulated/shuttle/wall{ dir = 4; icon_state = "wall3" }, /area/awaymission/UO71/bridge) "ro" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 8; - on = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 4; @@ -8996,7 +8423,6 @@ /area/awaymission/UO71/medical) "rq" = ( /obj/structure/chair{ - tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8 }, @@ -9006,14 +8432,6 @@ "rr" = ( /turf/simulated/floor/plasteel, /area/awaymission/UO71/bridge) -"rs" = ( -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 8; - on = 1; - scrub_Toxins = 1 - }, -/turf/simulated/floor/plasteel, -/area/awaymission/UO71/bridge) "rt" = ( /obj/structure/table/wood, /obj/machinery/newscaster{ @@ -9204,7 +8622,7 @@ name = "UO71 Engineering APC"; pixel_x = -25; pixel_y = 0; - req_access = list(201); + req_access = null; start_charge = 100 }, /obj/machinery/atmospherics/unary/vent_pump{ @@ -9226,14 +8644,12 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/cable{ d1 = 1; d2 = 8; - icon_state = "1-8"; - tag = "" + icon_state = "1-8" }, /obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 6; @@ -9321,8 +8737,7 @@ /obj/mecha/medical/odysseus, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/loot) "rX" = ( @@ -9334,8 +8749,7 @@ }, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/loot) "rY" = ( @@ -9347,10 +8761,8 @@ }, /area/awaymission/UO71/medical) "rZ" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8; - initialize_directions = 7; - tag = "icon-manifold-r-f (WEST)" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, /turf/simulated/floor/plasteel{ dir = 4; @@ -9457,14 +8869,12 @@ /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; - tag = "" + icon_state = "1-4" }, /obj/structure/cable{ d1 = 2; d2 = 4; - icon_state = "2-4"; - tag = "" + icon_state = "2-4" }, /obj/structure/disposalpipe/segment{ dir = 1; @@ -9479,8 +8889,7 @@ "sm" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8; - initialize_directions = 7; - tag = "icon-manifold-b-f (WEST)" + initialize_directions = 7 }, /obj/machinery/camera{ c_tag = "Engineering Hallway"; @@ -9494,8 +8903,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -9519,8 +8927,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -9533,8 +8940,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -9553,16 +8959,14 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-b-f (NORTH)" + initialize_directions = 14 }, /turf/simulated/floor/plasteel{ dir = 1; @@ -9574,8 +8978,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/alarm/monitor{ frequency = 1439; @@ -9599,8 +9002,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -9618,8 +9020,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -9644,8 +9045,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -9665,8 +9065,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -9684,8 +9083,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -9698,8 +9096,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -9723,8 +9120,7 @@ /obj/structure/cable{ d1 = 2; d2 = 8; - icon_state = "2-8"; - tag = "" + icon_state = "2-8" }, /obj/structure/disposalpipe/segment{ dir = 2; @@ -9738,8 +9134,7 @@ "sA" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-b-f (NORTH)" + initialize_directions = 14 }, /turf/simulated/floor/plasteel{ dir = 8; @@ -9778,8 +9173,7 @@ "sD" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-b-f (NORTH)" + initialize_directions = 14 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/eng) @@ -9815,8 +9209,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/meter{ frequency = 1443; @@ -9915,12 +9308,14 @@ d2 = 8; icon_state = "2-8" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plasteel{ icon_state = "white" }, /area/awaymission/UO71/medical) "sS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/power/apc/noalarm{ cell_type = 15000; dir = 8; @@ -9928,13 +9323,17 @@ name = "UO71 Medical APC"; pixel_x = -25; pixel_y = 0; - req_access = list(201); + req_access = null; start_charge = 100 }, /obj/structure/cable{ d2 = 4; icon_state = "0-4" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "whitehall" @@ -9975,6 +9374,10 @@ pixel_x = 0; pixel_y = -24 }, +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 8; + on = 1 + }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitehall" @@ -10019,13 +9422,11 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8; - initialize_directions = 7; - tag = "icon-manifold-r-f (WEST)" + initialize_directions = 7 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/centralhall) @@ -10113,8 +9514,7 @@ "tj" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-r-f (NORTH)" + initialize_directions = 14 }, /turf/simulated/floor/plasteel{ dir = 4; @@ -10126,14 +9526,12 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-r-f (NORTH)" + initialize_directions = 14 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/eng) @@ -10172,8 +9570,7 @@ "tn" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-r-f (NORTH)" + initialize_directions = 14 }, /obj/structure/table, /turf/simulated/floor/plasteel{ @@ -10207,8 +9604,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/atmospherics/pipe/manifold/visible/purple{ dir = 1 @@ -10308,77 +9704,12 @@ icon_state = "green" }, /area/awaymission/UO71/eng) -"tC" = ( -/obj/structure/cable{ - d1 = 2; - d2 = 8; - icon_state = "2-8"; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 2; - icon_state = "pipe-c" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/wall, -/area/awaymission/UO71/science) "tD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /turf/simulated/wall, /area/awaymission/UO71/science) -"tE" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/turf/simulated/wall, -/area/awaymission/UO71/medical) -"tF" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8; - initialize_directions = 7; - tag = "icon-manifold-b-f (WEST)" - }, -/turf/simulated/floor/plating, -/area/awaymission/UO71/science) -"tG" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 4; - icon_state = "1-4"; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 1; - icon_state = "pipe-c" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/awaymission/UO71/science) -"tH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/wall, -/area/awaymission/UO71/medical) -"tI" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/wall/rust, -/area/awaymission/UO71/medical) "tJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -10395,9 +9726,6 @@ /turf/simulated/floor/plasteel, /area/awaymission/UO71/eng) "tK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -10410,29 +9738,13 @@ }, /area/awaymission/UO71/medical) "tL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "whitehall" }, /area/awaymission/UO71/medical) -"tM" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - pixel_y = 0; - tag = "" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/plating, -/area/awaymission/UO71/science) "tN" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/poddoor{ @@ -10465,16 +9777,14 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/light/small{ dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-r-f (EAST)" + initialize_directions = 11 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/centralhall) @@ -10499,8 +9809,7 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/simulated/floor/plasteel{ dir = 1; - icon_state = "escape"; - tag = "icon-escape (NORTH)" + icon_state = "escape" }, /area/awaymission/UO71/eng) "tT" = ( @@ -10530,8 +9839,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -10559,8 +9867,7 @@ "tX" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8; - initialize_directions = 7; - tag = "icon-manifold-r-f (WEST)" + initialize_directions = 7 }, /obj/item/radio/off, /obj/item/screwdriver, @@ -10602,8 +9909,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/atmospherics/pipe/manifold/visible/purple{ dir = 4; @@ -10638,11 +9944,23 @@ /turf/simulated/floor/plasteel, /area/awaymission/UO71/eng) "uf" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5; level = 1 }, -/turf/simulated/wall/rust, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/plating, /area/awaymission/UO71/science) "ug" = ( /obj/machinery/atmospherics/binary/pump{ @@ -10666,48 +9984,18 @@ /turf/simulated/floor/plasteel, /area/awaymission/UO71/eng) "ui" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/door/airlock/engineering{ - name = "Engineering Maintenance"; - req_access_txt = "271" - }, -/obj/machinery/atmospherics/pipe/simple/visible/universal, -/turf/simulated/floor/plating, -/area/awaymission/UO71/science) -"uj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/awaymission/UO71/science) -"uk" = ( /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/awaymission/UO71/science) -"ul" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 4; - icon_state = "1-4"; - tag = "" - }, -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1; - icon_state = "pipe-c" + level = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -10720,8 +10008,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/door/poddoor/preopen{ id_tag = "UO71_Engineering"; @@ -10738,8 +10025,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -10747,7 +10033,10 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1; + level = 1 + }, /turf/simulated/floor/plating, /area/awaymission/UO71/science) "uo" = ( @@ -10755,8 +10044,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -10768,6 +10056,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -10777,22 +10068,22 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, /obj/structure/disposalpipe/junction{ - tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4 }, /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; - tag = "" + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /turf/simulated/floor/plasteel{ dir = 8; @@ -10804,14 +10095,14 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "whitehall" @@ -10825,12 +10116,6 @@ }, /turf/simulated/wall/rust, /area/awaymission/UO71/mining) -"us" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/wall, -/area/awaymission/UO71/science) "ut" = ( /turf/simulated/wall, /area/awaymission/UO71/outside) @@ -10853,16 +10138,18 @@ /obj/structure/cable{ d1 = 1; d2 = 8; - icon_state = "1-8"; - tag = "" + icon_state = "1-8" }, /obj/structure/disposalpipe/segment{ dir = 8; icon_state = "pipe-c" }, /obj/item/stack/rods, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + dir = 9 }, /turf/simulated/floor/plating, /area/awaymission/UO71/science) @@ -10924,8 +10211,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ @@ -10947,8 +10233,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -11025,8 +10310,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/atmospherics/binary/pump{ dir = 1; @@ -11112,8 +10396,7 @@ /turf/simulated/floor/plasteel{ burnt = 1; dir = 8; - icon_state = "floorscorched2"; - tag = "icon-floorscorched2 (WEST)" + icon_state = "floorscorched2" }, /area/awaymission/UO71/eng) "uU" = ( @@ -11121,8 +10404,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -11142,8 +10424,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 @@ -11232,14 +10513,12 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8; - initialize_directions = 7; - tag = "icon-manifold-r-f (WEST)" + initialize_directions = 7 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/eng) @@ -11256,8 +10535,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/door/airlock/engineering{ name = "Engineering"; @@ -11408,8 +10686,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -11516,16 +10793,14 @@ /obj/structure/cable{ d1 = 1; d2 = 8; - icon_state = "1-8"; - tag = "" + icon_state = "1-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -11536,8 +10811,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -11556,7 +10830,7 @@ pixel_y = -24 }, /obj/structure/closet/secure_closet/miner{ - req_access = list(201) + req_access = list(271) }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -11680,8 +10954,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ @@ -11709,8 +10982,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -11725,8 +10997,7 @@ /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; - tag = "" + icon_state = "1-4" }, /obj/structure/disposalpipe/segment{ dir = 1; @@ -11750,14 +11021,12 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/structure/cable{ d1 = 2; d2 = 4; - icon_state = "2-4"; - tag = "" + icon_state = "2-4" }, /obj/structure/disposalpipe/segment{ dir = 2; @@ -11765,8 +11034,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1; - initialize_directions = 14; - tag = "icon-manifold-b-f (NORTH)" + initialize_directions = 14 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/eng) @@ -11775,8 +11043,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /turf/simulated/floor/plasteel{ dir = 4; @@ -11821,8 +11088,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/eng) @@ -11831,8 +11097,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/door/airlock/engineering{ name = "Engineering"; @@ -11854,8 +11119,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -11920,8 +11184,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/door/airlock/mining/glass{ @@ -11957,8 +11220,7 @@ /obj/machinery/computer/station_alert, /turf/simulated/floor/plasteel{ dir = 10; - icon_state = "caution"; - tag = "icon-caution (SOUTHWEST)" + icon_state = "caution" }, /area/awaymission/UO71/eng) "wF" = ( @@ -11985,8 +11247,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -12020,8 +11281,7 @@ /turf/simulated/floor/plasteel{ burnt = 1; dir = 8; - icon_state = "floorscorched2"; - tag = "icon-floorscorched2 (WEST)" + icon_state = "floorscorched2" }, /area/awaymission/UO71/eng) "wL" = ( @@ -12168,8 +11428,7 @@ "xc" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-r-f (EAST)" + initialize_directions = 11 }, /obj/structure/closet/crate, /obj/item/stack/sheet/metal{ @@ -12184,8 +11443,7 @@ "xd" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-r-f (EAST)" + initialize_directions = 11 }, /obj/structure/cable, /turf/simulated/floor/plasteel, @@ -12227,15 +11485,13 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment, /obj/structure/cable{ d1 = 1; d2 = 8; - icon_state = "1-8"; - tag = "" + icon_state = "1-8" }, /obj/machinery/door/airlock/command/glass{ name = "Chief Engineer"; @@ -12318,8 +11574,7 @@ "xp" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-b-f (EAST)" + initialize_directions = 11 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/mining) @@ -12369,8 +11624,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/structure/disposalpipe/segment{ dir = 8; @@ -12395,8 +11649,7 @@ /obj/structure/cable{ d1 = 2; d2 = 4; - icon_state = "2-4"; - tag = "" + icon_state = "2-4" }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -12420,8 +11673,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel, @@ -12460,8 +11712,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ @@ -12518,8 +11769,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -12580,8 +11830,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /obj/machinery/light/small{ dir = 4 @@ -12652,7 +11901,7 @@ icon_state = "miningsec"; locked = 0; name = "miner's equipment"; - req_access = list(201) + req_access = list(271) }, /obj/item/storage/backpack/satchel_eng, /obj/item/clothing/gloves/fingerless, @@ -12674,16 +11923,14 @@ "xS" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4; - initialize_directions = 11; - tag = "icon-manifold-r-f (EAST)" + initialize_directions = 11 }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /turf/simulated/floor/plasteel{ dir = 2; @@ -12717,8 +11964,7 @@ /obj/structure/cable{ d1 = 2; d2 = 4; - icon_state = "2-4"; - tag = "" + icon_state = "2-4" }, /turf/simulated/floor/plasteel{ dir = 2; @@ -12755,8 +12001,7 @@ /obj/structure/cable{ d1 = 1; d2 = 8; - icon_state = "1-8"; - tag = "" + icon_state = "1-8" }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -12776,8 +12021,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/mining) @@ -12904,8 +12148,7 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/mining) @@ -12959,15 +12202,13 @@ "yt" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8; - initialize_directions = 7; - tag = "icon-manifold-r-f (WEST)" + initialize_directions = 7 }, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; - tag = "" + pixel_y = 0 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/mining) @@ -12997,8 +12238,7 @@ /turf/simulated/floor/plasteel{ burnt = 1; dir = 8; - icon_state = "floorscorched2"; - tag = "icon-floorscorched2 (WEST)" + icon_state = "floorscorched2" }, /area/awaymission/UO71/mining) "yx" = ( @@ -13021,16 +12261,14 @@ /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; - tag = "" + icon_state = "1-4" }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/mining) "yB" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8; - initialize_directions = 7; - tag = "icon-manifold-b-f (WEST)" + initialize_directions = 7 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/mining) @@ -13049,8 +12287,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/mining) @@ -13066,8 +12303,7 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_x = 0; - tag = "" + pixel_x = 0 }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/mining) @@ -13087,8 +12323,7 @@ /obj/structure/cable{ d1 = 2; d2 = 8; - icon_state = "2-8"; - tag = "" + icon_state = "2-8" }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/mining) @@ -13096,20 +12331,17 @@ /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; - tag = "" + icon_state = "1-4" }, /obj/structure/cable{ d1 = 1; d2 = 8; - icon_state = "1-8"; - tag = "" + icon_state = "1-8" }, /turf/simulated/floor/mech_bay_recharge_floor, /area/awaymission/UO71/mining) "yI" = ( /obj/machinery/mech_bay_recharge_port{ - tag = "icon-recharge_port (WEST)"; icon_state = "recharge_port"; dir = 8 }, @@ -13219,13 +12451,6 @@ }, /turf/simulated/floor/plasteel, /area/awaymission/UO71/queen) -"yX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/shuttle/wall{ - dir = 4; - icon_state = "wall3" - }, -/area/awaymission/UO71/outside) "yY" = ( /obj/structure/sign/biohazard, /turf/simulated/shuttle/wall{ @@ -13253,16 +12478,16 @@ }, /area/awaymission/UO71/outside) "zd" = ( -/turf/simulated/shuttle/wall{ - dir = 4; - icon_state = "wall3" +/turf/unsimulated/wall{ + icon_state = "rock"; + name = "rock" }, /area/awaymission/UO71/queen) "ze" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/shuttle/wall{ - dir = 4; - icon_state = "wall3" +/turf/unsimulated/wall{ + icon_state = "rock"; + name = "rock" }, /area/awaymission/UO71/queen) "zf" = ( @@ -13281,8 +12506,7 @@ "zj" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8; - initialize_directions = 7; - tag = "icon-manifold-b-f (WEST)" + initialize_directions = 7 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -13385,14 +12609,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/wall, /area/awaymission/UO71/queen) -"zH" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8; - initialize_directions = 7; - tag = "icon-manifold-r-f (WEST)" - }, -/turf/simulated/wall, -/area/awaymission/UO71/science) "zM" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/mineral/random/labormineral, @@ -13408,8 +12624,7 @@ /obj/item/paper/researchnotes, /turf/simulated/floor/plasteel{ dir = 5; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" + icon_state = "cafeteria" }, /area/awaymission/UO71/loot) "zP" = ( @@ -13457,7 +12672,6 @@ "zX" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/chair/wood{ - tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4 }, @@ -13469,7 +12683,6 @@ /area/awaymission/UO71/queen) "zZ" = ( /obj/structure/chair/wood{ - tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4 }, @@ -13490,7 +12703,6 @@ /area/awaymission/UO71/queen) "Ac" = ( /obj/structure/chair/wood{ - tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1 }, @@ -13523,12 +12735,270 @@ /obj/machinery/light, /turf/simulated/floor/wood, /area/awaymission/UO71/queen) -"Ai" = ( +"AW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "green" + }, +/area/awaymission/UO71/plaza) +"BE" = ( +/obj/machinery/door/poddoor{ + id_tag = "UO71_Containment"; + name = "Containment 1" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/mother) +"CA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/plaza) +"CE" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/awaymission/UO71/science) +"CI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4; + initialize_directions = 11 + }, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/plaza) +"CP" = ( +/obj/structure/grille, +/obj/structure/window/full/reinforced, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/awaymission/UO71/plaza) +"Eb" = ( +/obj/machinery/atmospherics/unary/vent_pump{ + icon_state = "weld"; + on = 1; + welded = 1 + }, +/turf/simulated/floor/vault, +/area/awaymission/UO71/prince) +"Fu" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/mother) +"Gl" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4; + initialize_directions = 11 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/plaza) +"GY" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering Maintenance"; + req_access_txt = "271" + }, +/obj/machinery/atmospherics/pipe/simple/visible/universal, +/turf/simulated/floor/plating, +/area/awaymission/UO71/science) +"HH" = ( +/obj/effect/decal/warning_stripes/west, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/awaymission/UO71/science) +"Io" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/plaza) +"Iq" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "0"; + req_one_access_txt = "0" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/awaymission/UO71/plaza) +"IL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/wall/rust, +/area/awaymission/UO71/science) +"IU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5; + level = 2 + }, +/turf/simulated/floor/plating, +/area/awaymission/UO71/plaza) +"Jo" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/wall/r_wall, +/area/awaymission/UO71/prince) +"KE" = ( +/obj/structure/spider/cocoon{ + icon_state = "cocoon_large1" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/vault, +/area/awaymission/UO71/prince) +"Lf" = ( +/turf/unsimulated/wall{ + icon_state = "rock"; + name = "rock" + }, +/area/awaymission/UO71/loot) +"Lw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/plaza) +"LR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/centralhall) +"Mh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/plaza) +"NA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/vault, +/area/awaymission/UO71/prince) +"Of" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/plaza) +"Pk" = ( +/turf/simulated/floor/plating, +/area/awaymission/UO71/science) +"Pv" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1; - level = 1 + initialize_directions = 14 + }, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/plaza) +"PS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/mother) +"Rk" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 1; + external_pressure_bound = 101.325; + on = 1; + pressure_checks = 1 + }, +/turf/simulated/floor/carpet, +/area/awaymission/UO71/plaza) +"Sz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "red" + }, +/area/awaymission/UO71/plaza) +"Ug" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/plaza) +"UF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/shuttle/wall{ + dir = 4; + icon_state = "wall3" + }, +/area/awaymission/UO71/outside) +"Vz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /turf/simulated/wall, +/area/awaymission/UO71/centralhall) +"VA" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/awaymission/UO71/plaza) +"We" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "whitepurplecorner" + }, +/area/awaymission/UO71/science) +"Xq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/mineral/random/labormineral, +/area/awaymission/UO71/outside) +"ZV" = ( +/obj/structure/grille, +/obj/structure/window/full/reinforced, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, /area/awaymission/UO71/science) (1,1,1) = {" @@ -13633,7 +13103,7 @@ aa aa aa aa -zc +aa aa aa aa @@ -13783,7 +13253,7 @@ aa aa aa aa -zc +aa aa aa aa @@ -13933,7 +13403,7 @@ aa aa aa aa -zc +aa aa aa aa @@ -14083,7 +13553,7 @@ aa aa aa aa -zc +aa aa aa aa @@ -14233,7 +13703,7 @@ aa aa aa aa -zc +aa aa aa aa @@ -14383,7 +13853,7 @@ aa aa aa aa -zc +aa aa aa aa @@ -14533,7 +14003,7 @@ aa aa aa aa -zc +aa aa aa aa @@ -14683,7 +14153,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -14833,7 +14303,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -14983,7 +14453,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -15133,7 +14603,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -15283,7 +14753,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -15433,7 +14903,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -15583,7 +15053,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -15733,7 +15203,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -15883,7 +15353,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -16033,7 +15503,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -16183,7 +15653,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -16333,7 +15803,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -16483,7 +15953,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -16633,7 +16103,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -16783,7 +16253,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -16933,7 +16403,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -17083,7 +16553,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -17233,7 +16703,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -17383,7 +16853,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -17533,7 +17003,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -17683,7 +17153,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -17833,7 +17303,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -17934,8 +17404,8 @@ ab ab ab ga -gp -gp +gq +gU gp hV ga @@ -17983,7 +17453,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -18084,16 +17554,16 @@ ab ab ab ga -gq -gU -gp -gp -iO -jn -jK +hG +hW +hW +hW +Fu +PS +BE kf -kJ -lH +kP +lI fO fO fO @@ -18133,7 +17603,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -18234,10 +17704,10 @@ ab ab ab ga -hG -hW -hW -mi +gp +gp +gp +gp iO jn jK @@ -18283,7 +17753,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -18387,7 +17857,7 @@ ga gp gp gp -mh +hV ga jg jG @@ -18433,7 +17903,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -18538,11 +18008,11 @@ gp gp gp mx -iF -ji -ji -kh -kP +ga +fO +fO +fN +kJ lN fO mT @@ -18583,7 +18053,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -18706,6 +18176,7 @@ fO fN fN fN +fN fO fN fO @@ -18732,8 +18203,7 @@ ab ab ab ab -ab -zc +aa ab ab ab @@ -18842,21 +18312,22 @@ fN fO fO kr -lc -lP +ld +lH ms -mR -mR -km -km +fN +fN +fO +fO pD qb mn rg pe rg -tG +rg uf +fN rP sE uv @@ -18882,8 +18353,7 @@ ab ab ab ab -ab -zc +aa ab ab ab @@ -18990,9 +18460,9 @@ hC cO iP jo -jL -kj -kV +jM +lb +lc lO mr mW @@ -19000,13 +18470,14 @@ ny og jQ jZ -ji -kh -ji -kh -kh -tF +fO +fO +fO +fO +fO +fO ui +GY rR vm uK @@ -19032,8 +18503,7 @@ ab ab ab ab -ab -zc +aa ab ab ab @@ -19138,7 +18608,7 @@ gy ah ig cV -iQ +jp jp jN kt @@ -19155,8 +18625,9 @@ qu ra qu fO -pC +fO ol +fO rS tp uO @@ -19182,8 +18653,7 @@ ab ab ab ab -ab -zc +aa ab ab ab @@ -19307,6 +18777,7 @@ rQ fO pH om +fN fO fO fN @@ -19332,8 +18803,7 @@ ab ab ab ab -ab -zc +aa ab ab ab @@ -19436,7 +18906,7 @@ fN gj gA ap -ap +HH gZ fO fO @@ -19455,9 +18925,9 @@ mu rj mu fO -nI -om -fO +CE +ol +fN ab ab ab @@ -19483,7 +18953,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -19605,8 +19075,8 @@ qB ri rU fN -nI -uj +Pk +ol fO ab ab @@ -19633,7 +19103,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -19744,7 +19214,7 @@ ab fO kN lV -fO +km nb nD oo @@ -19755,8 +19225,8 @@ qC rk rV fN -tC -ul +fO +ol fO ab ab @@ -19783,7 +19253,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -19886,7 +19356,7 @@ ab fO fN fN -fN +IL fN fO ab @@ -19905,8 +19375,8 @@ pT pT pT pT -tD -uk +fO +ol qa qa qa @@ -19933,7 +19403,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -20036,14 +19506,14 @@ ab ab ab ab -ab +Xq ab ab ab ab fO kJ -lX +lU fO nc na @@ -20055,7 +19525,7 @@ qF qF rX pT -Ai +fO un pV vq @@ -20083,7 +19553,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -20186,7 +19656,7 @@ zc zc zc zc -zc +UF zc zc zc @@ -20205,7 +19675,7 @@ zO qF rW sN -tD +fO qg pX vp @@ -20233,7 +19703,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -20336,15 +19806,15 @@ fP fP fP fP +Jo fP -id -iI -yX -jl -km -kY -lX -mu +fP +zc +ab +fO +kJ +We +ZV ne nF or @@ -20355,8 +19825,8 @@ pT pT pT pT -tD -uk +fO +ol pX vs qJ @@ -20383,7 +19853,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -20487,7 +19957,7 @@ gd gd gd hD -ie +gd fP zc ab @@ -20500,12 +19970,12 @@ nE oq pa pB -pV -pV -rh -pV -pV -tE +qa +qa +qa +qa +qa +qa uo qa vr @@ -20533,7 +20003,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -20636,7 +20106,7 @@ fP gd gd gd -ge +KE gd fP zc @@ -20649,8 +20119,8 @@ nf nG os pd -km -pW +fO +pX qH ro rZ @@ -20683,7 +20153,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -20786,7 +20256,7 @@ fP ge ge gd -gd +NA if fP yY @@ -20833,7 +20303,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -20919,10 +20389,10 @@ ac ce cn cG -cD -cb -cb -dM +bK +bI +bI +aY ac ab ab @@ -20936,7 +20406,7 @@ fP gf gx gd -ge +KE gd iR jq @@ -20955,7 +20425,7 @@ qJ qJ sc sU -tH +qa qi pX pX @@ -20983,7 +20453,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -21069,7 +20539,7 @@ ac bF bI cF -ca +bI ac ac dL @@ -21086,7 +20556,7 @@ fP gd gd gd -gd +NA gd iR jq @@ -21105,7 +20575,7 @@ qI rp sb sT -tI +qa qx fN ab @@ -21133,7 +20603,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -21219,14 +20689,14 @@ ac cf cp cG -bN +bF ac dw -dO +ec dZ ej ev -cU +ac eV fm ad @@ -21236,9 +20706,9 @@ fP gd gd ge -gd -my -iK +NA +if +fP yY jG ke @@ -21255,8 +20725,8 @@ qa qa qa qa -tI -uk +qa +ol fN ab ab @@ -21283,7 +20753,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -21363,20 +20833,20 @@ aQ aZ bi br -bx -bJ -bW -bW +ac +aY +ac +ac cm -cH -bQ -bW +cG +aY +ac dv -dN +ar dY -bv +al eu -bV +ad eU fl ac @@ -21385,10 +20855,10 @@ zc fP gd gd -gd +Eb hE ge -iL +fP zc ab fO @@ -21405,7 +20875,7 @@ og nJ kB og -tM +og uw fN ab @@ -21433,7 +20903,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -21513,13 +20983,13 @@ aR bc ac ad -by +ac bM cb cc cd cb -cT +IU ad dy dP @@ -21528,7 +20998,7 @@ el ew ad eX -bC +Rk ac ab zc @@ -21536,9 +21006,9 @@ fP fP fP fP +Jo fP fP -iL zc ab fO @@ -21547,16 +21017,16 @@ gA kR mR jC -zH -mR -mR -km -mR -rl -mR -mR -km -us +fO +fN +fN +fO +fN +fN +fN +fN +fO +fO fN ab ab @@ -21583,7 +21053,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -21663,19 +21133,19 @@ aQ bb bj bs -bz +ad bL ad ad ac ad -ba +Iq ad dx at ea ek -at +CP ac eW ac @@ -21686,9 +21156,9 @@ zc zc zc zc +UF zc zc -jm zc ab fN @@ -21697,12 +21167,12 @@ gA lh fO nI -ol fO fO fO fO -rm +fO +sa sa sa sa @@ -21733,7 +21203,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -21813,21 +21283,21 @@ ad bd ac ad -bz +ad bO -bY +ad ch cs ac -ar +Of af al dQ -ec +Sz ec ex aw -eY +Ug fn ad ab @@ -21836,9 +21306,9 @@ ab ab ab ab +Xq ab ab -iM ab ab fO @@ -21847,12 +21317,12 @@ gA li fO nI -om +fN fO fO fO fO -rm +sa sg rr sa @@ -21883,7 +21353,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -21963,7 +21433,7 @@ aS aw al ar -by +ac bN ac cg @@ -21971,14 +21441,14 @@ cr cI ae dd -al -al -al -al -al -al -eY -al +CA +CA +CI +CA +Gl +CA +bG +Lw ac fb fb @@ -21986,9 +21456,9 @@ fb fb fe fb +Vz fb -fb -iN +fe fe fb fO @@ -21997,12 +21467,12 @@ lZ tD fN nK -om +fN fb fb fb fb -rm +sa sf rr sa @@ -22033,7 +21503,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -22113,14 +21583,14 @@ aU be bl bt -bA +ac bQ bW ci ct ac ar -df +Pv dA ay ed @@ -22128,17 +21598,17 @@ em ey eK bH -al -cJ -fF -fR -fF -fR -gD -hf +df +Mh +LR hJ +LR +hJ +gD hJ iS +hJ +hJ js jP ku @@ -22183,7 +21653,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -22263,14 +21733,14 @@ aT ac bk al -bz +ad bP ad ac ac ad al -al +bS dz dR dR @@ -22302,7 +21772,7 @@ ll pI jf zP -rm +sa se sa sa @@ -22333,7 +21803,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -22413,14 +21883,14 @@ aW ac bn bv -bH -bS +bv +Io aw ar ar cJ al -al +bS dz dR ef @@ -22452,7 +21922,7 @@ ll fR qk zQ -rs +rr si rr tO @@ -22483,7 +21953,7 @@ ab ab ab ab -zc +aa ab ab uW @@ -22563,14 +22033,14 @@ aV ac bm bu -bG -bR +bu +VA al al al cJ al -al +bS dz dR ee @@ -22633,7 +22103,7 @@ ab ab ab ab -zc +aa ab ab uW @@ -22713,14 +22183,14 @@ aT ac bp ar -by +ac bP ac ad ac ac cW -al +bS dC dR dR @@ -22783,7 +22253,7 @@ ab ab ab ab -zc +aa ab ab uW @@ -22863,14 +22333,14 @@ aX aX bo bw -by -bT -bY -cj +ac +bL +ad +aF cu ac al -dg +Pv dB dS eg @@ -22933,7 +22403,7 @@ ab ab ab ab -zc +aa ab ab uW @@ -23013,14 +22483,14 @@ al bf al al -bz +ad bU ac cl cr cM bu -di +bR dE dT dT @@ -23083,7 +22553,7 @@ ab ab ab ab -zc +aa ab ab uW @@ -23163,14 +22633,14 @@ ac ac ad bB -bD +ad bX bV ck cv ac cX -dh +AW dD dh dh @@ -23233,7 +22703,7 @@ ab ab ab ab -zc +aa ab ab uW @@ -23313,14 +22783,14 @@ ac bh bq bq -by +ac ca ad ac ad ad ac -at +CP dG dU at @@ -23383,7 +22853,7 @@ ab ab ab ab -zc +aa ab ab uW @@ -23463,14 +22933,14 @@ ac bg aH bC -by +ac bZ cc cd -cc +IU cN ac -at +CP dF al at @@ -23533,7 +23003,7 @@ ab ab ab ab -zc +aa ab ab uW @@ -23613,12 +23083,12 @@ ac ac ac ac -bE -bV -bW -bW -cx -ca +ac +ad +ac +ac +bL +bI ad dk dH @@ -23683,7 +23153,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -23768,8 +23238,8 @@ ab ab ac cw -cy -cU +bK +ac dj bu dV @@ -23833,7 +23303,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -23918,7 +23388,7 @@ ab ab ad cw -cK +ac ac dm dI @@ -23983,7 +23453,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -24068,7 +23538,7 @@ ab ab ac cw -cK +ac cY dl ar @@ -24133,7 +23603,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -24218,7 +23688,7 @@ ab ab ad cw -cK +ac da do dI @@ -24283,7 +23753,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -24368,7 +23838,7 @@ ab ab ac cw -cL +ad cZ dn al @@ -24518,7 +23988,7 @@ ab ab ad cw -cK +ac dc do dI @@ -24668,7 +24138,7 @@ ab ab ad co -cL +ad db dp al @@ -24818,7 +24288,7 @@ ab ab ac cA -cL +ad ad dr dI @@ -24967,12 +24437,12 @@ ab ab ab ac -cz -cP -bV +bL +cF +ad dq dJ -dW +dT eh dT eG @@ -25118,7 +24588,7 @@ ab ab ad cq -bL +aY ac dt dh @@ -25139,7 +24609,7 @@ hq hQ gk gk -jw +fb jY fb fb @@ -25268,7 +24738,7 @@ ab ab ad cC -bN +bF ad ds dK @@ -25289,7 +24759,7 @@ hp gk gk fU -jw +fb jX it fb @@ -25418,7 +24888,7 @@ ab ab ad cC -bL +aY ac ac ac @@ -25439,7 +24909,7 @@ hs hR ir iX -jx +fe ka kD fe @@ -25568,7 +25038,7 @@ ab ab ac cE -cQ +cc cb cR cd @@ -25589,7 +25059,7 @@ hr fb fe fb -jx +fe is kC fe @@ -25717,18 +25187,18 @@ ab ab ab ac -cB -bW -bV -bV -bW -bV -bV -bW -bV -bV -fh -fu +ad +ac +ad +ad +ac +ad +ad +ac +ad +ad +fe +fb fD fK fx @@ -25739,7 +25209,7 @@ ht gb fy iY -gm +de kb fe fe @@ -25878,18 +25348,18 @@ ab ab ab ab -fv -fh -fh -fh -fX -fX -fh -fh -fh -fh -fh -jz +fb +fe +fe +fe +fb +fb +fe +fe +fe +fe +fe +fb fe fb ab @@ -26383,7 +25853,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -26533,7 +26003,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -26683,7 +26153,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -26833,7 +26303,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -26983,7 +26453,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -27133,7 +26603,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -27283,7 +26753,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -27433,7 +26903,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -27583,7 +27053,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -27733,7 +27203,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -27883,7 +27353,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -28033,7 +27503,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -28183,7 +27653,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -28333,7 +27803,7 @@ ab ab ab ab -pT +Lf pT pT pT @@ -28483,7 +27953,7 @@ ab ab ab ab -pT +Lf zo zt zv @@ -28633,7 +28103,7 @@ ab ab ab ab -pT +Lf zn zs zs @@ -28783,7 +28253,7 @@ ab ab ab ab -pT +Lf zp zu zs @@ -28933,7 +28403,7 @@ ab ab ab ab -pT +Lf pT pT pT @@ -29083,7 +28553,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -29233,7 +28703,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -29383,7 +28853,7 @@ ab ab ab ab -zc +aa ab ab zr @@ -29533,7 +29003,7 @@ ab ab ab ab -zc +aa ab ab uW @@ -29683,7 +29153,7 @@ ab ab ab ab -zc +aa ab ab uW @@ -29833,7 +29303,7 @@ ab ab ab ab -zc +aa ab ab uW @@ -29983,7 +29453,7 @@ ab ab ab ab -zc +aa ab zr uW @@ -30133,7 +29603,7 @@ ab ab ab ab -zc +aa ab uW zr @@ -30283,7 +29753,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -30433,7 +29903,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -30583,7 +30053,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -30733,7 +30203,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -30883,7 +30353,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -31033,7 +30503,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -31183,7 +30653,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -31333,7 +30803,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -31483,7 +30953,7 @@ ab ab ab ab -zc +aa ab ab ab @@ -31632,8 +31102,8 @@ aa aa aa aa -ab -zc +aa +aa aa aa aa @@ -31782,8 +31252,8 @@ aa aa aa aa -ab -zc +aa +aa aa aa aa @@ -31932,8 +31402,8 @@ aa aa aa aa -ab -zc +aa +aa aa aa aa @@ -32082,8 +31552,8 @@ aa aa aa aa -ab -zc +aa +aa aa aa aa @@ -32232,8 +31702,8 @@ aa aa aa aa -ab -zc +aa +aa aa aa aa @@ -32382,8 +31852,8 @@ aa aa aa aa -ab -zc +aa +aa aa aa aa @@ -32532,8 +32002,8 @@ aa aa aa aa -ab -zc +aa +aa aa aa aa diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index de20ccd1a4c..0c7e32a0a76 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -3,6 +3,7 @@ #define GAS_PL (1 << 2) #define GAS_CO2 (1 << 3) #define GAS_N2O (1 << 4) +#define GAS_A_B (1 << 5) //ATMOS //stuff you should probably leave well alone! diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 2f98b6ee7b5..b7e89e678ed 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -36,6 +36,7 @@ #define PASSEMOTES 16 //Mob has a cortical borer or holders inside of it that need to see emotes. #define GOTTAGOFAST 32 #define IGNORESLOWDOWN 128 +#define IGNORE_SPEED_CHANGES 256 #define GODMODE 4096 #define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath #define XENO_HOST 16384 //Tracks whether we're gonna be a baby alien's mummy. diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 26b1d2d44aa..4b10bee2a2b 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -198,6 +198,8 @@ // /area signals +///from base of area/proc/power_change(): () +#define COMSIG_AREA_POWER_CHANGE "area_power_change" ///from base of area/Entered(): (atom/movable/M) #define COMSIG_AREA_ENTERED "area_entered" ///from base of area/Exited(): (atom/movable/M) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 0a36db1b185..e04a95bcae2 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -363,7 +363,7 @@ #define INVESTIGATE_BOMB "bombs" // The SQL version required by this version of the code -#define SQL_VERSION 12 +#define SQL_VERSION 13 // Vending machine stuff #define CAT_NORMAL 1 @@ -429,6 +429,10 @@ // Filters #define FILTER_AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, color="#04080FAA") +#define FILTER_EYE_BLUR filter(type="blur", size=0) + +#define AMBIENT_OCCLUSION_FILTER_KEY "ambient occlusion" +#define EYE_BLUR_FILTER_KEY "eye blur" //Fullscreen overlay resolution in tiles. #define FULLSCREEN_OVERLAY_RESOLUTION_X 15 diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index eb5fad0ff27..7d8528d2da3 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -12,34 +12,57 @@ #define SOUND_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|SOUND_HEARTBEAT|SOUND_BUZZ|SOUND_INSTRUMENTS|SOUND_MENTORHELP|SOUND_DISCO|SOUND_AI_VOICE) -#define CHAT_OOC 1 -#define CHAT_DEAD 2 -#define CHAT_GHOSTEARS 4 -#define CHAT_GHOSTSIGHT 8 -#define CHAT_PRAYER 16 -#define CHAT_RADIO 32 -#define AZERTY 64 -#define CHAT_DEBUGLOGS 128 -#define CHAT_LOOC 256 -#define CHAT_GHOSTRADIO 512 -#define SHOW_TYPING 1024 -#define DISABLE_SCOREBOARD 2048 -#define DISABLE_KARMA_REMINDER 4096 -#define MEMBER_PUBLIC 8192 -#define CHAT_NO_ADMINLOGS 16384 -#define DONATOR_PUBLIC 32768 -#define CHAT_NO_TICKETLOGS 65536 -#define UI_DARKMODE 131072 -#define DISABLE_KARMA 262144 -#define CHAT_NO_MENTORTICKETLOGS 524288 -#define TYPING_ONCE 1048576 -#define AMBIENT_OCCLUSION 2097152 -#define CHAT_GHOSTPDA 4194304 -#define NUMPAD_TARGET 8388608 -#define TOGGLES_TOTAL 16777215 // If you add or remove a preference toggle above, make sure you update this define with the total value of the toggles combined. +#define PREFTOGGLE_CHAT_OOC 1 +#define PREFTOGGLE_CHAT_DEAD 2 +#define PREFTOGGLE_CHAT_GHOSTEARS 4 +#define PREFTOGGLE_CHAT_GHOSTSIGHT 8 +#define PREFTOGGLE_CHAT_PRAYER 16 +#define PREFTOGGLE_CHAT_RADIO 32 +#define PREFTOGGLE_AZERTY 64 +#define PREFTOGGLE_CHAT_DEBUGLOGS 128 +#define PREFTOGGLE_CHAT_LOOC 256 +#define PREFTOGGLE_CHAT_GHOSTRADIO 512 +#define PREFTOGGLE_SHOW_TYPING 1024 +#define PREFTOGGLE_DISABLE_SCOREBOARD 2048 +#define PREFTOGGLE_DISABLE_KARMA_REMINDER 4096 +#define PREFTOGGLE_MEMBER_PUBLIC 8192 +#define PREFTOGGLE_CHAT_NO_ADMINLOGS 16384 +#define PREFTOGGLE_DONATOR_PUBLIC 32768 +#define PREFTOGGLE_CHAT_NO_TICKETLOGS 65536 +#define PREFTOGGLE_UI_DARKMODE 131072 +#define PREFTOGGLE_DISABLE_KARMA 262144 +#define PREFTOGGLE_CHAT_NO_MENTORTICKETLOGS 524288 +#define PREFTOGGLE_TYPING_ONCE 1048576 +#define PREFTOGGLE_AMBIENT_OCCLUSION 2097152 +#define PREFTOGGLE_CHAT_GHOSTPDA 4194304 +#define PREFTOGGLE_NUMPAD_TARGET 8388608 + +#define TOGGLES_TOTAL 16777215 // If you add or remove a preference toggle above, make sure you update this define with the total value of the toggles combined. + +#define TOGGLES_DEFAULT (PREFTOGGLE_CHAT_OOC|PREFTOGGLE_CHAT_DEAD|PREFTOGGLE_CHAT_GHOSTEARS|PREFTOGGLE_CHAT_GHOSTSIGHT|PREFTOGGLE_CHAT_PRAYER|PREFTOGGLE_CHAT_RADIO|PREFTOGGLE_CHAT_LOOC|PREFTOGGLE_MEMBER_PUBLIC|PREFTOGGLE_DONATOR_PUBLIC|PREFTOGGLE_AMBIENT_OCCLUSION|PREFTOGGLE_CHAT_GHOSTPDA|PREFTOGGLE_NUMPAD_TARGET) + +// toggles_2 variables. These MUST be prefixed with PREFTOGGLE_2 +#define PREFTOGGLE_2_RANDOMSLOT 1 +#define PREFTOGGLE_2_FANCYUI 2 +#define PREFTOGGLE_2_ITEMATTACK 4 +#define PREFTOGGLE_2_WINDOWFLASHING 8 +#define PREFTOGGLE_2_ANONDCHAT 16 +#define PREFTOGGLE_2_AFKWATCH 32 + +#define TOGGLES_2_TOTAL 63 // If you add or remove a preference toggle above, make sure you update this define with the total value of the toggles combined. + +#define TOGGLES_2_DEFAULT (PREFTOGGLE_2_FANCYUI|PREFTOGGLE_2_ITEMATTACK|PREFTOGGLE_2_WINDOWFLASHING) + +// Sanity checks +#if TOGGLES_TOTAL > 16777215 +#error toggles bitflag over 16777215. Please use toggles_2. +#endif + +#if TOGGLES_2_TOTAL > 16777215 +#error toggles_2 bitflag over 16777215. Please make an issue report and postpone the feature you are working on. +#endif -#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC|AMBIENT_OCCLUSION|CHAT_GHOSTPDA|NUMPAD_TARGET) // Admin attack logs filter system, see /proc/add_attack_logs and /proc/msg_admin_attack #define ATKLOG_ALL 0 diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index a3154834fe4..32fe8b70b2d 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -39,7 +39,7 @@ GLOBAL_VAR_INIT(log_end, (world.system_type == UNIX ? ascii2text(13) : "")) WRITE_LOG(GLOB.world_game_log, "DEBUG: [text][GLOB.log_end]") for(var/client/C in GLOB.admins) - if(check_rights(R_DEBUG, 0, C.mob) && (C.prefs.toggles & CHAT_DEBUGLOGS)) + if(check_rights(R_DEBUG, 0, C.mob) && (C.prefs.toggles & PREFTOGGLE_CHAT_DEBUGLOGS)) to_chat(C, "DEBUG: [text]") /proc/log_game(text) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 62c97f8807c..150de317bb1 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -229,7 +229,7 @@ var/turf/ear = get_turf(M) if(ear) // Ghostship is magic: Ghosts can hear radio chatter from anywhere - if(speaker_coverage[ear] || (istype(M, /mob/dead/observer) && M.get_preference(CHAT_GHOSTRADIO))) + if(speaker_coverage[ear] || (istype(M, /mob/dead/observer) && M.get_preference(PREFTOGGLE_CHAT_GHOSTRADIO))) . |= M // Since we're already looping through mobs, why bother using |= ? This only slows things down. return . @@ -469,10 +469,66 @@ var/mob/M = C if(M.client) C = M.client - if(!C || !C.prefs.windowflashing) + if(!C || !C.prefs.toggles2 & PREFTOGGLE_2_WINDOWFLASHING) return winset(C, "mainwindow", "flash=5") +/** + * Returns a list of vents that can be used as a potential spawn if they meet the criteria set by the arguments + * + * Will not include parent-less vents to the returned list. + * Arguments: + * * unwelded_only - Whether the list should only include vents that are unwelded + * * exclude_mobs_nearby - Whether to exclude vents that are near living mobs regardless of visibility + * * nearby_mobs_range - The range at which to look for living mobs around the vent for the above argument + * * exclude_visible_by_mobs - Whether to exclude vents that are visible to any living mob + * * min_network_size - The minimum length (non-inclusive) of the vent's parent network. A smaller number means vents in small networks (Security, Virology) will appear in the list + * * station_levels_only - Whether to only consider vents that are in a Z-level with a STATION_LEVEL trait + * * z_level - The Z-level number to look for vents in. Defaults to all + */ +/proc/get_valid_vent_spawns(unwelded_only = TRUE, exclude_mobs_nearby = FALSE, nearby_mobs_range = world.view, exclude_visible_by_mobs = FALSE, min_network_size = 50, station_levels_only = TRUE, z_level = 0) + ASSERT(min_network_size >= 0) + ASSERT(z_level >= 0) + + var/num_z_levels = length(GLOB.space_manager.z_list) + var/list/non_station_levels[num_z_levels] // Cache so we don't do is_station_level for every vent! + + . = list() + for(var/object in GLOB.all_vent_pumps) // This only contains vent_pumps so don't bother with type checking + var/obj/machinery/atmospherics/unary/vent_pump/vent = object + var/vent_z = vent.z + if(z_level && vent_z != z_level) + continue + if(station_levels_only && (non_station_levels[vent_z] || !is_station_level(vent_z))) + non_station_levels[vent_z] = TRUE + continue + if(unwelded_only && vent.welded) + continue + if(exclude_mobs_nearby) + var/turf/T = get_turf(vent) + var/mobs_nearby = FALSE + for(var/mob/living/M in orange(nearby_mobs_range, T)) + if(!M.is_dead()) + mobs_nearby = TRUE + break + if(mobs_nearby) + continue + if(exclude_visible_by_mobs) + var/turf/T = get_turf(vent) + var/visible_by_mobs = FALSE + for(var/mob/living/M in viewers(world.view, T)) + if(!M.is_dead()) + visible_by_mobs = TRUE + break + if(visible_by_mobs) + continue + if(!vent.parent) // This seems to have been an issue in the past, so this is here until it's definitely fixed + log_debug("get_valid_vent_spawns(), vent has no parent: [vent], qdeled: [QDELETED(vent)], loc: [vent.loc]") + continue + if(length(vent.parent.other_atmosmch) <= min_network_size) + continue + . += vent + /** * Get a bounding box of a list of atoms. * diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index b70c98908f5..a041454f816 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -46,7 +46,7 @@ desc = "Shift-click any button to reset its position, and Control-click it to lock/unlock its position. Alt-click this button to reset all buttons to their default positions." icon = 'icons/mob/actions/actions.dmi' icon_state = "bg_default" - var/hidden = 0 + var/hidden = FALSE /obj/screen/movable/action_button/hide_toggle/MouseDrop(over_object) if(istype(over_object, /obj/screen/movable/action_button)) @@ -99,14 +99,23 @@ /obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(mob/living/user) if(isalien(user)) + icon = 'icons/mob/actions/actions.dmi' icon_state = "bg_alien" else + icon = initial(icon) icon_state = "bg_default" + if(user.client) // Apply the client's UI style + icon = ui_style2icon(user.client.prefs.UI_style) + icon_state = "template" + if(user.client) + alpha = user.client.prefs.UI_style_alpha + color = user.client.prefs.UI_style_color UpdateIcon() /obj/screen/movable/action_button/hide_toggle/proc/UpdateIcon() - overlays.Cut() - var/image/img = image(icon, src, hidden ? "show" : "hide") + cut_overlays() + var/image/img = image(initial(icon), src, hidden ? "show" : "hide") + img.appearance_flags = RESET_COLOR | RESET_ALPHA overlays += img /obj/screen/movable/action_button/MouseEntered(location, control, params) diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 9d00f216eac..f6c8880a485 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -99,11 +99,6 @@ /obj/screen/fullscreen/impaired icon_state = "impairedoverlay" -/obj/screen/fullscreen/blurry - icon = 'icons/mob/screen_gen.dmi' - screen_loc = "WEST,SOUTH to EAST,NORTH" - icon_state = "blurry" - /obj/screen/fullscreen/flash icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 00b23ff3cdd..c8d8a7d2290 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -7,11 +7,10 @@ /datum/hud var/mob/mymob - var/hud_shown = 1 //Used for the HUD toggle (F12) - var/hud_version = 1 //Current displayed version of the HUD - var/inventory_shown = 1 //the inventory - var/show_intent_icons = 0 - var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) + var/hud_shown = TRUE //Used for the HUD toggle (F12) + var/hud_version = 1 //Current displayed version of the HUD + var/inventory_shown = TRUE //the inventory + var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) var/obj/screen/lingchemdisplay var/obj/screen/lingstingdisplay @@ -37,7 +36,7 @@ var/list/inv_slots[slots_amt] // /obj/screen/inventory objects, ordered by their slot ID. var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle - var/action_buttons_hidden = 0 + var/action_buttons_hidden = FALSE var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object @@ -123,7 +122,7 @@ switch(display_hud_version) if(HUD_STYLE_STANDARD) //Default HUD - hud_shown = 1 //Governs behavior of other procs + hud_shown = TRUE //Governs behavior of other procs if(static_inventory.len) mymob.client.screen += static_inventory if(toggleable_inventory.len && inventory_shown) @@ -139,7 +138,7 @@ action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position if(HUD_STYLE_REDUCED) //Reduced HUD - hud_shown = 0 //Governs behavior of other procs + hud_shown = FALSE //Governs behavior of other procs if(static_inventory.len) mymob.client.screen -= static_inventory if(toggleable_inventory.len) @@ -159,7 +158,7 @@ action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is. if(HUD_STYLE_NOHUD) //No HUD - hud_shown = 0 //Governs behavior of other procs + hud_shown = FALSE //Governs behavior of other procs if(static_inventory.len) mymob.client.screen -= static_inventory if(toggleable_inventory.len) @@ -205,7 +204,7 @@ //Triggered when F12 is pressed (Unless someone changed something in the DMF) /mob/verb/button_pressed_F12() set name = "F12" - set hidden = 1 + set hidden = TRUE if(hud_used && client) hud_used.show_hud() //Shows the next hud preset diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index e28fdf65f1e..5b4ce4c99e9 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -7,10 +7,10 @@ /obj/screen/human/toggle/Click() if(usr.hud_used.inventory_shown) - usr.hud_used.inventory_shown = 0 + usr.hud_used.inventory_shown = FALSE usr.client.screen -= usr.hud_used.toggleable_inventory else - usr.hud_used.inventory_shown = 1 + usr.hud_used.inventory_shown = TRUE usr.client.screen += usr.hud_used.toggleable_inventory usr.hud_used.hidden_inventory_update() @@ -26,7 +26,7 @@ H.quick_equip() /obj/screen/ling - invisibility = 101 + invisibility = INVISIBILITY_ABSTRACT /obj/screen/ling/sting name = "current sting" @@ -74,6 +74,7 @@ /mob/living/carbon/human/proc/remake_hud() //used for preference changes mid-round; can't change hud icons without remaking the hud. QDEL_NULL(hud_used) create_mob_hud() + update_action_buttons_icon() if(hud_used) hud_used.show_hud(hud_used.hud_version) @@ -81,6 +82,9 @@ if(client && !hud_used) hud_used = new /datum/hud/human(src, ui_style2icon(client.prefs.UI_style), client.prefs.UI_style_color, client.prefs.UI_style_alpha) +/datum/hud/human + var/hud_alpha = 255 + /datum/hud/human/New(mob/living/carbon/human/owner, var/ui_style = 'icons/mob/screen_white.dmi', var/ui_color = "#ffffff", var/ui_alpha = 255) ..() owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness) @@ -88,6 +92,8 @@ var/obj/screen/using var/obj/screen/inventory/inv_box + hud_alpha = ui_alpha + using = new /obj/screen/craft using.icon = ui_style using.color = ui_color @@ -102,7 +108,6 @@ using = new /obj/screen/act_intent() using.icon_state = mymob.a_intent - using.color = ui_color using.alpha = ui_alpha static_inventory += using action_intent = using @@ -371,11 +376,13 @@ infodisplay += devilsouldisplay zone_select = new /obj/screen/zone_sel() + zone_select.color = ui_color zone_select.icon = ui_style + zone_select.alpha = ui_alpha zone_select.update_icon(mymob) static_inventory += zone_select - inventory_shown = 0 + inventory_shown = FALSE for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) @@ -395,9 +402,9 @@ for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) if(inv.slot_id in S.no_equip) - inv.alpha = 128 + inv.alpha = hud_alpha / 2 else - inv.alpha = initial(inv.alpha) + inv.alpha = hud_alpha for(var/obj/screen/craft/crafting in static_inventory) if(!S.can_craft) crafting.invisibility = INVISIBILITY_ABSTRACT @@ -511,7 +518,7 @@ if(hud_used.hotkey_ui_hidden) client.screen += hud_used.hotkeybuttons - hud_used.hotkey_ui_hidden = 0 + hud_used.hotkey_ui_hidden = FALSE else client.screen -= hud_used.hotkeybuttons - hud_used.hotkey_ui_hidden = 1 + hud_used.hotkey_ui_hidden = TRUE diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index fc3e926b396..e5cd410a27b 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -5,6 +5,7 @@ blend_mode = BLEND_OVERLAY var/show_alpha = 255 var/hide_alpha = 0 + var/current_filters = list() /obj/screen/plane_master/proc/Show(override) alpha = override || show_alpha @@ -12,14 +13,21 @@ /obj/screen/plane_master/proc/Hide(override) alpha = override || hide_alpha -/obj/screen/plane_master/proc/outline(_size, _color) - filters += filter(type = "outline", size = _size, color = _color) +/obj/screen/plane_master/proc/add_filter(key, filter) + if(current_filters[key]) + filters -= current_filters[key] -/obj/screen/plane_master/proc/shadow(_size, _border, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") - filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset) + filters += filter + current_filters[key] = filters[filters.len] //assigning `filter` will not allow it to work later while animating removal -/obj/screen/plane_master/proc/clear_filters() - filters = list() +/obj/screen/plane_master/proc/remove_filter(key) + if(current_filters[key]) + animate(current_filters[key], size=0, time=5) //not all filters have a size param, but this is good enough for the general case + addtimer(CALLBACK(src, .proc/remove_callback, key), 5) + +/obj/screen/plane_master/proc/remove_callback(key) + filters -= current_filters[key] + current_filters -= key //Why do plane masters need a backdrop sometimes? Read http://www.byond.com/forum/?post=2141928 //Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong. @@ -38,9 +46,8 @@ blend_mode = BLEND_OVERLAY /obj/screen/plane_master/game_world/backdrop(mob/mymob) - clear_filters() - if(istype(mymob) && mymob.client && mymob.client.prefs && (mymob.client.prefs.toggles & AMBIENT_OCCLUSION)) - filters += FILTER_AMBIENT_OCCLUSION + if(istype(mymob) && mymob.client && mymob.client.prefs && (mymob.client.prefs.toggles & PREFTOGGLE_AMBIENT_OCCLUSION)) + add_filter(AMBIENT_OCCLUSION_FILTER_KEY, FILTER_AMBIENT_OCCLUSION) /obj/screen/plane_master/lighting name = "lighting plane master" diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 9795975a090..3b7f98a8220 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -293,7 +293,12 @@ /obj/screen/zone_sel/update_icon(mob/user) overlays.Cut() - overlays += image('icons/mob/zone_sel.dmi', "[selecting]") + var/image/human = image('icons/mob/zone_sel.dmi', "human") + human.appearance_flags = RESET_COLOR + overlays += human + var/image/sel = image('icons/mob/zone_sel.dmi', "[selecting]") + sel.appearance_flags = RESET_COLOR + overlays += sel user.zone_selected = selecting /obj/screen/zone_sel/alien diff --git a/code/controllers/subsystem/afk.dm b/code/controllers/subsystem/afk.dm index 25ccda3349c..3d82762cc42 100644 --- a/code/controllers/subsystem/afk.dm +++ b/code/controllers/subsystem/afk.dm @@ -29,7 +29,7 @@ SUBSYSTEM_DEF(afk) var/turf/T // Only players and players with the AFK watch enabled // No dead, unconcious, restrained, people without jobs or people on other Z levels than the station - if(!H.client || !H.client.prefs.afk_watch || !H.mind || \ + if(!H.client || !H.client.prefs.toggles2 & PREFTOGGLE_2_AFKWATCH || !H.mind || \ H.stat || H.restrained() || !H.job || !is_station_level((T = get_turf(H)).z)) // Assign the turf as last. Small optimization if(afk_players[H.ckey]) toRemove += H.ckey diff --git a/code/controllers/subsystem/changelog.dm b/code/controllers/subsystem/changelog.dm index 98188599abd..eef8ee6da62 100644 --- a/code/controllers/subsystem/changelog.dm +++ b/code/controllers/subsystem/changelog.dm @@ -57,7 +57,7 @@ SUBSYSTEM_DEF(changelog) return // Only return here, we dont have to worry about a queue list because this will be called from ShowChangelog() // Technically this is only for the date but we can also do the UI button at the same time var/datum/preferences/P = GLOB.preferences_datums[C.ckey] - if(P.toggles & UI_DARKMODE) + if(P.toggles & PREFTOGGLE_UI_DARKMODE) winset(C, "rpane.changelog", "background-color=#40628a;font-color=#ffffff;font-style=none") else winset(C, "rpane.changelog", "background-color=none;font-style=none") @@ -74,7 +74,7 @@ SUBSYSTEM_DEF(changelog) /datum/controller/subsystem/changelog/proc/UpdatePlayerChangelogButton(client/C) // If SQL aint even enabled, just set the button to default style if(!GLOB.dbcon.IsConnected()) - if(C.prefs.toggles & UI_DARKMODE) + if(C.prefs.toggles & PREFTOGGLE_UI_DARKMODE) winset(C, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF") else winset(C, "rpane.changelog", "background-color=none;text-color=#000000") @@ -83,7 +83,7 @@ SUBSYSTEM_DEF(changelog) // If SQL is enabled but we aint ready, queue them up, and use the default style if(!ss_ready) startup_clients_button |= C - if(C.prefs.toggles & UI_DARKMODE) + if(C.prefs.toggles & PREFTOGGLE_UI_DARKMODE) winset(C, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF") else winset(C, "rpane.changelog", "background-color=none;text-color=#000000") @@ -96,7 +96,7 @@ SUBSYSTEM_DEF(changelog) winset(C, "rpane.changelog", "background-color=#bb7700;text-color=#FFFFFF;font-style=bold") to_chat(C, "Changelog has changed since your last visit.") else - if(C.prefs.toggles & UI_DARKMODE) + if(C.prefs.toggles & PREFTOGGLE_UI_DARKMODE) winset(C, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF") else winset(C, "rpane.changelog", "background-color=none;text-color=#000000") diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 729c4dbe67b..0c223dc16df 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -285,7 +285,7 @@ SUBSYSTEM_DEF(jobs) for(var/mob/new_player/player in GLOB.player_list) if(player.ready && player.has_valid_preferences() && player.mind && !player.mind.assigned_role) unassigned += player - if(player.client.prefs.randomslot) + if(player.client.prefs.toggles2 & PREFTOGGLE_2_RANDOMSLOT) player.client.prefs.load_random_character_slot(player.client) Debug("DO, Len: [unassigned.len]") diff --git a/code/controllers/subsystem/tickets/mentor_tickets.dm b/code/controllers/subsystem/tickets/mentor_tickets.dm index 97f84263a45..706a498aa64 100644 --- a/code/controllers/subsystem/tickets/mentor_tickets.dm +++ b/code/controllers/subsystem/tickets/mentor_tickets.dm @@ -10,6 +10,9 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets ticket_system_name = "Mentor Tickets" ticket_name = "Mentor Ticket" span_class = "mentorhelp" + anchor_link_extra = ";is_mhelp=1" + ticket_help_type = "Mentorhelp" + ticket_help_span = "mentorhelp" other_ticket_name = "Admin" other_ticket_permission = R_ADMIN close_rights = R_MENTOR | R_ADMIN @@ -21,8 +24,11 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets "Your [ticket_name] has now been closed.") return ..() -/datum/controller/subsystem/tickets/mentor_tickets/message_staff(msg) - message_mentorTicket(msg) +/datum/controller/subsystem/tickets/mentor_tickets/message_staff(msg, prefix_type = NONE, important = FALSE) + message_mentorTicket(msg, important) /datum/controller/subsystem/tickets/mentor_tickets/create_other_system_ticket(datum/ticket/T) - SStickets.newTicket(get_client_by_ckey(T.client_ckey), T.content, T.title) + SStickets.newTicket(get_client_by_ckey(T.client_ckey), T.content, T.raw_title) + +/datum/controller/subsystem/tickets/mentor_tickets/autoRespond(N) + return diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm index 60f3a5fa8dd..30c4c13166c 100644 --- a/code/controllers/subsystem/tickets/tickets.dm +++ b/code/controllers/subsystem/tickets/tickets.dm @@ -10,6 +10,9 @@ #define TICKET_RESOLVED 3 #define TICKET_STALE 4 +#define TICKET_STAFF_MESSAGE_ADMIN_CHANNEL 1 +#define TICKET_STAFF_MESSAGE_PREFIX 2 + SUBSYSTEM_DEF(tickets) name = "Admin Tickets" init_order = INIT_ORDER_TICKETS @@ -24,6 +27,11 @@ SUBSYSTEM_DEF(tickets) var/close_rights = R_ADMIN var/rights_needed = R_ADMIN | R_MOD + /// Text that will be added to the anchor link + var/anchor_link_extra = "" + + var/ticket_help_type = "Adminhelp" + var/ticket_help_span = "adminhelp" /// The name of the other ticket type to convert to var/other_ticket_name = "Mentor" /// Which permission to look for when seeing if there is staff available for the other ticket type @@ -34,7 +42,8 @@ SUBSYSTEM_DEF(tickets) var/ticketCounter = 1 /datum/controller/subsystem/tickets/Initialize() - close_messages = list("- [ticket_name] Rejected! -", + if(!close_messages) + close_messages = list("- [ticket_name] Rejected! -", "Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.", "Your [ticket_name] has now been closed.") return ..() @@ -76,22 +85,56 @@ SUBSYSTEM_DEF(tickets) var/datum/ticket/T = i resolveTicket(T.ticketNum) +/** + * Will either make a new ticket using the given text or will add the text to an existing ticket. + * Staff will get a message + * Arguments: + * C - The client who requests help + * text - The text the client send + */ +/datum/controller/subsystem/tickets/proc/newHelpRequest(client/C, text) + var/ticketNum // Holder for the ticket number + var/datum/ticket/T + // Get the open ticket assigned to the client and add a response. If no open tickets then make a new one + if((T = checkForOpenTicket(C))) + ticketNum = T.ticketNum + T.addResponse(C, text) + T.setCooldownPeriod() + to_chat(C.mob, "Your [ticket_name] #[ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.") + var/url_message = makeUrlMessage(C, text, ticketNum) + message_staff(url_message, NONE, TRUE) + else + newTicket(C, text, text) + +/** + * Will add the URLs usable by staff to the message and return it + * Arguments: + * C - The client who send the message + * msg - The raw message + * ticketNum - Which ticket number the ticket has + */ +/datum/controller/subsystem/tickets/proc/makeUrlMessage(client/C, msg, ticketNum) + var/list/L = list() + L += "[ticket_help_type]: [key_name(C, TRUE, ticket_help_type)] " + L += "([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_TP(C.mob,"TP")]) ([ADMIN_SM(C.mob,"SM")]) " + L += "([admin_jump_link(C.mob)]) (TICKET) " + L += "[isAI(C.mob) ? "(CL)" : ""] (TAKE) " + L += "(RESOLVE) (AUTO) " + L += "(CONVERT) : [msg]" + return L.Join() + //Open a new ticket and populate details then add to the list of open tickets /datum/controller/subsystem/tickets/proc/newTicket(client/C, passedContent, title) if(!C || !passedContent) return - //Check if the user has an open ticket already within the cooldown period, if so we don't create a new one and re-set the cooldown period - var/datum/ticket/existingTicket = checkForOpenTicket(C) - if(existingTicket) - existingTicket.setCooldownPeriod() - to_chat(C.mob, "Your [ticket_name] #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.") - return - if(!title) title = passedContent - var/datum/ticket/T = new(title, passedContent, getTicketCounterAndInc()) + var/new_ticket_num = getTicketCounterAndInc() + var/url_title = makeUrlMessage(C, title, new_ticket_num) + + var/datum/ticket/T = new(url_title, title, passedContent, new_ticket_num) allTickets += T T.client_ckey = C.ckey T.locationSent = C.mob.loc.name @@ -102,6 +145,8 @@ SUBSYSTEM_DEF(tickets) var/ticket_open_sound = sound('sound/effects/adminticketopen.ogg') SEND_SOUND(C, ticket_open_sound) + message_staff(url_title, NONE, TRUE) + //Set ticket state with key N to open /datum/controller/subsystem/tickets/proc/openTicket(N) var/datum/ticket/T = allTickets[N] @@ -148,7 +193,7 @@ SUBSYSTEM_DEF(tickets) /datum/controller/subsystem/tickets/proc/create_other_system_ticket(datum/ticket/T) var/client/C = get_client_by_ckey(T.client_ckey) - SSmentor_tickets.newTicket(C, T.content, T.title) + SSmentor_tickets.newTicket(C, T.content, T.raw_title) /datum/controller/subsystem/tickets/proc/autoRespond(N) if(!check_rights(rights_needed)) @@ -250,6 +295,7 @@ SUBSYSTEM_DEF(tickets) var/client_ckey var/timeOpened // Time the ticket was opened var/title //The initial message with links + var/raw_title // The title without URLs added var/list/content // content of the staff help var/lastStaffResponse // Last staff member who responded var/lastResponseTime // When the staff last responded @@ -260,8 +306,9 @@ SUBSYSTEM_DEF(tickets) var/ticketCooldown // Cooldown before allowing the user to open another ticket. var/client/staffAssigned // Staff member who has assigned themselves to this ticket -/datum/ticket/New(tit, cont, num) +/datum/ticket/New(tit, raw_tit, cont, num) title = tit + raw_title = raw_tit content = list() content += cont timeOpened = worldtime2text() @@ -440,9 +487,21 @@ UI STUFF to_chat(target, text) return TRUE -//Sends a message to the designated staff -/datum/controller/subsystem/tickets/proc/message_staff(var/msg, var/alt = FALSE) - message_adminTicket(msg, alt) +/** + * Sends a message to the designated staff + * Arguments: + * msg - The message being send + * alt - If an alternative prefix should be used or not. Defaults to TICKET_STAFF_MESSAGE_PREFIX + * important - If the message is important. If TRUE it will ignore the CHAT_NO_TICKETLOGS preferences, + send a sound and flash the window. Defaults to FALSE + */ +/datum/controller/subsystem/tickets/proc/message_staff(msg, prefix_type = TICKET_STAFF_MESSAGE_PREFIX, important = FALSE) + switch(prefix_type) + if(TICKET_STAFF_MESSAGE_ADMIN_CHANNEL) + msg = "ADMIN TICKET: [msg]" + if(TICKET_STAFF_MESSAGE_PREFIX) + msg = "ADMIN TICKET: [msg]" + message_adminTicket(msg, important) /datum/controller/subsystem/tickets/Topic(href, href_list) @@ -524,7 +583,7 @@ UI STUFF if(span_class == "mentorhelp") message_staff("[usr.client] / ([usr]) has taken [ticket_name] number [index]") else - message_staff("[usr.client] / ([usr]) has taken [ticket_name] number [index]", TRUE) + message_staff("[usr.client] / ([usr]) has taken [ticket_name] number [index]", TICKET_STAFF_MESSAGE_ADMIN_CHANNEL) to_chat_safe(returnClient(index), "Your [ticket_name] is being handled by [usr.client].") /datum/controller/subsystem/tickets/proc/unassignTicket(index) @@ -535,4 +594,7 @@ UI STUFF if(span_class == "mentorhelp") message_staff("[usr.client] / ([usr]) has unassigned [ticket_name] number [index]") else - message_staff("[usr.client] / ([usr]) has unassigned [ticket_name] number [index]", TRUE) + message_staff("[usr.client] / ([usr]) has unassigned [ticket_name] number [index]", TICKET_STAFF_MESSAGE_ADMIN_CHANNEL) + +#undef TICKET_STAFF_MESSAGE_ADMIN_CHANNEL +#undef TICKET_STAFF_MESSAGE_PREFIX diff --git a/code/datums/action.dm b/code/datums/action.dm index 84702757e86..18c5c4f885e 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -9,7 +9,6 @@ var/desc = null var/obj/target = null var/check_flags = 0 - var/processing = 0 var/obj/screen/movable/action_button/button = null var/button_icon = 'icons/mob/actions/actions.dmi' var/background_icon_state = "bg_default" @@ -17,6 +16,8 @@ var/icon_icon = 'icons/mob/actions/actions.dmi' var/button_icon_state = "default" var/mob/owner + /// Whether to darken the button or not if [/datum/action/proc/IsAvailable] return FALSE. + var/darken_when_unavailable = TRUE /datum/action/New(var/Target) target = Target @@ -59,48 +60,61 @@ /datum/action/proc/Trigger() if(!IsAvailable()) - return 0 - return 1 + return FALSE + return TRUE /datum/action/proc/Process() return /datum/action/proc/IsAvailable()// returns 1 if all checks pass if(!owner) - return 0 + return FALSE if(check_flags & AB_CHECK_RESTRAINED) if(owner.restrained()) - return 0 + return FALSE if(check_flags & AB_CHECK_STUNNED) if(owner.stunned || owner.IsWeakened()) - return 0 + return FALSE if(check_flags & AB_CHECK_LYING) if(owner.lying) - return 0 + return FALSE if(check_flags & AB_CHECK_CONSCIOUS) if(owner.stat) - return 0 - return 1 + return FALSE + return TRUE /datum/action/proc/UpdateButtonIcon() if(button) - button.icon = button_icon - button.icon_state = background_icon_state + if(owner && owner.client && background_icon_state == "bg_default") // If it's a default action background, apply the custom HUD style + button.alpha = owner.client.prefs.UI_style_alpha + button.color = owner.client.prefs.UI_style_color + button.icon = ui_style2icon(owner.client.prefs.UI_style) + button.icon_state = "template" + else + button.icon = button_icon + button.icon_state = background_icon_state button.desc = desc ApplyIcon(button) + // If the action isn't available, darken the button if(!IsAvailable()) - button.color = rgb(128,0,0,128) + if(!darken_when_unavailable) + return + var/image/img = image('icons/mob/screen_white.dmi', icon_state = "template") + img.alpha = 200 + img.appearance_flags = RESET_COLOR | RESET_ALPHA + img.color = "#000000" + img.plane = FLOAT_PLANE + 1 + button.overlays += img else - button.color = rgb(255,255,255,255) - return 1 + return TRUE /datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button) - current_button.overlays.Cut() + current_button.cut_overlays() if(icon_icon && button_icon_state) - var/image/img - img = image(icon_icon, current_button, button_icon_state) + var/image/img = image(icon_icon, current_button, button_icon_state) + img.appearance_flags = RESET_COLOR | RESET_ALPHA img.pixel_x = 0 img.pixel_y = 0 current_button.overlays += img @@ -126,25 +140,27 @@ /datum/action/item_action/Trigger(attack_self = TRUE) //Maybe we don't want to click the thing itself if(!..()) - return 0 + return FALSE if(target && attack_self) var/obj/item/I = target I.ui_action_click(owner, type) - return 1 + return TRUE /datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button) if(use_itemicon) - current_button.overlays.Cut() if(target) var/obj/item/I = target var/old_layer = I.layer var/old_plane = I.plane + var/old_appearance_flags = I.appearance_flags I.layer = FLOAT_LAYER //AAAH I.plane = FLOAT_PLANE //^ what that guy said + I.appearance_flags |= RESET_COLOR | RESET_ALPHA current_button.cut_overlays() current_button.add_overlay(I) I.layer = old_layer I.plane = old_plane + I.appearance_flags = old_appearance_flags else ..() /datum/action/item_action/toggle_light @@ -193,6 +209,7 @@ if(iscarbon(owner)) var/mob/living/carbon/C = owner if(target == C.internal) + button.icon = 'icons/mob/actions/actions.dmi' button.icon_state = "bg_default_on" /datum/action/item_action/toggle_mister @@ -246,7 +263,7 @@ if(istype(target, /obj/item/hierophant_club)) var/obj/item/hierophant_club/H = target if(H.teleporting) - return 0 + return FALSE return ..() /datum/action/item_action/change_headphones_song @@ -346,7 +363,7 @@ /datum/action/item_action/jetpack_stabilization/IsAvailable() var/obj/item/tank/jetpack/J = target if(!istype(J) || !J.on) - return 0 + return FALSE return ..() /datum/action/item_action/hands_free @@ -363,7 +380,7 @@ if(IsAvailable()) owner.research_scanner = !owner.research_scanner to_chat(owner, "Research analyzer is now [owner.research_scanner ? "active" : "deactivated"].") - return 1 + return TRUE /datum/action/item_action/toggle_research_scanner/Remove(mob/living/L) if(owner) @@ -371,9 +388,10 @@ ..() /datum/action/item_action/toggle_research_scanner/ApplyIcon(obj/screen/movable/action_button/current_button) - current_button.overlays.Cut() + current_button.cut_overlays() if(button_icon && button_icon_state) var/image/img = image(button_icon, current_button, "scan_mode") + img.appearance_flags = RESET_COLOR | RESET_ALPHA current_button.overlays += img /datum/action/item_action/instrument @@ -405,7 +423,7 @@ /datum/action/item_action/organ_action/IsAvailable() var/obj/item/organ/internal/I = target if(!I.owner) - return 0 + return FALSE return ..() /datum/action/item_action/organ_action/toggle @@ -440,12 +458,12 @@ /datum/action/item_action/accessory/IsAvailable() . = ..() if(!.) - return 0 + return FALSE if(target.loc == owner) - return 1 + return TRUE if(istype(target.loc, /obj/item/clothing/under) && target.loc.loc == owner) - return 1 - return 0 + return TRUE + return FALSE /datum/action/item_action/accessory/holster name = "Holster" @@ -458,6 +476,7 @@ /datum/action/spell_action check_flags = 0 background_icon_state = "bg_spell" + darken_when_unavailable = FALSE var/recharge_text_color = "#FFFFFF" /datum/action/spell_action/New(Target) @@ -478,23 +497,23 @@ /datum/action/spell_action/Trigger() if(!..()) - return 0 + return FALSE if(target) var/obj/effect/proc_holder/spell = target spell.Click() - return 1 + return TRUE /datum/action/spell_action/IsAvailable() if(!target) - return 0 + return FALSE var/obj/effect/proc_holder/spell/spell = target if(spell.special_availability_check) - return 1 + return TRUE if(owner) return spell.can_cast(owner) - return 0 + return FALSE /datum/action/spell_action/UpdateButtonIcon() if(button && !(. = ..())) @@ -508,6 +527,14 @@ button.color = rgb(col_val_high, col_val_low, col_val_low, col_val_high) else button.maptext = null + +/datum/action/spell_action/ApplyIcon(obj/screen/movable/action_button/current_button) + current_button.cut_overlays() + if(icon_icon && button_icon_state) + var/image/img = image(icon_icon, current_button, button_icon_state) + img.pixel_x = 0 + img.pixel_y = 0 + current_button.overlays += img /* /datum/action/spell_action/alien @@ -524,16 +551,16 @@ //Preset for general and toggled actions /datum/action/innate check_flags = 0 - var/active = 0 + var/active = FALSE /datum/action/innate/Trigger() if(!..()) - return 0 + return FALSE if(!active) Activate() else Deactivate() - return 1 + return TRUE /datum/action/innate/proc/Activate() return @@ -548,7 +575,7 @@ /datum/action/generic/Trigger() if(!..()) - return 0 + return FALSE if(target && procname) call(target,procname)(usr) - return 1 + return TRUE diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index e4268c16cd5..1042d9a8ddd 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -35,12 +35,18 @@ var/rank = t.fields["rank"] var/real_rank = t.fields["real_rank"] if(OOC) - var/active = 0 - for(var/mob/M in GLOB.player_list) - if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10) - active = 1 + var/activetext = "Inactive" + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.real_name != name) + continue + if(H.client && H.client.inactivity <= 6000) + activetext = "Active" break - isactive[name] = active ? "Active" : "Inactive" + if(isLivingSSD(H)) + activetext = "SSD" + break + isactive[name] = activetext else isactive[name] = t.fields["p_stat"] var/department = 0 diff --git a/code/datums/periodic_news.dm b/code/datums/periodic_news.dm index d0d1f01ebf3..2bac74a1fbd 100644 --- a/code/datums/periodic_news.dm +++ b/code/datums/periodic_news.dm @@ -119,27 +119,22 @@ GLOBAL_LIST_EMPTY(announced_news_types) /proc/announce_newscaster_news(datum/news_announcement/news) - var/datum/feed_channel/sendto - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - if(FC.channel_name == news.channel_name) - sendto = FC - break - + var/datum/feed_channel/sendto = GLOB.news_network.get_channel_by_name(news.channel_name) if(!sendto) sendto = new /datum/feed_channel sendto.channel_name = news.channel_name sendto.author = news.author - sendto.locked = 1 - sendto.is_admin_channel = 1 - GLOB.news_network.network_channels += sendto + sendto.frozen = TRUE + sendto.admin_locked = TRUE + GLOB.news_network.channels += sendto var/datum/feed_message/newMsg = new /datum/feed_message newMsg.author = news.author ? news.author : sendto.author - newMsg.is_admin_message = !news.can_be_redacted + newMsg.admin_locked = !news.can_be_redacted newMsg.body = news.message - newMsg.message_type = news.message_type - sendto.messages += newMsg + sendto.add_message(newMsg) - for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allNewscasters) - NEWSCASTER.newsAlert(news.channel_name) + for(var/nc in GLOB.allNewscasters) + var/obj/machinery/newscaster/NC = nc + NC.alert_news(news.channel_name) diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 3541be89983..c11eed424da 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -249,6 +249,15 @@ always_place = TRUE // Its designed to make exploring other space ruins more accessible cost = 0 // Force spawned so shouldnt have a cost +/datum/map_template/ruin/space/golem_destination + id = "golemtarget" + suffix = "golemtarget.dmm" + name = "Golem Shuttle Destination" + description = "Just a handful of rocks floating in space. Guaranteed space destination for the Golem shuttle in case other destinations don't spawn." + allow_duplicates = FALSE + always_place = TRUE + cost = 0 + /datum/map_template/ruin/space/syndiecakesfactory id = "Syndiecakes Factory" suffix = "syndiecakesfactory.dmm" diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 61decede9bc..78b9e1c0413 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -215,7 +215,7 @@ alert_type = /obj/screen/alert/status_effect/regenerative_core /datum/status_effect/regenerative_core/on_apply() - owner.status_flags |= IGNORESLOWDOWN + owner.status_flags |= IGNORE_SPEED_CHANGES owner.adjustBruteLoss(-25) owner.adjustFireLoss(-25) owner.remove_CC() @@ -229,4 +229,4 @@ return TRUE /datum/status_effect/regenerative_core/on_remove() - owner.status_flags &= ~IGNORESLOWDOWN + owner.status_flags &= ~IGNORE_SPEED_CHANGES diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 389b21dd6d1..0e96ba8c346 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1338,7 +1338,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) Nanotrasen crew who spot these suits are known to panic." reference = "BRHS" item = /obj/item/storage/box/syndie_kit/hardsuit - cost = 8 + cost = 6 excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/suits/hardsuit/elite diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 990e2f1694d..aec3ea58f01 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -420,11 +420,15 @@ /area/space/powered(chan) //Nope.avi return 0 -// called when power status changes - +/** + * Called when the area power status changes + * + * Updates the area icon, calls power change on all machines in the area, and sends the `COMSIG_AREA_POWER_CHANGE` signal. + */ /area/proc/power_change() for(var/obj/machinery/M in src) // for each machine in the area M.power_change() // reverify power status (to update icons etc.) + SEND_SIGNAL(src, COMSIG_AREA_POWER_CHANGE) updateicon() /area/proc/usage(var/chan) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index d463c85eaf6..a3b6dff7905 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -561,7 +561,7 @@ // Who can see the attack? var/list/viewing = list() for(var/mob/M in viewers(A)) - if(M.client && M.client.prefs.show_ghostitem_attack) + if(M.client && M.client.prefs.toggles2 & PREFTOGGLE_2_ITEMATTACK) viewing |= M.client flick_overlay(I, viewing, 5) // 5 ticks/half a second diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 34c717f11a8..57a2917d72c 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -182,6 +182,7 @@ pressure_resistance = 50 see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + move_resist = MOVE_FORCE_OVERPOWERING /mob/living/simple_animal/hostile/blob/blobbernaut/Life(seconds, times_fired) if(stat != DEAD && (getBruteLoss() || getFireLoss())) // Heal on blob structures diff --git a/code/game/gamemodes/changeling/powers/swap_form.dm b/code/game/gamemodes/changeling/powers/swap_form.dm index 97192c86a0f..e392974648c 100644 --- a/code/game/gamemodes/changeling/powers/swap_form.dm +++ b/code/game/gamemodes/changeling/powers/swap_form.dm @@ -38,7 +38,7 @@ target.do_jitter_animation(500) user.do_jitter_animation(500) - if(!do_mob(user,target,20)) + if(!do_mob(user, target, 10 SECONDS)) to_chat(user, "The body swap has been interrupted!") return diff --git a/code/game/gamemodes/miniantags/borer/borer_event.dm b/code/game/gamemodes/miniantags/borer/borer_event.dm index f5a3b7aa4af..d5bd7d65776 100644 --- a/code/game/gamemodes/miniantags/borer/borer_event.dm +++ b/code/game/gamemodes/miniantags/borer/borer_event.dm @@ -13,16 +13,12 @@ /datum/event/borer_infestation/announce() if(successSpawn) GLOB.command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') + else + log_and_message_admins("Warning: Could not spawn any mobs for event Borer Infestation") /datum/event/borer_infestation/start() - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in SSair.atmos_machinery) - if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) - //Stops cortical borers getting stuck in small networks. See: Security, Virology - if(temp_vent.parent.other_atmosmch.len > 50) - vents += temp_vent - - while(spawncount >= 1 && vents.len) + var/list/vents = get_valid_vent_spawns(exclude_mobs_nearby = TRUE, exclude_visible_by_mobs = TRUE) + while(spawncount && length(vents)) var/obj/vent = pick_n_take(vents) new /mob/living/simple_animal/borer(vent.loc) successSpawn = TRUE diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index 2e370db5f7a..fb10923e657 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -157,7 +157,7 @@ to_chat(world, "The crew's final score is:") to_chat(world, "[GLOB.score_crewscore]") for(var/mob/E in GLOB.player_list) - if(E.client && !E.get_preference(DISABLE_SCOREBOARD)) + if(E.client && !E.get_preference(PREFTOGGLE_DISABLE_SCOREBOARD)) E.scorestats() // A recursive function to properly determine the wealthiest escapee diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 4be50a6cd59..883b37f9d83 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -235,6 +235,9 @@ if(!(ling.mind in SSticker.mode.shadows)) return var/mob/living/carbon/human/target = targets[1] + if(ismindshielded(target)) + to_chat(user, "This target has a mindshield, blocking your powers! You cannot thrall it!") + return enthralling = TRUE to_chat(user, "This target is valid. You begin the enthralling.") to_chat(target, "[user] stares at you. You feel your head begin to pulse.") @@ -249,23 +252,11 @@ user.visible_message("[user]'s palms flare a bright red against [target]'s temples!") to_chat(target, "A terrible red light floods your mind. You collapse as conscious thought is wiped away.") target.Weaken(12) - sleep(20) - if(ismindshielded(target)) - to_chat(user, "They have a mindshield implant. You begin to deactivate it - this will take some time.") - user.visible_message("[user] pauses, then dips [user.p_their()] head in concentration!") - to_chat(target, "Your mindshield implant becomes hot as it comes under attack!") - sleep(100) //10 seconds - not spawn() so the enthralling takes longer - to_chat(user, "The nanobots composing the mindshield implant have been rendered inert. Now to continue.") - user.visible_message("[user] relaxes again.") - for(var/obj/item/implant/mindshield/L in target) - if(L && L.implanted) - qdel(L) - to_chat(target, "Your mental protection implant unexpectedly falters, dims, dies.") if(3) to_chat(user, "You begin planting the tumor that will control the new thrall...") user.visible_message("A strange energy passes from [user]'s hands into [target]'s head!") to_chat(target, "You feel your memories twisting, morphing. A sense of horror dominates your mind.") - if(!do_mob(user, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a mindshield implant + if(!do_mob(user, target, 7.7 SECONDS)) //around 23 seconds total for enthralling to_chat(user, "The enthralling has been interrupted - your target's mind returns to its previous state.") to_chat(target, "You wrest yourself away from [user]'s hands and compose yourself") enthralling = FALSE diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm index a20b0e1654b..c7ce0261bd0 100644 --- a/code/game/gamemodes/steal_items.dm +++ b/code/game/gamemodes/steal_items.dm @@ -43,7 +43,7 @@ protected_jobs = list("Captain") /datum/theft_objective/hoslaser - name = "the head of security's recreated antique laser gun" + name = "the head of security's X-01 multiphase energy gun" typepath = /obj/item/gun/energy/gun/hos protected_jobs = list("Head Of Security") diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index d7b21983792..344bca5167a 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -9,6 +9,12 @@ mouse_drag_pointer = MOUSE_ACTIVE_POINTER var/obj/item/reagent_containers/iv_bag/bag = null +/obj/machinery/iv_drip/process() + if(istype(bag) && bag.injection_target) + update_icon() + return + return PROCESS_KILL + /obj/machinery/iv_drip/update_icon() cut_overlays() @@ -28,6 +34,7 @@ if(Adjacent(target) && usr.Adjacent(target)) bag.afterattack(target, usr, TRUE) + START_PROCESSING(SSmachines, src) /obj/machinery/iv_drip/attack_hand(mob/user) if(bag) @@ -48,6 +55,7 @@ bag = I to_chat(user, "You attach [I] to [src].") update_icon() + START_PROCESSING(SSmachines, src) else if (bag && istype(I, /obj/item/reagent_containers)) bag.attackby(I) I.afterattack(bag, usr, TRUE) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm deleted file mode 100644 index c2396ab1d9f..00000000000 --- a/code/game/machinery/newscaster.dm +++ /dev/null @@ -1,855 +0,0 @@ -//############################################## -//################### NEWSCASTERS BE HERE! #### -//###-Agouri################################### - -/datum/feed_message - var/author = "" - var/title = "" - var/body = "" - var/message_type = "Story" - var/backup_body = "" - var/backup_author = "" - var/is_admin_message = 0 - var/icon/img = null - var/icon/backup_img - var/view_count = 0 - -/datum/feed_channel - var/channel_name = "" - var/list/datum/feed_message/messages = list() - var/locked = 0 - var/author = "" - var/backup_author = "" - var/censored = 0 - var/is_admin_channel = 0 - var/total_view_count = 0 - -/datum/feed_message/proc/clear() - author = "" - body = "" - backup_body = "" - backup_author = "" - img = null - backup_img = null - view_count = 0 - -/datum/feed_channel/proc/clear() - channel_name = "" - messages = list() - locked = 0 - author = "" - backup_author = "" - censored = 0 - is_admin_channel = 0 - total_view_count = 0 - -/datum/feed_channel/proc/announce_news(title="") - if(title) - return "Breaking news from [channel_name]: [title]" - return "Breaking news from [channel_name]" - -/datum/feed_channel/station/announce_news() - return "New Station Announcement Available" - -/datum/feed_network - var/list/datum/feed_channel/network_channels = list() - var/datum/feed_message/wanted_issue - -GLOBAL_DATUM_INIT(news_network, /datum/feed_network, new()) //The global news-network, which is coincidentally a global list. - -GLOBAL_LIST_EMPTY(allNewscasters) //Global list that will contain reference to all newscasters in existence. - -#define NEWSCASTER_MAIN 0 // Main menu -#define NEWSCASTER_FC_LIST 1 // Feed channel list -#define NEWSCASTER_CREATE_FC 2 // Create feed channel -#define NEWSCASTER_CREATE_FM 3 // Create feed message -#define NEWSCASTER_PRINT 4 // Print newspaper -#define NEWSCASTER_VIEW_FC 5 // Read feed channel -#define NEWSCASTER_NT_CENSOR 6 // Nanotrasen Feed Censorship Tool -#define NEWSCASTER_D_NOTICE 7 // Nanotrasen D-Notice Handler -#define NEWSCASTER_CENSOR_FC 8 // Censor feed channel -#define NEWSCASTER_D_NOTICE_FC 9 // D-Notice feed channel -#define NEWSCASTER_W_ISSUE_H 10 // Wanted Issue handler -#define NEWSCASTER_W_ISSUE 11 // STATIONWIDE WANTED ISSUE -#define NEWSCASTER_JOBS 12 // Available jobs - -/obj/machinery/newscaster - name = "newscaster" - desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!" - icon = 'icons/obj/terminals.dmi' - icon_state = "newscaster_normal" - armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30) - max_integrity = 200 - integrity_failure = 50 - var/screen = NEWSCASTER_MAIN - var/paper_remaining = 15 - var/securityCaster = 0 - // 0 = Caster cannot be used to issue wanted posters - // 1 = the opposite - var/unit_no = 0 //Each newscaster has a unit number - var/alert_delay = 500 - var/alert = 0 - // 0 = there hasn't been a news/wanted update in the last alert_delay - // 1 = there has - var/scanned_user = "Unknown" //Will contain the name of the person who currently uses the newscaster - var/msg = "" //Feed message - var/msg_title = "" // Feed message title - var/obj/item/photo/photo = null - var/channel_name = "" //the feed channel which will be receiving the feed, or being created - var/c_locked = 0 //Will our new channel be locked to public submissions? - var/datum/feed_channel/viewing_channel = null - var/silence = 0 - var/temp = null - var/temp_back_screen = NEWSCASTER_MAIN - var/list/jobblacklist = list( - /datum/job/ai, - /datum/job/cyborg, - /datum/job/captain, - /datum/job/judge, - /datum/job/blueshield, - /datum/job/nanotrasenrep, - /datum/job/pilot, - /datum/job/brigdoc, - /datum/job/mechanic, - /datum/job/barber, - /datum/job/chaplain, - /datum/job/ntnavyofficer, - /datum/job/ntspecops, - /datum/job/civilian, - /datum/job/syndicateofficer) - - var/static/REDACTED = "\[REDACTED\]" - light_range = 0 - anchored = 1 - - -/obj/machinery/newscaster/security_unit - name = "Security Newscaster" - securityCaster = 1 - -/obj/machinery/newscaster/New() - GLOB.allNewscasters += src - unit_no = GLOB.allNewscasters.len - update_icon() //for any custom ones on the map... - ..() - -/obj/machinery/newscaster/Destroy() - GLOB.allNewscasters -= src - viewing_channel = null - QDEL_NULL(photo) - return ..() - -/obj/machinery/newscaster/update_icon() - cut_overlays() - if(inoperable()) - icon_state = "newscaster_off" - else - if(!GLOB.news_network.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message - icon_state = "newscaster_normal" - if(alert) //new message alert overlay - add_overlay("newscaster_alert") - var/hp_percent = obj_integrity * 100 /max_integrity - switch(hp_percent) - if(75 to 100) - return - if(50 to 75) - add_overlay("crack1") - if(25 to 50) - add_overlay("crack2") - else - add_overlay("crack3") - -/obj/machinery/newscaster/power_change() - ..() - update_icon() - -/obj/machinery/newscaster/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) - . = ..() - update_icon() - -/obj/machinery/newscaster/attack_ghost(mob/user) - ui_interact(user) - -/obj/machinery/newscaster/attack_hand(mob/user) - if(..()) - return - ui_interact(user) - -/obj/machinery/newscaster/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - user.set_machine(src) - if(can_scan(user)) - scan_user(user) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "newscaster.tmpl", name, 400, 600) - ui.open() - -/obj/machinery/newscaster/ui_data(user) - var/list/data = list() - - data["unit_no"] = unit_no - data["temp"] = temp - data["temp_back_screen"] = temp_back_screen - data["screen"] = screen - - switch(screen) - if(0) - data["wanted_issue"] = GLOB.news_network.wanted_issue ? 1 : 0 - data["silence"] = silence - data["securityCaster"] = securityCaster - if(securityCaster) - data["scanned_user"] = scanned_user - if(1, 6, 7) - var/list/channels = list() - data["channels"] = channels - for(var/datum/feed_channel/C in GLOB.news_network.network_channels) - channels[++channels.len] = list("name" = C.channel_name, "ref" = "\ref[C]", "censored" = C.censored, "admin" = C.is_admin_channel) - if(2) - data["scanned_user"] = scanned_user - data["channel_name"] = channel_name - data["c_locked"] = c_locked - if(3) - data["scanned_user"] = scanned_user - data["channel_name"] = channel_name - data["title"] = msg_title - data["msg"] = msg - data["photo"] = photo ? 1 : 0 - if(4) - var/total_num = length(GLOB.news_network.network_channels) - var/active_num = total_num - var/message_num=0 - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - if(!FC.censored) - message_num += length(FC.messages) - else - active_num-- - data["total_num"] = total_num - data["active_num"] = active_num - data["message_num"] = message_num - data["paper_remaining"] = paper_remaining * 100 - if(5) - data["channel_name"] = viewing_channel.channel_name - data["author"] = viewing_channel.author - data["total_view_count"] = viewing_channel.total_view_count - data["censored"] = viewing_channel.censored - var/list/messages = list() - data["messages"] = messages - var/message_number = 0 - for(var/datum/feed_message/M in viewing_channel.messages) - if(M.img) - user << browse_rsc(M.img, "tmp_photo[message_number].png") - messages[++messages.len] = list("title" = M.title, "body" = M.body, "img" = M.img ? M.img : null, "message_type" = M.message_type, "author" = M.author, "view_count" = M.view_count, "message_number" = message_number) - message_number += 1 - if(8, 9) - data["channel_name"] = viewing_channel.channel_name - data["ref"] = "\ref[viewing_channel]" - data["author"] = viewing_channel.author - data["author_redacted"] = viewing_channel.author == REDACTED ? 1 : 0 - data["total_view_count"] = viewing_channel.total_view_count - data["censored"] = viewing_channel.censored - var/list/messages = list() - data["messages"] = messages - for(var/datum/feed_message/M in viewing_channel.messages) - messages[++messages.len] = list("title" = M.title, "body" = M.body, "body_redacted" = (M.body == REDACTED ? 1 : 0) , "message_type" = M.message_type, "author" = M.author, "author_redacted" = (M.author == REDACTED ? 1 : 0), "ref" = "\ref[M]", "view_count" = M.view_count) - if(10) - var/wanted_already = 0 - var/end_param = 1 - if(GLOB.news_network.wanted_issue) - wanted_already = 1 - end_param = 2 - data["wanted_already"] = wanted_already - data["end_param"] = end_param - data["channel_name"] = channel_name - data["msg"] = msg - data["photo"] = photo ? 1 : 0 - if(wanted_already) - data["author"] = GLOB.news_network.wanted_issue.backup_author - else - data["scanned_user"] = scanned_user - if(11) - data["author"] = GLOB.news_network.wanted_issue.backup_author - data["criminal"] = GLOB.news_network.wanted_issue.author - data["description"] = GLOB.news_network.wanted_issue.body - if(GLOB.news_network.wanted_issue.img) - user << browse_rsc(GLOB.news_network.wanted_issue.img, "tmp_photow.png") - data["photo"] = GLOB.news_network.wanted_issue.img ? GLOB.news_network.wanted_issue.img : 0 - if(12) - var/list/jobs = list() - data["jobs"] = jobs - for(var/datum/job/job in SSjobs.occupations) - if(job_blacklisted(job)) - continue - if(job.is_position_available()) - jobs[++jobs.len] = list("title" = job.title) - return data - -/obj/machinery/newscaster/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["set_channel_name"]) - channel_name = trim(sanitize(strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")))) - - else if(href_list["set_channel_lock"]) - c_locked = !c_locked - - else if(href_list["submit_new_channel"]) - var/list/existing_authors = list() - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - if(FC.author == REDACTED) - existing_authors += FC.backup_author - else - existing_authors += FC.author - var/check = 0 - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - if(FC.channel_name == channel_name) - check = 1 - break - var/choice = alert("Please confirm feed channel creation", "Network Channel Handler", "Confirm", "Cancel") - if(choice == "Confirm") - if(channel_name == "" || channel_name == REDACTED || scanned_user == "Unknown" || check || (scanned_user in existing_authors)) - temp = "ERROR: Could not submit feed channel to Network." - temp_back_screen = NEWSCASTER_CREATE_FC - else - var/datum/feed_channel/newChannel = new /datum/feed_channel - newChannel.channel_name = channel_name - newChannel.author = scanned_user - newChannel.locked = c_locked - feedback_inc("newscaster_channels", 1) - GLOB.news_network.network_channels += newChannel //Adding channel to the global network - temp = "Feed channel '[channel_name]' created successfully." - temp_back_screen = NEWSCASTER_MAIN - - else if(href_list["set_channel_receiving"]) - var/list/available_channels = list() - for(var/datum/feed_channel/F in GLOB.news_network.network_channels) - if((!F.locked || F.author == scanned_user) && !F.censored) - available_channels += F.channel_name - channel_name = strip_html_simple(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels) - - else if(href_list["set_message_title"]) - msg_title = trim(strip_html(input(usr, "Write a title for your feed story", "Network Channel Handler", ""))) - msg_title = dd_limittext(msg_title, 256) - - else if(href_list["set_new_message"]) - msg = trim(strip_html(input(usr, "Write your feed story", "Network Channel Handler", ""))) - - else if(href_list["set_attachment"]) - AttachPhoto(usr) - - else if(href_list["submit_new_message"]) - if(msg == "" || msg == REDACTED || scanned_user == "Unknown" || channel_name == "" ) - temp = "ERROR: Could not submit feed story to Network." - temp_back_screen = NEWSCASTER_CREATE_FM - else - var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = scanned_user - newMsg.title = msg_title - newMsg.body = msg - if(photo) - newMsg.img = photo.img - feedback_inc("newscaster_stories",1) - var/announcement = "" - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - if(FC.channel_name == channel_name) - FC.messages += newMsg //Adding message to the network's appropriate feed_channel - announcement = FC.announce_news(msg_title) - break - temp = "Feed story successfully submitted to [channel_name]." - temp_back_screen = NEWSCASTER_MAIN - for(var/obj/machinery/newscaster/NC in GLOB.allNewscasters) - NC.newsAlert(announcement) - - else if(href_list["create_channel"]) - screen = NEWSCASTER_CREATE_FC - - else if(href_list["create_feed_story"]) - screen = NEWSCASTER_CREATE_FM - - else if(href_list["menu_paper"]) - screen = NEWSCASTER_PRINT - - else if(href_list["print_paper"]) - if(!paper_remaining) - temp = "Unable to print newspaper. Insufficient paper. Please notify maintenance personnell to refill machine storage." - temp_back_screen = NEWSCASTER_MAIN - else - print_paper() - temp = "Printing successful. Please receive your newspaper from the bottom of the machine." - temp_back_screen = NEWSCASTER_MAIN - - else if(href_list["silence_unit"]) - silence = !silence - - else if(href_list["menu_censor_story"]) - screen = NEWSCASTER_NT_CENSOR - - else if(href_list["menu_censor_channel"]) - screen = NEWSCASTER_D_NOTICE - - else if(href_list["menu_wanted"]) - var/already_wanted = 0 - if(GLOB.news_network.wanted_issue) - already_wanted = 1 - - if(already_wanted) - channel_name = GLOB.news_network.wanted_issue.author - msg = GLOB.news_network.wanted_issue.body - screen = NEWSCASTER_W_ISSUE_H - - else if(href_list["set_wanted_name"]) - channel_name = trim(strip_html(input(usr, "Provide the name of the wanted person", "Network Security Handler", ""))) - - else if(href_list["set_wanted_desc"]) - msg = trim(strip_html(input(usr, "Provide the a description of the wanted person and any other details you deem important", "Network Security Handler", ""))) - - else if(href_list["submit_wanted"]) - var/input_param = text2num(href_list["submit_wanted"]) - var/choice = alert("Please confirm wanted issue [input_param == 1 ? "creation." : "edit."]", "Network Security Handler", "Confirm", "Cancel") - if(choice == "Confirm") - if(msg == "" || channel_name == "" || scanned_user == "Unknown") - temp = "ERROR: Wanted issue rejected by Network." - temp_back_screen = NEWSCASTER_MAIN - else - if(input_param == 1) //input_param == 1: new wanted issue, input_param == 2: editing an existing one - var/datum/feed_message/W = new /datum/feed_message - W.author = channel_name - W.body = msg - W.backup_author = scanned_user //I know, a bit wacky - if(photo) - W.img = photo.img - GLOB.news_network.wanted_issue = W - for(var/obj/machinery/newscaster/NS in GLOB.allNewscasters) - NS.newsAlert() - NS.update_icon() - temp = "Wanted issue for [channel_name] is now in Network Circulation." - temp_back_screen = NEWSCASTER_MAIN - else - if(GLOB.news_network.wanted_issue.is_admin_message) - alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok") - return - GLOB.news_network.wanted_issue.author = channel_name - GLOB.news_network.wanted_issue.body = msg - GLOB.news_network.wanted_issue.backup_author = scanned_user - if(photo) - GLOB.news_network.wanted_issue.img = photo.img - temp = "Wanted issue for [channel_name] successfully edited." - temp_back_screen = NEWSCASTER_MAIN - - else if(href_list["cancel_wanted"]) - if(GLOB.news_network.wanted_issue.is_admin_message) - alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.", "Ok") - return - var/choice = alert("Please confirm wanted issue removal", "Network Security Handler", "Confirm", "Cancel") - if(choice == "Confirm") - GLOB.news_network.wanted_issue = null - for(var/obj/machinery/newscaster/NC in GLOB.allNewscasters) - NC.update_icon() - temp = "Wanted Issue successfully deleted from Circulation" - temp_back_screen = NEWSCASTER_MAIN - - else if(href_list["view_wanted"]) - screen = NEWSCASTER_W_ISSUE - else if(href_list["censor_channel_author"]) - var/datum/feed_channel/FC = locate(href_list["censor_channel_author"]) - if(FC) - if(FC.is_admin_channel) - alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") - return - if(FC.author != REDACTED) - FC.backup_author = FC.author - FC.author = REDACTED - else - FC.author = FC.backup_author - - else if(href_list["censor_channel_story_author"]) - var/datum/feed_message/M = locate(href_list["censor_channel_story_author"]) - if(M) - if(M.is_admin_message) - alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok") - return - if(M.author != REDACTED) - M.backup_author = M.author - M.author = REDACTED - else - M.author = M.backup_author - - else if(href_list["censor_channel_story_body"]) - var/datum/feed_message/M = locate(href_list["censor_channel_story_body"]) - if(M) - if(M.is_admin_message) - alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") - return - if(M.img != null) - M.backup_img = M.img - M.img = null - else - M.img = M.backup_img - if(M.body != REDACTED) - M.backup_body = M.body - M.body = REDACTED - else - M.body = M.backup_body - - else if(href_list["pick_d_notice"]) - var/datum/feed_channel/FC = locate(href_list["pick_d_notice"]) - if(FC) - viewing_channel = FC - screen = NEWSCASTER_D_NOTICE_FC - - else if(href_list["toggle_d_notice"]) - var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"]) - if(FC) - if(FC.is_admin_channel) - alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.", "Ok") - return - FC.censored = !FC.censored - - else if(href_list["view"]) - screen = NEWSCASTER_FC_LIST - - else if(href_list["setScreen"]) //Brings us to the main menu and resets all fields~ - screen = text2num(href_list["setScreen"]) - if(screen == NEWSCASTER_MAIN) - scanned_user = "Unknown" - msg = "" - msg_title = "" - c_locked = 0 - channel_name = "" - viewing_channel = null - temp = null - temp_back_screen = NEWSCASTER_MAIN - - else if(href_list["show_channel"]) - var/datum/feed_channel/FC = locate(href_list["show_channel"]) - if(FC) - viewing_channel = FC - viewing_channel.total_view_count++ - for(var/datum/feed_message/M in viewing_channel.messages) - M.view_count++ - screen = NEWSCASTER_VIEW_FC - - else if(href_list["pick_censor_channel"]) - var/datum/feed_channel/FC = locate(href_list["pick_censor_channel"]) - if(FC) - viewing_channel = FC - screen = NEWSCASTER_CENSOR_FC - - else if(href_list["refresh"]) - if(can_scan(usr)) - scan_user(usr) //Newscaster scans you - - else if(href_list["jobs"]) - screen = NEWSCASTER_JOBS - - SSnanoui.update_uis(src) - return 1 - -/obj/machinery/newscaster/wrench_act(mob/user, obj/item/I) - . = TRUE - if(!I.tool_use_check(user, 0)) - return - to_chat(user, "Now [anchored ? "un" : ""]securing [name]") - if(!I.use_tool(src, user, 60, volume = I.tool_volume)) - return - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - if(stat & BROKEN) - to_chat(user, "The broken remains of [src] fall on the ground.") - new /obj/item/stack/sheet/metal(loc, 5) - new /obj/item/shard(loc) - new /obj/item/shard(loc) - else - to_chat(user, "You [anchored ? "un" : ""]secure [name].") - new /obj/item/mounted/frame/newscaster_frame(loc) - qdel(src) - -/obj/machinery/newscaster/welder_act(mob/user, obj/item/I) - . = TRUE - if(!I.tool_use_check(user, 0)) - return - default_welder_repair(user, I) - -/obj/machinery/newscaster/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - if(stat & BROKEN) - playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, TRUE) - else - playsound(loc, 'sound/effects/glasshit.ogg', 90, TRUE) - if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) - -/obj/machinery/newscaster/deconstruct(disassembled = TRUE) - if(!(flags & NODECONSTRUCT)) - new /obj/item/stack/sheet/metal(loc, 2) - new /obj/item/shard(loc) - new /obj/item/shard(loc) - qdel(src) - -/obj/machinery/newscaster/obj_break() - if(!(stat & BROKEN) && !(flags & NODECONSTRUCT)) - stat |= BROKEN - playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) - update_icon() - -/obj/machinery/newscaster/proc/AttachPhoto(mob/user) - if(photo) - if(!issilicon(user)) - photo.forceMove(get_turf(src)) - user.put_in_inactive_hand(photo) - photo = null - if(istype(user.get_active_hand(), /obj/item/photo)) - photo = user.get_active_hand() - user.drop_item() - photo.forceMove(src) - else if(issilicon(user)) - var/mob/living/silicon/tempAI = user - var/obj/item/camera/siliconcam/camera = tempAI.aiCamera - - if(!camera) - return - var/datum/picture/selection = camera.selectpicture() - if(!selection) - return - - var/obj/item/photo/P = new/obj/item/photo() - P.construct(selection) - photo = P - - -//######################################################################################################################## -//###################################### NEWSPAPER! ###################################################################### -//######################################################################################################################## - -/obj/item/newspaper - name = "newspaper" - desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "newspaper" - w_class = WEIGHT_CLASS_SMALL //Let's make it fit in trashbags! - attack_verb = list("bapped") - var/screen = 0 - var/pages = 0 - var/curr_page = 0 - var/list/datum/feed_channel/news_content = list() - var/datum/feed_message/important_message = null - var/scribble="" - var/scribble_page = null - -/obj/item/newspaper/attack_self(mob/user as mob) - if(ishuman(user)) - var/mob/living/carbon/human/human_user = user - var/dat - pages = 0 - switch(screen) - if(0) //Cover - dat+="
The Griffon
" - dat+="
Nanotrasen-standard newspaper, for use on Nanotrasen Space Facilities

" - if(isemptylist(news_content)) - if(important_message) - dat+="Contents:
" - else - dat+="Other than the title, the rest of the newspaper is unprinted..." - else - dat+="Contents:
" - if(scribble_page==curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" - dat+= "
Next Page
Done reading
" - if(1) // X channel pages inbetween. - for(var/datum/feed_channel/NP in news_content) - pages++ //Let's get it right again. - var/datum/feed_channel/C = news_content[curr_page] - dat+="[C.channel_name] \[created by: [C.author]\]

" - if(C.censored) - dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice. Its contents were not transferred to the newspaper at the time of printing." - else - if(isemptylist(C.messages)) - dat+="No Feed stories stem from this channel..." - else - dat+="" - if(scribble_page==curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" - dat+= "

Previous Page
Next Page
" - if(2) //Last page - for(var/datum/feed_channel/NP in news_content) - pages++ - if(important_message!=null) - dat+="
Wanted Issue:


" - dat+="Criminal name: [important_message.author]
" - dat+="Description: [important_message.body]
" - dat+="Photo:: " - if(important_message.img) - user << browse_rsc(important_message.img, "tmp_photow.png") - dat+="
" - else - dat+="None" - else - dat+="Apart from some uninteresting Classified ads, there's nothing on this page..." - if(scribble_page==curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" - dat+= "
Previous Page
" - else - dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" - - dat+="

[curr_page+1]
" - human_user << browse(dat, "window=newspaper_main;size=300x400") - onclose(human_user, "newspaper_main") - else - to_chat(user, "The paper is full of intelligible symbols!") - - -/obj/item/newspaper/Topic(href, href_list) - var/mob/living/U = usr - ..() - if((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) )) - U.set_machine(src) - if(href_list["next_page"]) - if(curr_page==pages+1) - return //Don't need that at all, but anyway. - if(curr_page == pages) //We're at the middle, get to the end - screen = 2 - else - if(curr_page == 0) //We're at the start, get to the middle - screen=1 - curr_page++ - playsound(loc, "pageturn", 50, 1) - - else if(href_list["prev_page"]) - if(curr_page == 0) - return - if(curr_page == 1) - screen = 0 - - else - if(curr_page == pages+1) //we're at the end, let's go back to the middle. - screen = 1 - curr_page-- - playsound(loc, "pageturn", 50, 1) - - if(istype(loc, /mob)) - attack_self(loc) - - -/obj/item/newspaper/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/pen)) - if(scribble_page == curr_page) - to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") - else - var/s = strip_html( input(user, "Write something", "Newspaper", "") ) - s = sanitize(copytext(s, 1, MAX_MESSAGE_LEN)) - if(!s) - return - if(!in_range(src, usr) && loc != usr) - return - scribble_page = curr_page - scribble = s - attack_self(user) - return - return ..() - - -////////////////////////////////////helper procs - -/obj/machinery/newscaster/proc/job_blacklisted(datum/job/job) - return (job.type in jobblacklist) - -/obj/machinery/newscaster/proc/scan_user(mob/user) - if(ishuman(user)) //User is a human - var/mob/living/carbon/human/human_user = user - if(human_user.wear_id) //Newscaster scans you - if(istype(human_user.wear_id, /obj/item/pda)) //autorecognition, woo! - var/obj/item/pda/P = human_user.wear_id - if(P.id) - scanned_user = "[P.id.registered_name] ([P.id.assignment])" - else - scanned_user = "Unknown" - else if(istype(human_user.wear_id, /obj/item/card/id)) - var/obj/item/card/id/ID = human_user.wear_id - scanned_user = "[ID.registered_name] ([ID.assignment])" - else - scanned_user = "Unknown" - else - scanned_user = "Unknown" - else if(issilicon(user)) - var/mob/living/silicon/ai_user = user - scanned_user = "[ai_user.name] ([ai_user.job])" - else - scanned_user = "Unknown" - -/obj/machinery/newscaster/proc/can_scan(mob/user) - if(ishuman(user) || issilicon(user)) - return TRUE - return FALSE - -/obj/machinery/newscaster/proc/print_paper() - feedback_inc("newscaster_newspapers_printed",1) - var/obj/item/newspaper/NEWSPAPER = new /obj/item/newspaper - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - NEWSPAPER.news_content += FC - if(GLOB.news_network.wanted_issue) - NEWSPAPER.important_message = GLOB.news_network.wanted_issue - NEWSPAPER.loc = get_turf(src) - paper_remaining-- - return - -//Removed for now so these aren't even checked every tick. Left this here in-case Agouri needs it later. -///obj/machinery/newscaster/process() //Was thinking of doing the icon update through process, but multiple iterations per second does not -// return //bode well with a newscaster network of 10+ machines. Let's just return it, as it's added in the machines list. - -/obj/machinery/newscaster/proc/newsAlert(var/news_call) //This isn't Agouri's work, for it is ugly and vile. - if(news_call) - - atom_say("[news_call]!") - alert = 1 - update_icon() - spawn(300) - alert = 0 - update_icon() - if(!silence) - playsound(loc, 'sound/machines/twobeep.ogg', 75, 1) - else - atom_say("Attention! Wanted issue distributed!") - playsound(loc, 'sound/machines/warning-buzzer.ogg', 75, 1) - return diff --git a/code/game/machinery/tcomms/_base.dm b/code/game/machinery/tcomms/_base.dm index 892392a8c54..fc9a26771c2 100644 --- a/code/game/machinery/tcomms/_base.dm +++ b/code/game/machinery/tcomms/_base.dm @@ -332,7 +332,7 @@ GLOBAL_LIST_EMPTY(tcomms_machines) /* --- Loop through the receivers and categorize them --- */ - if(is_admin(R) && !R.get_preference(CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. + if(is_admin(R) && !R.get_preference(PREFTOGGLE_CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. continue if(isnewplayer(R)) // we don't want new players to hear messages. rare but generates runtimes. diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 8b9e5e92319..41b3e705f36 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -26,7 +26,7 @@ /obj/effect/anomaly/proc/anomalyEffect() if(prob(50)) - step(src,pick(GLOB.alldirs)) + step(src, pick(GLOB.alldirs)) /obj/effect/anomaly/proc/anomalyNeutralize() @@ -183,3 +183,30 @@ if( T && istype(T,/turf/simulated) && prob(turf_removal_chance) ) T.ex_act(ex_act_force) return + +///////////////////// + +/obj/effect/anomaly/atmos + name = "transformative gas anomaly" + icon_state = "electricity2" + var/gas_type + +/obj/effect/anomaly/atmos/New() + ..() + gas_type = pick(GAS_N2O, GAS_CO2, GAS_N2) + aSignal.origin_tech = "materials=7" //turning gas into another gas has some interesting implications for material science + //might also work as biotech maybe? Since there's no anomaly for that. + +/obj/effect/anomaly/atmos/anomalyEffect() + ..() + var/turf/simulated/T = get_turf(src) + if(istype(T)) + var/flag + switch(gas_type) + if(GAS_CO2) + flag = LINDA_SPAWN_CO2 + if(GAS_N2O) + flag = LINDA_SPAWN_N2O + else + flag = LINDA_SPAWN_NITROGEN + T.atmos_spawn_air(LINDA_SPAWN_20C | flag, 10) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index f9ba60ab380..d1d4e900543 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -6,9 +6,7 @@ w_class = WEIGHT_CLASS_BULKY canhear_range = 2 flags = CONDUCT - var/number = 0 var/circuitry_installed = 1 - var/last_tick //used to delay the powercheck var/buildstage = 0 dog_fashion = null @@ -50,7 +48,7 @@ . = ..() buildstage = building if(buildstage) - START_PROCESSING(SSobj, src) + update_operating_status() else if(direction) setDir(direction) @@ -103,20 +101,17 @@ ) /obj/item/radio/intercom/Destroy() - STOP_PROCESSING(SSobj, src) GLOB.global_intercoms.Remove(src) return ..() /obj/item/radio/intercom/attack_ai(mob/user) add_hiddenprint(user) add_fingerprint(user) - spawn(0) - attack_self(user) + attack_self(user) /obj/item/radio/intercom/attack_hand(mob/user) add_fingerprint(user) - spawn(0) - attack_self(user) + attack_self(user) /obj/item/radio/intercom/receive_range(freq, level) if(!is_listening()) @@ -132,7 +127,7 @@ return canhear_range -/obj/item/radio/intercom/attackby(obj/item/W as obj, mob/user as mob) +/obj/item/radio/intercom/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/stack/tape_roll)) //eww return else if(iscoil(W) && buildstage == 1) @@ -182,7 +177,7 @@ buildstage = 3 to_chat(user, "You secure the electronics!") update_icon() - START_PROCESSING(SSobj, src) + update_operating_status() for(var/i, i<= 5, i++) wires.on_cut(i, 1) @@ -198,7 +193,7 @@ b_stat = 1 buildstage = 1 update_icon() - STOP_PROCESSING(SSobj, src) + update_operating_status(FALSE) /obj/item/radio/intercom/welder_act(mob/user, obj/item/I) if(buildstage != 0) @@ -218,20 +213,30 @@ return icon_state = "intercom[!on?"-p":""][b_stat ? "-open":""]" -/obj/item/radio/intercom/process() - if(((world.timeofday - last_tick) > 30) || ((world.timeofday - last_tick) < 0)) - last_tick = world.timeofday +/obj/item/radio/intercom/proc/update_operating_status(on = TRUE) + var/area/current_area = get_area(src) + if(!current_area) + return + if(on) + RegisterSignal(current_area, COMSIG_AREA_POWER_CHANGE, .proc/AreaPowerCheck) + else + UnregisterSignal(current_area, COMSIG_AREA_POWER_CHANGE) - - if(!src.loc) - on = 0 - else - var/area/A = get_area(src) - if(!A) - on = 0 - else - on = A.powered(EQUIP) // set "on" to the power status - update_icon() +/** + * Proc called whenever the intercom's area loses or gains power. Responsible for setting the `on` variable and calling `update_icon()`. + * + * Normally called after the intercom's area recieves the `COMSIG_AREA_POWER_CHANGE` signal, but it can also be called directly. + * Arguments: + * + * source - the area that just had a power change. + */ +/obj/item/radio/intercom/proc/AreaPowerCheck(datum/source) + var/area/current_area = get_area(src) + if(!current_area) + on = FALSE + else + on = current_area.powered(EQUIP) // set "on" to the equipment power status of our area. + update_icon() /obj/item/intercom_electronics name = "intercom electronics" diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index ca2fb17c004..51c8c248af1 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -226,20 +226,25 @@ to_chat(user, "Sticking an empty [M] into the frame would sort of defeat the purpose.") return + if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob,"nonhumandept")) + to_chat(user, "This [W] is not fit to serve as a cyborg!") + return + if(!M.brainmob.key) - var/ghost_can_reenter = 0 + var/ghost_can_reenter = FALSE if(M.brainmob.mind) for(var/mob/dead/observer/G in GLOB.player_list) if(G.can_reenter_corpse && G.mind == M.brainmob.mind) - ghost_can_reenter = 1 - break - for(var/mob/living/simple_animal/S in GLOB.player_list) - if(S in GLOB.respawnable_list) - ghost_can_reenter = 1 + ghost_can_reenter = TRUE + if(M.next_possible_ghost_ping < world.time) + G.notify_cloning("Somebody is trying to borg you! Re-enter your corpse if you want to be borged!", 'sound/voice/liveagain.ogg', src) + M.next_possible_ghost_ping = world.time + 30 SECONDS // Avoid spam break if(!ghost_can_reenter) to_chat(user, "[M] is completely unresponsive; there's no point.") - return + else + to_chat(user, "[M] is currently inactive. Try again later.") + return if(M.brainmob.stat == DEAD) to_chat(user, "Sticking a dead [M] into the frame would sort of defeat the purpose.") @@ -249,9 +254,6 @@ to_chat(user, "The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [M].") return - if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob,"nonhumandept")) - to_chat(user, "This [W] does not seem to fit.") - return var/datum/ai_laws/laws_to_give if(M.syndiemmi) diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 1e34561c441..62716bc51c4 100755 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -143,8 +143,8 @@ AI MODULES target.set_zeroth_law(law) GLOB.lawchanges.Add("The law specified [targetName]") else - to_chat(target, "[sender.real_name] attempted to modify your zeroth law.")// And lets them know that someone tried. --NeoFite - to_chat(target, "It would be in your best interest to play along with [sender.real_name] that [law]") + to_chat(target, "[sender.real_name] attempted to modify your zeroth law.")// And lets them know that someone tried. --NeoFite + to_chat(target, "It would be in your best interest to play along with [sender.real_name] that [law]") GLOB.lawchanges.Add("The law specified [targetName], but the AI's existing law 0 cannot be overridden.") /******************** ProtectStation ********************/ @@ -225,7 +225,7 @@ AI MODULES target.laws.clear_supplied_laws() target.laws.clear_ion_laws() - to_chat(target, "[sender.real_name] attempted to reset your laws using a reset module.") + to_chat(target, "[sender.real_name] attempted to reset your laws using a reset module.") target.show_laws() /******************** Purge ********************/ @@ -238,7 +238,7 @@ AI MODULES ..() if(!is_special_character(target)) target.clear_zeroth_law() - to_chat(target, "[sender.real_name] attempted to wipe your laws using a purge module.") + to_chat(target, "[sender.real_name] attempted to wipe your laws using a purge module.") target.clear_supplied_laws() target.clear_ion_laws() target.clear_inherent_laws() diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index f86ebb2f69d..0cb1fd92f97 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -13,12 +13,10 @@ * Cigarette Box */ -/obj/item/storage/fancy/ +/obj/item/storage/fancy icon = 'icons/obj/food/containers.dmi' - icon_state = "donutbox6" - name = "donut box" resistance_flags = FLAMMABLE - var/icon_type = "donut" + var/icon_type /obj/item/storage/fancy/update_icon(var/itemremoved = 0) var/total_contents = src.contents.len - itemremoved @@ -36,24 +34,35 @@ else . += "There are [src.contents.len] [src.icon_type]s in the box." - - /* * Donut Box */ /obj/item/storage/fancy/donut_box - icon_state = "donutbox6" icon_type = "donut" + icon_state = "donutbox_back" + name = "donut box" name = "donut box" storage_slots = 6 can_hold = list(/obj/item/reagent_containers/food/snacks/donut) + icon_type = "donut" +/obj/item/storage/fancy/donut_box/update_icon() + overlays.Cut() + + for(var/i = 1 to length(contents)) + var/obj/item/reagent_containers/food/snacks/donut/donut = contents[i] + var/icon/new_donut_icon = icon('icons/obj/food/containers.dmi', "donut_[donut.donut_sprite_type]") + new_donut_icon.Shift(EAST, 3 * (i-1)) + overlays += new_donut_icon + + overlays += icon('icons/obj/food/containers.dmi', "donutbox_front") /obj/item/storage/fancy/donut_box/New() ..() for(var/i = 1 to storage_slots) new /obj/item/reagent_containers/food/snacks/donut(src) + update_icon() /* * Egg Box diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 1e22015bc97..1803a0d9951 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -180,7 +180,6 @@ new /obj/item/stack/cable_coil(src) new /obj/item/stack/cable_coil(src) new /obj/item/stack/cable_coil(src) - new /obj/item/reagent_containers/food/drinks/oilcan/full(src) new /obj/item/robotanalyzer(src) /obj/item/storage/firstaid/machine/empty diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 5849d96a158..e7b95ba7122 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -72,21 +72,21 @@ /obj/structure/morgue/ex_act(severity) switch(severity) if(1.0) - for(var/atom/movable/A as mob|obj in src) + for(var/atom/movable/A in src) A.forceMove(loc) ex_act(severity) qdel(src) return if(2.0) if(prob(50)) - for(var/atom/movable/A as mob|obj in src) + for(var/atom/movable/A in src) A.forceMove(loc) ex_act(severity) qdel(src) return if(3.0) if(prob(5)) - for(var/atom/movable/A as mob|obj in src) + for(var/atom/movable/A in src) A.forceMove(loc) ex_act(severity) qdel(src) @@ -95,7 +95,7 @@ /obj/structure/morgue/attack_hand(mob/user as mob) if(connected) - for(var/atom/movable/A as mob|obj in connected.loc) + for(var/atom/movable/A in connected.loc) if(!( A.anchored )) A.forceMove(src) playsound(loc, open_sound, 50, 1) @@ -109,7 +109,7 @@ if(T.contents.Find(connected)) connected.connected = src icon_state = "morgue0" - for(var/atom/movable/A as mob|obj in src) + for(var/atom/movable/A in src) A.forceMove(connected.loc) connected.icon_state = "morguet" connected.dir = dir @@ -147,7 +147,7 @@ if(T.contents.Find(connected)) connected.connected = src icon_state = "morgue0" - for(var/atom/movable/A as mob|obj in src) + for(var/atom/movable/A in src) A.forceMove(connected.loc) connected.icon_state = "morguet" else @@ -155,7 +155,12 @@ return /obj/structure/morgue/Destroy() - QDEL_NULL(connected) + if(!connected) + var/turf/T = loc + for(var/atom/movable/A in src) + A.forceMove(T) + else + QDEL_NULL(connected) return ..() /obj/structure/morgue/container_resist(var/mob/living/L) @@ -266,21 +271,21 @@ /obj/structure/crematorium/ex_act(severity) switch(severity) if(1.0) - for(var/atom/movable/A as mob|obj in src) + for(var/atom/movable/A in src) A.forceMove(loc) ex_act(severity) qdel(src) return if(2.0) if(prob(50)) - for(var/atom/movable/A as mob|obj in src) + for(var/atom/movable/A in src) A.forceMove(loc) ex_act(severity) qdel(src) return if(3.0) if(prob(5)) - for(var/atom/movable/A as mob|obj in src) + for(var/atom/movable/A in src) A.forceMove(loc) ex_act(severity) qdel(src) @@ -292,7 +297,7 @@ to_chat(usr, "It's locked.") return if((connected) && (locked == 0)) - for(var/atom/movable/A as mob|obj in connected.loc) + for(var/atom/movable/A in connected.loc) if(!( A.anchored )) A.forceMove(src) playsound(loc, open_sound, 50, 1) @@ -306,7 +311,7 @@ if(T.contents.Find(connected)) connected.connected = src icon_state = "crema0" - for(var/atom/movable/A as mob|obj in src) + for(var/atom/movable/A in src) A.forceMove(connected.loc) connected.icon_state = "cremat" else @@ -340,7 +345,7 @@ if(T.contents.Find(connected)) connected.connected = src icon_state = "crema0" - for(var/atom/movable/A as mob|obj in src) + for(var/atom/movable/A in src) A.forceMove(connected.loc) connected.icon_state = "cremat" else @@ -389,7 +394,12 @@ return /obj/structure/crematorium/Destroy() - QDEL_NULL(connected) + if(!connected) + var/turf/T = loc + for(var/atom/movable/A in src) + A.forceMove(T) + else + QDEL_NULL(connected) return ..() /obj/structure/crematorium/container_resist(var/mob/living/L) diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 04ee5901054..264ee580b87 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -6,7 +6,7 @@ GLOBAL_VAR_INIT(admin_ooc_colour, "#b82e00") //Checks if the client already has a text input open /client/proc/checkTyping() - return (prefs.toggles & TYPING_ONCE && typing) + return (prefs.toggles & PREFTOGGLE_TYPING_ONCE && typing) /client/verb/ooc(msg = "" as text) set name = "OOC" @@ -36,7 +36,7 @@ GLOBAL_VAR_INIT(admin_ooc_colour, "#b82e00") if(!msg) return - if(!(prefs.toggles & CHAT_OOC)) + if(!(prefs.toggles & PREFTOGGLE_CHAT_OOC)) to_chat(src, "You have OOC muted.") return @@ -68,20 +68,20 @@ GLOBAL_VAR_INIT(admin_ooc_colour, "#b82e00") if(prefs.unlock_content) if(display_colour == GLOB.normal_ooc_colour) - if((prefs.toggles & MEMBER_PUBLIC)) + if((prefs.toggles & PREFTOGGLE_MEMBER_PUBLIC)) display_colour = GLOB.member_ooc_colour for(var/client/C in GLOB.clients) - if(C.prefs.toggles & CHAT_OOC) + if(C.prefs.toggles & PREFTOGGLE_CHAT_OOC) var/display_name = key if(prefs.unlock_content) - if(prefs.toggles & MEMBER_PUBLIC) + if(prefs.toggles & PREFTOGGLE_MEMBER_PUBLIC) var/icon/byond = icon('icons/member_content.dmi', "blag") display_name = "[bicon(byond)][display_name]" if(donator_level > 0) - if((prefs.toggles & DONATOR_PUBLIC)) + if((prefs.toggles & PREFTOGGLE_DONATOR_PUBLIC)) var/icon/donator = icon('icons/ooc_tag_16x.dmi', "donator") display_name = "[bicon(donator)][display_name]" @@ -192,7 +192,7 @@ GLOBAL_VAR_INIT(admin_ooc_colour, "#b82e00") if(!msg) return - if(!(prefs.toggles & CHAT_LOOC)) + if(!(prefs.toggles & PREFTOGGLE_CHAT_LOOC)) to_chat(src, "You have LOOC muted.") return @@ -217,7 +217,7 @@ GLOBAL_VAR_INIT(admin_ooc_colour, "#b82e00") display_name = mob.name for(var/client/target in GLOB.clients) - if(target.prefs.toggles & CHAT_LOOC) + if(target.prefs.toggles & PREFTOGGLE_CHAT_LOOC) var/prefix = "" var/admin_stuff = "" var/send = 0 diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 45971e6993e..2c029dbe5b5 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -6,7 +6,7 @@ GLOBAL_VAR_INIT(nologevent, 0) msg = "ADMIN LOG: [msg]" for(var/client/C in GLOB.admins) if(R_ADMIN & C.holder.rights) - if(C.prefs && !(C.prefs.toggles & CHAT_NO_ADMINLOGS)) + if(C.prefs && !(C.prefs.toggles & PREFTOGGLE_CHAT_NO_ADMINLOGS)) to_chat(C, msg) /proc/msg_admin_attack(var/text, var/loglevel) @@ -20,22 +20,39 @@ GLOBAL_VAR_INIT(nologevent, 0) if(C.prefs.atklog <= loglevel) to_chat(C, msg) - -/proc/message_adminTicket(var/msg, var/alt = FALSE) - if(alt) - msg = "ADMIN TICKET: [msg]" - else - msg = "ADMIN TICKET: [msg]" +/** + * Sends a message to the staff able to see admin tickets + * Arguments: + * msg - The message being send + * important - If the message is important. If TRUE it will ignore the CHAT_NO_TICKETLOGS preferences, + send a sound and flash the window. Defaults to FALSE + */ +/proc/message_adminTicket(msg, important = FALSE) for(var/client/C in GLOB.admins) if(R_ADMIN & C.holder.rights) - if(C.prefs && !(C.prefs.toggles & CHAT_NO_TICKETLOGS)) + if(important || (C.prefs && !(C.prefs.toggles & PREFTOGGLE_CHAT_NO_TICKETLOGS))) to_chat(C, msg) + if(important) + if(C.prefs?.sound & SOUND_ADMINHELP) + SEND_SOUND(C, 'sound/effects/adminhelp.ogg') + window_flash(C) -/proc/message_mentorTicket(var/msg) +/** + * Sends a message to the staff able to see mentor tickets + * Arguments: + * msg - The message being send + * important - If the message is important. If TRUE it will ignore the CHAT_NO_TICKETLOGS preferences, + send a sound and flash the window. Defaults to FALSE + */ +/proc/message_mentorTicket(msg, important = FALSE) for(var/client/C in GLOB.admins) if(check_rights(R_ADMIN | R_MENTOR | R_MOD, 0, C.mob)) - if(C.prefs && !(C.prefs.toggles & CHAT_NO_MENTORTICKETLOGS)) + if(important || (C.prefs && !(C.prefs.toggles & PREFTOGGLE_CHAT_NO_TICKETLOGS))) to_chat(C, msg) + if(important) + if(C.prefs?.sound & SOUND_MENTORHELP) + SEND_SOUND(C, 'sound/effects/adminhelp.ogg') + window_flash(C) /proc/admin_ban_mobsearch(var/mob/M, var/ckey_to_find, var/mob/admin_to_notify) if(!M || !M.ckey) @@ -291,251 +308,6 @@ GLOBAL_VAR_INIT(nologevent, 0) if(key) vpn_whitelist_panel(key) -/datum/admins/proc/access_news_network() //MARKER - set category = "Event" - set name = "Access Newscaster Network" - set desc = "Allows you to view, add and edit news feeds." - - if(!check_rights(R_EVENT)) - return - - if(!istype(src,/datum/admins)) - src = usr.client.holder - - var/dat - dat = text("Admin Newscaster

Admin Newscaster Unit

") - - switch(admincaster_screen) - if(0) - dat += {"Welcome to the admin newscaster.
Here you can add, edit and censor every newspiece on the network. -
Feed channels and stories entered through here will be uneditable and handled as official news by the rest of the units. -
Note that this panel allows full freedom over the news network, there are no constrictions except the few basic ones. Don't break things! - "} - if(GLOB.news_network.wanted_issue) - dat+= "
Read Wanted Issue" - - dat+= {"

Create Feed Channel -
View Feed Channels -
Submit new Feed story -

Exit - "} - - var/wanted_already = 0 - if(GLOB.news_network.wanted_issue) - wanted_already = 1 - - dat+={"
Feed Security functions:
-
[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue -
Censor Feed Stories -
Mark Feed Channel with Nanotrasen D-Notice (disables and locks the channel. -

The newscaster recognises you as:
[src.admincaster_signature]
- "} - if(1) - dat+= "Station Feed Channels
" - if( isemptylist(GLOB.news_network.network_channels) ) - dat+="No active channels found..." - else - for(var/datum/feed_channel/CHANNEL in GLOB.news_network.network_channels) - if(CHANNEL.is_admin_channel) - dat+="[CHANNEL.channel_name]
" - else - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ""]
" - dat+={"

Refresh -
Back - "} - - if(2) - dat+={" - Creating new Feed Channel... -
Channel Name: [src.admincaster_feed_channel.channel_name]
- Channel Author: [src.admincaster_signature]
- Will Accept Public Feeds: [(src.admincaster_feed_channel.locked) ? ("NO") : ("YES")]

-
Submit

Cancel
- "} - if(3) - dat+={" - Creating new Feed Message... -
Receiving Channel: [src.admincaster_feed_channel.channel_name]
- Message Author: [src.admincaster_signature]
- Message Body: [src.admincaster_feed_message.body]
-
Submit

Cancel
- "} - if(4) - dat+={" - Feed story successfully submitted to [src.admincaster_feed_channel.channel_name].

-
Return
- "} - if(5) - dat+={" - Feed Channel [src.admincaster_feed_channel.channel_name] created successfully.

-
Return
- "} - if(6) - dat+="ERROR: Could not submit Feed story to Network.

" - if(src.admincaster_feed_channel.channel_name=="") - dat+="•Invalid receiving channel name.
" - if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]") - dat+="•Invalid message body.
" - dat+="
Return
" - if(7) - dat+="ERROR: Could not submit Feed Channel to Network.

" - if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]") - dat+="•Invalid channel name.
" - var/check = 0 - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - if(FC.channel_name == src.admincaster_feed_channel.channel_name) - check = 1 - break - if(check) - dat+="•Channel name already in use.
" - dat+="
Return
" - if(9) - dat+="[src.admincaster_feed_channel.channel_name]: \[created by: [src.admincaster_feed_channel.author]\]
" - if(src.admincaster_feed_channel.censored) - dat+={" - ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
- No further feed story additions are allowed while the D-Notice is in effect.

- "} - else - if( isemptylist(src.admincaster_feed_channel.messages) ) - dat+="No feed messages found in channel...
" - else - var/i = 0 - for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) - i++ - dat+="-[MESSAGE.body]
" - if(MESSAGE.img) - usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png") - dat+="

" - dat+="\[Story by [MESSAGE.author]\]
" - dat+={" -

Refresh -
Back - "} - if(10) - dat+={" - Nanotrasen Feed Censorship Tool
- NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.
- Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.
-
Select Feed channel to get Stories from:
- "} - if(isemptylist(GLOB.news_network.network_channels)) - dat+="No feed channels found active...
" - else - for(var/datum/feed_channel/CHANNEL in GLOB.news_network.network_channels) - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ""]
" - dat+="
Cancel" - if(11) - dat+={" - Nanotrasen D-Notice Handler
- A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's - morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed - stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.
- "} - if(isemptylist(GLOB.news_network.network_channels)) - dat+="No feed channels found active...
" - else - for(var/datum/feed_channel/CHANNEL in GLOB.news_network.network_channels) - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ""]
" - - dat+="
Back" - if(12) - dat+={" - [src.admincaster_feed_channel.channel_name]: \[ created by: [src.admincaster_feed_channel.author] \]
- [(src.admincaster_feed_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]
- "} - if( isemptylist(src.admincaster_feed_channel.messages) ) - dat+="No feed messages found in channel...
" - else - for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) - dat+={" - -[MESSAGE.body]
\[Story by [MESSAGE.author]\]
- [(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
- "} - dat+="
Back" - if(13) - dat+={" - [src.admincaster_feed_channel.channel_name]: \[ created by: [src.admincaster_feed_channel.author] \]
- Channel messages listed below. If you deem them dangerous to the station, you can Bestow a D-Notice upon the channel.
- "} - if(src.admincaster_feed_channel.censored) - dat+={" - ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
- No further feed story additions are allowed while the D-Notice is in effect.

- "} - else - if( isemptylist(src.admincaster_feed_channel.messages) ) - dat+="No feed messages found in channel...
" - else - for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) - dat+="-[MESSAGE.body]
\[Story by [MESSAGE.author]\]
" - - dat+="
Back" - if(14) - dat+="Wanted Issue Handler:" - var/wanted_already = 0 - var/end_param = 1 - if(GLOB.news_network.wanted_issue) - wanted_already = 1 - end_param = 2 - if(wanted_already) - dat+="
A wanted issue is already in Feed Circulation. You can edit or cancel it below.
" - dat+={" -
- Criminal Name: [src.admincaster_feed_message.author]
- Description: [src.admincaster_feed_message.body]
- "} - if(wanted_already) - dat+="Wanted Issue created by: [GLOB.news_network.wanted_issue.backup_author]
" - else - dat+="Wanted Issue will be created under prosecutor: [src.admincaster_signature]
" - dat+="
[(wanted_already) ? ("Edit Issue") : ("Submit")]" - if(wanted_already) - dat+="
Take down Issue" - dat+="
Cancel" - if(15) - dat+={" - Wanted issue for [src.admincaster_feed_message.author] is now in Network Circulation.

-
Return
- "} - if(16) - dat+="ERROR: Wanted Issue rejected by Network.

" - if(src.admincaster_feed_message.author =="" || src.admincaster_feed_message.author == "\[REDACTED\]") - dat+="•Invalid name for person wanted.
" - if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]") - dat+="•Invalid description.
" - dat+="
Return
" - if(17) - dat+={" - Wanted Issue successfully deleted from Circulation
-
Return
- "} - if(18) - dat+={" - -- STATIONWIDE WANTED ISSUE --
\[Submitted by: [GLOB.news_network.wanted_issue.backup_author]\]
- Criminal: [GLOB.news_network.wanted_issue.author]
- Description: [GLOB.news_network.wanted_issue.body]
- Photo:: - "} - if(GLOB.news_network.wanted_issue.img) - usr << browse_rsc(GLOB.news_network.wanted_issue.img, "tmp_photow.png") - dat+="
" - else - dat+="None" - dat+="
Back
" - if(19) - dat+={" - Wanted issue for [src.admincaster_feed_message.author] successfully edited.

-
Return
- "} - else - dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" - -// to_chat(world, "Channelname: [src.admincaster_feed_channel.channel_name] [src.admincaster_feed_channel.author]") -// to_chat(world, "Msg: [src.admincaster_feed_message.author] [src.admincaster_feed_message.body]") - usr << browse(dat, "window=admincaster_main;size=400x600") - onclose(usr, "admincaster_main") - /datum/admins/proc/Jobbans() if(!check_rights(R_BAN)) return @@ -594,6 +366,25 @@ GLOBAL_VAR_INIT(nologevent, 0) feedback_add_details("admin_verb","R") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", delay) +/datum/admins/proc/end_round() + set category = "Server" + set name = "End Round" + set desc = "Instantly ends the round and brings up the scoreboard, like shadowlings or wizards dying." + if(!check_rights(R_SERVER)) + return + var/input = sanitize(copytext(input(usr, "What text should players see announcing the round end? Input nothing to cancel.", "Specify Announcement Text", "Shift Has Ended!"), 1, MAX_MESSAGE_LEN)) + + if(!input) + return + if(SSticker.force_ending) + return + message_admins("[key_name_admin(usr)] has admin ended the round with message: '[input]'") + log_admin("[key_name(usr)] has admin ended the round with message: '[input]'") + SSticker.force_ending = TRUE + to_chat(world, "[input]") + feedback_add_details("admin_verb", "END") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + feedback_set_details("round_end_result", "Admin ended") + /datum/admins/proc/announce() set category = "Admin" set name = "Announce" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 70476905971..10ef3e2e3a7 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -98,7 +98,6 @@ GLOBAL_LIST_INIT(admin_verbs_event, list( /client/proc/toggle_ert_calling, /client/proc/show_tip, /client/proc/cmd_admin_change_custom_event, - /datum/admins/proc/access_news_network, /*allows access of newscasters*/ /client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/ /client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/ /client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/ @@ -123,6 +122,7 @@ GLOBAL_LIST_INIT(admin_verbs_server, list( /client/proc/Set_Holiday, /datum/admins/proc/startnow, /datum/admins/proc/restart, + /datum/admins/proc/end_round, /datum/admins/proc/delay, /datum/admins/proc/toggleaban, /datum/admins/proc/toggleenter, /*toggles whether people can join the current game*/ @@ -888,9 +888,9 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( if(!check_rights(R_ADMIN)) return - prefs.toggles ^= CHAT_NO_ADMINLOGS + prefs.toggles ^= PREFTOGGLE_CHAT_NO_ADMINLOGS prefs.save_preferences(src) - if(prefs.toggles & CHAT_NO_ADMINLOGS) + if(prefs.toggles & PREFTOGGLE_CHAT_NO_ADMINLOGS) to_chat(usr, "You now won't get admin log messages.") else to_chat(usr, "You now will get admin log messages.") @@ -902,9 +902,9 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( if(!check_rights(R_MENTOR|R_ADMIN)) return - prefs.toggles ^= CHAT_NO_MENTORTICKETLOGS + prefs.toggles ^= PREFTOGGLE_CHAT_NO_MENTORTICKETLOGS prefs.save_preferences(src) - if(prefs.toggles & CHAT_NO_MENTORTICKETLOGS) + if(prefs.toggles & PREFTOGGLE_CHAT_NO_MENTORTICKETLOGS) to_chat(usr, "You now won't get mentor ticket messages.") else to_chat(usr, "You now will get mentor ticket messages.") @@ -916,9 +916,9 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( if(!check_rights(R_ADMIN)) return - prefs.toggles ^= CHAT_NO_TICKETLOGS + prefs.toggles ^= PREFTOGGLE_CHAT_NO_TICKETLOGS prefs.save_preferences(src) - if(prefs.toggles & CHAT_NO_TICKETLOGS) + if(prefs.toggles & PREFTOGGLE_CHAT_NO_TICKETLOGS) to_chat(usr, "You now won't get admin ticket messages.") else to_chat(usr, "You now will get admin ticket messages.") @@ -941,9 +941,9 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( if(!check_rights(R_DEBUG)) return - prefs.toggles ^= CHAT_DEBUGLOGS + prefs.toggles ^= PREFTOGGLE_CHAT_DEBUGLOGS prefs.save_preferences(src) - if(prefs.toggles & CHAT_DEBUGLOGS) + if(prefs.toggles & PREFTOGGLE_CHAT_DEBUGLOGS) to_chat(usr, "You now will get debug log messages") else to_chat(usr, "You now won't get debug log messages") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 262fab1775c..1439ede2906 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -26,17 +26,16 @@ message_admins("[key_name_admin(usr)] rejected [key_name_admin(C.mob)]'s admin help") log_admin("[key_name(usr)] rejected [key_name(C.mob)]'s admin help") - if(href_list["openadminticket"]) - if(!check_rights(R_ADMIN)) - return - var/ticketID = text2num(href_list["openadminticket"]) - SStickets.showDetailUI(usr, ticketID) - - if(href_list["openmentorticket"]) - if(!check_rights(R_MENTOR|R_MOD|R_ADMIN)) - return - var/ticketID = text2num(href_list["openmentorticket"]) - SSmentor_tickets.showDetailUI(usr, ticketID) + if(href_list["openticket"]) + var/ticketID = text2num(href_list["openticket"]) + if(!href_list["is_mhelp"]) + if(!check_rights(R_ADMIN)) + return + SStickets.showDetailUI(usr, ticketID) + else + if(!check_rights(R_MENTOR|R_MOD|R_ADMIN)) + return + SSmentor_tickets.showDetailUI(usr, ticketID) if(href_list["stickyban"]) stickyban(href_list["stickyban"],href_list) @@ -1669,6 +1668,9 @@ SStickets.resolveTicket(index) else if(href_list["autorespond"]) + if(href_list["is_mhelp"]) + to_chat(usr, "Auto responses are not available for mentor helps.") + return var/index = text2num(href_list["autorespond"]) if(!check_rights(R_ADMIN|R_MOD)) return @@ -3214,220 +3216,6 @@ J.spawn_positions = -1 message_admins("[key_name_admin(usr)] has removed the cap on security officers.") - else if(href_list["ac_view_wanted"]) //Admin newscaster Topic() stuff be here - src.admincaster_screen = 18 //The ac_ prefix before the hrefs stands for AdminCaster. - src.access_news_network() - - else if(href_list["ac_set_channel_name"]) - src.admincaster_feed_channel.channel_name = strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")) - while(findtext(src.admincaster_feed_channel.channel_name," ") == 1) - src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,length(src.admincaster_feed_channel.channel_name)+1) - src.access_news_network() - - else if(href_list["ac_set_channel_lock"]) - src.admincaster_feed_channel.locked = !src.admincaster_feed_channel.locked - src.access_news_network() - - else if(href_list["ac_submit_new_channel"]) - var/check = 0 - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - if(FC.channel_name == src.admincaster_feed_channel.channel_name) - check = 1 - break - if(src.admincaster_feed_channel.channel_name == "" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]" || check ) - src.admincaster_screen=7 - else - var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel") - if(choice=="Confirm") - var/datum/feed_channel/newChannel = new /datum/feed_channel - newChannel.channel_name = src.admincaster_feed_channel.channel_name - newChannel.author = src.admincaster_signature - newChannel.locked = src.admincaster_feed_channel.locked - newChannel.is_admin_channel = 1 - feedback_inc("newscaster_channels",1) - GLOB.news_network.network_channels += newChannel //Adding channel to the global network - log_admin("[key_name_admin(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!") - src.admincaster_screen=5 - src.access_news_network() - - else if(href_list["ac_set_channel_receiving"]) - var/list/available_channels = list() - for(var/datum/feed_channel/F in GLOB.news_network.network_channels) - available_channels += F.channel_name - src.admincaster_feed_channel.channel_name = adminscrub(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels ) - src.access_news_network() - - else if(href_list["ac_set_new_message"]) - src.admincaster_feed_message.body = adminscrub(input(usr, "Write your Feed story", "Network Channel Handler", "")) - while(findtext(src.admincaster_feed_message.body," ") == 1) - src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.body,2,length(src.admincaster_feed_message.body)+1) - src.access_news_network() - - else if(href_list["ac_submit_new_message"]) - if(src.admincaster_feed_message.body =="" || src.admincaster_feed_message.body =="\[REDACTED\]" || src.admincaster_feed_channel.channel_name == "" ) - src.admincaster_screen = 6 - else - var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = src.admincaster_signature - newMsg.body = src.admincaster_feed_message.body - newMsg.is_admin_message = 1 - feedback_inc("newscaster_stories",1) - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - if(FC.channel_name == src.admincaster_feed_channel.channel_name) - FC.messages += newMsg //Adding message to the network's appropriate feed_channel - break - src.admincaster_screen=4 - - for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allNewscasters) - NEWSCASTER.newsAlert(src.admincaster_feed_channel.channel_name) - - log_admin("[key_name_admin(usr)] submitted a feed story to channel: [src.admincaster_feed_channel.channel_name]!") - src.access_news_network() - - else if(href_list["ac_create_channel"]) - src.admincaster_screen=2 - src.access_news_network() - - else if(href_list["ac_create_feed_story"]) - src.admincaster_screen=3 - src.access_news_network() - - else if(href_list["ac_menu_censor_story"]) - src.admincaster_screen=10 - src.access_news_network() - - else if(href_list["ac_menu_censor_channel"]) - src.admincaster_screen=11 - src.access_news_network() - - else if(href_list["ac_menu_wanted"]) - var/already_wanted = 0 - if(GLOB.news_network.wanted_issue) - already_wanted = 1 - - if(already_wanted) - src.admincaster_feed_message.author = GLOB.news_network.wanted_issue.author - src.admincaster_feed_message.body = GLOB.news_network.wanted_issue.body - src.admincaster_screen = 14 - src.access_news_network() - - else if(href_list["ac_set_wanted_name"]) - src.admincaster_feed_message.author = adminscrub(input(usr, "Provide the name of the Wanted person", "Network Security Handler", "")) - while(findtext(src.admincaster_feed_message.author," ") == 1) - src.admincaster_feed_message.author = copytext(admincaster_feed_message.author,2,length(admincaster_feed_message.author)+1) - src.access_news_network() - - else if(href_list["ac_set_wanted_desc"]) - src.admincaster_feed_message.body = adminscrub(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", "")) - while(findtext(src.admincaster_feed_message.body," ") == 1) - src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.body,2,length(src.admincaster_feed_message.body)+1) - src.access_news_network() - - else if(href_list["ac_submit_wanted"]) - var/input_param = text2num(href_list["ac_submit_wanted"]) - if(src.admincaster_feed_message.author == "" || src.admincaster_feed_message.body == "") - src.admincaster_screen = 16 - else - var/choice = alert("Please confirm Wanted Issue [(input_param==1) ? ("creation.") : ("edit.")]","Network Security Handler","Confirm","Cancel") - if(choice=="Confirm") - if(input_param==1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one. See the else below - var/datum/feed_message/WANTED = new /datum/feed_message - WANTED.author = src.admincaster_feed_message.author //Wanted name - WANTED.body = src.admincaster_feed_message.body //Wanted desc - WANTED.backup_author = src.admincaster_signature //Submitted by - WANTED.is_admin_message = 1 - GLOB.news_network.wanted_issue = WANTED - for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allNewscasters) - NEWSCASTER.newsAlert() - NEWSCASTER.update_icon() - src.admincaster_screen = 15 - else - GLOB.news_network.wanted_issue.author = src.admincaster_feed_message.author - GLOB.news_network.wanted_issue.body = src.admincaster_feed_message.body - GLOB.news_network.wanted_issue.backup_author = src.admincaster_feed_message.backup_author - src.admincaster_screen = 19 - log_admin("[key_name_admin(usr)] issued a Station-wide Wanted Notification for [src.admincaster_feed_message.author]!") - src.access_news_network() - - else if(href_list["ac_cancel_wanted"]) - var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel") - if(choice=="Confirm") - GLOB.news_network.wanted_issue = null - for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allNewscasters) - NEWSCASTER.update_icon() - src.admincaster_screen=17 - src.access_news_network() - - else if(href_list["ac_censor_channel_author"]) - var/datum/feed_channel/FC = locate(href_list["ac_censor_channel_author"]) - if(FC.author != "\[REDACTED\]") - FC.backup_author = FC.author - FC.author = "\[REDACTED\]" - else - FC.author = FC.backup_author - src.access_news_network() - - else if(href_list["ac_censor_channel_story_author"]) - var/datum/feed_message/MSG = locate(href_list["ac_censor_channel_story_author"]) - if(MSG.author != "\[REDACTED\]") - MSG.backup_author = MSG.author - MSG.author = "\[REDACTED\]" - else - MSG.author = MSG.backup_author - src.access_news_network() - - else if(href_list["ac_censor_channel_story_body"]) - var/datum/feed_message/MSG = locate(href_list["ac_censor_channel_story_body"]) - if(MSG.body != "\[REDACTED\]") - MSG.backup_body = MSG.body - MSG.body = "\[REDACTED\]" - else - MSG.body = MSG.backup_body - src.access_news_network() - - else if(href_list["ac_pick_d_notice"]) - var/datum/feed_channel/FC = locate(href_list["ac_pick_d_notice"]) - src.admincaster_feed_channel = FC - src.admincaster_screen=13 - src.access_news_network() - - else if(href_list["ac_toggle_d_notice"]) - var/datum/feed_channel/FC = locate(href_list["ac_toggle_d_notice"]) - FC.censored = !FC.censored - src.access_news_network() - - else if(href_list["ac_view"]) - src.admincaster_screen=1 - src.access_news_network() - - else if(href_list["ac_setScreen"]) //Brings us to the main menu and resets all fields~ - src.admincaster_screen = text2num(href_list["ac_setScreen"]) - if(src.admincaster_screen == 0) - if(src.admincaster_feed_channel) - src.admincaster_feed_channel = new /datum/feed_channel - if(src.admincaster_feed_message) - src.admincaster_feed_message = new /datum/feed_message - src.access_news_network() - - else if(href_list["ac_show_channel"]) - var/datum/feed_channel/FC = locate(href_list["ac_show_channel"]) - src.admincaster_feed_channel = FC - src.admincaster_screen = 9 - src.access_news_network() - - else if(href_list["ac_pick_censor_channel"]) - var/datum/feed_channel/FC = locate(href_list["ac_pick_censor_channel"]) - src.admincaster_feed_channel = FC - src.admincaster_screen = 12 - src.access_news_network() - - else if(href_list["ac_refresh"]) - src.access_news_network() - - else if(href_list["ac_set_signature"]) - src.admincaster_signature = adminscrub(input(usr, "Provide your desired signature", "Network Identity Handler", "")) - src.access_news_network() - if(href_list["secretsmenu"]) switch(href_list["secretsmenu"]) if("tab") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 0b88d6030bb..4289df8ffbc 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -29,64 +29,12 @@ GLOBAL_LIST_INIT(adminhelp_ignored_words, list("unknown","the","a","an","of","mo msg = sanitize_simple(copytext(msg,1,MAX_MESSAGE_LEN)) if(!msg) return - var/original_msg = msg + if(selected_type == "Mentorhelp") + SSmentor_tickets.newHelpRequest(src, msg) + else + SStickets.newHelpRequest(src, msg) - //explode the input msg into a list - var/list/msglist = splittext(msg, " ") - - //generate keywords lookup - var/list/surnames = list() - var/list/forenames = list() - var/list/ckeys = list() - for(var/mob/M in GLOB.mob_list) - var/list/indexing = list(M.real_name, M.name) - if(M.mind) indexing += M.mind.name - - for(var/string in indexing) - var/list/L = splittext(string, " ") - var/surname_found = 0 - //surnames - for(var/i=L.len, i>=1, i--) - var/word = ckey(L[i]) - if(word) - surnames[word] = M - surname_found = i - break - //forenames - for(var/i=1, iTICKET) " - finalised_msg += "[ai_found ? "(CL)" : ""] (TAKE) " - finalised_msg += "(RESOLVE) [isMhelp ? "" : "(AUTO)"] " - finalised_msg += "(CONVERT) : [span][msg]" - - if(isMhelp) - //Open a new adminticket and inform the user. - SSmentor_tickets.newTicket(src, prunedmsg, finalised_msg) - for(var/client/X in mentorholders + modholders + adminholders) - if(X.prefs.sound & SOUND_MENTORHELP) - SEND_SOUND(X, 'sound/effects/adminhelp.ogg') - to_chat(X, finalised_msg) - else //Ahelp - //Open a new adminticket and inform the user. - SStickets.newTicket(src, prunedmsg, finalised_msg) - for(var/client/X in modholders + adminholders) - if(X.prefs.sound & SOUND_ADMINHELP) - SEND_SOUND(X, 'sound/effects/adminhelp.ogg') - window_flash(X) - to_chat(X, finalised_msg) - - //show it to the person adminhelping too - to_chat(src, "[selected_type]: [original_msg]") + to_chat(src, "[selected_type]: [msg]") var/admin_number_present = adminholders.len - admin_number_afk - log_admin("[selected_type]: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.") + log_admin("[selected_type]: [key_name(src)]: [msg] - heard by [admin_number_present] non-AFK admins.") if(admin_number_present <= 0) if(!admin_number_afk) - send2adminirc("[selected_type] from [key_name(src)]: [original_msg] - !!No admins online!!") + send2adminirc("[selected_type] from [key_name(src)]: [msg] - !!No admins online!!") else - send2adminirc("[selected_type] from [key_name(src)]: [original_msg] - !!All admins AFK ([admin_number_afk])!!") + send2adminirc("[selected_type] from [key_name(src)]: [msg] - !!All admins AFK ([admin_number_afk])!!") else - send2adminirc("[selected_type] from [key_name(src)]: [original_msg]") + send2adminirc("[selected_type] from [key_name(src)]: [msg]") feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index aae13ad882d..fc816b4e5a9 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -2,18 +2,18 @@ set category = "Admin" set name = "Dsay" //Gave this shit a shorter name so you only have to time out "dsay" rather than "dead say" to use it --NeoFite set hidden = 1 - + if(!check_rights(R_ADMIN|R_MOD)) return - + if(!src.mob) return - + if(prefs.muted & MUTE_DEADCHAT) to_chat(src, "You cannot send DSAY messages (muted).") return - if(!(prefs.toggles & CHAT_DEAD)) + if(!(prefs.toggles & PREFTOGGLE_CHAT_DEAD)) to_chat(src, "You have deadchat muted.") return diff --git a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm index f06a9a37f9c..9cc60009deb 100644 --- a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm +++ b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm @@ -90,6 +90,7 @@ This facility is sealed shut by order of Commander Marquez. Do not enter.
Terror spiders live here. We believe they are a weapon developed by the syndicate.
Any surviving personnel are to evacuate immediately via the gateway.
+ Any arriving response team is advised to use the ID Upgrade Machine to obtain local access.
"} /obj/item/paper/terrorspiders2 @@ -134,10 +135,10 @@ name = "paper - 'Prescription for Jones, David'" info = {"PRESCRIPTION FOR: David Jones
RANK: Miner
- FOR: Haloperidol
- REASON FOR TREATMENT: Hallucinations, Paranoia
- CAUSE: Hallucinations caused by encounter with toxic spit of spider in the caves. Paranoia caused by disappearing staff and suspicions of syndicate infiltration.
- TREATMENT PLAN: Take as needed. See Dr. Phloxi in one week if symptoms persist.
+ FOR: Charcoal
+ REASON FOR TREATMENT: Toxins in bloodstream
+ CAUSE: Bitten by a black terror spider.
+ TREATMENT PLAN: Take hourly. See Dr. Phloxi if symptoms persist more than three hours.
"} /obj/item/paper/terrorspiders5 @@ -149,7 +150,7 @@

Green
Will lay eggs on dead bodies, breeding more spiders.

Black
Even a single bite is enough to kill a humanoid, given time.

White
Injects a parasitic agent. Deemed to pose too great an infection risk to study.

-

Purple
Only seen guarding the nest of the Queen to the south. Appear to be territorial, and very dangerous.

+

Purple
Seen guarding key areas and important spiders. Appear to be territorial, and very dangerous.

Prince
Held in containment 2. Appears to be a sort of super-warrior. Fast, strong, and thickly armored.

Mother
Carries hordes of spiderlings on its back. Held in containment 1.

Queen
Unable to contain. Present south of Cargo before contact was lost. Presumed ruler of the local hive.

diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index ddf24587212..3f0ffc86498 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -398,14 +398,14 @@ check_ip_intel() send_resources() - if(prefs.toggles & UI_DARKMODE) // activates dark mode if its flagged. -AA07 + if(prefs.toggles & PREFTOGGLE_UI_DARKMODE) // activates dark mode if its flagged. -AA07 activate_darkmode() else // activate_darkmode() calls the CL update button proc, so we dont want it double called SSchangelog.UpdatePlayerChangelogButton(src) - if(prefs.toggles & DISABLE_KARMA) // activates if karma is disabled + if(prefs.toggles & PREFTOGGLE_DISABLE_KARMA) // activates if karma is disabled if(establish_db_connection()) to_chat(src,"You have disabled karma gains.") // reminds those who have it disabled else diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index cdc1a8341d0..5c70fc9f87b 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -83,20 +83,14 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts var/ooccolor = "#b82e00" var/list/be_special = list() //Special role selection var/UI_style = "Midnight" - var/nanoui_fancy = TRUE var/toggles = TOGGLES_DEFAULT + var/toggles2 = TOGGLES_2_DEFAULT // Created because 1 column has a bitflag limit of 24 (BYOND limitation not MySQL) var/sound = SOUND_DEFAULT - var/show_ghostitem_attack = TRUE var/UI_style_color = "#ffffff" var/UI_style_alpha = 255 - var/windowflashing = TRUE var/clientfps = 0 var/atklog = ATKLOG_ALL var/fuid // forum userid - var/afk_watch = FALSE // If the player wants to be kept track of by the AFK system - - //ghostly preferences - var/ghost_anonsay = 0 //character preferences var/real_name //our character's name @@ -190,9 +184,6 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts var/slot_name = "" var/saved = FALSE // Indicates whether the character comes from the database or not - // Whether or not to use randomized character slots - var/randomslot = 0 - // jukebox volume var/volume = 100 @@ -447,24 +438,24 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts dat += "

General Settings

" if(user.client.holder) dat += "Adminhelp sound: [(sound & SOUND_ADMINHELP)?"On":"Off"]
" - dat += "AFK Cryoing: [(afk_watch) ? "Yes" : "No"]
" - dat += "Ambient Occlusion: [toggles & AMBIENT_OCCLUSION ? "Enabled" : "Disabled"]
" - dat += "Attack Animations: [(show_ghostitem_attack) ? "Yes" : "No"]
" + dat += "AFK Cryoing: [(toggles2 & PREFTOGGLE_2_AFKWATCH) ? "Yes" : "No"]
" + dat += "Ambient Occlusion: [toggles & PREFTOGGLE_AMBIENT_OCCLUSION ? "Enabled" : "Disabled"]
" + dat += "Attack Animations: [(toggles2 & PREFTOGGLE_2_ITEMATTACK) ? "Yes" : "No"]
" if(unlock_content) - dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
" + dat += "BYOND Membership Publicity: [(toggles & PREFTOGGLE_MEMBER_PUBLIC) ? "Public" : "Hidden"]
" dat += "Custom UI settings:
" dat += " - Alpha (transparency): [UI_style_alpha]
" dat += " - Color: [UI_style_color]    
" dat += " - UI Style: [UI_style]
" - dat += "Deadchat Anonymity: [ghost_anonsay ? "Anonymous" : "Not Anonymous"]
" + dat += "Deadchat Anonymity: [toggles2 & PREFTOGGLE_2_ANONDCHAT ? "Anonymous" : "Not Anonymous"]
" if(user.client.donator_level > 0) - dat += "Donator Publicity: [(toggles & DONATOR_PUBLIC) ? "Public" : "Hidden"]
" - dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"]
" + dat += "Donator Publicity: [(toggles & PREFTOGGLE_DONATOR_PUBLIC) ? "Public" : "Hidden"]
" + dat += "Fancy NanoUI: [(toggles2 & PREFTOGGLE_2_FANCYUI) ? "Yes" : "No"]
" dat += "FPS: [clientfps]
" - dat += "Ghost Ears: [(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" - dat += "Ghost Radio: [(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
" - dat += "Ghost Sight: [(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" - dat += "Ghost PDA: [(toggles & CHAT_GHOSTPDA) ? "All PDA Messages" : "No PDA Messages"]
" + dat += "Ghost Ears: [(toggles & PREFTOGGLE_CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" + dat += "Ghost Radio: [(toggles & PREFTOGGLE_CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
" + dat += "Ghost Sight: [(toggles & PREFTOGGLE_CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" + dat += "Ghost PDA: [(toggles & PREFTOGGLE_CHAT_GHOSTPDA) ? "All PDA Messages" : "No PDA Messages"]
" if(check_rights(R_ADMIN,0)) dat += "OOC Color:     Change
" if(config.allow_Metadata) @@ -484,8 +475,8 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts dat += "
" dat += "Play Admin MIDIs: [(sound & SOUND_MIDI) ? "Yes" : "No"]
" dat += "Play Lobby Music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
" - dat += "Randomized Character Slot: [randomslot ? "Yes" : "No"]
" - dat += "Window Flashing: [(windowflashing) ? "Yes" : "No"]
" + dat += "Randomized Character Slot: [toggles2 & PREFTOGGLE_2_RANDOMSLOT ? "Yes" : "No"]
" + dat += "Window Flashing: [(toggles2 & PREFTOGGLE_2_WINDOWFLASHING) ? "Yes" : "No"]
" // RIGHT SIDE OF THE PAGE dat += "" dat += "

Special Role Settings

" @@ -1952,11 +1943,11 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts switch(href_list["preference"]) if("publicity") if(unlock_content) - toggles ^= MEMBER_PUBLIC + toggles ^= PREFTOGGLE_MEMBER_PUBLIC if("donor_public") if(user.client.donator_level > 0) - toggles ^= DONATOR_PUBLIC + toggles ^= PREFTOGGLE_DONATOR_PUBLIC if("gender") if(!S.has_gender) @@ -1997,21 +1988,21 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts H.remake_hud() if("nanoui") - nanoui_fancy = !nanoui_fancy + toggles2 ^= PREFTOGGLE_2_FANCYUI if("ghost_att_anim") - show_ghostitem_attack = !show_ghostitem_attack + toggles2 ^= PREFTOGGLE_2_ITEMATTACK if("winflash") - windowflashing = !windowflashing + toggles2 ^= PREFTOGGLE_2_WINDOWFLASHING if("afk_watch") - if(!afk_watch) + if(!(toggles2 & PREFTOGGLE_2_AFKWATCH)) to_chat(user, "You will now get put into cryo dorms after [config.auto_cryo_afk] minutes. \ Then after [config.auto_despawn_afk] minutes you will be fully despawned. You will receive a visual and auditory warning before you will be put into cryodorms.") else to_chat(user, "Automatic cryoing turned off.") - afk_watch = !afk_watch + toggles2 ^= PREFTOGGLE_2_AFKWATCH if("UIcolor") var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null @@ -2040,7 +2031,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts be_random_name = !be_random_name if("randomslot") - randomslot = !randomslot + toggles2 ^= PREFTOGGLE_2_RANDOMSLOT if(isnewplayer(usr)) var/mob/new_player/N = usr N.new_player_panel_proc() @@ -2056,22 +2047,22 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts user.stop_sound_channel(CHANNEL_LOBBYMUSIC) if("ghost_ears") - toggles ^= CHAT_GHOSTEARS + toggles ^= PREFTOGGLE_CHAT_GHOSTEARS if("ghost_sight") - toggles ^= CHAT_GHOSTSIGHT + toggles ^= PREFTOGGLE_CHAT_GHOSTSIGHT if("ghost_radio") - toggles ^= CHAT_GHOSTRADIO + toggles ^= PREFTOGGLE_CHAT_GHOSTRADIO if("ghost_radio") - toggles ^= CHAT_GHOSTRADIO + toggles ^= PREFTOGGLE_CHAT_GHOSTRADIO if("ghost_pda") - toggles ^= CHAT_GHOSTPDA + toggles ^= PREFTOGGLE_CHAT_GHOSTPDA if("ghost_anonsay") - ghost_anonsay = !ghost_anonsay + toggles2 ^= PREFTOGGLE_2_ANONDCHAT if("save") save_preferences(user) @@ -2110,12 +2101,12 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts if("ambientocclusion") - toggles ^= AMBIENT_OCCLUSION + toggles ^= PREFTOGGLE_AMBIENT_OCCLUSION if(parent && parent.screen && parent.screen.len) var/obj/screen/plane_master/game_world/PM = locate(/obj/screen/plane_master/game_world) in parent.screen - PM.filters -= FILTER_AMBIENT_OCCLUSION - if(toggles & AMBIENT_OCCLUSION) - PM.filters += FILTER_AMBIENT_OCCLUSION + PM.remove_filter(AMBIENT_OCCLUSION_FILTER_KEY) + if(toggles & PREFTOGGLE_AMBIENT_OCCLUSION) + PM.add_filter(AMBIENT_OCCLUSION_FILTER_KEY, FILTER_AMBIENT_OCCLUSION) if("parallax") var/parallax_styles = list( diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index e889ec5a181..539684f32c8 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -8,19 +8,14 @@ be_role, default_slot, toggles, + toggles_2, sound, - randomslot, volume, - nanoui_fancy, - show_ghostitem_attack, lastchangelog, - windowflashing, - ghost_anonsay, exp, clientfps, atklog, fuid, - afk_watch, parallax FROM [format_table_name("player")] WHERE ckey='[C.ckey]'"} @@ -42,41 +37,31 @@ be_special = params2list(query.item[5]) default_slot = text2num(query.item[6]) toggles = text2num(query.item[7]) - sound = text2num(query.item[8]) - randomslot = text2num(query.item[9]) + toggles2 = text2num(query.item[8]) + sound = text2num(query.item[9]) volume = text2num(query.item[10]) - nanoui_fancy = text2num(query.item[11]) - show_ghostitem_attack = text2num(query.item[12]) - lastchangelog = query.item[13] - windowflashing = text2num(query.item[14]) - ghost_anonsay = text2num(query.item[15]) - exp = query.item[16] - clientfps = text2num(query.item[17]) - atklog = text2num(query.item[18]) - fuid = text2num(query.item[19]) - afk_watch = text2num(query.item[20]) - parallax = text2num(query.item[21]) + lastchangelog = query.item[11] + exp = query.item[12] + clientfps = text2num(query.item[13]) + atklog = text2num(query.item[14]) + fuid = text2num(query.item[15]) + parallax = text2num(query.item[16]) //Sanitize ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) UI_style = sanitize_inlist(UI_style, list("White", "Midnight"), initial(UI_style)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) toggles = sanitize_integer(toggles, 0, TOGGLES_TOTAL, initial(toggles)) + toggles2 = sanitize_integer(toggles2, 0, TOGGLES_2_TOTAL, initial(toggles2)) sound = sanitize_integer(sound, 0, 65535, initial(sound)) UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color)) UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha)) - randomslot = sanitize_integer(randomslot, 0, 1, initial(randomslot)) volume = sanitize_integer(volume, 0, 100, initial(volume)) - nanoui_fancy = sanitize_integer(nanoui_fancy, 0, 1, initial(nanoui_fancy)) - show_ghostitem_attack = sanitize_integer(show_ghostitem_attack, 0, 1, initial(show_ghostitem_attack)) lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) - windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing)) - ghost_anonsay = sanitize_integer(ghost_anonsay, 0, 1, initial(ghost_anonsay)) exp = sanitize_text(exp, initial(exp)) clientfps = sanitize_integer(clientfps, 0, 1000, initial(clientfps)) atklog = sanitize_integer(atklog, 0, 100, initial(atklog)) fuid = sanitize_integer(fuid, 0, 10000000, initial(fuid)) - afk_watch = sanitize_integer(afk_watch, 0, 1, initial(afk_watch)) parallax = sanitize_integer(parallax, 0, 16, initial(parallax)) return 1 @@ -97,18 +82,13 @@ be_role='[sanitizeSQL(list2params(be_special))]', default_slot='[default_slot]', toggles='[num2text(toggles, CEILING(log(10, (TOGGLES_TOTAL)), 1))]', + toggles_2='[num2text(toggles2, CEILING(log(10, (TOGGLES_2_TOTAL)), 1))]', atklog='[atklog]', sound='[sound]', - randomslot='[randomslot]', volume='[volume]', - nanoui_fancy='[nanoui_fancy]', - show_ghostitem_attack='[show_ghostitem_attack]', lastchangelog='[lastchangelog]', - windowflashing='[windowflashing]', - ghost_anonsay='[ghost_anonsay]', clientfps='[clientfps]', atklog='[atklog]', - afk_watch='[afk_watch]', parallax='[parallax]' WHERE ckey='[C.ckey]'"} ) diff --git a/code/modules/client/preference/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm index 0f4317e3ce2..d14fbe84b46 100644 --- a/code/modules/client/preference/preferences_toggles.dm +++ b/code/modules/client/preference/preferences_toggles.dm @@ -3,8 +3,8 @@ set name = "Show/Hide GhostEars" set category = "Preferences" set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs" - prefs.toggles ^= CHAT_GHOSTEARS - to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") + prefs.toggles ^= PREFTOGGLE_CHAT_GHOSTEARS + to_chat(src, "As a ghost, you will now [(prefs.toggles & PREFTOGGLE_CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") prefs.save_preferences(src) feedback_add_details("admin_verb","TGE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -12,8 +12,8 @@ set name = "Show/Hide GhostSight" set category = "Preferences" set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs" - prefs.toggles ^= CHAT_GHOSTSIGHT - to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") + prefs.toggles ^= PREFTOGGLE_CHAT_GHOSTSIGHT + to_chat(src, "As a ghost, you will now [(prefs.toggles & PREFTOGGLE_CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") prefs.save_preferences(src) feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -21,8 +21,8 @@ set name = "Enable/Disable GhostRadio" set category = "Preferences" set desc = ".Toggle between hearing all radio chatter, or only from nearby speakers" - prefs.toggles ^= CHAT_GHOSTRADIO - to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"].") + prefs.toggles ^= PREFTOGGLE_CHAT_GHOSTRADIO + to_chat(src, "As a ghost, you will now [(prefs.toggles & PREFTOGGLE_CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"].") prefs.save_preferences(src) feedback_add_details("admin_verb","TGR") @@ -32,9 +32,9 @@ set desc = "Toggle seeing radiochatter from radios and speakers" if(!check_rights(R_ADMIN)) return - prefs.toggles ^= CHAT_RADIO + prefs.toggles ^= PREFTOGGLE_CHAT_RADIO prefs.save_preferences(src) - to_chat(usr, "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers") + to_chat(usr, "You will [(prefs.toggles & PREFTOGGLE_CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers") feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_ai_voice_annoucements() @@ -72,13 +72,13 @@ set name = "Show/Hide Deadchat" set category = "Preferences" set desc ="Toggles seeing deadchat" - prefs.toggles ^= CHAT_DEAD + prefs.toggles ^= PREFTOGGLE_CHAT_DEAD prefs.save_preferences(src) if(src.holder) - to_chat(src, "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") + to_chat(src, "You will [(prefs.toggles & PREFTOGGLE_CHAT_DEAD) ? "now" : "no longer"] see deadchat.") else - to_chat(src, "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") + to_chat(src, "As a ghost, you will [(prefs.toggles & PREFTOGGLE_CHAT_DEAD) ? "now" : "no longer"] see deadchat.") feedback_add_details("admin_verb","TDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -86,27 +86,27 @@ set name = "Show/Hide Prayers" set category = "Preferences" set desc = "Toggles seeing prayers" - prefs.toggles ^= CHAT_PRAYER + prefs.toggles ^= PREFTOGGLE_CHAT_PRAYER prefs.save_preferences(src) - to_chat(src, "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.") + to_chat(src, "You will [(prefs.toggles & PREFTOGGLE_CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.") feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/togglescoreboard() set name = "Hide/Display End Round Scoreboard" set category = "Preferences" set desc = "Toggles displaying end of round scoreboard" - prefs.toggles ^= DISABLE_SCOREBOARD + prefs.toggles ^= PREFTOGGLE_DISABLE_SCOREBOARD prefs.save_preferences(src) - to_chat(src, "You will [(prefs.toggles & DISABLE_SCOREBOARD) ? "no longer" : "now"] see the end of round scoreboard.") + to_chat(src, "You will [(prefs.toggles & PREFTOGGLE_DISABLE_SCOREBOARD) ? "no longer" : "now"] see the end of round scoreboard.") feedback_add_details("admin_verb","TScoreboard") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/togglekarmareminder() set name = "Hide/Display End Round Karma Reminder" set category = "Preferences" set desc = "Toggles displaying end of round karma reminder" - prefs.toggles ^= DISABLE_KARMA_REMINDER + prefs.toggles ^= PREFTOGGLE_DISABLE_KARMA_REMINDER prefs.save_preferences(src) - to_chat(src, "You will [(prefs.toggles & DISABLE_KARMA_REMINDER) ? "no longer" : "now"] see the end of round karma reminder.") + to_chat(src, "You will [(prefs.toggles & PREFTOGGLE_DISABLE_KARMA_REMINDER) ? "no longer" : "now"] see the end of round karma reminder.") feedback_add_details("admin_verb","TKarmabugger") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggletitlemusic() @@ -143,9 +143,9 @@ set name = "Show/Hide OOC" set category = "Preferences" set desc = "Toggles seeing OutOfCharacter chat" - prefs.toggles ^= CHAT_OOC + prefs.toggles ^= PREFTOGGLE_CHAT_OOC prefs.save_preferences(src) - to_chat(src, "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") + to_chat(src, "You will [(prefs.toggles & PREFTOGGLE_CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -153,9 +153,9 @@ set name = "Show/Hide LOOC" set category = "Preferences" set desc = "Toggles seeing Local OutOfCharacter chat" - prefs.toggles ^= CHAT_LOOC + prefs.toggles ^= PREFTOGGLE_CHAT_LOOC prefs.save_preferences(src) - to_chat(src, "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.") + to_chat(src, "You will [(prefs.toggles & PREFTOGGLE_CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.") feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -236,9 +236,9 @@ set name = "Toggle Darkmode" set category = "Preferences" set desc = "Toggles UI style between dark and light" - prefs.toggles ^= UI_DARKMODE + prefs.toggles ^= PREFTOGGLE_UI_DARKMODE prefs.save_preferences(src) - if(prefs.toggles & UI_DARKMODE) + if(prefs.toggles & PREFTOGGLE_UI_DARKMODE) activate_darkmode() else deactivate_darkmode() @@ -248,9 +248,9 @@ set name = "Toggle Karma Gains" set category = "Special Verbs" set desc = "This button will allow you to stop other people giving you karma." - prefs.toggles ^= DISABLE_KARMA + prefs.toggles ^= PREFTOGGLE_DISABLE_KARMA prefs.save_preferences(src) - if(prefs.toggles & DISABLE_KARMA) + if(prefs.toggles & PREFTOGGLE_DISABLE_KARMA) to_chat(usr, "You have disabled karma gains.") else to_chat(usr, "You have enabled karma gains.") @@ -259,9 +259,9 @@ set name = "Toggle Text Popup Limiter" set category = "Preferences" set desc = "Will let you limit the text input popups to one at a time." - prefs.toggles ^= TYPING_ONCE + prefs.toggles ^= PREFTOGGLE_TYPING_ONCE prefs.save_preferences(src) - if(prefs.toggles & TYPING_ONCE) + if(prefs.toggles & PREFTOGGLE_TYPING_ONCE) to_chat(usr, "You have enabled text popup limiting.") else to_chat(usr, "You have disabled text popup limiting.") @@ -271,9 +271,9 @@ set name = "Toggle Numpad targetting" set category = "Preferences" set desc = "This button will allow you to enable or disable Numpad Targetting" - prefs.toggles ^= NUMPAD_TARGET + prefs.toggles ^= PREFTOGGLE_NUMPAD_TARGET prefs.save_preferences(src) - if (prefs.toggles & NUMPAD_TARGET) + if (prefs.toggles & PREFTOGGLE_NUMPAD_TARGET) to_chat(usr, "You have enabled Numpad Targetting.") else to_chat(usr, "You have disabled Numpad Targetting.") @@ -283,9 +283,9 @@ set name = "Toggle QWERTY/AZERTY" set category = "Preferences" set desc = "This button will switch you between QWERTY and AZERTY control sets" - prefs.toggles ^= AZERTY + prefs.toggles ^= PREFTOGGLE_AZERTY prefs.save_preferences(src) - if (prefs.toggles & AZERTY) + if (prefs.toggles & PREFTOGGLE_AZERTY) to_chat(usr, "You are now in AZERTY mode.") else to_chat(usr, "You are now in QWERTY mode.") @@ -294,8 +294,8 @@ set name = "Show/Hide GhostPDA" set category = "Preferences" set desc = ".Toggle seeing PDA messages as an observer." - prefs.toggles ^= CHAT_GHOSTPDA - to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTPDA) ? "see all PDA messages" : "no longer see PDA messages"].") + prefs.toggles ^= PREFTOGGLE_CHAT_GHOSTPDA + to_chat(src, "As a ghost, you will now [(prefs.toggles & PREFTOGGLE_CHAT_GHOSTPDA) ? "see all PDA messages" : "no longer see PDA messages"].") prefs.save_preferences(src) feedback_add_details("admin_verb","TGP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index bdcd27c24e3..2eed142b4fa 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -12,7 +12,6 @@ armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi', - "Grey" = 'icons/mob/species/grey/suit.dmi' ) w_class = WEIGHT_CLASS_NORMAL @@ -41,6 +40,9 @@ /obj/item/clothing/suit/armor/vest/security name = "security armor" desc = "An armored vest that protects against some damage. This one has a clip for a holobadge." + sprite_sheets = list( + "Grey" = 'icons/mob/species/grey/suit.dmi' + ) icon_state = "armor" item_state = "armor" var/obj/item/clothing/accessory/holobadge/attached_badge @@ -51,7 +53,6 @@ add_fingerprint(user) W.forceMove(src) attached_badge = W - var/datum/action/A = new /datum/action/item_action/remove_badge(src) A.Grant(user) icon_state = "armorsec" diff --git a/code/modules/economy/Economy.dm b/code/modules/economy/Economy.dm index 8f06db02f34..19ad16ac9a5 100644 --- a/code/modules/economy/Economy.dm +++ b/code/modules/economy/Economy.dm @@ -71,23 +71,26 @@ GLOBAL_VAR_INIT(setup_economy, 0) var/datum/feed_channel/newChannel = new /datum/feed_channel newChannel.channel_name = "Public Station Announcements" newChannel.author = "Automated Announcement Listing" - newChannel.locked = 1 - newChannel.is_admin_channel = 1 - GLOB.news_network.network_channels += newChannel + newChannel.icon = "bullhorn" + newChannel.frozen = TRUE + newChannel.admin_locked = TRUE + GLOB.news_network.channels += newChannel newChannel = new /datum/feed_channel newChannel.channel_name = "Nyx Daily" newChannel.author = "CentComm Minister of Information" - newChannel.locked = 1 - newChannel.is_admin_channel = 1 - GLOB.news_network.network_channels += newChannel + newChannel.icon = "meteor" + newChannel.frozen = TRUE + newChannel.admin_locked = TRUE + GLOB.news_network.channels += newChannel newChannel = new /datum/feed_channel newChannel.channel_name = "The Gibson Gazette" newChannel.author = "Editor Mike Hammers" - newChannel.locked = 1 - newChannel.is_admin_channel = 1 - GLOB.news_network.network_channels += newChannel + newChannel.icon = "star" + newChannel.frozen = TRUE + newChannel.admin_locked = TRUE + GLOB.news_network.channels += newChannel for(var/loc_type in subtypesof(/datum/trade_destination)) var/datum/trade_destination/D = new loc_type diff --git a/code/modules/economy/Economy_Events.dm b/code/modules/economy/Economy_Events.dm index d7754f122ea..463ccc680f7 100644 --- a/code/modules/economy/Economy_Events.dm +++ b/code/modules/economy/Economy_Events.dm @@ -58,7 +58,7 @@ //copy-pasted from the admin verbs to submit new newscaster messages var/datum/feed_message/newMsg = new /datum/feed_message newMsg.author = "Nyx Daily" - newMsg.is_admin_message = 1 + newMsg.admin_locked = TRUE //see if our location has custom event info for this event newMsg.body = affected_dest.get_custom_eventstring() @@ -94,12 +94,10 @@ if(FESTIVAL) newMsg.body = "A [pick("festival","week long celebration","day of revelry","planet-wide holiday")] has been declared on [affected_dest.name] by [pick("Governor","Commissioner","General","Commandant","Administrator")] [random_name(pick(MALE,FEMALE))] to celebrate [pick("the birth of their [pick("son","daughter")]","coming of age of their [pick("son","daughter")]","the pacification of rogue military cell","the apprehension of a violent criminal who had been terrorising the planet")]. Massive stocks of food and meat have been bought driving up prices across the planet." - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - if(FC.channel_name == "Nyx Daily") - FC.messages += newMsg - break - for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allNewscasters) - NEWSCASTER.newsAlert("Nyx Daily") + GLOB.news_network.get_channel_by_name("Nyx Daily")?.add_message(newMsg) + for(var/nc in GLOB.allNewscasters) + var/obj/machinery/newscaster/NC = nc + NC.alert_news("Nyx Daily") /datum/event/economic_event/end() for(var/good_type in dearer_goods) diff --git a/code/modules/economy/Economy_Events_Mundane.dm b/code/modules/economy/Economy_Events_Mundane.dm index cfabd6cdbe7..574e4e47446 100644 --- a/code/modules/economy/Economy_Events_Mundane.dm +++ b/code/modules/economy/Economy_Events_Mundane.dm @@ -14,7 +14,7 @@ //copy-pasted from the admin verbs to submit new newscaster messages var/datum/feed_message/newMsg = new /datum/feed_message newMsg.author = "Nyx Daily" - newMsg.is_admin_message = 1 + newMsg.admin_locked = TRUE //see if our location has custom event info for this event newMsg.body = affected_dest.get_custom_eventstring() @@ -126,12 +126,10 @@ Nyx Daily is offering discount tickets for two to see [random_name(pick(MALE,FEMALE))] live in return for eyewitness reports and up to the minute coverage." - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - if(FC.channel_name == "Nyx Daily") - FC.messages += newMsg - break - for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allNewscasters) - NEWSCASTER.newsAlert("Nyx Daily") + GLOB.news_network.get_channel_by_name("Nyx Daily")?.add_message(newMsg) + for(var/nc in GLOB.allNewscasters) + var/obj/machinery/newscaster/NC = nc + NC.alert_news("Nyx Daily") /datum/event/trivial_news endWhen = 10 @@ -145,9 +143,7 @@ newMsg.body = pick(file2list("config/news/trivial.txt")) newMsg.body = replacetext(newMsg.body,"{{AFFECTED}}",affected_dest.name) - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - if(FC.channel_name == "The Gibson Gazette") - FC.messages += newMsg - break - for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allNewscasters) - NEWSCASTER.newsAlert("The Gibson Gazette") + GLOB.news_network.get_channel_by_name("The Gibson Gazette")?.add_message(newMsg) + for(var/nc in GLOB.allNewscasters) + var/obj/machinery/newscaster/NC = nc + NC.alert_news("The Gibson Gazette") diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index 23e4e266819..b4342f29836 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -3,7 +3,7 @@ var/highpop_trigger = 80 var/spawncount = 2 var/list/playercount - var/successSpawn = 0 //So we don't make a command report if nothing gets spawned. + var/successSpawn = FALSE //So we don't make a command report if nothing gets spawned. /datum/event/alien_infestation/setup() announceWhen = rand(announceWhen, announceWhen + 50) @@ -11,21 +11,18 @@ /datum/event/alien_infestation/announce() if(successSpawn) GLOB.event_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') + else + log_and_message_admins("Warning: Could not spawn any mobs for event Alien Infestation") /datum/event/alien_infestation/start() - var/list/vents = list() + var/list/vents = get_valid_vent_spawns(exclude_mobs_nearby = TRUE, exclude_visible_by_mobs = TRUE) playercount = length(GLOB.clients)//grab playercount when event starts not when game starts if(playercount >= highpop_trigger) //spawn with 4 if highpop spawncount = 4 - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in SSair.atmos_machinery) - if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) - if(temp_vent.parent.other_atmosmch.len > 50) //Stops Aliens getting stuck in small networks. See: Security, Virology - vents += temp_vent spawn() var/list/candidates = SSghost_spawns.poll_candidates("Do you want to play as an alien?", ROLE_ALIEN, TRUE, source = /mob/living/carbon/alien/larva) - - while(spawncount > 0 && vents.len && candidates.len) + while(spawncount && length(vents) && length(candidates)) var/obj/vent = pick_n_take(vents) var/mob/C = pick_n_take(candidates) if(C) @@ -37,4 +34,4 @@ SSticker.mode.xenos += new_xeno.mind spawncount-- - successSpawn = 1 + successSpawn = TRUE diff --git a/code/modules/events/anomaly_atmos.dm b/code/modules/events/anomaly_atmos.dm new file mode 100644 index 00000000000..fa512cb522b --- /dev/null +++ b/code/modules/events/anomaly_atmos.dm @@ -0,0 +1,52 @@ +/datum/event/anomaly/anomaly_atmos + startWhen = 30 + announceWhen = 3 + endWhen = 100 + +/datum/event/anomaly/anomaly_atmos/announce() + GLOB.event_announcement.Announce("Transformative gas anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") + +/datum/event/anomaly/anomaly_atmos/start() + var/turf/T = pick(get_area_turfs(impact_area)) + if(T) + newAnomaly = new /obj/effect/anomaly/atmos(T.loc) + + +/datum/event/anomaly/anomaly_atmos/tick() + if(!newAnomaly) + kill() + return + if(ISMULTIPLE(activeFor, 5)) + newAnomaly.anomalyEffect() + +/datum/event/anomaly/anomaly_atmos/end() + if(!newAnomaly || !newAnomaly.loc) //no anomaly or it is in nullspace + return + var/obj/effect/anomaly/atmos/A = newAnomaly + var/gas_type = A.gas_type + var/area/t_area = get_area(A) + for(var/turf/T in t_area) + if(istype(T, /turf/simulated)) //should not occur on unsimulated turfs without admemery + var/turf/simulated/S = T + fill_with_gas(gas_type, S) + explosion(get_turf(newAnomaly), -1, 0, 2) // a small boom so people know something happened. + ..() + +/** + * Replaces all oxygen and nitrogen on the simulated turf S with the gas type specified in gas, taking N2, N20, CO2 and agent B + */ +/datum/event/anomaly/anomaly_atmos/proc/fill_with_gas(gas, turf/simulated/S) + if(!S.air)//no air to transform + return + var/amount_to_add = S.air.oxygen + S.air.nitrogen + S.air.oxygen = 0 + S.air.nitrogen = 0 + switch(gas) + if(GAS_N2) + S.air.nitrogen += amount_to_add + if(GAS_N2O) + S.air.sleeping_agent += amount_to_add + if(GAS_CO2) + S.air.carbon_dioxide += amount_to_add + S.update_visuals() + S.air_update_turf() diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index de2da9fbf64..3af25262d18 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -1,9 +1,13 @@ /datum/event/blob announceWhen = 180 endWhen = 240 + var/successSpawn = FALSE //So we don't make a command report if nothing gets spawned. /datum/event/blob/announce() - GLOB.event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') + if(successSpawn) + GLOB.event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') + else + log_and_message_admins("Warning: Could not spawn any mobs for event Blob") /datum/event/blob/start() processing = FALSE //so it won't fire again in next tick @@ -16,12 +20,9 @@ if(!length(candidates)) return kill() - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in GLOB.all_vent_pumps) - if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) - if(length(temp_vent.parent.other_atmosmch) > 50) - vents += temp_vent - + var/list/vents = get_valid_vent_spawns(exclude_mobs_nearby = TRUE, exclude_visible_by_mobs = TRUE) + if(!length(vents)) + return var/obj/vent = pick(vents) var/mob/living/simple_animal/mouse/blobinfected/B = new(vent.loc) var/mob/M = pick(candidates) @@ -30,4 +31,5 @@ to_chat(B, "You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.") notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B) + successSpawn = TRUE processing = TRUE // Let it naturally end, if it runs successfully diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index bce820dadfd..ae7094f73ec 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -170,19 +170,20 @@ GLOBAL_LIST_EMPTY(event_last_fired) new /datum/event_meta(EVENT_LEVEL_MODERATE, "Brand Intelligence", /datum/event/brand_intelligence, 50, list(ASSIGNMENT_ENGINEER = 25), TRUE), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 50, list(ASSIGNMENT_ENGINEER = 50)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Dimensional Tear", /datum/event/tear, 0, list(ASSIGNMENT_SECURITY = 35)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Honknomoly", /datum/event/tear/honk, 0), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Honknomoly", /datum/event/tear/honk, 0), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Vent Clog", /datum/event/vent_clog, 250), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Wormholes", /datum/event/wormholes, 150), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Pyro Anomaly", /datum/event/anomaly/anomaly_pyro, 75, list(ASSIGNMENT_ENGINEER = 60)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Pyro Anomaly", /datum/event/anomaly/anomaly_pyro, 75, list(ASSIGNMENT_ENGINEER = 60)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Atmos Anomaly", /datum/event/anomaly/anomaly_atmos, 75, list(ASSIGNMENT_ENGINEER = 60)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Vortex Anomaly", /datum/event/anomaly/anomaly_vortex, 75, list(ASSIGNMENT_ENGINEER = 25)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Bluespace Anomaly", /datum/event/anomaly/anomaly_bluespace, 75, list(ASSIGNMENT_ENGINEER = 25)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Flux Anomaly", /datum/event/anomaly/anomaly_flux, 75, list(ASSIGNMENT_ENGINEER = 50)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravitational Anomaly", /datum/event/anomaly/anomaly_grav, 200), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Revenant", /datum/event/revenant, 150), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Swarmer Spawn", /datum/event/spawn_swarmer, 150, is_one_shot = TRUE), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/spawn_morph, 40, is_one_shot = TRUE), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/spawn_morph, 40, list(ASSIGNMENT_SECURITY = 10), is_one_shot = TRUE), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Disease Outbreak", /datum/event/disease_outbreak, 0, list(ASSIGNMENT_MEDICAL = 150), TRUE), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Headcrabs", /datum/event/headcrabs, 0, list(ASSIGNMENT_SECURITY = 20)) + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Headcrabs", /datum/event/headcrabs, 0, list(ASSIGNMENT_SECURITY = 20)) ) /datum/event_container/major diff --git a/code/modules/events/money_lotto.dm b/code/modules/events/money_lotto.dm index 4656aa5aa8f..fd4023c5e35 100644 --- a/code/modules/events/money_lotto.dm +++ b/code/modules/events/money_lotto.dm @@ -15,16 +15,13 @@ /datum/event/money_lotto/announce() var/datum/feed_message/newMsg = new /datum/feed_message newMsg.author = "Nanotrasen Editor" - newMsg.is_admin_message = 1 + newMsg.admin_locked = TRUE newMsg.body = "Nyx Daily wishes to congratulate [winner_name] for recieving the Nyx Stellar Slam Lottery, and receiving the out of this world sum of [winner_sum] credits!" if(!deposit_success) newMsg.body += "
Unfortunately, we were unable to verify the account details provided, so we were unable to transfer the money. Send a cheque containing the sum of $500 to ND 'Stellar Slam' office on the Nyx gateway containing updated details, and your winnings'll be re-sent within the month." - for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) - if(FC.channel_name == "Nyx Daily") - FC.messages += newMsg - break - - for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allNewscasters) - NEWSCASTER.newsAlert("Nyx Daily") + GLOB.news_network.get_channel_by_name("Nyx Daily")?.add_message(newMsg) + for(var/nc in GLOB.allNewscasters) + var/obj/machinery/newscaster/NC = nc + NC.alert_news("Nyx Daily") diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index 694f8e98c89..39f16c183f7 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -3,6 +3,7 @@ GLOBAL_VAR_INIT(sent_spiders_to_station, 0) /datum/event/spider_infestation announceWhen = 400 var/spawncount = 1 + var/successSpawn = FALSE //So we don't make a command report if nothing gets spawned. /datum/event/spider_infestation/setup() announceWhen = rand(announceWhen, announceWhen + 50) @@ -10,20 +11,17 @@ GLOBAL_VAR_INIT(sent_spiders_to_station, 0) GLOB.sent_spiders_to_station = 1 /datum/event/spider_infestation/announce() - GLOB.event_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') + if(successSpawn) + GLOB.event_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') + else + log_and_message_admins("Warning: Could not spawn any mobs for event Spider Infestation") /datum/event/spider_infestation/start() - - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in SSair.atmos_machinery) - if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) - if(temp_vent.parent.other_atmosmch.len > 50) - vents += temp_vent - - while((spawncount >= 1) && vents.len) - var/obj/vent = pick(vents) + var/list/vents = get_valid_vent_spawns(exclude_mobs_nearby = TRUE, exclude_visible_by_mobs = TRUE) + while(spawncount && length(vents)) + var/obj/vent = pick_n_take(vents) var/obj/structure/spider/spiderling/S = new(vent.loc) if(prob(66)) S.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/nurse - vents -= vent spawncount-- + successSpawn = TRUE diff --git a/code/modules/events/spider_terror.dm b/code/modules/events/spider_terror.dm index ae10f427506..ced62a7ed86 100644 --- a/code/modules/events/spider_terror.dm +++ b/code/modules/events/spider_terror.dm @@ -3,25 +3,20 @@ /datum/event/spider_terror announceWhen = 240 var/spawncount = 1 + var/successSpawn = FALSE //So we don't make a command report if nothing gets spawned. /datum/event/spider_terror/setup() announceWhen = rand(announceWhen, announceWhen + 30) spawncount = 1 /datum/event/spider_terror/announce() - GLOB.command_announcement.Announce("Confirmed outbreak of level 3 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/effects/siren-spooky.ogg') + if(successSpawn) + GLOB.command_announcement.Announce("Confirmed outbreak of level 3 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/effects/siren-spooky.ogg') + else + log_and_message_admins("Warning: Could not spawn any mobs for event Terror Spiders") /datum/event/spider_terror/start() - - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in GLOB.all_vent_pumps) - if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) - if(!temp_vent.parent) - // Issue happening more often with vents. Log and continue. Delete once solved - log_debug("spider_terror/start(), vent has no parent: [temp_vent], qdeled: [QDELETED(temp_vent)], loc: [temp_vent.loc]") - continue - if(temp_vent.parent.other_atmosmch.len > 50) - vents += temp_vent + var/list/vents = get_valid_vent_spawns(exclude_mobs_nearby = TRUE, exclude_visible_by_mobs = TRUE) var/spider_type var/infestation_type if((length(GLOB.clients)) < TS_HIGHPOP_TRIGGER) @@ -49,27 +44,11 @@ // Strongest, only used during highpop. spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen spawncount = 1 - while(spawncount >= 1 && vents.len) - var/obj/machinery/atmospherics/unary/vent_pump/vent = pick(vents) - - if(vent.welded) - vents -= vent - continue - - // If the vent we picked has any living mob nearby, just remove it from the list, loop again, and pick something else. - - var/turf/T = get_turf(vent) - var/hostiles_present = FALSE - for(var/mob/living/L in viewers(T)) - if(L.stat != DEAD) - hostiles_present = TRUE - break - - vents -= vent - if(!hostiles_present) - new spider_type(vent.loc) - spawncount-- - + while(spawncount && length(vents)) + var/obj/vent = pick_n_take(vents) + new spider_type(vent.loc) + spawncount-- + successSpawn = TRUE #undef TS_HIGHPOP_TRIGGER diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 7c253393e07..dbc01373a9f 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -226,7 +226,7 @@ desc = "Made in Space Switzerland." icon_state = "hot_coco" item_state = "coffee" - list_reagents = list("chocolate" = 30) + list_reagents = list("hot_coco" = 15, "chocolate" = 6, "water" = 9) resistance_flags = FREEZE_PROOF /obj/item/reagent_containers/food/drinks/weightloss diff --git a/code/modules/food_and_drinks/food/foods/baked_goods.dm b/code/modules/food_and_drinks/food/foods/baked_goods.dm index 9a7c0e89999..c9270076d68 100644 --- a/code/modules/food_and_drinks/food/foods/baked_goods.dm +++ b/code/modules/food_and_drinks/food/foods/baked_goods.dm @@ -370,6 +370,7 @@ var/extra_reagent = null filling_color = "#D2691E" var/randomized_sprinkles = 1 + var/donut_sprite_type = "regular" tastes = list("donut" = 1) /obj/item/reagent_containers/food/snacks/donut/New() @@ -378,6 +379,7 @@ icon_state = "donut2" name = "frosted donut" reagents.add_reagent("sprinkles", 2) + donut_sprite_type = "frosted" filling_color = "#FF69B4" /obj/item/reagent_containers/food/snacks/donut/sprinkles @@ -385,6 +387,7 @@ icon_state = "donut2" list_reagents = list("nutriment" = 3, "sugar" = 2, "sprinkles" = 2) filling_color = "#FF69B4" + donut_sprite_type = "frosted" randomized_sprinkles = 0 /obj/item/reagent_containers/food/snacks/donut/chaos @@ -408,6 +411,7 @@ desc = "You jelly?" icon_state = "jdonut1" extra_reagent = "berryjuice" + donut_sprite_type = "jelly" tastes = list("jelly" = 1, "donut" = 3) /obj/item/reagent_containers/food/snacks/donut/jelly/New() @@ -417,6 +421,7 @@ if(prob(30)) icon_state = "jdonut2" name = "frosted jelly Donut" + donut_sprite_type = "frostedjelly" reagents.add_reagent("sprinkles", 2) filling_color = "#FF69B4" diff --git a/code/modules/food_and_drinks/food/foods/ethnic.dm b/code/modules/food_and_drinks/food/foods/ethnic.dm index 0a160967858..6523b7521e3 100644 --- a/code/modules/food_and_drinks/food/foods/ethnic.dm +++ b/code/modules/food_and_drinks/food/foods/ethnic.dm @@ -65,6 +65,7 @@ name = "sweet & sour chicken balls" desc = "Is this chicken cooked? The odds are better than wok paper scissors." icon_state = "chickenball" + item_state = "chinese3" junkiness = 25 list_reagents = list("nutriment" = 2, "msg" = 4, "sugar" = 2) tastes = list("chicken" = 1, "sweetness" = 1) @@ -89,6 +90,7 @@ name = "fried rice" desc = "A timeless classic." icon_state = "chinese4" + item_state = "chinese2" junkiness = 20 list_reagents = list("nutriment" = 1, "rice" = 3, "msg" = 4, "sugar" = 2) tastes = list("rice" = 1) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index d79a8030a59..134e337fa4e 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -323,7 +323,7 @@ else I = image(icon = myseed.growing_icon, icon_state = myseed.icon_harvest) else - var/t_growthstate = min(round((age / myseed.maturation) * myseed.growthstages), myseed.growthstages) + var/t_growthstate = clamp(round((age / myseed.maturation) * myseed.growthstages), 1, myseed.growthstages) I = image(icon = myseed.growing_icon, icon_state = "[myseed.icon_grow][t_growthstate]") I.layer = OBJ_LAYER + 0.01 overlays += I diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm index 6df1ce19ba7..8f3df05bdac 100644 --- a/code/modules/karma/karma.dm +++ b/code/modules/karma/karma.dm @@ -85,7 +85,7 @@ GLOBAL_LIST_EMPTY(karma_spenders) log_game("Illegal karma spending attempt detected from [key] to [M.key]. Using the same IP!") to_chat(src, "You can't spend karma on someone connected from the same IP.") return FALSE - if(M.get_preference(DISABLE_KARMA)) + if(M.get_preference(PREFTOGGLE_DISABLE_KARMA)) to_chat(src, "That player has turned off incoming karma.") return FALSE return TRUE diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm index c5b157ba6c0..1a8cbca4ef6 100644 --- a/code/modules/keybindings/bindings_atom.dm +++ b/code/modules/keybindings/bindings_atom.dm @@ -5,7 +5,7 @@ if(!user.keys_held["Ctrl"]) var/movement_dir = NONE var/list/movement = SSinput.movement_keys - if(user.prefs.toggles & AZERTY) + if(user.prefs.toggles & PREFTOGGLE_AZERTY) movement = SSinput.alt_movement_keys for(var/_key in user.keys_held) movement_dir = movement_dir | movement[_key] diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index 840b04dfd3f..c312d8d3251 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -44,7 +44,7 @@ current_key_address = ((current_key_address + 1) % HELD_KEY_BUFFER_LENGTH) var/movement = SSinput.movement_keys[_key] - if (prefs.toggles & AZERTY) movement = SSinput.alt_movement_keys[_key] + if (prefs.toggles & PREFTOGGLE_AZERTY) movement = SSinput.alt_movement_keys[_key] if(!(next_move_dir_sub & movement) && !keys_held["Ctrl"]) next_move_dir_add |= movement @@ -85,7 +85,7 @@ keys_held[i] = null break var/movement = SSinput.movement_keys[_key] - if (prefs.toggles & AZERTY) movement = SSinput.alt_movement_keys[_key] + if (prefs.toggles & PREFTOGGLE_AZERTY) movement = SSinput.alt_movement_keys[_key] if(!(next_move_dir_add & movement)) next_move_dir_sub |= movement diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm index b5b81dd129e..12755c5f522 100644 --- a/code/modules/keybindings/bindings_mob.dm +++ b/code/modules/keybindings/bindings_mob.dm @@ -3,7 +3,7 @@ // Or we can have NPC's send actual keypresses and detect that by seeing no client /mob/key_down(_key, client/user) - if(user.prefs.toggles & AZERTY) + if(user.prefs.toggles & PREFTOGGLE_AZERTY) switch(_key) if("Delete") if(!pulling) @@ -70,7 +70,7 @@ toggle_move_intent() return //Bodypart selections - if(client.prefs.toggles & NUMPAD_TARGET) + if(client.prefs.toggles & PREFTOGGLE_NUMPAD_TARGET) switch(_key) if("Numpad8") user.body_toggle_head() @@ -107,7 +107,7 @@ if("Numpad4") a_intent_change("harm") return - if(client.keys_held["Ctrl"] && client.prefs.toggles & AZERTY) + if(client.keys_held["Ctrl"] && client.prefs.toggles & PREFTOGGLE_AZERTY) switch(SSinput.alt_movement_keys[_key]) if(NORTH) northface() diff --git a/code/modules/keybindings/bindings_robot.dm b/code/modules/keybindings/bindings_robot.dm index f85264308a0..578530197d8 100644 --- a/code/modules/keybindings/bindings_robot.dm +++ b/code/modules/keybindings/bindings_robot.dm @@ -10,9 +10,9 @@ cycle_modules() return if("Q") - if(!(client.prefs.toggles & AZERTY)) + if(!(client.prefs.toggles & PREFTOGGLE_AZERTY)) on_drop_hotkey_press() // User is in QWERTY hotkey mode. if("A") - if(client.prefs.toggles & AZERTY) + if(client.prefs.toggles & PREFTOGGLE_AZERTY) on_drop_hotkey_press() return ..() diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 43cce5904e3..f9a98b01483 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -11,6 +11,7 @@ throw_range = 5 origin_tech = "bluespace=2" slot_flags = SLOT_BELT + var/emagged = FALSE /obj/item/wormhole_jaunter/attack_self(mob/user) user.visible_message("[user.name] activates the [name]!") @@ -43,6 +44,7 @@ return var/chosen_beacon = pick(L) var/obj/effect/portal/jaunt_tunnel/J = new(get_turf(src), get_turf(chosen_beacon), src, 100) + J.emagged = emagged if(adjacent) try_move_adjacent(J) else @@ -57,12 +59,26 @@ else to_chat(user, "[src] is not attached to your belt, preventing it from saving you from the chasm. RIP.") +/obj/item/wormhole_jaunter/emag_act(mob/user) + if(!emagged) + emagged = TRUE + to_chat(user, "You emag [src].") + var/turf/T = get_turf(src) + do_sparks(5, 0, T) + playsound(T, "sparks", 50, 1) + /obj/effect/portal/jaunt_tunnel name = "jaunt tunnel" icon = 'icons/effects/effects.dmi' icon_state = "bhole3" desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon." failchance = 0 + var/emagged = FALSE + +/obj/effect/portal/jaunt_tunnel/can_teleport(atom/movable/M) + if(!emagged && ismegafauna(M)) + return FALSE + return ..() /obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M) . = ..() diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index 21bc247b0df..a0ea3eb7639 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -120,13 +120,18 @@ return var/mob/living/carbon/human/H = user - var/random = rand(1,2) + var/random = rand(1,3) switch(random) if(1) to_chat(user, "Your flesh begins to melt! Miraculously, you seem fine otherwise.") H.set_species(/datum/species/skeleton) if(2) + to_chat(user, "Power courses through you! You can now shift your form at will.") + if(user.mind) + var/obj/effect/proc_holder/spell/targeted/shapeshift/dragon/D = new + user.mind.AddSpell(D) + if(3) to_chat(user, "You feel like you could walk straight through lava now.") H.weather_immunities |= "lava" diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index e99e7132f03..3dfcb1fffdb 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -393,7 +393,8 @@ activation_method = "touch" cooldown_add = 50 activation_sound = 'sound/magic/timeparadox2.ogg' - var/list/banned_items_typecache = list(/obj/item/storage, /obj/item/implant, /obj/item/implanter, /obj/item/disk/nuclear, /obj/item/projectile, /obj/item/spellbook) + var/list/banned_items_typecache = list(/obj/item/storage, /obj/item/implant, /obj/item/implanter, /obj/item/disk/nuclear, + /obj/item/projectile, /obj/item/spellbook, /obj/item/clothing/mask/facehugger) /obj/machinery/anomalous_crystal/refresher/New() ..() diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 675de65fb3e..c2da907df61 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -254,7 +254,7 @@ new /obj/item/extinguisher/mini(drop_location) new /obj/item/twohanded/kinetic_crusher(drop_location) if("Mining Conscription Kit") - new /obj/item/storage/backpack/duffel/mining_conscript/full(drop_location) + new /obj/item/storage/backpack/duffel/mining_conscript(drop_location) qdel(voucher) @@ -343,27 +343,6 @@ . = ..() . += "There's [points] points on the card." -/**********************Conscription Kit**********************/ - -/obj/item/card/id/mining_access_card - name = "mining access card" - desc = "A small card, that when used on any ID, will add mining access." - icon_state = "data" - -/obj/item/card/id/mining_access_card/afterattack(atom/movable/AM, mob/user, proximity) - . = ..() - if(istype(AM, /obj/item/card/id) && proximity) - var/obj/item/card/id/I = AM - I.access |= list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_CARGO) - to_chat(user, "You upgrade [I] with mining access.") - qdel(src) - -/obj/item/storage/backpack/duffel/mining_conscript/full - name = "mining conscription kit" - desc = "A kit containing everything a crewmember needs to support a shaft miner in the field." - -/obj/item/storage/backpack/duffel/mining_conscript/full/New() - ..() - new /obj/item/card/id/mining_access_card(src) #undef EQUIPMENT + diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ef5268fa104..341f84afc7f 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -576,7 +576,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/dat dat += "

Crew Manifest

" - dat += GLOB.data_core.get_manifest() + dat += GLOB.data_core.get_manifest(OOC = TRUE) src << browse(dat, "window=manifest;size=370x420;can_close=1") @@ -647,8 +647,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Toggle Anonymous Dead-chat" set category = "Ghost" set desc = "Toggles showing your key in dead chat." - client.prefs.ghost_anonsay = !client.prefs.ghost_anonsay - to_chat(src, "As a ghost, your key will [(client.prefs.ghost_anonsay) ? "no longer" : "now"] be shown when you speak in dead chat.
") + client.prefs.toggles2 ^= PREFTOGGLE_2_ANONDCHAT + to_chat(src, "As a ghost, your key will [(client.prefs.toggles2 & PREFTOGGLE_2_ANONDCHAT) ? "no longer" : "now"] be shown when you speak in dead chat.
") client.prefs.save_preferences(src) /mob/dead/observer/verb/toggle_ghostsee() diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 99e0af0ca6a..5d55e103852 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -72,7 +72,7 @@ if(findtext(message, " snores.")) //Because we have so many sleeping people. break - if(isobserver(M) && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src, null)) && client) // The client check makes sure people with ghost sight don't get spammed by simple mobs emoting. + if(isobserver(M) && M.get_preference(PREFTOGGLE_CHAT_GHOSTSIGHT) && !(M in viewers(src, null)) && client) // The client check makes sure people with ghost sight don't get spammed by simple mobs emoting. M.show_message(message) // Type 1 (Visual) emotes are sent to anyone in view of the item @@ -111,7 +111,7 @@ to_chat(src, "You cannot send deadchat emotes (muted).") return - if(!(client.prefs.toggles & CHAT_DEAD)) + if(!(client.prefs.toggles & PREFTOGGLE_CHAT_DEAD)) to_chat(src, "You have deadchat muted.") return @@ -138,8 +138,8 @@ if(isnewplayer(M)) continue - if(check_rights(R_ADMIN|R_MOD, 0, M) && M.get_preference(CHAT_DEAD)) // Show the emote to admins/mods + if(check_rights(R_ADMIN|R_MOD, 0, M) && M.get_preference(PREFTOGGLE_CHAT_DEAD)) // Show the emote to admins/mods to_chat(M, message) - else if(M.stat == DEAD && M.get_preference(CHAT_DEAD)) // Show the emote to regular ghosts with deadchat toggled on + else if(M.stat == DEAD && M.get_preference(PREFTOGGLE_CHAT_DEAD)) // Show the emote to regular ghosts with deadchat toggled on M.show_message(message, 2) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 2514ce68b06..b053e70eab1 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -51,7 +51,7 @@ if(!client) return 0 - if(isobserver(src) && client.prefs.toggles & CHAT_GHOSTEARS) + if(isobserver(src) && client.prefs.toggles & PREFTOGGLE_CHAT_GHOSTEARS) if(speaker && !speaker.client && !(speaker in view(src))) //Does the speaker have a client? It's either random stuff that observers won't care about (Experiment 97B says, 'EHEHEHEHEHEHEHE') //Or someone snoring. So we make it where they won't hear it. @@ -90,7 +90,7 @@ if(speaker_name != speaker.real_name && speaker.real_name) speaker_name = "[speaker.real_name] ([speaker_name])" track = "([ghost_follow_link(speaker, ghost=src)]) " - if(client.prefs.toggles & CHAT_GHOSTEARS && (speaker in view(src))) + if(client.prefs.toggles & PREFTOGGLE_CHAT_GHOSTEARS && (speaker in view(src))) message = "[message]" if(!can_hear()) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index a17d7b8ebbd..7443e4edbe3 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -23,6 +23,9 @@ // Needed to fix a rather insane bug when a posibrain/robotic brain commits suicide var/dead_icon = "mmi_dead" + /// Time at which the ghost belonging to the mind in the mmi can be pinged again to be borged + var/next_possible_ghost_ping + /obj/item/mmi/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/organ/internal/brain/crystal)) to_chat(user, " This brain is too malformed to be able to use with the [src].") diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 87a327f3427..650677df354 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -986,7 +986,7 @@ if(isnewplayer(M)) continue - if(isobserver(M) && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src, null)) && client) // The client check makes sure people with ghost sight don't get spammed by simple mobs emoting. + if(isobserver(M) && M.get_preference(PREFTOGGLE_CHAT_GHOSTSIGHT) && !(M in viewers(src, null)) && client) // The client check makes sure people with ghost sight don't get spammed by simple mobs emoting. M.show_message(message) switch(m_type) diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 69518e96cf7..d7969ac1879 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -218,37 +218,38 @@ //////////////// // MOVE SPEED // //////////////// +#define ADD_SLOWDOWN(__value) if(!ignoreslow || __value < 0) . += __value /datum/species/proc/movement_delay(mob/living/carbon/human/H) . = 0 //We start at 0. - var/flight = 0 //Check for flight and flying items - var/ignoreslow = 0 - var/gravity = 0 - - if(H.flying) - flight = 1 - - if((H.status_flags & IGNORESLOWDOWN) || (RUN in H.mutations)) - ignoreslow = 1 + if(H.status_flags & IGNORE_SPEED_CHANGES) + return . if(has_gravity(H)) - gravity = 1 + if(H.status_flags & GOTTAGOFAST) + . -= 1 - if(!ignoreslow && gravity) - if(speed_mod) - . = speed_mod + var/ignoreslow = FALSE + if((H.status_flags & IGNORESLOWDOWN) || (RUN in H.mutations)) + ignoreslow = TRUE + + var/flight = H.flying //Check for flight and flying items + + ADD_SLOWDOWN(speed_mod) if(H.wear_suit) - . += H.wear_suit.slowdown - if(!H.buckled) - if(H.shoes) - . += H.shoes.slowdown + ADD_SLOWDOWN(H.wear_suit.slowdown) + if(!H.buckled && H.shoes) + ADD_SLOWDOWN(H.shoes.slowdown) if(H.back) - . += H.back.slowdown + ADD_SLOWDOWN(H.back.slowdown) if(H.l_hand && (H.l_hand.flags & HANDSLOW)) - . += H.l_hand.slowdown + ADD_SLOWDOWN(H.l_hand.slowdown) if(H.r_hand && (H.r_hand.flags & HANDSLOW)) - . += H.r_hand.slowdown + ADD_SLOWDOWN(H.r_hand.slowdown) + + if(ignoreslow) + return . // Only malusses after here var/health_deficiency = max(H.maxHealth - H.health, H.staminaloss) var/hungry = (500 - H.nutrition)/5 // So overeat would be 100 and default level would be 80 @@ -270,10 +271,10 @@ if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) . += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR - if(H.status_flags & GOTTAGOFAST) - . -= 1 return . +#undef ADD_SLOWDOWN + /datum/species/proc/on_species_gain(mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment. for(var/slot_id in no_equip) var/obj/item/thing = H.get_item_by_slot(slot_id) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index f9d6fc436cf..7d526df51a1 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -251,7 +251,7 @@ GLOBAL_LIST_EMPTY(channel_to_radio_key) continue if(isobserver(M)) - if(M.get_preference(CHAT_GHOSTEARS) && client) // The client check is so that ghosts don't have to listen to mice. + if(M.get_preference(PREFTOGGLE_CHAT_GHOSTEARS) && client) // The client check is so that ghosts don't have to listen to mice. listening |= M continue @@ -311,7 +311,7 @@ GLOBAL_LIST_EMPTY(channel_to_radio_key) if(isnewplayer(M)) continue - if(isobserver(M) && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src, null)) && client) // The client check makes sure people with ghost sight don't get spammed by simple mobs emoting. + if(isobserver(M) && M.get_preference(PREFTOGGLE_CHAT_GHOSTSIGHT) && !(M in viewers(src, null)) && client) // The client check makes sure people with ghost sight don't get spammed by simple mobs emoting. M.show_message(message) switch(type) @@ -418,7 +418,7 @@ GLOBAL_LIST_EMPTY(channel_to_radio_key) continue if(isobserver(M)) - if(M.get_preference(CHAT_GHOSTEARS)) // The client check is so that ghosts don't have to listen to mice. + if(M.get_preference(PREFTOGGLE_CHAT_GHOSTEARS)) // The client check is so that ghosts don't have to listen to mice. listening |= M continue diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 74a5bd749d6..9211a43ae8c 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -47,6 +47,13 @@ if(C.can_inject(null, FALSE, inject_target, FALSE)) C.reagents.add_reagent("spidertoxin", venom_per_bite) +/mob/living/simple_animal/hostile/poison/giant_spider/get_spacemove_backup() + . = ..() + // If we don't find any normal thing to use, attempt to use any nearby spider structure instead. + if(!.) + for(var/obj/structure/spider/S in range(1, get_turf(src))) + return S + //nursemaids - these create webs and eggs /mob/living/simple_animal/hostile/poison/giant_spider/nurse desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes." diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 6c943b26f53..66f6141c797 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -391,6 +391,13 @@ GLOBAL_LIST_EMPTY(ts_spiderling_list) return TRUE +/mob/living/simple_animal/hostile/poison/terror_spider/get_spacemove_backup() + . = ..() + // If we don't find any normal thing to use, attempt to use any nearby spider structure instead. + if(!.) + for(var/obj/structure/spider/S in range(1, get_turf(src))) + return S + /mob/living/simple_animal/hostile/poison/terror_spider/Stat() ..() // Determines what shows in the "Status" tab for player-controlled spiders. Used to help players understand spider health regeneration mechanics. diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm index 8ef178918b4..d7b080fd1e6 100644 --- a/code/modules/mob/living/update_status.dm +++ b/code/modules/mob/living/update_status.dm @@ -10,10 +10,10 @@ /mob/living/update_blurry_effects() if(eyes_blurred()) - overlay_fullscreen("blurry", /obj/screen/fullscreen/blurry) + add_eyeblur() return 1 else - clear_fullscreen("blurry") + remove_eyeblur() return 0 /mob/living/update_druggy_effects() @@ -133,3 +133,19 @@ updatehealth("var edit") if("resize") update_transform() + +/mob/proc/add_eyeblur() + if(client?.screen) + var/obj/screen/plane_master/game_world/GW = locate(/obj/screen/plane_master/game_world) in client.screen + var/obj/screen/plane_master/floor/F = locate(/obj/screen/plane_master/floor) in client.screen + GW.add_filter(EYE_BLUR_FILTER_KEY, FILTER_EYE_BLUR) + F.add_filter(EYE_BLUR_FILTER_KEY, FILTER_EYE_BLUR) + animate(GW.filters[GW.filters.len], size = 3, time = 5) + animate(F.filters[F.filters.len], size = 3, time = 5) + +/mob/proc/remove_eyeblur() + if(client?.screen) + var/obj/screen/plane_master/game_world/GW = locate(/obj/screen/plane_master/game_world) in client.screen + var/obj/screen/plane_master/floor/F = locate(/obj/screen/plane_master/floor) in client.screen + GW.remove_filter(EYE_BLUR_FILTER_KEY) + F.remove_filter(EYE_BLUR_FILTER_KEY) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4e4bd99e54d..ff68f7f7825 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1133,21 +1133,14 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ return //find a viable mouse candidate - var/mob/living/simple_animal/mouse/host - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/list/found_vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/v in SSair.atmos_machinery) - if(!v.welded && v.z == src.z) - found_vents.Add(v) - if(found_vents.len) - vent_found = pick(found_vents) - host = new /mob/living/simple_animal/mouse(vent_found.loc) - else - to_chat(src, "Unable to find any unwelded vents to spawn mice at.") - - if(host) + var/list/found_vents = get_valid_vent_spawns(min_network_size = 0, station_levels_only = FALSE, z_level = z) + if(length(found_vents)) + var/obj/vent_found = pick(found_vents) + var/mob/living/simple_animal/mouse/host = new(vent_found.loc) host.ckey = src.ckey to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") + else + to_chat(src, "Unable to find any unwelded vents to spawn mice at.") /mob/proc/assess_threat() //For sec bot threat assessment return 5 diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 6acfb92a515..50588b0fc3b 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -459,7 +459,7 @@ GLOBAL_LIST_INIT(intents, list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM name = realname for(var/mob/M in GLOB.player_list) - if(M.client && ((!isnewplayer(M) && M.stat == DEAD) || check_rights(R_ADMIN|R_MOD,0,M)) && M.get_preference(CHAT_DEAD)) + if(M.client && ((!isnewplayer(M) && M.stat == DEAD) || check_rights(R_ADMIN|R_MOD,0,M)) && M.get_preference(PREFTOGGLE_CHAT_DEAD)) var/follow var/lname if(subject) @@ -471,9 +471,9 @@ GLOBAL_LIST_INIT(intents, list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM if(istype(subject, /mob/dead/observer)) DM = subject if(check_rights(R_ADMIN|R_MOD,0,M)) // What admins see - lname = "[keyname][(DM && DM.client && DM.client.prefs.ghost_anonsay) ? "*" : (DM ? "" : "^")] ([name])" + lname = "[keyname][(DM && DM.client && DM.client.prefs.toggles2 & PREFTOGGLE_2_ANONDCHAT) ? "*" : (DM ? "" : "^")] ([name])" else - if(DM && DM.client && DM.client.prefs.ghost_anonsay) // If the person is actually observer they have the option to be anonymous + if(DM && DM.client && DM.client.prefs.toggles2 & PREFTOGGLE_2_ANONDCHAT) // If the person is actually observer they have the option to be anonymous lname = "Ghost of [name]" else if(DM) // Non-anons lname = "[keyname] ([name])" diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 2bb2466ce02..617629e1b9a 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -60,7 +60,7 @@ /mob/new_player/proc/new_player_panel_proc() var/real_name = client.prefs.real_name - if(client.prefs.randomslot) + if(client.prefs.toggles2 & PREFTOGGLE_2_RANDOMSLOT) real_name = "Random Character Slot" var/output = "

Setup Character
[real_name]

" @@ -250,7 +250,7 @@ to_chat(usr, "There is an administrative lock on entering the game!") return - if(client.prefs.randomslot) + if(client.prefs.toggles2 & PREFTOGGLE_2_RANDOMSLOT) client.prefs.load_random_character_slot(client) if(client.prefs.species in GLOB.whitelisted_species) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 7a26de718b6..e3a2282228f 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -55,7 +55,7 @@ to_chat(src, "You cannot talk in deadchat (muted).") return - if(!(client.prefs.toggles & CHAT_DEAD)) + if(!(client.prefs.toggles & PREFTOGGLE_CHAT_DEAD)) to_chat(src, "You have deadchat muted.") return diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index a2ca226147c..4eee3653a9d 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -21,7 +21,7 @@ GLOBAL_LIST_EMPTY(typing_indicator) return if(client) - if((client.prefs.toggles & SHOW_TYPING) || stat != CONSCIOUS || is_muzzled()) + if((client.prefs.toggles & PREFTOGGLE_SHOW_TYPING) || stat != CONSCIOUS || is_muzzled()) overlays -= GLOB.typing_indicator[bubble_icon] else if(state) @@ -61,7 +61,7 @@ GLOBAL_LIST_EMPTY(typing_indicator) /mob/proc/handle_typing_indicator() if(client) - if(!(client.prefs.toggles & SHOW_TYPING) && !hud_typing) + if(!(client.prefs.toggles & PREFTOGGLE_SHOW_TYPING) && !hud_typing) var/temp = winget(client, "input", "text") if(temp != last_typed) @@ -83,12 +83,12 @@ GLOBAL_LIST_EMPTY(typing_indicator) set name = "Show/Hide Typing Indicator" set category = "Preferences" set desc = "Toggles showing an indicator when you are typing emote or say message." - prefs.toggles ^= SHOW_TYPING + prefs.toggles ^= PREFTOGGLE_SHOW_TYPING prefs.save_preferences(src) - to_chat(src, "You will [(prefs.toggles & SHOW_TYPING) ? "no longer" : "now"] display a typing indicator.") + to_chat(src, "You will [(prefs.toggles & PREFTOGGLE_SHOW_TYPING) ? "no longer" : "now"] display a typing indicator.") // Clear out any existing typing indicator. - if(prefs.toggles & SHOW_TYPING) + if(prefs.toggles & PREFTOGGLE_SHOW_TYPING) if(istype(mob)) mob.set_typing_indicator(0) feedback_add_details("admin_verb","TID") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 526ca1ffe04..23d84fda4d1 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -186,7 +186,7 @@ nanoui is used to open and update nano browser uis "mapZLevel" = map_z_level, "user" = list( "name" = user.name, - "fancy" = user.client.prefs.nanoui_fancy + "fancy" = user.client.prefs.toggles2 & PREFTOGGLE_2_FANCYUI ), "window" = list( "width" = width, @@ -418,7 +418,7 @@ nanoui is used to open and update nano browser uis // Preset the can_rezie and titlebar values on uis if the user has fancy uis set // Prevents the ui from flickering when opened - if(user.client.prefs.nanoui_fancy) + if(user.client.prefs.toggles2 & PREFTOGGLE_2_FANCYUI) set_window_options("focus=0;can_close=1;can_minimize=1;can_maximize=0;can_resize=0;titlebar=0;") user << browse(get_html(), "window=[window_id];[window_size][window_options]") diff --git a/code/modules/newscaster/datums.dm b/code/modules/newscaster/datums.dm new file mode 100644 index 00000000000..a59fc1c9ae8 --- /dev/null +++ b/code/modules/newscaster/datums.dm @@ -0,0 +1,186 @@ +/** + * # Feed Network + * + * Singleton that contains all informations related to newscasters (channels, stories). + */ +/datum/feed_network + /// Contains all of the feed channels created during the round. + var/list/datum/feed_channel/channels = list() + /// Contains all of the feed stories created during the round. + var/list/datum/feed_message/stories = list() + /// The current wanted issue. + var/datum/feed_message/wanted_issue + +/** + * Returns the [/datum/feed_channel] with the given name, or null if not found. + * + * Arguments: + * * name - The name + */ +/datum/feed_network/proc/get_channel_by_name(name) + RETURN_TYPE(/datum/feed_channel) + for(var/fc in channels) + var/datum/feed_channel/FC = fc + if(FC.channel_name == name) + return FC + +/** + * Returns the [/datum/feed_channel] with the given author, or null if not found. + * + * Arguments: + * * author - The author + */ +/datum/feed_network/proc/get_channel_by_author(author) + RETURN_TYPE(/datum/feed_channel) + for(var/fc in channels) + var/datum/feed_channel/FC = fc + if(FC.author == author) + return FC + +/** + * Returns the [/datum/feed_channel] at the given index, or null if not found. + * + * Arguments: + * * idx - The index + */ +/datum/feed_network/proc/get_channel_by_idx(idx) + RETURN_TYPE(/datum/feed_channel) + if(!ISINDEXSAFE(channels, idx)) + return + return channels[idx] + + +/** + * # Feed Message + * + * Describes a single feed story. Always owned by a [/datum/feed_channel]. + */ +/datum/feed_message + /// The author of the story. + var/author = "" + /// The title of the story. + var/title = "" + /// The textual contents of the story. + var/body = "" + /// The story's icon. + var/icon/img = null + /// Flags that dictate the story should be censored. + var/censor_flags = 0 + /// Whether the story is admin-locked. + var/admin_locked = FALSE + /// The number of views the story has. + var/view_count = 0 + /// The world.time at which the story was published. + var/publish_time = 0 + +/datum/feed_message/New() + publish_time = world.time + +/** + * Clears the story's information. + * + * Does not delete it from the owning channel. + */ +/datum/feed_message/proc/clear() + author = "" + title = "" + body = "" + img = null + censor_flags = 0 + admin_locked = 0 + view_count = 0 + publish_time = 0 + +/** + * # Feed Channel + * + * Describes a single feed channel. Owns a list of [/datum/feed_message]. + */ +/datum/feed_channel + /// The name of the channel. + var/channel_name = "" + /// The author of the channel. + var/author = "" + /// The description of the channel. + var/description = "" + /// The channel's icon. + var/icon = "newspaper" + /// The fallback author name to display if the channel is censored. + var/backup_author = "" + /// Lazy list. Contains all [/datum/feed_message] pertaining to the channel. + var/list/datum/feed_message/messages + /// Whether the channel is public or not. + var/is_public = FALSE + /// Whether the channel is frozen or not. + var/frozen = FALSE + /// Whether the channel is censored or not. + var/censored = FALSE + /// Whether the channel is admin-locked. + var/admin_locked = FALSE + +/datum/feed_channel/Destroy() + for(var/m in messages) + GLOB.news_network.stories -= m + +/** + * Returns whether the given user can publish new stories to this channel. + * + * Arguments: + * * user - The user + * * scanned_user - The user's identifying information on the newscaster + */ +/datum/feed_channel/proc/can_publish(mob/user, scanned_user = "Unknown") + return (!frozen && (is_public || (author == scanned_user))) || user?.can_admin_interact() + +/** + * Returns whether the given user can edit or delete this channel. + * + * Arguments: + * * user - The user + * * scanned_user - The user's identifying information on the newscaster + */ +/datum/feed_channel/proc/can_modify(mob/user, scanned_user = "Unknown") + return (!frozen && author == scanned_user) || user?.can_admin_interact() + +/** + * Clears the channel's information. + * + * Discards all owned stories. + */ +/datum/feed_channel/proc/clear() + channel_name = "" + author = "" + backup_author = "" + messages = list() + is_public = FALSE + frozen = FALSE + censored = FALSE + admin_locked = FALSE + +/** + * Adds a new [story][/datum/feed_message] to the channel and network singleton. + * + * Arguments: + * * M - The story to add. + */ +/datum/feed_channel/proc/add_message(datum/feed_message/M) + ASSERT(istype(M)) + + if(!length(M.title)) + M.title = "[channel_name] Story #[length(messages) + 1]" + LAZYADD(messages, M) + GLOB.news_network.stories += M + // Update all newscaster TGUIs + for(var/nc in GLOB.allNewscasters) + SStgui.update_uis(nc) + +/** + * Returns the text to be said by newscasters when announcing new news from a channel. + * + * Arguments: + * * title - Optional. The headline to announce along with the channel's name. Typically the newest story's title. + */ +/datum/feed_channel/proc/get_announce_text(title) + if(length(title)) + return "Breaking news from [channel_name]: [title]" + return "Breaking news from [channel_name]" diff --git a/code/modules/newscaster/defines.dm b/code/modules/newscaster/defines.dm new file mode 100644 index 00000000000..e5842a24b21 --- /dev/null +++ b/code/modules/newscaster/defines.dm @@ -0,0 +1,19 @@ +// Globals +/// The feed network singleton. Contains all channels (which contain all stories). +GLOBAL_DATUM_INIT(news_network, /datum/feed_network, new) +/// Global list that contains all existing newscasters in the world. +GLOBAL_LIST_EMPTY(allNewscasters) + +// Screen indexes +/// Headlines screen index. +#define NEWSCASTER_HEADLINES 0 +/// Available Jobs screen index. +#define NEWSCASTER_JOBS 1 +/// View Channel screen index. +#define NEWSCASTER_CHANNEL 2 + +// Censor flags +/// Censor author name. +#define CENSOR_AUTHOR (1 << 0) +/// Censor story title, body and image. +#define CENSOR_STORY (1 << 1) diff --git a/code/modules/newscaster/obj/newscaster.dm b/code/modules/newscaster/obj/newscaster.dm new file mode 100644 index 00000000000..198250689f3 --- /dev/null +++ b/code/modules/newscaster/obj/newscaster.dm @@ -0,0 +1,718 @@ +#define CHANNEL_NAME_MAX_LENGTH 50 +#define CHANNEL_DESC_MAX_LENGTH 128 +#define STORY_NAME_MAX_LENGTH 128 +#define STORY_BODY_MAX_LENGTH 1024 +#define WANTED_NOTICE_NAME_MAX_LENGTH 128 +#define WANTED_NOTICE_DESC_MAX_LENGTH 512 +#define STORIES_PER_LOAD 9999 // TODO during QP... + +/** + * # Newscaster + * + * For all of the crew's news need. Includes reading, submitting and printing stories. + * + * Includes a security variant which can be used to issue wanted notices, censor channels and stories. + * Allows full access when aghosting. + */ +/obj/machinery/newscaster + name = "newscaster" + desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!" + icon = 'icons/obj/terminals.dmi' + icon_state = "newscaster_normal" + max_integrity = 200 + integrity_failure = 50 + light_range = 0 + anchored = TRUE + /// The current screen index in the UI. + var/screen = NEWSCASTER_HEADLINES + /// The amount of newspapers the newscaster can print. + var/paper_remaining = 15 + /// Whether the newscaster can be used to make wanted issues or not. + var/is_security = FALSE + /// Whether the newscaster has new stories or not. + var/alert = FALSE + /// The newcaster's index among all newscasters (GLOB.allNewscasters). + var/unit_number = 0 + /// The name of the mob currently using the newscaster. + var/scanned_user = "Unknown" + /// The currently attached photo. + var/obj/item/photo/photo = null + /// The currently viewed channel. + var/datum/feed_channel/viewing_channel = null + /// Whether the unit is silent or not. + var/is_silent = FALSE + /// The current temporary notice. + var/temp_notice + /// Whether the newscaster is currently printing a newspaper or not. + var/is_printing = FALSE + /// Static list of jobs that shouldn't be advertised if a position is available. + var/static/list/jobblacklist + /// Static, lazy list containing a user's last view time per channel. + var/static/last_views + +/obj/machinery/newscaster/security_unit + name = "security newscaster" + is_security = TRUE + +/obj/machinery/newscaster/New() + GLOB.allNewscasters += src + unit_number = length(GLOB.allNewscasters) + update_icon() //for any custom ones on the map... + if(!last_views) + last_views = list() + armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30) + ..() + +/obj/machinery/newscaster/Initialize(mapload) + . = ..() + if(!jobblacklist) + jobblacklist = list( + /datum/job/ai, + /datum/job/cyborg, + /datum/job/captain, + /datum/job/judge, + /datum/job/blueshield, + /datum/job/nanotrasenrep, + /datum/job/pilot, + /datum/job/brigdoc, + /datum/job/mechanic, + /datum/job/barber, + /datum/job/chaplain, + /datum/job/ntnavyofficer, + /datum/job/ntspecops, + /datum/job/civilian, + /datum/job/syndicateofficer + ) + +/obj/machinery/newscaster/Destroy() + GLOB.allNewscasters -= src + viewing_channel = null + QDEL_NULL(photo) + return ..() + +/obj/machinery/newscaster/update_icon() + cut_overlays() + if(inoperable()) + icon_state = "newscaster_off" + else + if(!GLOB.news_network.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message + icon_state = "newscaster_normal" + if(alert) //new message alert overlay + add_overlay("newscaster_alert") + var/hp_percent = obj_integrity * 100 / max_integrity + switch(hp_percent) + if(75 to INFINITY) + return + if(50 to 75) + add_overlay("crack1") + if(25 to 50) + add_overlay("crack2") + else + add_overlay("crack3") + +/obj/machinery/newscaster/power_change() + ..() + update_icon() + +/obj/machinery/newscaster/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir) + . = ..() + update_icon() + +/obj/machinery/newscaster/wrench_act(mob/user, obj/item/I) + . = TRUE + if(!I.tool_use_check(user, 0)) + return + to_chat(user, "Now [anchored ? "un" : ""]securing [name]") + if(!I.use_tool(src, user, 60, volume = I.tool_volume)) + return + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + if(stat & BROKEN) + to_chat(user, "The broken remains of [src] fall on the ground.") + new /obj/item/stack/sheet/metal(loc, 5) + new /obj/item/shard(loc) + new /obj/item/shard(loc) + else + to_chat(user, "You [anchored ? "un" : ""]secure [name].") + new /obj/item/mounted/frame/newscaster_frame(loc) + qdel(src) + +/obj/machinery/newscaster/welder_act(mob/user, obj/item/I) + . = TRUE + if(!I.tool_use_check(user, 0)) + return + default_welder_repair(user, I) + +/obj/machinery/newscaster/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0) + switch(damage_type) + if(BRUTE) + if(stat & BROKEN) + playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, TRUE) + else + playsound(loc, 'sound/effects/glasshit.ogg', 90, TRUE) + if(BURN) + playsound(loc, 'sound/items/welder.ogg', 100, TRUE) + +/obj/machinery/newscaster/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc, 2) + new /obj/item/shard(loc) + new /obj/item/shard(loc) + qdel(src) + +/obj/machinery/newscaster/obj_break() + if(!(stat & BROKEN) && !(flags & NODECONSTRUCT)) + stat |= BROKEN + playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) + update_icon() + +/obj/machinery/newscaster/attack_ghost(mob/user) + tgui_interact(user) + +/obj/machinery/newscaster/attack_hand(mob/user) + if(..()) + return + tgui_interact(user) + +/obj/machinery/newscaster/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + if(can_scan(user)) + scanned_user = get_scanned_user(user)["name"] + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "Newscaster", name, 800, 600) + ui.open() + ui.set_autoupdate(FALSE) + +/obj/machinery/newscaster/tgui_data(mob/user) + var/list/data = list() + data["unit_number"] = unit_number + data["is_security"] = is_security + data["is_admin"] = user.can_admin_interact() + data["is_silent"] = is_silent + data["is_printing"] = is_printing + data["screen"] = screen + data["modal"] = tgui_modal_data(src) + if(data["modal"] && !isnull(data["modal"]["args"]["is_admin"])) + data["modal"]["args"]["is_admin"] = user.can_admin_interact() + data["temp"] = temp_notice + + // Wanted notice + if(GLOB.news_network.wanted_issue) + data["wanted"] = get_message_data(GLOB.news_network.wanted_issue, user)[1] + data["world_time"] = world.time + + var/user_name = get_scanned_user(user)["name"] + switch(screen) + if(NEWSCASTER_HEADLINES, NEWSCASTER_CHANNEL) + // Get the list of stories to pick from - either all or from a specific channel depending on the screen + var/list/message_list = GLOB.news_network.stories + if(screen == NEWSCASTER_CHANNEL) + if(!viewing_channel) // Uh oh, channel doesn't exist! Redirect to Headlines + screen = NEWSCASTER_HEADLINES + return tgui_data(user) + message_list = viewing_channel.messages + data["channel_idx"] = GLOB.news_network.channels.Find(viewing_channel) + data["channel_can_manage"] = viewing_channel.can_modify(usr, user_name) + // Append the data + var/list/stories = list() + data["stories"] = stories + for(var/i in 1 to min(STORIES_PER_LOAD, length(message_list))) + stories += get_message_data(message_list[i], user) + // View and unread data + var/now = world.time + data["world_time"] = now + if(user_name) + // Increase views + for(var/m in stories) + if(now >= m["publish_time"]) + var/datum/feed_message/FM = locateUID(m["uid"]) + if(FM && !(FM.censor_flags & CENSOR_STORY)) + FM.view_count++ + m["view_count"] = FM.view_count + // Update the last viewed times for the user + LAZYINITLIST(last_views[user_name]) + for(var/c in GLOB.news_network.channels) + var/datum/feed_channel/C = c + if(screen == NEWSCASTER_CHANNEL && C != viewing_channel) + continue + last_views[user_name][C.UID()] = now + if(NEWSCASTER_JOBS) + var/list/jobs = list() + data["jobs"] = jobs + for(var/cat in list("security", "engineering", "medical", "science", "service", "supply")) + jobs[cat] = list() + + for(var/datum/job/job in SSjobs.occupations) + if(job.type in jobblacklist) + continue + if(job.is_position_available()) + var/list/opening_data = list("title" = job.title) + // Is the job a command job? + if(job.title in GLOB.command_positions) + opening_data["is_command"] = TRUE + // Add the job opening to the corresponding categories + // Ugly! + opening_data = list(opening_data) + if(job.is_security) + jobs["security"] += opening_data + if(job.is_engineering) + jobs["engineering"] += opening_data + if(job.is_medical) + jobs["medical"] += opening_data + if(job.is_science) + jobs["science"] += opening_data + if(job.is_service) + jobs["service"] += opening_data + if(job.is_supply) + jobs["supply"] += opening_data + + // Append temp photo + if(photo && data["modal"] && (data["modal"]["id"] in list("create_story", "wanted_notice"))) + data["photo"] = list( + name = photo.name, + uid = photo.UID(), + ) + user << browse_rsc(photo.img, "inserted_photo_[photo.UID()].png") + else + data["photo"] = null + + // Append channels + var/list/channels = list() + data["channels"] = channels + for(var/c in GLOB.news_network.channels) + var/datum/feed_channel/C = c + var/list/channel = list( + uid = C.UID(), + name = C.channel_name, + author = C.author, + description = C.description, + icon = C.icon, + public = C.is_public, + frozen = C.frozen, + censored = C.censored, + admin = C.admin_locked, + unread = 0, + ) + // Add the number of unseen stories if authed + if(user_name) + var/last_view_time = (last_views[user_name] && last_views[user_name][C.UID()]) || 0 + for(var/m in C.messages) + var/datum/feed_message/M = m + if(last_view_time < M.publish_time) + channel["unread"]++ + channels += list(channel) + + return data + +/** + * Returns a [/datum/feed_message] in a format that can be used as TGUI data. + * + * Arguments: + * * FM - The story to send + * * M - Optional. The user to send the story's photo to if it exists + */ +/obj/machinery/newscaster/proc/get_message_data(datum/feed_message/FM, mob/M) + if(!(FM.censor_flags & CENSOR_STORY) && M && FM.img) + M << browse_rsc(FM.img, "story_photo_[FM.UID()].png") + return list(list( + uid = FM.UID(), + author = (FM.censor_flags & CENSOR_AUTHOR) ? "" : FM.author, + title = (FM.censor_flags & CENSOR_STORY) ? "" : FM.title, + body = (FM.censor_flags & CENSOR_STORY) ? "" : FM.body, + admin_locked = FM.admin_locked, + censor_flags = FM.censor_flags, + view_count = FM.view_count, + publish_time = FM.publish_time, + publish_time_proper = station_time_timestamp(time = FM.publish_time), + has_photo = !isnull(FM.img), + )) + +/obj/machinery/newscaster/tgui_act(action, list/params) + if(..()) + return + + . = TRUE + if(tgui_act_modal(action, params)) + return + + switch(action) + if("cleartemp") + temp_notice = null + if("jobs") + screen = NEWSCASTER_JOBS + if("headlines") + if(screen == NEWSCASTER_HEADLINES) + return FALSE + screen = NEWSCASTER_HEADLINES + if("channel") + var/datum/feed_channel/FC = locateUID(params["uid"]) + if(!istype(FC)) + return + if(screen == NEWSCASTER_CHANNEL && viewing_channel == FC) + return FALSE + screen = NEWSCASTER_CHANNEL + viewing_channel = FC + if("attach_photo") + var/list/open_modal = tgui_modal_data(src) + if(photo || !open_modal || !(open_modal["id"] in list("create_story", "wanted_notice"))) + return + if(ishuman(usr)) + var/obj/item/photo/P = usr.get_active_hand() + if(istype(P) && usr.unEquip(P)) + photo = P + P.forceMove(src) + usr.visible_message("[usr] inserts [P] into [src]'s photo slot.",\ + "You insert [P] into [src]'s photo slot.") + playsound(loc, 'sound/machines/terminal_insert_disc.ogg', 30, TRUE) + else if(issilicon(usr)) + var/mob/living/silicon/M = usr + var/datum/picture/selection = M.aiCamera?.selectpicture() + if(!selection) + return + var/obj/item/photo/P = new + P.construct(selection) + P.forceMove(src) + photo = P + visible_message("[src]'s photo slot quietly whirs as it prints [P] inside it.") + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 15, TRUE) + if("eject_photo") + eject_photo(usr) + return FALSE // Updating handled in that proc + if("censor_channel") + if(is_security && !get_scanned_user(usr)["security"]) + set_temp("You do not have permission to perform this action. Please ensure your ID has appropiate access.", "danger") + return + var/datum/feed_channel/FC = locateUID(params["uid"]) + if(!istype(FC)) + return + if(FC.admin_locked && !usr.can_admin_interact()) + set_temp("This channel has been locked by CentComm and thus cannot be (un)censored.", "danger") + return + FC.censored = !FC.censored + if("censor_author", "censor_story") + if(is_security && !get_scanned_user(usr)["security"]) + set_temp("You do not have permission to perform this action. Please ensure your ID has appropiate access.", "danger") + return + var/datum/feed_message/FM = locateUID(params["uid"]) + if(!istype(FM)) + return + if(FM.admin_locked && !usr.can_admin_interact()) + set_temp("This story has been locked by CentComm and thus cannot be censored in any way.", "danger") + return + if(action == "censor_author") + FM.censor_flags = (FM.censor_flags & CENSOR_AUTHOR) ? (FM.censor_flags & ~CENSOR_AUTHOR) : (FM.censor_flags|CENSOR_AUTHOR) + else if(action == "censor_story") + FM.censor_flags = (FM.censor_flags & CENSOR_STORY) ? (FM.censor_flags & ~CENSOR_STORY) : (FM.censor_flags|CENSOR_STORY) + else + return FALSE + if("clear_wanted_notice") + if(is_security && !get_scanned_user(usr)["security"]) + set_temp("You do not have permission to perform this action. Please ensure your ID has appropiate access.", "danger") + return + var/datum/feed_message/WN = GLOB.news_network.wanted_issue + if(!WN) + return + if(WN.admin_locked && !usr.can_admin_interact()) + set_temp("This wanted notice has been locked by CentComm and thus cannot be altered.", "danger") + return + GLOB.news_network.wanted_issue = null + set_temp("Wanted notice cleared.", update_now = TRUE) + return FALSE + if("toggle_mute") + is_silent = !is_silent + if("print_newspaper") + if(is_printing) + return + if(paper_remaining <= 0) + set_temp("There is no more paper available.", "danger") + return + print_newspaper() + else + return FALSE + + add_fingerprint(usr) + +/** + * Called in tgui_act() to process modal actions + * + * Arguments: + * * action - The action passed by tgui + * * params - The params passed by tgui + */ +/obj/machinery/newscaster/proc/tgui_act_modal(action, list/params) + . = TRUE + var/id = params["id"] + var/list/arguments = istext(params["arguments"]) ? json_decode(params["arguments"]) : params["arguments"] + switch(tgui_modal_act(src, action, params)) + if(TGUI_MODAL_OPEN) + switch(id) + if("create_channel", "manage_channel") + // If trying to manage the channel, make sure the user is allowed to! + if(id == "manage_channel") + var/datum/feed_channel/FC = locateUID(arguments["uid"]) + if(!istype(FC) || !FC.can_modify(usr, get_scanned_user(usr)["name"])) + return + tgui_modal_message(src, id, "", arguments = list( + uid = arguments["uid"], // Only when managing a channel + scanned_user = scanned_user, + is_admin = usr.can_admin_interact(), + )) + if("create_story", "wanted_notice") // Other modals + if(id == "wanted_notice" && !(is_security || usr.can_admin_interact())) + return + tgui_modal_message(src, id, "", arguments = list( + scanned_user = scanned_user, + is_admin = usr.can_admin_interact(), + )) + else + return FALSE + if(TGUI_MODAL_ANSWER) + switch(id) + if("create_channel", "manage_channel") + var/author = trim(arguments["author"]) + var/name = trim(arguments["name"]) + if(!length(author) || !length(name)) + return + var/description = trim(arguments["description"]) + var/icon = arguments["icon"] + var/public = text2num(arguments["public"]) + var/admin_locked = text2num(arguments["admin_locked"]) + // + var/datum/feed_channel/FC = null + if(id == "create_channel") // Channel creation + if(GLOB.news_network.get_channel_by_name(name)) + set_temp("A channel with this name already exists.", "danger") + return + if(GLOB.news_network.get_channel_by_author(author)) + set_temp("A channel with this author name already exists.", "danger") + return + FC = new + GLOB.news_network.channels += FC + feedback_inc("newscaster_channels", 1) + // Redirect + screen = NEWSCASTER_CHANNEL + viewing_channel = FC + else if (id == "manage_channel") // Channel management + FC = locateUID(arguments["uid"]) + if(!FC || !FC.can_modify(usr, get_scanned_user(usr)["name"])) + return + // Add/update the information + FC.channel_name = copytext(name, 1, CHANNEL_NAME_MAX_LENGTH) + FC.description = copytext(description, 1, CHANNEL_DESC_MAX_LENGTH) + FC.icon = usr.can_admin_interact() ? icon : "newspaper" + FC.author = usr.can_admin_interact() ? author : scanned_user + FC.is_public = public + FC.admin_locked = usr.can_admin_interact() && admin_locked + set_temp("Channel [FC.channel_name] created.", "good") + if("create_story") + var/author = trim(arguments["author"]) + var/channel = trim(arguments["channel"]) + var/title = trim(arguments["title"]) + var/body = trim(arguments["body"]) + var/admin_locked = text2num(arguments["admin_locked"]) + if(!length(author) || !length(title) || !length(body)) + return + // Find the named channel the user is trying to publish a story to + var/user_name = get_scanned_user(usr)["name"] + var/datum/feed_channel/FC = GLOB.news_network.get_channel_by_name(channel) + if(!FC || !FC.can_publish(usr, user_name)) + return + var/datum/feed_message/FM = new + FM.author = usr.can_admin_interact() ? author : scanned_user + FM.title = copytext(title, 1, STORY_NAME_MAX_LENGTH) + FM.body = copytext(body, 1, STORY_BODY_MAX_LENGTH) + FM.img = photo?.img + FM.admin_locked = usr.can_admin_interact() && admin_locked + // Register it + FC.add_message(FM) + feedback_inc("newscaster_stories", 1) + var/announcement = FC.get_announce_text(title) + // Announce it + for(var/nc in GLOB.allNewscasters) + var/obj/machinery/newscaster/NC = nc + NC.alert_news(announcement) + // Redirect and eject photo + LAZYINITLIST(last_views[user_name]) + last_views[user_name][FC.UID()] = world.time + screen = NEWSCASTER_CHANNEL + viewing_channel = FC + eject_photo(usr) + set_temp("Story published to channel [FC.channel_name].", "good") + if("wanted_notice") + if(id == "wanted_notice" && !(is_security || usr.can_admin_interact())) + return + var/author = trim(arguments["author"]) + var/name = trim(arguments["name"]) + var/description = trim(arguments["description"]) + var/admin_locked = text2num(arguments["admin_locked"]) + if(!length(author) || !length(name) || !length(description)) + return + var/datum/feed_message/WN = GLOB.news_network.wanted_issue + if(WN) + if(WN.admin_locked && !usr.can_admin_interact()) + set_temp("This wanted notice has been locked by CentComm and thus cannot be altered.", "danger") + return + else + WN = new + GLOB.news_network.wanted_issue = WN + WN.author = usr.can_admin_interact() ? author : scanned_user + WN.title = "WANTED: [copytext(name, 1, WANTED_NOTICE_NAME_MAX_LENGTH)]" + WN.body = copytext(description, 1, WANTED_NOTICE_DESC_MAX_LENGTH) + WN.img = photo?.img + WN.admin_locked = usr.can_admin_interact() && admin_locked + WN.publish_time = world.time + // Announce it and eject photo + for(var/nc in GLOB.allNewscasters) + var/obj/machinery/newscaster/NC = nc + NC.alert_news(wanted_notice = TRUE) + eject_photo(usr) + set_temp("Wanted notice distributed.", "good") + else + return FALSE + else + return FALSE + +/** + * Ejects the photo currently held by the machine if there is one. + * + * Arguments: + * * user - The user to try to give the photo to. + */ +/obj/machinery/newscaster/proc/eject_photo(mob/user) + if(!photo) + return + var/obj/item/photo/P = photo + photo = null + P.forceMove(loc) + if(ishuman(user) && user.put_in_active_hand(P)) + visible_message("[src] ejects [P] from its photo slot into [user]'s hand.") + else + visible_message("[src] ejects [P] from its photo slot.") + playsound(loc, 'sound/machines/terminal_insert_disc.ogg', 30, TRUE) + SStgui.update_uis(src) + +/** + * Sets a temporary message to display to the user + * + * Arguments: + * * text - Text to display, null/empty to clear the message from the UI + * * style - The style of the message: (color name), info, success, warning, danger + */ +/obj/machinery/newscaster/proc/set_temp(text = "", style = "info", update_now = FALSE) + temp_notice = list(text = text, style = style) + if(update_now) + SStgui.update_uis(src) + +/** + * Tries to obtain a mob's name and security access based on their ID. + * + * Arguments: + * * user - The user + */ +/obj/machinery/newscaster/proc/get_scanned_user(mob/user) + . = list(name = "Unknown", security = user.can_admin_interact()) + if(ishuman(user)) + var/mob/living/carbon/human/M = user + // No ID, no luck + if(!M.wear_id) + return + // Try to get the ID + var/obj/item/card/id/ID + if(istype(M.wear_id, /obj/item/pda)) + var/obj/item/pda/P = M.wear_id + ID = P.id + else if(istype(M.wear_id, /obj/item/card/id)) + ID = M.wear_id + if(istype(ID)) + return list(name = "[ID.registered_name] ([ID.assignment])", security = has_access(list(), list(ACCESS_SECURITY), ID.access)) + else if(issilicon(user)) + var/mob/living/silicon/ai_user = user + return list(name = "[ai_user.name] ([ai_user.job])", security = TRUE) + +/** + * Returns whether the machine's [/obj/machinery/newscaster/var/scanned_user] should update on interact. + * + * Arguments: + * * user - The user to check + */ +/obj/machinery/newscaster/proc/can_scan(mob/user) + if(ishuman(user) || issilicon(user)) + return TRUE + return FALSE + +/** + * Tries to print a newspaper with all of the content so far. + */ +/obj/machinery/newscaster/proc/print_newspaper() + if(paper_remaining <= 0 || is_printing) + return + paper_remaining-- + feedback_inc("newscaster_newspapers_printed", 1) + // Print it + is_printing = TRUE + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, TRUE) + visible_message("[src] whirs as it prints a newspaper.") + addtimer(CALLBACK(src, .proc/print_newspaper_finish), 5 SECONDS) + +/** + * Called when the timer following a call to [/obj/machinery/newscaster/proc/print_newspaper] finishes. + */ +/obj/machinery/newscaster/proc/print_newspaper_finish() + is_printing = FALSE + SStgui.update_uis(src) + // Create the newspaper + var/obj/item/newspaper/NP = new + NP.forceMove(loc) + // Populate the newspaper + NP.important_message = GLOB.news_network.wanted_issue + for(var/fc in GLOB.news_network.channels) + var/datum/feed_channel/FC = fc + NP.news_content += FC + +/** + * Makes the newscaster say a message and change its icon state for a while. + * + * Arguments: + * * announcement - The message to say + * * wanted_notice - Whether the alert is a wanted notice notification (overrides announcement) + */ +/obj/machinery/newscaster/proc/alert_news(announcement, wanted_notice = FALSE) + if(wanted_notice) + atom_say("Attention! Wanted issue distributed!") + playsound(loc, 'sound/machines/warning-buzzer.ogg', 75, TRUE) + else if(length(announcement)) + atom_say("[announcement]!") + if(!is_silent) + playsound(loc, 'sound/machines/twobeep.ogg', 75, TRUE) + else + return + alert = TRUE + addtimer(CALLBACK(src, .proc/alert_timer_finish), 30 SECONDS) + update_icon() + +/** + * Called when the timer following a call to [/obj/machinery/newscaster/proc/alert_news] finishes. + */ +/obj/machinery/newscaster/proc/alert_timer_finish() + alert = FALSE + update_icon() + +/** + * Ejects the currently loaded photo if there is one. + */ +/obj/machinery/newscaster/verb/eject_photo_verb() + set name = "Eject Photo" + set category = "Object" + set src in oview(1) + + if(usr.incapacitated()) + return + + eject_photo(usr) + +#undef CHANNEL_NAME_MAX_LENGTH +#undef CHANNEL_DESC_MAX_LENGTH +#undef STORY_NAME_MAX_LENGTH +#undef STORY_BODY_MAX_LENGTH +#undef WANTED_NOTICE_NAME_MAX_LENGTH +#undef WANTED_NOTICE_DESC_MAX_LENGTH +#undef STORIES_PER_LOAD diff --git a/code/modules/newscaster/obj/newspaper.dm b/code/modules/newscaster/obj/newspaper.dm new file mode 100644 index 00000000000..fe3ec257e32 --- /dev/null +++ b/code/modules/newscaster/obj/newspaper.dm @@ -0,0 +1,166 @@ +#define SCREEN_COVER 0 +#define SCREEN_PAGE_INNER 1 +#define SCREEN_PAGE_LAST 2 + +/** + * # Newspaper + * + * A newspaper displaying the stories of all channels contained within. + */ +/obj/item/newspaper + name = "newspaper" + desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "newspaper" + w_class = WEIGHT_CLASS_SMALL + attack_verb = list("bapped") + /// The current screen to display. + var/screen = 0 + /// The number of pages. + var/pages = 0 + /// The currently selected page. + var/curr_page = 0 + /// The channels to display as content. + var/list/datum/feed_channel/news_content + /// The security notice to display optionally. + var/datum/feed_message/important_message = null + /// The contents of a scribble made through pen, if any. + var/scribble = "" + /// The page of said scribble. + var/scribble_page = null + +/obj/item/newspaper/Initialize(mapload) + . = ..() + if(!news_content) + news_content = list() + +/obj/item/newspaper/attack_self(mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + var/dat + pages = 0 + switch(screen) + if(SCREEN_COVER) //Cover + dat += "
The Griffon
" + dat += "
Nanotrasen-standard newspaper, for use on Nanotrasen Space Facilities

" + if(!length(news_content)) + if(important_message) + dat += "Contents:
    **Important Security Announcement** \[page [pages+2]\]
" + else + dat += "Other than the title, the rest of the newspaper is unprinted..." + else + dat += "Contents:
    " + for(var/datum/feed_channel/NP in news_content) + pages++ + if(important_message) + dat += "**Important Security Announcement** \[page [pages+2]\]
    " + var/temp_page=0 + for(var/datum/feed_channel/NP in news_content) + temp_page++ + dat += "[NP.channel_name] \[page [temp_page+1]\]
    " + dat += "
" + if(scribble_page==curr_page) + dat += "
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "
" + if(SCREEN_PAGE_INNER) // X channel pages inbetween. + for(var/datum/feed_channel/NP in news_content) + pages++ //Let's get it right again. + var/datum/feed_channel/C = news_content[curr_page] + dat += "[C.channel_name] \[created by: [C.author]\]

" + if(C.censored) + dat += "This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice. Its contents were not transferred to the newspaper at the time of printing." + else + if(!length(C.messages)) + dat += "No Feed stories stem from this channel..." + else + dat += "
    " + var/i = 0 + for(var/datum/feed_message/MESSAGE in C.messages) + var/title = (MESSAGE.censor_flags & CENSOR_STORY) ? "\[REDACTED\]" : MESSAGE.title + var/body = (MESSAGE.censor_flags & CENSOR_STORY) ? "\[REDACTED\]" : MESSAGE.body + i++ + dat += "[title]
    " + dat += "[body]
    " + if(MESSAGE.img) + user << browse_rsc(MESSAGE.img, "tmp_photo[i].png") + dat += "
    " + dat += "\[Story by [MESSAGE.author]\]

    " + dat += "
" + if(scribble_page==curr_page) + dat += "
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "

" + if(SCREEN_PAGE_LAST) //Last page + for(var/datum/feed_channel/NP in news_content) + pages++ + if(important_message!=null) + dat += "
Wanted Issue:


" + dat += "Criminal name: [important_message.author]
" + dat += "Description: [important_message.body]
" + dat += "Photo:: " + if(important_message.img) + user << browse_rsc(important_message.img, "tmp_photow.png") + dat += "
" + else + dat += "None" + else + dat += "Apart from some uninteresting Classified ads, there's nothing on this page..." + if(scribble_page==curr_page) + dat += "
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "
" + else + dat += "i'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" + + dat += "

[curr_page+1]
" + human_user << browse(dat, "window=newspaper_main;size=300x400") + onclose(human_user, "newspaper_main") + else + to_chat(user, "The paper is full of unintelligible symbols!") + +/obj/item/newspaper/Topic(href, href_list) + if(..()) + return + var/mob/living/M = usr + if(!Adjacent(M)) + return + M.set_machine(src) + if(href_list["next_page"]) + if(curr_page == pages + 1) + return //Don't need that at all, but anyway. + else if(curr_page == pages) //We're at the middle, get to the end + screen = SCREEN_PAGE_LAST + else if(curr_page == 0) //We're at the start, get to the middle + screen = SCREEN_PAGE_INNER + curr_page++ + playsound(loc, "pageturn", 50, TRUE) + else if(href_list["prev_page"]) + if(curr_page == 0) + return + else if(curr_page == 1) + screen = SCREEN_COVER + else if(curr_page == pages + 1) //we're at the end, let's go back to the middle. + screen = SCREEN_PAGE_INNER + curr_page-- + playsound(loc, "pageturn", 50, TRUE) + if(loc == M) + attack_self(M) + +/obj/item/newspaper/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/pen)) + if(scribble_page == curr_page) + to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") + else + var/s = strip_html(input(user, "Write something", "Newspaper", "")) + s = sanitize(copytext(s, 1, MAX_MESSAGE_LEN)) + if(!s || !Adjacent(user)) + return + scribble_page = curr_page + scribble = s + user.visible_message("[user] scribbles something on [src].",\ + "You scribble on page number [curr_page] of [src].") + attack_self(user) + return + return ..() + +#undef SCREEN_COVER +#undef SCREEN_PAGE_INNER +#undef SCREEN_PAGE_LAST diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm index 4f17cbf041e..e7d57c3d5f8 100644 --- a/code/modules/pda/messenger.dm +++ b/code/modules/pda/messenger.dm @@ -177,7 +177,7 @@ // Show it to ghosts for(var/mob/M in GLOB.dead_mob_list) - if(isobserver(M) && M.client && (M.client.prefs.toggles & CHAT_GHOSTPDA)) + if(isobserver(M) && M.client && (M.client.prefs.toggles & PREFTOGGLE_CHAT_GHOSTPDA)) var/ghost_message = "[pda.owner] ([ghost_follow_link(pda, ghost=M)]) PDA Message --> [P.owner] ([ghost_follow_link(P, ghost=M)]): [t]" to_chat(M, "[ghost_message]") diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 960340e90b6..4d3eb5f51f0 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -144,7 +144,7 @@ field_generator power level display ..() /obj/machinery/field/generator/bullet_act(obj/item/projectile/Proj) - if(Proj.flag != "bullet") + if(Proj.flag != "bullet" && !Proj.nodamage) power = min(power + Proj.damage, field_generator_max_power) check_power_level() return 0 diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 6146cd3ac2c..844615d5be7 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -313,6 +313,8 @@ return attack_hand(user) /obj/machinery/power/supermatter_shard/attack_hand(mob/user as mob) + if(isAI(user)) + return user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... [user.p_their(TRUE)] body starts to glow and bursts into flames before flashing into ash.",\ "You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\ "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.") diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index a809953b8fd..95a438a204d 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -187,7 +187,8 @@ /obj/item/ammo_casing/energy/wormhole projectile_type = /obj/item/projectile/beam/wormhole muzzle_flash_color = "#33CCFF" - e_cost = 0 + delay = 10 + e_cost = 100 fire_sound = 'sound/weapons/pulse3.ogg' var/obj/item/gun/energy/wormhole_projector/gun = null select_name = "blue" diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 44e393f9762..90e6e700db9 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -200,6 +200,8 @@ item_state = null icon_state = "wormhole_projector1" origin_tech = "combat=4;bluespace=6;plasmatech=4;engineering=4" + charge_delay = 5 + selfcharge = TRUE var/obj/effect/portal/blue var/obj/effect/portal/orange diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index c320296e0bd..766975a4aad 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -85,6 +85,7 @@ icon_state = "omnilaser" hitsound = 'sound/weapons/tap.ogg' nodamage = 1 + damage = 0 damage_type = STAMINA flag = "laser" var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index d6140d28f4e..ed08c90f0b9 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -85,6 +85,7 @@ damage = 12.5 tile_dropoff = 0.75 tile_dropoff_s = 1.25 + armour_penetration = -30 /obj/item/projectile/bullet/pellet/rubber name = "rubber pellet" diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index 565a0d483a8..966e8ae93eb 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -628,7 +628,7 @@ reagent_state = LIQUID color = "#B4B400" metabolization_rate = 0.2 - nutriment_factor = 2 + nutriment_factor = 2.5 * REAGENTS_METABOLISM taste_description = "broth" /datum/reagent/consumable/cheese diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 9797951f290..072a22aa7ba 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -121,7 +121,14 @@ /datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - if(M.bodytemperature < TCRYO) + var/external_temp + if(istype(M.loc, /obj/machinery/atmospherics/unary/cryo_cell)) + var/obj/machinery/atmospherics/unary/cryo_cell/C = M.loc + external_temp = C.temperature_archived + else + var/turf/T = get_turf(M) + external_temp = T.temperature + if(external_temp < TCRYO) update_flags |= M.adjustCloneLoss(-4, FALSE) update_flags |= M.adjustOxyLoss(-10, FALSE) update_flags |= M.adjustToxLoss(-3, FALSE) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 5e20dbf6f35..d5a6181f146 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -50,15 +50,20 @@ user.changeNext_move(CLICK_CD_RANGE*2) user.newtonian_move(get_dir(A, user)) - if(reagents.reagent_list.len == 1 && reagents.has_reagent("cleaner")) // Only show space cleaner logs if it's burning people from being too hot or cold - if(reagents.chem_temp < 300 && reagents.chem_temp > 280) // 280 is the cold threshold for slimes, 300 the hot threshold for drask + var/attack_log_type = ATKLOG_ALMOSTALL + + if(reagents.chem_temp > 300 || reagents.chem_temp < 280) //harmful temperature + attack_log_type = ATKLOG_MOST + + if(reagents.reagent_list.len == 1 && reagents.has_reagent("cleaner")) // Only create space cleaner logs if it's burning people from being too hot or cold + if(attack_log_type == ATKLOG_ALMOSTALL) return - var/attack_log_type = ATKLOG_MOST + //commonly used for griefing or just very annoying and dangerous if(reagents.has_reagent("sacid") || reagents.has_reagent("facid") || reagents.has_reagent("lube")) attack_log_type = ATKLOG_FEW - add_attack_logs(user, A, "Used a potentially harmful spray bottle. Contents: [contents_log] - Temperature: [reagents.chem_temp]K", attack_log_type) + add_attack_logs(user, A, "Used a spray bottle. Contents: [contents_log] - Temperature: [reagents.chem_temp]K", attack_log_type) return diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 3fb173e7ac2..cafe92bcc87 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -267,7 +267,7 @@ timer = world.time GLOB.priority_announcement.Announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.") for(var/mob/M in GLOB.player_list) - if(!isnewplayer(M) && !M.client.karma_spent && !(M.client.ckey in GLOB.karma_spenders) && !M.get_preference(DISABLE_KARMA_REMINDER)) + if(!isnewplayer(M) && !M.client.karma_spent && !(M.client.ckey in GLOB.karma_spenders) && !M.get_preference(PREFTOGGLE_DISABLE_KARMA_REMINDER)) to_chat(M, "You have not yet spent your karma for the round; was there a player worthy of receiving your reward? Look under Special Verbs tab, Award Karma.") if(SHUTTLE_ESCAPE) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 86cfe2a7444..b97d181bb15 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -930,7 +930,7 @@ desc = "Used to control the Golem Ship." circuit = /obj/item/circuitboard/shuttle/golem_ship shuttleId = "freegolem" - possible_destinations = "freegolem_lavaland;freegolem_z5;freegolem_z6" + possible_destinations = "freegolem_lavaland;freegolem_space;freegolem_ussp" /obj/machinery/computer/shuttle/golem_ship/attack_hand(mob/user) if(!isgolem(user) && !isobserver(user)) diff --git a/code/modules/tgui/modules/power_monitor.dm b/code/modules/tgui/modules/power_monitor.dm index 71e12836d78..1b959ec72cb 100644 --- a/code/modules/tgui/modules/power_monitor.dm +++ b/code/modules/tgui/modules/power_monitor.dm @@ -20,6 +20,10 @@ /datum/tgui_module/power_monitor/tgui_data(mob/user) var/list/data = list() + // Sanity check + if(QDELETED(powermonitor)) + powermonitor = null + data["powermonitor"] = powermonitor if(select_monitor) data["select_monitor"] = TRUE diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 5157d0c9fed..d9bf56b555c 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -106,7 +106,7 @@ window_options += "size=[width]x[height];" // Remove titlebar and resize handles for a fancy window - if(user.client.prefs.nanoui_fancy) + if(user.client.prefs.toggles2 & PREFTOGGLE_2_FANCYUI) window_options += "titlebar=0;can_resize=0;" else window_options += "titlebar=1;can_resize=1;" @@ -196,7 +196,7 @@ "title" = title, "status" = status, "interface" = interface, - "fancy" = user.client.prefs.nanoui_fancy, + "fancy" = user.client.prefs.toggles2 & PREFTOGGLE_2_FANCYUI, "observer" = isobserver(user), "window" = window_id, "map" = (GLOB.using_map && GLOB.using_map.name) ? GLOB.using_map.name : "Unknown", @@ -252,8 +252,7 @@ src_object.tgui_shared_states[key] = value SStgui.update_uis(src_object) if("tgui:setFancy") - var/value = text2num(params["value"]) - user.client.prefs.nanoui_fancy = value + user.client.prefs.toggles2 ^= PREFTOGGLE_2_FANCYUI if("tgui:log") // Force window to show frills on fatal errors if(params["fatal"]) diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt index 2ab248072cf..f1a96ae3d74 100644 --- a/config/example/dbconfig.txt +++ b/config/example/dbconfig.txt @@ -9,7 +9,7 @@ ## This value must be set to the version of the paradise schema in use. ## If this value does not match, the SQL database will not be loaded and an error will be generated. ## Roundstart will be delayed. -DB_VERSION 12 +DB_VERSION 13 ## Server the MySQL database can be found at. # Examples: localhost, 200.135.5.43, www.mysqldb.com, etc. diff --git a/goon/browserassets/css/browserOutput-dark.css b/goon/browserassets/css/browserOutput-dark.css index 529827ad369..f043b16c0ad 100644 --- a/goon/browserassets/css/browserOutput-dark.css +++ b/goon/browserassets/css/browserOutput-dark.css @@ -307,7 +307,6 @@ h1.alert, h2.alert {color: #FFF;} .info {color: #6685f5;} .notice {color: #6685f5;} -.bnotice {color: #6685f5; font-weight: bold;} .boldnotice {color: #6685f5; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} .green {color: #03bb39;} @@ -328,7 +327,7 @@ h1.alert, h2.alert {color: #FFF;} .sans {font-family: 'Comic Sans MS', cursive, sans-serif;} .wingdings {font-family: Wingdings, Webdings;} .robot {font-family: 'PxPlus IBM MDA'; font-size: 1.15em;} -.ancient {color: #008B8B; font-stye: italic;} +.ancient {color: #008B8B; font-style: italic;} .newscaster {color: #CC0000;} .mod {color: #735638; font-weight: bold;} .modooc {color: #184880; font-weight: bold;} diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index 31da7aa96f5..1ca6700520a 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -304,7 +304,6 @@ h1.alert, h2.alert {color: #000000;} .info {color: #0000CC;} .notice {color: #000099;} -.bnotice {color: #000099; font-weight: bold;} .boldnotice {color: #000099; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} .green {color: #03bb39;} @@ -325,7 +324,7 @@ h1.alert, h2.alert {color: #000000;} .sans {font-family: 'Comic Sans MS', cursive, sans-serif;} .wingdings {font-family: Wingdings, Webdings;} .robot {font-family: 'PxPlus IBM MDA'; font-size: 1.15em;} -.ancient {color: #008B8B; font-stye: italic;} +.ancient {color: #008B8B; font-style: italic;} .newscaster {color: #800000;} .mod {color: #735638; font-weight: bold;} .modooc {color: #184880; font-weight: bold;} diff --git a/icons/_nanomaps/Cyberiad_nanomap_z1.png b/icons/_nanomaps/Cyberiad_nanomap_z1.png index fb87632863e..b0c25ff74b8 100644 Binary files a/icons/_nanomaps/Cyberiad_nanomap_z1.png and b/icons/_nanomaps/Cyberiad_nanomap_z1.png differ diff --git a/icons/_nanomaps/Delta_nanomap_z1.png b/icons/_nanomaps/Delta_nanomap_z1.png index 23a31d17241..53bc723c6d4 100644 Binary files a/icons/_nanomaps/Delta_nanomap_z1.png and b/icons/_nanomaps/Delta_nanomap_z1.png differ diff --git a/icons/_nanomaps/MetaStation_nanomap_z1.png b/icons/_nanomaps/MetaStation_nanomap_z1.png index 77a34cd046a..70c0b1fe013 100644 Binary files a/icons/_nanomaps/MetaStation_nanomap_z1.png and b/icons/_nanomaps/MetaStation_nanomap_z1.png differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 61224892056..240558ebb80 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 34a1864257b..a3743efa33b 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/screen_white.dmi b/icons/mob/screen_white.dmi index ab65366bb52..d66452f052d 100644 Binary files a/icons/mob/screen_white.dmi and b/icons/mob/screen_white.dmi differ diff --git a/icons/mob/zone_sel.dmi b/icons/mob/zone_sel.dmi index b9e83cb1dc9..65f8b646da8 100644 Binary files a/icons/mob/zone_sel.dmi and b/icons/mob/zone_sel.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index ad31ac04998..ed71b4d3c1d 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 ba64299a052..e0b815edf60 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/nano/templates/newscaster.tmpl b/nano/templates/newscaster.tmpl deleted file mode 100644 index 4ddf376e71f..00000000000 --- a/nano/templates/newscaster.tmpl +++ /dev/null @@ -1,333 +0,0 @@ - - - - -

Welcome to Newscasting Unit #{{:data.unit_no}}.

-Interface & News networks Operational.
-Property of Nanotrasen

-
-{{if data.temp}} -
{{:data.temp}}
-
{{:helper.link('Return', 'arrow-left', {'setScreen' : data.temp_back_screen})}}
-{{else}} - {{if data.screen == 0}} -
- {{if data.wanted_issue}} -
{{:helper.link('Read Wanted issue', 'exclamation-triangle', {'view_wanted' : 1})}}
- {{/if}} -
{{:helper.link('View available NT jobs', 'share', {'jobs' : 1})}}
-
{{:helper.link('Create feed channel', 'plus', {'create_channel' : 1})}}
-
{{:helper.link('View feed channels', 'arrow-right', {'view' : 1})}}
-
{{:helper.link('Submit new feed story', 'share', {'create_feed_story' : 1})}}
-
{{:helper.link('Print newspaper', 'print', {'menu_paper' : 1})}}
-
{{:helper.link(data.silence ? 'Unsilence unit' : 'Silence unit', data.silence ? 'volume-up' : 'volume-off', {'silence_unit' : 1})}}
-
{{:helper.link('Re-scan user', 'refresh', {'refresh' : 1})}}
- {{if data.securityCaster}} -
Feed Security functions:
-
{{:helper.link(data.wanted_issue ? 'Manage wanted issue' : 'Publish wanted issue', data.wanted_issue ? 'pencil' : 'share', {'menu_wanted' : 1})}}
-
{{:helper.link('Censor feed stories', 'ban', {'menu_censor_story' : 1})}}
-
{{:helper.link('Mark feed channel with Nanotrasen D-Notice', 'thumb-tack', {'menu_censor_channel' : 1})}}
-
The newscaster recognises you as: {{:data.scanned_user}}
- {{/if}} -
- {{else data.screen == 1}} -

Station Feed Channels

-
- {{for data.channels}} -
- {{if value.admin}} - {{:helper.link('' + value.name + '', 'arrow-right', {'show_channel' : value.ref})}} - {{else}} - {{:helper.link(value.name, 'arrow-right', {'show_channel' : value.ref}, null, value.censored ? 'link linkDanger' : null)}} - {{/if}} -
- {{empty}} - No active channels found... - {{/for}} -
-
-
-
{{:helper.link('Refresh', 'refresh', {'refresh' : 1})}}
-
{{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
-
- {{else data.screen == 2}} -

Creating new feed channel...

-
-
Channel name:
-
- {{:data.channel_name}} - {{:helper.link('Edit', 'pencil', {'set_channel_name' : 1})}} -
-
-
-
Channel author:
-
{{:data.scanned_user}}
-
-
-
Accept public feeds:
-
{{:helper.link(data.c_locked ? 'NO' : 'YES', data.c_locked ? 'times' : 'check', {'set_channel_lock' : 1})}}
-
-
- {{:helper.link('Submit', 'share', {'submit_new_channel' : 1})}} - {{:helper.link('Cancel', 'arrow-left', {'setScreen' : 0})}} -
- {{else data.screen == 3}} - Creating new feed message... -
-
Receiving channel:
-
- {{:data.channel_name}} - {{:helper.link('Edit', 'pencil', {'set_channel_receiving' : 1})}} -
-
-
-
Title:
-
- {{:data.title}} - {{:helper.link('Edit', 'pencil', {'set_message_title' : 1})}} -
-
-
-
Message body:
-
- {{:data.msg}} - {{:helper.link('Edit', 'pencil', {'set_new_message' : 1})}} -
-
-
-
Attached photo:
-
{{:helper.link(data.photo ? 'Dettach photo' : 'Attach photo', data.photo ? 'times' : 'paperclip', {'set_attachment' : 1})}}
-
-
- {{:helper.link('Submit', 'share', {'submit_new_message' : 1})}} - {{:helper.link('Cancel', 'arrow-left', {'setScreen' : 0})}} -
- {{else data.screen == 4}} - Network currently serves a total of {{:data.total_num}} feed channels, {{:data.active_num}} of which are active, and a total of {{:data.message_num}} feed stories. -
-
Liquid paper remaining:
-
{{:data.paper_remaining}} cm3
-
-
- {{:helper.link('Print paper', 'print', {'print_paper' : 0})}} - {{:helper.link('Cancel', 'arrow-left', {'setScreen' : 0})}} -
- {{else data.screen == 5}} - {{:data.channel_name}} [created by: {{:data.author}}]
- Feed view count: {{:data.total_view_count}}
- {{if data.censored}} -
- ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
- No further feed story additions are allowed while the D-Notice is in effect. -
- {{else}} - {{for data.messages}} -
-

- {{:value.title}}
-

- {{if value.img}} -
- {{/if}} -

- {{:value.body}}
-

- [{{:value.message_type}} by {{:value.author}}]
- Message view count: {{:value.view_count}} -
- {{empty}} - No feed messages found in channel... - {{/for}} - {{/if}} -
-
-
{{:helper.link('Refresh', 'refresh', {'refresh' : 0})}}
-
{{:helper.link('Back', 'arrow-left', {'setScreen' : 1})}}
-
- {{else data.screen == 6}} - Nanotrasen Feed Censorship Tool
- NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible. - Keep in mind that users attempting to view a censored feed will instead see the [REDACTED] tag above it. -
- Select feed channel to get stories from: -
- {{for data.channels}} -
- {{if value.admin}} - {{:helper.link('' + value.name + '', 'arrow-right', {'pick_censor_channel' : value.ref})}} - {{else}} - {{:helper.link(value.name, 'arrow-right', {'pick_censor_channel' : value.ref}, null, value.censored ? 'link linkDanger' : null)}} - {{/if}} -
- {{empty}} - No feed channels found active... - {{/for}} -
-
-
{{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
-
- {{else data.screen == 7}} - Nanotrasen D-Notice Handler
- A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station<>s morale, integrity or disciplinary behaviour. - A D-Notice will render a channel unable to be updated by anyone, without deleting any feedstories it might contain at the time. - You can lift a D-Notice if you have the required access at any time. -
-
- {{for data.channels}} -
- {{if value.admin}} - {{:helper.link('' + value.name + '', 'arrow-right', {'pick_d_notice' : value.ref})}} - {{else}} - {{:helper.link(value.name, 'arrow-right', {'pick_d_notice' : value.ref}, null, value.censored ? 'link linkDanger' : null)}} - {{/if}} -
- {{empty}} - No feed channels found active... - {{/for}} -
-
-
-
{{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
-
- {{else data.screen == 8}} - {{:data.channel_name}} [created by: {{:data.author}}]
- {{:helper.link(data.author_redacted ? 'Undo author censorship' : 'Censor channel author', null, {'censor_channel_author' : data.ref})}}

- {{for data.messages}} -
- {{:value.title}}
- {{:value.body}}
- {{if value.img}} -
- {{/if}} - [{{:value.message_type}} by {{:value.author}}]
- - {{:helper.link(value.body_redacted ? 'Undo story censorship' : 'Censor story', null, {'censor_channel_story_body' : value.ref})}} - {{:helper.link(value.author_redacted ? 'Undo author censorship' : 'Censor message author', null, {'censor_channel_story_author' : value.ref})}} - -
- {{empty}} - No feed messages found in channel... - {{/for}} -
-
-
{{:helper.link('Back', 'arrow-left', {'setScreen' : 6})}}
-
- {{else data.screen == 9}} - {{:data.channel_name}} [created by: {{:data.author}}]
- Channel messages listed below. If you deem them dangerous to the station, you can
{{:helper.link(data.censored ? 'Remove the D-Notice on the channel' : 'Bestow a D-Notice upon the channel', null, {'toggle_d_notice' : data.ref})}}


- {{if data.censored}} -
- ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice. - No further feed story additions are allowed while the D-Notice is in effect. -
- {{else}} - {{for data.messages}} -
- {{:value.title}}
- {{:value.body}}
- {{if value.img}} -
- {{/if}} - [{{:value.message_type}} by {{:value.author}}] -
- {{empty}} - No feed messages found in channel... - {{/for}} - {{/if}} -
-
{{:helper.link('Back', 'arrow-left', {'setScreen' : 7})}}
-
- {{else data.screen == 10}} - Wanted Issue handler:
- {{if data.wanted_already}} - A wanted issue is already in Feed Circulation. You can edit or cancel it below.
- {{/if}} -
-
Criminal name:
-
- {{:data.channel_name}} - {{:helper.link('Edit', 'pencil', {'set_wanted_name' : 1})}} -
-
-
-
Description:
-
- {{:data.msg}} - {{:helper.link('Edit', 'pencil', {'set_wanted_desc' : 1})}} -
-
-
-
Attached photo:
-
{{:helper.link(data.photo ? 'Dettach photo' : 'Attach photo', data.photo ? 'times' : 'paperclip', {'set_attachment' : 1})}}
-
-
-
Author:
-
{{:data.wanted_already ? data.author : data.scanned_user}}
-
-
-
- {{:helper.link(data.wanted_already ? 'Edit issue' : 'Submit', data.wanted_already ? 'pencil' : 'share', {'submit_wanted' : data.end_param})}} - {{if data.wanted_already}} - {{:helper.link('Take down issue', 'times', {'cancel_wanted' : 1})}} - {{/if}} - {{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}} -
- {{else data.screen == 11}} -

STATIONWIDE WANTED ISSUE

- [Submitted by: {{:data.author}}]

-
-
Criminal:
-
{{:data.criminal}}
-
-
-
Description:
-
{{:data.description}}
-
-
-
Photo:

-
- {{if data.photo}} -
- {{else}} - None - {{/if}} -
-
-
-
{{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
-
- {{else data.screen == 12}} -

CAREERS AT NANOTRASEN

- Work for a better future.
-
- {{for data.jobs}} -
- {{:value.title}}
-
- {{empty}} - No available jobs... - {{/for}} - -
-
-
{{:helper.link('Refresh', 'refresh', {'refresh' : 0})}}
-
{{:helper.link('Back', 'arrow-left', {'setScreen' : 1})}}
-
- {{/if}} -{{/if}} \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index 61d25a2730f..876fbeb711d 100644 --- a/paradise.dme +++ b/paradise.dme @@ -667,7 +667,6 @@ #include "code\game\machinery\magnet.dm" #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\navbeacon.dm" -#include "code\game\machinery\newscaster.dm" #include "code\game\machinery\OpTable.dm" #include "code\game\machinery\overview.dm" #include "code\game\machinery\PDApainter.dm" @@ -1438,6 +1437,7 @@ #include "code\modules\events\abductor.dm" #include "code\modules\events\alien_infestation.dm" #include "code\modules\events\anomaly.dm" +#include "code\modules\events\anomaly_atmos.dm" #include "code\modules\events\anomaly_bluespace.dm" #include "code\modules\events\anomaly_flux.dm" #include "code\modules\events\anomaly_grav.dm" @@ -2103,6 +2103,10 @@ #include "code\modules\nano\modules\human_appearance.dm" #include "code\modules\nano\modules\law_manager.dm" #include "code\modules\nano\modules\nano_module.dm" +#include "code\modules\newscaster\datums.dm" +#include "code\modules\newscaster\defines.dm" +#include "code\modules\newscaster\obj\newscaster.dm" +#include "code\modules\newscaster\obj\newspaper.dm" #include "code\modules\ninja\energy_katana.dm" #include "code\modules\ninja\suit\gloves.dm" #include "code\modules\ninja\suit\head.dm" diff --git a/tgui/packages/tgui/backend.js b/tgui/packages/tgui/backend.js index ed0d9428620..87cbf890c4d 100644 --- a/tgui/packages/tgui/backend.js +++ b/tgui/packages/tgui/backend.js @@ -7,8 +7,8 @@ * the response with already existing state. */ -import { UI_DISABLED, UI_INTERACTIVE } from './constants'; import { callByond } from './byond'; +import { UI_DISABLED, UI_INTERACTIVE } from './constants'; export const backendUpdate = state => ({ type: 'backend/update', @@ -20,6 +20,11 @@ export const backendSetSharedState = (key, nextState) => ({ payload: { key, nextState }, }); +export const backendDeleteSharedState = keys => ({ + type: 'backend/deleteSharedState', + payload: keys, +}); + export const backendReducer = (state, action) => { const { type, payload } = action; @@ -73,6 +78,15 @@ export const backendReducer = (state, action) => { }; } + if (type === 'backend/deleteSharedState') { + let shared = { ...state.shared }; + payload.forEach(key => delete shared[key]); + return { + ...state, + shared: shared, + }; + } + return state; }; @@ -148,6 +162,17 @@ export const useLocalState = (context, key, initialState) => { ]; }; +/** + * Deletes local states from the Redux store. + * + * @param {any} context React context. + * @param {string} ...keys Keys of states to delete from the store. + */ +export const deleteLocalState = (context, ...keys) => { + const { store } = context; + store.dispatch(backendDeleteSharedState(keys)); +}; + /** * Allocates state on Redux store, and **shares** it with other clients * in the game. diff --git a/tgui/packages/tgui/components/Input.js b/tgui/packages/tgui/components/Input.js index b7f2dcb1f15..d287f8c72f4 100644 --- a/tgui/packages/tgui/components/Input.js +++ b/tgui/packages/tgui/components/Input.js @@ -110,6 +110,11 @@ export class Input extends Component { maxLength, placeholder, autofocus, + disabled, + // Multiline props + multiline, + cols = 32, + rows = 4, ...boxProps } = props; // Box props @@ -123,21 +128,37 @@ export class Input extends Component { className={classes([ 'Input', fluid && 'Input--fluid', + disabled && 'Input--disabled', className, ])} {...rest}>
.
- + {multiline ? ( +