diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index fc3f2852fc..00dc7b1d10 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -7,15 +7,5 @@
#deathride58
/modular_citadel/ @deathride58
-#LetterJay
-/modular_citadel/code/modules/client/loadout/__donator.dm @LetterJay
-
-#Poojawa
-
-/modular_citadel/code/modules/vore @Poojawa
-/code/game/objects/items/devices/dogborg_sleeper.dm @Poojawa
-/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm @Poojawa
-/tgui/ @Poojawa
-/modular_citadel/code/modules/clothing/spacesuits/flightsuit.dm @Poojawa
-/modular_citadel/code/game/objects/ids.dm @Poojawa
-/sound/vore @Poojawa
\ No newline at end of file
+#LetterJay
+/modular_citadel/code/modules/client/loadout/__donator.dm @LetterJay
diff --git a/.travis.yml b/.travis.yml
index 6581931961..fa42ba3aef 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -8,7 +8,7 @@ env:
- BYOND_MAJOR="512"
- BYOND_MINOR="1418"
- NODE_VERSION="4"
- - RUST_G_VERSION="0.2.0"
+ - RUST_G_VERSION="0.3.0"
- BUILD_TOOLS=false
- BUILD_TESTING=false
- DM_MAPFILE="loadallmaps"
@@ -32,6 +32,7 @@ addons:
- gcc-multilib
- python3
- python3-pip
+ - libssl-dev:i386
install:
- tools/travis/install_build_tools.sh
diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt
index 6e6bd7f7ca..83bc78050d 100644
--- a/SQL/database_changelog.txt
+++ b/SQL/database_changelog.txt
@@ -2,14 +2,22 @@ Any time you make a change to the schema files, remember to increment the databa
The latest database version is 4.1; The query to update the schema revision table is:
-INSERT INTO `schema_revision` (`major`, `minor`) VALUES (4, 1);
+INSERT INTO `schema_revision` (`major`, `minor`) VALUES (4, 2);
or
-INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (4, 1);
+INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (4, 2);
In any query remember to add a prefix to the table names if you use one.
----------------------------------------------------
+Version 4.2, 17 April 2018, by Jordie0608
+Modified table 'admin', adding the columns 'round_id' and 'target'
+ALTER TABLE `admin_log`
+ ADD COLUMN `round_id` INT UNSIGNED NOT NULL AFTER `datetime`,
+ ADD COLUMN `target` VARCHAR(32) NOT NULL AFTER `operation`;
+
+----------------------------------------------------
+
Version 4.1, 3 February 2018, by Jordie0608
Modified tables 'admin', 'admin_log' and 'admin_rank', removing unnecessary columns and adding support for excluding rights flags from admin ranks.
This change was made to enable use of sql-based admin loading.
@@ -41,7 +49,6 @@ ALTER TABLE `admin_ranks`
DROP PRIMARY KEY,
ADD PRIMARY KEY (`rank`);
-
----------------------------------------------------
Version 4.0, 12 November 2017, by Jordie0608
diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql
index ddd31a7e80..92411ea895 100644
--- a/SQL/tgstation_schema.sql
+++ b/SQL/tgstation_schema.sql
@@ -33,9 +33,11 @@ DROP TABLE IF EXISTS `admin_log`;
CREATE TABLE `admin_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
+ `round_id` int(11) unsigned NOT NULL,
`adminckey` varchar(32) NOT NULL,
`adminip` int(10) unsigned NOT NULL,
`operation` enum('add admin','remove admin','change admin rank','add rank','remove rank','change rank flags') NOT NULL,
+ `target` varchar(32) NOT NULL,
`log` varchar(1000) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql
index 01e0ed150b..de9d67e335 100644
--- a/SQL/tgstation_schema_prefixed.sql
+++ b/SQL/tgstation_schema_prefixed.sql
@@ -33,9 +33,11 @@ DROP TABLE IF EXISTS `SS13_admin_log`;
CREATE TABLE `SS13_admin_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
+ `round_id` int(11) unsigned NOT NULL,
`adminckey` varchar(32) NOT NULL,
`adminip` int(10) unsigned NOT NULL,
`operation` enum('add admin','remove admin','change admin rank','add rank','remove rank','change rank flags') NOT NULL,
+ `target` varchar(32) NOT NULL,
`log` varchar(1000) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
index 13ee4fa135..ba9b8b5c36 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
@@ -20,11 +20,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -44,11 +41,9 @@
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/main)
"ag" = (
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 4;
- pixel_x = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = -24
},
/turf/open/floor/plasteel/red/side{
dir = 8
@@ -100,9 +95,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/machinery/chem_dispenser,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/chem_dispenser/fullupgrade,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/chemistry)
"cA" = (
@@ -187,21 +182,16 @@
/area/ruin/unpowered/syndicate_lava_base/cargo)
"dA" = (
/obj/structure/closet/l3closet,
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/syndicate{
dir = 8;
name = "Chemistry APC";
- pixel_x = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = -24
},
/obj/structure/cable/yellow{
icon_state = "0-2"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 6
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/white/side{
@@ -209,11 +199,8 @@
},
/area/ruin/unpowered/syndicate_lava_base/chemistry)
"dB" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/chemistry)
@@ -287,10 +274,8 @@
/turf/open/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/cargo)
"dL" = (
-/obj/machinery/airalarm{
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
},
/obj/structure/closet/crate,
/obj/item/extinguisher{
@@ -390,11 +375,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/white/side{
dir = 8
},
@@ -437,11 +418,9 @@
pixel_x = -3
},
/obj/item/reagent_containers/dropper,
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 8;
- pixel_x = 24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = 24
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/white/side{
@@ -529,12 +508,10 @@
/obj/structure/cable/yellow{
icon_state = "0-2"
},
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/syndicate{
dir = 1;
name = "Cargo Bay APC";
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+ pixel_y = 24
},
/obj/structure/closet/emcloset/anchored,
/obj/effect/decal/cleanable/dirt,
@@ -689,11 +666,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/white/side{
dir = 8
},
@@ -779,11 +752,8 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 6
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -796,11 +766,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/vault{
@@ -814,11 +781,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 1
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -832,11 +796,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/door/airlock/mining/glass{
@@ -854,11 +815,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/cargo)
@@ -870,11 +828,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 10
},
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/cargo)
@@ -955,28 +910,20 @@
dir = 1;
pixel_y = -24
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/vault{
dir = 8
},
/area/ruin/unpowered/syndicate_lava_base/testlab)
"eN" = (
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 1;
- pixel_y = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_y = -24
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/vault{
dir = 8
@@ -987,11 +934,8 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/vault{
dir = 8
@@ -1004,11 +948,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 10
},
/turf/open/floor/plasteel/vault{
dir = 8
@@ -1037,11 +978,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/white/side{
dir = 10
},
@@ -1063,8 +1000,8 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/machinery/chem_dispenser,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/chem_dispenser/fullupgrade,
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/chemistry)
"eV" = (
@@ -1078,11 +1015,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/vault{
dir = 5
},
@@ -1118,11 +1051,8 @@
/obj/item/storage/box/donkpockets{
pixel_x = 2
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 1
},
/turf/open/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/cargo)
@@ -1155,20 +1085,14 @@
/area/ruin/unpowered/syndicate_lava_base/cargo)
"fc" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 5
},
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/cargo)
"fd" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 8
},
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/cargo)
@@ -1182,11 +1106,8 @@
/turf/open/floor/mineral/plastitanium,
/area/ruin/unpowered/syndicate_lava_base/cargo)
"ff" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 4
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/white/side{
@@ -1195,22 +1116,16 @@
/area/ruin/unpowered/syndicate_lava_base/virology)
"fg" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 10
},
/turf/open/floor/plasteel/white/side{
dir = 6
},
/area/ruin/unpowered/syndicate_lava_base/virology)
"fh" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/white/side{
dir = 10
@@ -1223,12 +1138,10 @@
pixel_y = 2
},
/obj/item/storage/box/syringes,
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/syndicate{
dir = 1;
name = "Virology APC";
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+ pixel_y = 24
},
/obj/structure/cable/yellow{
icon_state = "0-2"
@@ -1257,12 +1170,10 @@
},
/area/ruin/unpowered/syndicate_lava_base/virology)
"fk" = (
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/syndicate{
dir = 2;
name = "Experimentation Lab APC";
- pixel_y = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_y = -24
},
/obj/structure/cable/yellow{
icon_state = "0-4"
@@ -1274,11 +1185,7 @@
/area/ruin/unpowered/syndicate_lava_base/testlab)
"fl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/extinguisher_cabinet{
pixel_x = 25
},
@@ -1299,11 +1206,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/white,
/area/ruin/unpowered/syndicate_lava_base/chemistry)
"fn" = (
@@ -1349,11 +1252,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/vault{
dir = 5
@@ -1364,40 +1263,12 @@
dir = 8
},
/obj/structure/closet/crate,
-/obj/item/stock_parts/capacitor/quadratic,
-/obj/item/stock_parts/capacitor/quadratic,
-/obj/item/stock_parts/cell/bluespace{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/stock_parts/cell/bluespace{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/stock_parts/manipulator/femto{
- pixel_x = -4;
- pixel_y = 4
- },
-/obj/item/stock_parts/manipulator/femto{
- pixel_x = -4;
- pixel_y = 4
- },
-/obj/item/stock_parts/matter_bin/bluespace{
- pixel_x = -6;
- pixel_y = 6
- },
-/obj/item/stock_parts/matter_bin/bluespace{
- pixel_x = -6;
- pixel_y = 6
- },
-/obj/item/stock_parts/micro_laser/quadultra,
-/obj/item/stock_parts/micro_laser/quadultra,
-/obj/item/stock_parts/scanning_module/triphasic{
- pixel_x = -4
- },
-/obj/item/stock_parts/scanning_module/triphasic{
- pixel_x = -4
- },
+/obj/item/storage/box/stockparts/deluxe,
+/obj/item/stack/sheet/metal/fifty,
+/obj/item/stack/sheet/glass/fifty,
+/obj/item/circuitboard/machine/processor,
+/obj/item/circuitboard/machine/gibber,
+/obj/item/circuitboard/machine/deep_fryer,
/turf/open/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/cargo)
"ft" = (
@@ -1428,11 +1299,9 @@
/obj/machinery/light/small{
dir = 8
},
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 4;
- pixel_x = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = -24
},
/obj/structure/table,
/obj/item/clothing/suit/hazardvest,
@@ -1476,11 +1345,7 @@
req_access_txt = "150"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/white,
/area/ruin/unpowered/syndicate_lava_base/virology)
"fz" = (
@@ -1489,11 +1354,7 @@
req_access_txt = "150"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/white,
/area/ruin/unpowered/syndicate_lava_base/virology)
"fA" = (
@@ -1536,10 +1397,8 @@
/obj/machinery/light/small{
dir = 8
},
-/obj/machinery/airalarm{
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
},
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/main)
@@ -1553,11 +1412,7 @@
"fG" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/machinery/door/airlock/hatch{
name = "Experimentation Lab";
req_access_txt = "150"
@@ -1581,11 +1436,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/white/side{
dir = 1
},
@@ -1601,11 +1452,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/machinery/door/airlock/mining/glass{
name = "Warehouse";
req_access_txt = "150"
@@ -1704,11 +1551,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 5
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/white,
@@ -1717,11 +1561,8 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 1
},
/turf/open/floor/plasteel/white,
/area/ruin/unpowered/syndicate_lava_base/virology)
@@ -1729,21 +1570,15 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/white,
/area/ruin/unpowered/syndicate_lava_base/virology)
"gs" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 2;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 2
},
/obj/machinery/light/small,
/obj/effect/decal/cleanable/dirt,
@@ -1753,11 +1588,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 1
},
/turf/open/floor/plasteel/white/side{
dir = 9
@@ -1767,11 +1599,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "1-4"
@@ -1784,11 +1613,8 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/disposalpipe/segment,
/obj/structure/cable/yellow{
@@ -1800,11 +1626,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -1820,11 +1643,8 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -1838,11 +1658,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 1
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -1867,11 +1684,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -1885,11 +1699,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -1903,11 +1714,7 @@
/obj/structure/cable/yellow{
icon_state = "2-8"
},
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -1926,11 +1733,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/main)
@@ -1941,11 +1745,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/main)
@@ -1954,11 +1755,8 @@
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 2;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 2
},
/obj/structure/cable/yellow{
icon_state = "1-8"
@@ -1972,11 +1770,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/main)
@@ -1988,11 +1783,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/main)
@@ -2006,11 +1798,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/brown/corner{
dir = 4
@@ -2023,11 +1812,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 9
},
/turf/open/floor/plasteel/brown{
dir = 1
@@ -2087,30 +1873,21 @@
req_access_txt = "150"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/white,
/area/ruin/unpowered/syndicate_lava_base/virology)
"gU" = (
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 4;
- pixel_x = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = -24
},
/obj/structure/sink{
dir = 8;
pixel_x = -12;
pixel_y = 2
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 1
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/white/side{
@@ -2179,11 +1956,8 @@
/obj/effect/turf_decal/stripes/line{
dir = 6
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 1
},
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/main)
@@ -2198,11 +1972,7 @@
/area/ruin/unpowered/syndicate_lava_base/main)
"hc" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -2289,11 +2059,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/white/side{
dir = 1
},
@@ -2369,18 +2135,12 @@
/turf/open/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/main)
"hx" = (
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 4;
- pixel_x = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = -24
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -2435,11 +2195,8 @@
/area/ruin/unpowered/syndicate_lava_base/virology)
"hF" = (
/obj/machinery/light/small,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 1
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/white/side,
@@ -2491,11 +2248,7 @@
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -2507,10 +2260,8 @@
/obj/structure/table/wood,
/obj/item/ammo_box/magazine/m10mm,
/obj/item/ammo_box/magazine/sniper_rounds,
-/obj/machinery/airalarm{
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
},
/turf/open/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
@@ -2518,11 +2269,7 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
/turf/open/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"hO" = (
@@ -2532,20 +2279,14 @@
/obj/machinery/light/small{
dir = 8
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
/turf/open/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"hQ" = (
/obj/structure/table/wood,
/obj/item/ammo_box/magazine/m10mm,
-/obj/machinery/airalarm{
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
},
/turf/open/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
@@ -2620,22 +2361,16 @@
icon_state = "1-2"
},
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 8
},
/turf/open/floor/plasteel/red/side{
dir = 8
},
/area/ruin/unpowered/syndicate_lava_base/main)
"ia" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 8
},
/turf/open/floor/plasteel/red/side{
dir = 4
@@ -2650,11 +2385,7 @@
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"ic" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"id" = (
@@ -2718,11 +2449,7 @@
/area/ruin/unpowered/syndicate_lava_base/main)
"ij" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -2740,11 +2467,7 @@
name = "Cabin 2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"im" = (
@@ -2761,11 +2484,7 @@
name = "Cabin 4"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"ip" = (
@@ -2844,11 +2563,7 @@
/area/ruin/unpowered/syndicate_lava_base/main)
"ix" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -2868,21 +2583,15 @@
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"iA" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/neutral/side{
dir = 1
},
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"iB" = (
-/obj/machinery/airalarm{
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
},
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/effect/decal/cleanable/dirt,
@@ -2901,22 +2610,14 @@
dir = 2;
pixel_y = 24
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
/turf/open/floor/plasteel/neutral/corner{
dir = 4
},
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"iE" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/neutral/side{
dir = 1
},
@@ -2968,11 +2669,9 @@
/turf/open/floor/circuit/red,
/area/ruin/unpowered/syndicate_lava_base/main)
"iL" = (
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 8;
- pixel_x = 24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = 24
},
/turf/open/floor/circuit/red,
/area/ruin/unpowered/syndicate_lava_base/main)
@@ -3004,11 +2703,8 @@
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 5
},
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/main)
@@ -3016,11 +2712,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -3035,11 +2728,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -3050,11 +2740,8 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 1
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -3065,11 +2752,8 @@
"iT" = (
/obj/machinery/light/small,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 2;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 2
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -3081,11 +2765,8 @@
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"iU" = (
/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 1
},
/obj/structure/cable/yellow{
icon_state = "2-8"
@@ -3099,18 +2780,13 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/syndicate{
dir = 2;
name = "Dormitories APC";
- pixel_y = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_y = -24
},
/obj/structure/cable/yellow{
icon_state = "0-8"
@@ -3121,11 +2797,7 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/neutral/side,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
@@ -3133,11 +2805,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 9
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/neutral/corner{
@@ -3217,22 +2886,14 @@
name = "Cabin 1"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"jg" = (
/obj/machinery/door/airlock/maintenance,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -3244,23 +2905,17 @@
name = "Cabin 3"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"ji" = (
/obj/structure/cable/yellow{
icon_state = "0-2"
},
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/syndicate{
dir = 8;
name = "Primary Hallway APC";
- pixel_x = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = -24
},
/turf/open/floor/plasteel/red/side{
dir = 8
@@ -3292,10 +2947,8 @@
icon_state = "sleeper_s";
dir = 4
},
-/obj/machinery/airalarm{
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
},
/turf/open/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
@@ -3303,20 +2956,12 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"jp" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -3328,10 +2973,8 @@
dir = 8;
icon_state = "sleeper_s"
},
-/obj/machinery/airalarm{
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
},
/turf/open/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
@@ -3373,11 +3016,7 @@
/area/ruin/unpowered/syndicate_lava_base/engineering)
"jw" = (
/obj/effect/turf_decal/bot,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/toolcloset{
anchored = 1
@@ -3414,11 +3053,8 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 1
},
/turf/open/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
@@ -3426,11 +3062,8 @@
/obj/machinery/light/small{
dir = 8
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 1
},
/turf/open/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
@@ -3453,11 +3086,8 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 6
},
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/main)
@@ -3468,11 +3098,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/yellow/side{
dir = 4
@@ -3487,11 +3114,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/machinery/door/airlock/engineering{
name = "Engineering";
@@ -3509,11 +3133,8 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
@@ -3524,11 +3145,9 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 8;
- pixel_x = 24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = 24
},
/obj/structure/cable/yellow{
icon_state = "2-8"
@@ -3536,29 +3155,20 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"jJ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 6
},
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"jK" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- dir = 8;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer3{
+ dir = 8
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/syndicate_lava_base/engineering)
@@ -3608,11 +3218,7 @@
/area/ruin/unpowered/syndicate_lava_base/bar)
"jQ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -3631,11 +3237,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/main)
"jT" = (
@@ -3678,11 +3280,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
@@ -3720,11 +3318,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 6
},
/obj/structure/cable/yellow{
icon_state = "2-4"
@@ -3734,11 +3329,8 @@
/area/ruin/unpowered/syndicate_lava_base/main)
"kd" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 2;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 2
},
/obj/structure/cable/yellow{
icon_state = "1-4"
@@ -3753,11 +3345,8 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 1
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -3772,11 +3361,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -3787,11 +3373,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -3804,11 +3387,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -3822,20 +3402,14 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 2;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 2
},
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/main)
"kj" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 8
},
/obj/structure/chair{
dir = 8
@@ -3849,11 +3423,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/machinery/door/airlock/engineering{
name = "Engineering";
req_access_txt = "150"
@@ -3861,11 +3431,7 @@
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"kl" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3,
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"km" = (
@@ -3884,11 +3450,8 @@
},
/area/ruin/unpowered/syndicate_lava_base/bar)
"ko" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 4
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/vault{
@@ -3896,20 +3459,15 @@
},
/area/ruin/unpowered/syndicate_lava_base/bar)
"kp" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 10
},
/turf/open/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/bar)
"kq" = (
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 8;
- pixel_x = 24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = 24
},
/obj/machinery/vending/coffee{
extended_inventory = 1
@@ -3924,11 +3482,7 @@
req_access_txt = "150"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -4005,11 +3559,8 @@
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 8;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible/layer3{
+ dir = 8
},
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/engineering)
@@ -4017,12 +3568,10 @@
/obj/machinery/light/small{
dir = 1
},
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/syndicate{
dir = 1;
name = "Engineering APC";
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+ pixel_y = 24
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -4030,11 +3579,8 @@
/obj/structure/cable/yellow{
icon_state = "0-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 9
},
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/engineering)
@@ -4118,11 +3664,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/vault{
dir = 5
@@ -4150,11 +3692,7 @@
/area/ruin/unpowered/syndicate_lava_base/bar)
"kO" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -4220,11 +3758,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/visible{
dir = 5
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3,
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"kY" = (
@@ -4323,11 +3857,7 @@
name = "Bar"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/wood,
/area/ruin/unpowered/syndicate_lava_base/bar)
"lk" = (
@@ -4352,11 +3882,7 @@
/area/ruin/unpowered/syndicate_lava_base/bar)
"ll" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -4421,11 +3947,7 @@
/turf/open/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"ls" = (
@@ -4495,11 +4017,7 @@
/area/ruin/unpowered/syndicate_lava_base/bar)
"lB" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/wood,
/area/ruin/unpowered/syndicate_lava_base/bar)
"lC" = (
@@ -4537,11 +4055,7 @@
/obj/item/vending_refill/coffee,
/obj/item/vending_refill/cola,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -4580,11 +4094,9 @@
},
/area/ruin/unpowered/syndicate_lava_base/medbay)
"lL" = (
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 4;
- pixel_x = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = -24
},
/obj/machinery/light/small{
dir = 8
@@ -4608,20 +4120,14 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lN" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 9
},
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
@@ -4669,11 +4175,9 @@
/turf/open/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/arrivals)
"lU" = (
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 4;
- pixel_x = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = -24
},
/obj/structure/chair/stool,
/turf/open/floor/plasteel/vault{
@@ -4704,11 +4208,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 5
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -4719,11 +4220,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -4734,11 +4232,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/machinery/door/airlock{
name = "Bar Storage";
@@ -4753,11 +4248,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -4778,11 +4270,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 9
},
/obj/structure/cable/yellow{
icon_state = "1-8"
@@ -4801,11 +4290,7 @@
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/medbay)
"me" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/medbay)
"mf" = (
@@ -4813,11 +4298,9 @@
dir = 4;
pixel_x = 11
},
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 8;
- pixel_x = 24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = 24
},
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/medbay)
@@ -4932,12 +4415,10 @@
/obj/structure/table/wood,
/obj/machinery/light/small,
/obj/structure/cable/yellow,
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/syndicate{
dir = 2;
name = "Bar APC";
- pixel_y = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_y = -24
},
/turf/open/floor/wood,
/area/ruin/unpowered/syndicate_lava_base/bar)
@@ -4960,11 +4441,7 @@
"mz" = (
/obj/machinery/door/airlock/maintenance,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -4991,11 +4468,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/medbay)
"mC" = (
@@ -5141,11 +4614,7 @@
/area/ruin/unpowered/syndicate_lava_base/arrivals)
"mY" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -5163,11 +4632,7 @@
/area/ruin/unpowered/syndicate_lava_base/medbay)
"na" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/floorgrime,
/area/ruin/unpowered/syndicate_lava_base/medbay)
"nb" = (
@@ -5266,22 +4731,16 @@
},
/area/ruin/unpowered/syndicate_lava_base/telecomms)
"nk" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/vault{
dir = 5
},
/area/ruin/unpowered/syndicate_lava_base/telecomms)
"nl" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -5292,11 +4751,8 @@
dir = 4
},
/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 10
},
/obj/structure/noticeboard{
dir = 8;
@@ -5342,11 +4798,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 6
},
/obj/structure/cable/yellow{
icon_state = "2-4"
@@ -5360,22 +4813,17 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
},
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/syndicate{
dir = 1;
name = "Arrival Hallway APC";
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+ pixel_y = 24
},
/obj/structure/cable/yellow{
icon_state = "0-4"
@@ -5388,11 +4836,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5405,11 +4850,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5420,11 +4862,8 @@
/area/ruin/unpowered/syndicate_lava_base/arrivals)
"nw" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 2;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 2
},
/obj/structure/cable/yellow{
icon_state = "1-4"
@@ -5441,11 +4880,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5459,11 +4895,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5476,11 +4909,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 9
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5546,11 +4976,9 @@
/turf/open/floor/plating/airless,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"nH" = (
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 4;
- pixel_x = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = -24
},
/obj/machinery/light/small{
dir = 8
@@ -5575,11 +5003,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 5
},
/obj/structure/cable/yellow{
icon_state = "2-4"
@@ -5596,11 +5021,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5614,11 +5036,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5630,11 +5049,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5646,11 +5062,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5665,11 +5078,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5684,11 +5094,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5699,11 +5106,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5716,11 +5120,8 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/machinery/firealarm{
dir = 2;
@@ -5737,11 +5138,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
+ dir = 1
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5754,19 +5152,14 @@
/obj/machinery/light/small{
dir = 1
},
-/obj/machinery/airalarm{
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -5780,11 +5173,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 9
},
/obj/structure/cable/yellow{
icon_state = "1-8"
@@ -5823,12 +5213,10 @@
pixel_y = -29
},
/obj/structure/cable/yellow,
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/syndicate{
dir = 4;
name = "Medbay APC";
- pixel_x = 24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = 24
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/white/side{
@@ -5908,12 +5296,10 @@
dir = 8
},
/obj/structure/cable/yellow,
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/syndicate{
dir = 2;
name = "Telecommunications APC";
- pixel_y = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_y = -24
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -5951,11 +5337,8 @@
/turf/open/floor/plasteel/red/side,
/area/ruin/unpowered/syndicate_lava_base/arrivals)
"op" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1;
- piping_layer = 3;
- pixel_x = 5;
- pixel_y = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+ dir = 1
},
/turf/open/floor/plasteel/red/side,
/area/ruin/unpowered/syndicate_lava_base/arrivals)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm
index 209ba76efa..5f76cdb32c 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm
@@ -6,39 +6,10 @@
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"c" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien20"
- },
+/turf/closed/wall/mineral/abductor,
/area/lavaland/surface/outdoors)
"d" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien21"
- },
-/area/ruin/unpowered)
-"e" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien22"
- },
-/area/ruin/unpowered)
-"f" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien23"
- },
-/area/ruin/unpowered)
-"g" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien24"
- },
-/area/lavaland/surface/outdoors)
-"h" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien16"
- },
-/area/lavaland/surface/outdoors)
-"i" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien17"
- },
+/turf/closed/wall/mineral/abductor,
/area/ruin/unpowered)
"j" = (
/obj/machinery/abductor/experiment{
@@ -61,16 +32,6 @@
initial_gas_mix = "o2=16;n2=23;TEMP=300"
},
/area/ruin/unpowered)
-"m" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien18"
- },
-/area/ruin/unpowered)
-"n" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien19"
- },
-/area/lavaland/surface/outdoors)
"o" = (
/obj/item/hemostat/alien,
/turf/open/floor/plating/abductor{
@@ -89,11 +50,6 @@
initial_gas_mix = "o2=16;n2=23;TEMP=300"
},
/area/ruin/unpowered)
-"r" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien14"
- },
-/area/ruin/unpowered)
"s" = (
/obj/structure/table/optable/abductor,
/obj/item/cautery/alien,
@@ -108,11 +64,6 @@
initial_gas_mix = "o2=16;n2=23;TEMP=300"
},
/area/ruin/unpowered)
-"u" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien12"
- },
-/area/ruin/unpowered)
"v" = (
/obj/item/scalpel/alien,
/obj/item/surgical_drapes,
@@ -127,11 +78,6 @@
initial_gas_mix = "o2=16;n2=23;TEMP=300"
},
/area/ruin/unpowered)
-"x" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien10"
- },
-/area/ruin/unpowered)
"y" = (
/obj/machinery/abductor/gland_dispenser,
/turf/open/floor/plating/abductor{
@@ -152,36 +98,6 @@
initial_gas_mix = "o2=16;n2=23;TEMP=300"
},
/area/ruin/unpowered)
-"B" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien8"
- },
-/area/ruin/unpowered)
-"C" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien9"
- },
-/area/lavaland/surface/outdoors)
-"D" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien2"
- },
-/area/ruin/unpowered)
-"E" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien3"
- },
-/area/ruin/unpowered)
-"F" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien4"
- },
-/area/ruin/unpowered)
-"G" = (
-/turf/closed/indestructible/abductor{
- icon_state = "alien5"
- },
-/area/lavaland/surface/outdoors)
(1,1,1) = {"
a
@@ -211,7 +127,7 @@ a
a
a
a
-h
+c
a
a
a
@@ -223,7 +139,7 @@ a
a
a
c
-i
+d
a
a
a
@@ -240,54 +156,54 @@ k
k
a
y
-D
+d
a
"}
(6,1,1) = {"
a
a
-e
+d
k
o
s
v
z
-E
+d
a
"}
(7,1,1) = {"
a
a
-f
+d
l
p
k
w
A
-F
+d
a
"}
(8,1,1) = {"
a
a
-g
-m
+c
+d
q
t
q
-B
-G
+d
+c
a
"}
(9,1,1) = {"
a
a
b
-n
-r
-u
-x
-C
+c
+d
+d
+d
+c
b
a
"}
diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm
index b172e24f29..6229854c09 100644
--- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm
@@ -12,10 +12,8 @@
/obj/machinery/computer/message_monitor{
dir = 2
},
-/obj/machinery/airalarm{
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
@@ -210,11 +208,9 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 4;
- pixel_x = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = -24
},
/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/listeningstation)
@@ -517,10 +513,8 @@
},
/area/ruin/space/has_grav/listeningstation)
"aU" = (
-/obj/machinery/airalarm{
- pixel_y = 24;
- req_access = null;
- req_access_txt = "150"
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
@@ -640,11 +634,9 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 8;
- pixel_x = 24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = 24
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -811,12 +803,10 @@
icon_state = "0-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/syndicate{
dir = 4;
name = "Syndicate Listening Post APC";
- pixel_x = 24;
- req_access = null;
- req_access_txt = "150"
+ pixel_x = 24
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
@@ -948,11 +938,9 @@
},
/obj/machinery/iv_drip,
/obj/machinery/light/small,
-/obj/machinery/airalarm{
+/obj/machinery/airalarm/syndicate{
dir = 1;
- pixel_y = -24;
- req_access = null;
- req_access_txt = "150"
+ pixel_y = -24
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
index 2690a58816..4c25dbb740 100644
--- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
@@ -4045,7 +4045,7 @@
/area/ruin/space/has_grav/ancientstation)
"kE" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/deadcockroach,
+/obj/effect/decal/cleanable/insectguts,
/turf/open/floor/plasteel/floorgrime,
/area/ruin/space/has_grav/ancientstation)
"kF" = (
diff --git a/_maps/cit_map_files/generic/CentCom.dmm b/_maps/cit_map_files/generic/CentCom.dmm
index 1b5d94d8c1..bb43763955 100644
--- a/_maps/cit_map_files/generic/CentCom.dmm
+++ b/_maps/cit_map_files/generic/CentCom.dmm
@@ -2526,6 +2526,10 @@
/obj/machinery/capture_the_flag/red,
/turf/open/floor/circuit/green/anim,
/area/ctf)
+"hH" = (
+/obj/machinery/vending/coffee,
+/turf/open/floor/wood,
+/area/centcom/holding)
"hI" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -3324,6 +3328,10 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/centcom/supply)
+"jO" = (
+/obj/machinery/vending/cigarette,
+/turf/open/floor/wood,
+/area/centcom/holding)
"jP" = (
/obj/machinery/conveyor_switch/oneway{
dir = 8;
@@ -4178,7 +4186,6 @@
/area/syndicate_mothership)
"mb" = (
/obj/structure/table/reinforced,
-/obj/machinery/computer/stockexchange,
/turf/open/floor/plasteel/vault{
dir = 8
},
@@ -5254,7 +5261,6 @@
/area/centcom/ferry)
"oM" = (
/obj/structure/table/reinforced,
-/obj/machinery/computer/stockexchange,
/obj/effect/turf_decal/stripes/line{
dir = 5
},
@@ -5320,6 +5326,19 @@
dir = 8
},
/area/tdome/tdomeobserve)
+"oU" = (
+/obj/structure/closet/secure_closet/bar{
+ req_access_txt = "25"
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"oV" = (
+/obj/structure/reagent_dispensers/beerkeg,
+/turf/open/floor/wood,
+/area/centcom/holding)
"oW" = (
/obj/structure/flora/bush,
/obj/effect/light_emitter{
@@ -5564,6 +5583,70 @@
dir = 8
},
/area/centcom/control)
+"px" = (
+/obj/machinery/chem_dispenser/drinks/beer,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"py" = (
+/obj/machinery/chem_dispenser/drinks,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pz" = (
+/obj/item/storage/box/donkpockets{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/box/donkpockets{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/box/donkpockets{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/box/donkpockets{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pA" = (
+/obj/machinery/vending/cola/random,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pB" = (
+/obj/structure/rack,
+/obj/item/toy/sword,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/item/coin/gold{
+ pixel_x = 8;
+ pixel_y = -3
+ },
+/obj/item/camera,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pC" = (
+/obj/structure/rack,
+/obj/item/toy/gun,
+/obj/item/coin/gold{
+ pixel_w = -9;
+ pixel_y = 6
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pD" = (
+/obj/machinery/computer/arcade/battle,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pE" = (
+/obj/machinery/computer/arcade/orion_trail,
+/turf/open/floor/wood,
+/area/centcom/holding)
"pF" = (
/obj/machinery/door/airlock/centcom{
name = "Auxillary Dock";
@@ -5688,6 +5771,25 @@
dir = 5
},
/area/centcom/ferry)
+"pS" = (
+/obj/machinery/computer/slot_machine,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pT" = (
+/obj/machinery/vending/snack/random,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pU" = (
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pV" = (
+/obj/item/clothing/head/that,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pW" = (
+/turf/open/floor/carpet/black,
+/area/centcom/holding)
"pX" = (
/obj/item/storage/crayons,
/obj/structure/table,
@@ -5953,6 +6055,30 @@
"qE" = (
/turf/closed/indestructible/riveted/uranium,
/area/wizard_station)
+"qF" = (
+/obj/structure/chair/stool{
+ pixel_y = 8
+ },
+/turf/open/floor/carpet/black,
+/area/centcom/holding)
+"qG" = (
+/obj/structure/table/wood,
+/obj/item/storage/box/drinkingglasses,
+/obj/item/storage/box/drinkingglasses{
+ pixel_x = 2;
+ pixel_y = 4
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"qH" = (
+/obj/item/reagent_containers/food/drinks/shaker,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"qI" = (
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
"qJ" = (
/obj/machinery/computer/shuttle/syndicate/recall,
/turf/open/floor/plasteel/bar{
@@ -6078,6 +6204,16 @@
/obj/machinery/computer/shuttle,
/turf/open/floor/engine/cult,
/area/wizard_station)
+"rb" = (
+/obj/item/lighter,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"rc" = (
+/obj/item/reagent_containers/food/drinks/soda_cans/cola,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
"rd" = (
/obj/structure/flora/grass/brown,
/obj/effect/light_emitter{
@@ -6504,6 +6640,48 @@
},
/turf/open/floor/engine/cult,
/area/wizard_station)
+"rY" = (
+/obj/item/dice/d20,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"rZ" = (
+/obj/structure/rack,
+/obj/item/clothing/head/that,
+/obj/item/clothing/under/suit_jacket,
+/obj/item/clothing/accessory/waistcoat,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"sa" = (
+/obj/structure/rack,
+/obj/item/storage/crayons,
+/obj/item/gun/ballistic/automatic/toy/pistol,
+/obj/item/ammo_box/foambox,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"sb" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"sc" = (
+/obj/structure/rack,
+/obj/item/storage/crayons,
+/obj/item/gun/ballistic/shotgun/toy/crossbow,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"sd" = (
+/obj/structure/rack,
+/obj/item/clothing/shoes/laceup,
+/obj/item/clothing/under/suit_jacket/female{
+ desc = "A black trouser suit for women. Very formal.";
+ name = "black suit";
+ pixel_x = 3;
+ pixel_y = 1
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
"se" = (
/obj/machinery/light{
dir = 8
@@ -6905,6 +7083,34 @@
},
/turf/open/floor/engine/cult,
/area/wizard_station)
+"sY" = (
+/mob/living/simple_animal/bot/medbot,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"sZ" = (
+/obj/machinery/sleeper{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"ta" = (
+/obj/machinery/light,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"tb" = (
+/obj/machinery/vending/clothing,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"tc" = (
+/obj/structure/closet/wardrobe/mixed,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"td" = (
+/obj/structure/rack,
+/obj/effect/spawner/lootdrop/costume,
+/obj/effect/spawner/lootdrop/costume,
+/turf/open/floor/wood,
+/area/centcom/holding)
"te" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/pizzaslice/mushroom,
@@ -6945,6 +7151,40 @@
},
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
+"tj" = (
+/obj/structure/rack,
+/obj/effect/spawner/lootdrop/costume,
+/obj/effect/spawner/lootdrop/costume,
+/obj/machinery/light,
+/obj/machinery/button/door{
+ id = "Ninjaholdingsuicide";
+ name = "SUICIDE CHAMBER LOCK";
+ normaldoorcontrol = 1;
+ pixel_x = 4;
+ pixel_y = -24;
+ specialfunctions = 4
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"tk" = (
+/obj/machinery/door/airlock/wood/glass{
+ name = "Private Rooms"
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"tl" = (
+/obj/machinery/door/airlock/maintenance_hatch{
+ id_tag = "Ninjaholdingsuicide";
+ locked = 1;
+ name = "SUICIDE CHAMBER"
+ },
+/turf/open/floor/wood{
+ icon_state = "wood-broken5"
+ },
+/area/centcom/holding)
+"tm" = (
+/turf/open/floor/carpet,
+/area/centcom/holding)
"tn" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -7245,6 +7485,10 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/centcom/evac)
+"tW" = (
+/obj/structure/table/wood/fancy/black,
+/turf/open/floor/carpet,
+/area/centcom/holding)
"tX" = (
/obj/machinery/door/airlock{
icon = 'icons/obj/doors/airlocks/station/uranium.dmi';
@@ -7252,6 +7496,40 @@
},
/turf/open/floor/engine/cult,
/area/wizard_station)
+"tY" = (
+/obj/structure/chair/comfy/black{
+ dir = 4
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"tZ" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"ua" = (
+/obj/structure/plasticflaps,
+/turf/open/floor/wood{
+ icon_state = "wood-broken4"
+ },
+/area/centcom/holding)
+"ub" = (
+/obj/machinery/door/airlock/wood{
+ id_tag = "Proom1";
+ name = "Room 1"
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"uc" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/chair/comfy/black{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
"ud" = (
/obj/machinery/door/poddoor/shutters{
id = "nukeop_ready";
@@ -7265,6 +7543,25 @@
},
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
+"uf" = (
+/turf/open/lava,
+/area/centcom/holding)
+"ug" = (
+/obj/machinery/button/door{
+ id = "Proom1";
+ name = "Door Lock";
+ normaldoorcontrol = 1;
+ pixel_x = -24;
+ pixel_y = 4;
+ specialfunctions = 4
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/random,
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"uh" = (
+/turf/open/chasm/lavaland,
+/area/centcom/holding)
"ui" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -7466,12 +7763,37 @@
/obj/structure/chair/wood/wings,
/turf/open/floor/carpet,
/area/wizard_station)
+"uG" = (
+/obj/structure/chair/sofa/left,
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"uH" = (
+/obj/structure/chair/sofa/corner{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"uI" = (
+/obj/structure/chair/sofa,
+/turf/open/floor/carpet,
+/area/centcom/holding)
"uJ" = (
/obj/machinery/door/airlock/external{
req_access_txt = "150"
},
/turf/open/floor/plating,
/area/syndicate_mothership/control)
+"uK" = (
+/obj/machinery/button/door{
+ id = "Proom2";
+ name = "Door Lock";
+ normaldoorcontrol = 1;
+ pixel_x = 24;
+ pixel_y = 4;
+ specialfunctions = 4
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
"uL" = (
/obj/machinery/button/door{
id = "nukeop_ready";
@@ -7490,6 +7812,10 @@
},
/turf/open/floor/mineral/plastitanium,
/area/syndicate_mothership/control)
+"uN" = (
+/obj/structure/table/wood/poker,
+/turf/open/floor/carpet,
+/area/centcom/holding)
"uO" = (
/obj/machinery/door/airlock/centcom{
name = "Shuttle Control Office";
@@ -7695,6 +8021,45 @@
},
/turf/open/floor/carpet,
/area/wizard_station)
+"vo" = (
+/obj/structure/chair/sofa{
+ icon_state = "sofamiddle";
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"vp" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"vq" = (
+/obj/machinery/door/airlock/wood{
+ id_tag = "Proom2";
+ name = "Room 2"
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"vr" = (
+/obj/structure/chair/sofa/corner{
+ dir = 4
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"vs" = (
+/obj/structure/chair/sofa/left{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"vt" = (
+/obj/machinery/vending/games,
+/turf/open/floor/carpet,
+/area/centcom/holding)
"vu" = (
/obj/item/storage/box/drinkingglasses,
/obj/item/reagent_containers/food/drinks/bottle/rum,
@@ -7717,6 +8082,19 @@
/obj/item/toy/nuke,
/turf/open/floor/wood,
/area/syndicate_mothership/control)
+"vy" = (
+/obj/structure/chair/sofa{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"vz" = (
+/obj/machinery/door/airlock/wood{
+ id_tag = "Proom3";
+ name = "Room 3"
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
"vA" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/directions/engineering{
@@ -7984,6 +8362,68 @@
},
/turf/open/floor/carpet,
/area/wizard_station)
+"we" = (
+/obj/machinery/button/door{
+ id = "Proom3";
+ name = "Door Lock";
+ normaldoorcontrol = 1;
+ pixel_x = -24;
+ pixel_y = 4;
+ specialfunctions = 4
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/random,
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"wf" = (
+/obj/machinery/button/door{
+ id = "Proom4";
+ name = "Door Lock";
+ normaldoorcontrol = 1;
+ pixel_x = 24;
+ pixel_y = 4;
+ specialfunctions = 4
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"wg" = (
+/obj/machinery/door/airlock/wood{
+ id_tag = "Proom4";
+ name = "Room 4"
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"wh" = (
+/obj/structure/table/wood,
+/obj/item/soap/nanotrasen,
+/obj/item/reagent_containers/spray/cleaner,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"wi" = (
+/obj/structure/table/wood,
+/obj/structure/bedsheetbin,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"wj" = (
+/obj/machinery/door/airlock/wood{
+ id_tag = "Proom5";
+ name = "Room 5"
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"wk" = (
+/obj/machinery/button/door{
+ id = "Proom5";
+ name = "Door Lock";
+ normaldoorcontrol = 1;
+ pixel_x = -24;
+ pixel_y = 4;
+ specialfunctions = 4
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/random,
+/turf/open/floor/carpet,
+/area/centcom/holding)
"wl" = (
/obj/machinery/light,
/turf/open/floor/wood,
@@ -10765,77 +11205,6 @@
},
/turf/open/floor/engine/cult,
/area/wizard_station)
-"EZ" = (
-/obj/structure/table,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"Fa" = (
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"Fb" = (
-/obj/structure/closet/secure_closet/bar{
- req_access_txt = "25"
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"Fc" = (
-/obj/structure/reagent_dispensers/beerkeg,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"Fd" = (
-/obj/structure/table,
-/obj/item/storage/box/donkpockets{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/box/donkpockets{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/box/donkpockets{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/box/donkpockets{
- pixel_x = 3;
- pixel_y = 3
- },
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"Fe" = (
-/obj/structure/rack,
-/obj/item/camera,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"Ff" = (
-/obj/structure/rack,
-/obj/item/toy/sword,
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"Fg" = (
-/obj/structure/rack,
-/obj/item/toy/gun,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"Fh" = (
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
"Fi" = (
/turf/open/floor/plating/beach/sand,
/area/centcom/holding)
@@ -10952,19 +11321,6 @@
dir = 5
},
/area/tdome/tdomeobserve)
-"FA" = (
-/obj/structure/table,
-/obj/item/clothing/head/that,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"FB" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
"FC" = (
/obj/item/camera,
/turf/open/floor/plating/beach/sand,
@@ -11071,41 +11427,6 @@
},
/turf/open/floor/engine/cult,
/area/wizard_station)
-"FU" = (
-/obj/structure/table,
-/obj/item/ammo_box/foambox,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"FV" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/drinks/shaker,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"FW" = (
-/obj/structure/table,
-/obj/item/lighter,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"FX" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/drinks/soda_cans/cola,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"FY" = (
-/obj/structure/table,
-/obj/item/dice/d20,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
"FZ" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -11226,13 +11547,6 @@
},
/turf/open/lava,
/area/wizard_station)
-"Gs" = (
-/obj/structure/rack,
-/obj/item/clothing/head/that,
-/obj/item/clothing/under/suit_jacket,
-/obj/item/clothing/accessory/waistcoat,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
"Gt" = (
/obj/item/toy/beach_ball,
/turf/open/floor/plating/beach/sand,
@@ -11280,18 +11594,6 @@
},
/turf/open/lava/airless,
/area/wizard_station)
-"GA" = (
-/obj/structure/rack,
-/obj/item/storage/crayons,
-/obj/item/gun/ballistic/automatic/toy/pistol,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"GB" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
"GC" = (
/obj/structure/table,
/obj/structure/bedsheetbin,
@@ -11524,12 +11826,6 @@
/obj/structure/shuttle/engine/propulsion,
/turf/open/space,
/area/wizard_station)
-"GY" = (
-/obj/structure/rack,
-/obj/item/storage/crayons,
-/obj/item/gun/ballistic/shotgun/toy/crossbow,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
"GZ" = (
/turf/open/floor/plating/beach/coastline_b,
/area/centcom/holding)
@@ -11582,33 +11878,6 @@
dir = 4
},
/area/tdome/tdomeobserve)
-"Hi" = (
-/obj/structure/rack,
-/obj/item/clothing/shoes/laceup,
-/obj/item/clothing/under/suit_jacket/female{
- desc = "A black trouser suit for women. Very formal.";
- name = "black suit";
- pixel_x = 3;
- pixel_y = 1
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"Hj" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"Hk" = (
-/obj/structure/table,
-/obj/item/gun/ballistic/automatic/toy/pistol,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"Hl" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/machinery/light,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
"Hm" = (
/turf/open/floor/plating/beach/water,
/area/centcom/holding)
@@ -39485,25 +39754,25 @@ aa
aa
aa
ED
-EZ
-EZ
-FU
-Gs
-GA
-GY
-Hi
+hH
+pU
+qG
+rZ
+sa
+sc
+sd
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
ED
ED
ED
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -39742,25 +40011,25 @@ aa
aa
aa
ED
-Fa
-Fa
-Fa
-Fh
-Fh
-Fh
-Fh
+jO
+pU
+pU
+pW
+pW
+pW
+pU
Hy
HH
HH
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+uH
+vo
+vr
+ED
+uH
+vo
+vr
+ED
aa
aa
aa
@@ -39999,25 +40268,25 @@ aa
aa
aa
ED
-Fb
-Fa
-FV
-FB
-Fh
-Fh
-Fh
+oU
+pU
+qH
+qF
+pW
+pW
+pU
Hz
HH
HH
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+uI
+uN
+vy
+ED
+uI
+uN
+vy
+ED
aa
aa
aa
@@ -40256,25 +40525,25 @@ aa
aa
aa
ED
-Fc
-Fa
-EZ
-FB
-Fh
-Fh
-Fh
+oV
+pU
+qI
+qF
+pW
+pW
+sY
Hz
HH
HH
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+uG
+uN
+vs
+ED
+uG
+uN
+vs
+ED
aa
aa
aa
@@ -40513,25 +40782,25 @@ aa
aa
aa
ED
-Fc
-Fa
-FW
-FB
-Fh
-Fh
-Fh
+px
+pU
+rb
+qF
+pW
+pW
+sZ
Hy
HH
HH
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+tm
+tm
+tm
+ED
+tm
+tm
+tm
+ED
aa
aa
aa
@@ -40770,25 +41039,25 @@ aa
aa
aa
ED
-Fa
-Fa
-FX
-FB
-Fh
-Fh
-Hj
+py
+pU
+rc
+qF
+pW
+pW
+ta
ED
ED
ED
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+uK
+tm
+vt
+ED
+wf
+tm
+vt
+ED
aa
aa
aa
@@ -41027,26 +41296,26 @@ aa
aa
aa
ED
-Fd
-FA
-FY
-FB
-Fh
-Fh
-Fh
+pz
+pV
+rY
+qF
+pW
+pW
+pU
+ED
+ED
+ED
+ED
+ED
+vq
+ED
+ED
+ED
+wg
+ED
+ED
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -41284,13 +41553,25 @@ aa
aa
aa
ED
-Fe
-Fh
-Fh
-Fh
-Fh
-Fh
-Fh
+pA
+pW
+pW
+pW
+pW
+pW
+pU
+tk
+pU
+tZ
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+tZ
+wh
ED
aa
aa
@@ -41301,18 +41582,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
KH
KU
Lb
@@ -41541,13 +41810,25 @@ aa
aa
aa
ED
-Ff
-Fh
-Fh
-Fh
-Fh
-Fh
-FB
+pB
+pW
+pW
+pW
+pW
+pW
+pU
+tk
+pU
+pU
+pU
+pU
+vp
+pU
+pU
+pU
+pU
+pU
+wi
ED
aa
aa
@@ -41557,18 +41838,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
KH
KH
KS
@@ -41798,26 +42067,26 @@ aa
aa
aa
ED
-Fg
-Fh
-Fh
-Fh
-Fh
-FB
-Hk
+pC
+pW
+pW
+pW
+pW
+pW
+tb
+ED
+ED
+ub
+ED
+ED
+ED
+vz
+ED
+ED
+ED
+wj
+ED
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -42055,26 +42324,26 @@ aa
aa
aa
ED
-Fh
-FB
-Fh
-Fh
-Fh
-Fh
-FB
+pD
+qF
+pW
+pW
+pW
+pW
+tc
+ED
+tY
+tm
+ug
+ED
+tY
+tm
+we
+ED
+tY
+tm
+wk
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -42312,26 +42581,26 @@ aa
aa
aa
ED
-Fi
-Fi
-Fi
-Fi
-GB
-GB
-Hl
+pE
+qF
+pW
+pW
+pW
+pW
+td
+ED
+tW
+uc
+tm
+ED
+tW
+uc
+tm
+ED
+tW
+uc
+tm
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -42569,26 +42838,26 @@ aa
aa
aa
ED
-Fj
-Fi
-Fi
-Fi
-Fi
-GZ
-Hm
+pS
+qF
+pW
+pW
+pW
+pW
+td
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -42826,6 +43095,777 @@ aa
aa
aa
ED
+pS
+qF
+pW
+pW
+pW
+pW
+tj
+ED
+ED
+ED
+ED
+ED
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(115,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ED
+pT
+pU
+pU
+pU
+sb
+sb
+sb
+tl
+ua
+uf
+uh
+ED
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(116,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ED
+Fj
+Fi
+Fi
+Fi
+Fi
+GZ
+Hm
+ED
+ED
+ED
+ED
+ED
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(117,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ED
Fi
Fi
FZ
@@ -42892,7 +43932,7 @@ aa
aa
aa
"}
-(115,1,1) = {"
+(118,1,1) = {"
aa
aa
aa
@@ -43149,7 +44189,7 @@ aa
aa
aa
"}
-(116,1,1) = {"
+(119,1,1) = {"
aa
aa
aa
@@ -43406,7 +44446,7 @@ aa
aa
aa
"}
-(117,1,1) = {"
+(120,1,1) = {"
aa
aa
aa
@@ -43663,777 +44703,6 @@ aa
aa
aa
"}
-(118,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ED
-ED
-ED
-ED
-ED
-ED
-ED
-ED
-ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(119,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(120,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
(121,1,1) = {"
aa
aa
@@ -44624,15 +44893,15 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
aa
aa
aa
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 650439de96..d945d49116 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -11754,22 +11754,8 @@
/turf/open/floor/circuit,
/area/ai_monitored/nuke_storage)
"aEN" = (
-/obj/structure/closet/crate{
- name = "Gold Crate"
- },
-/obj/item/stack/sheet/mineral/gold{
- pixel_x = -1;
- pixel_y = 5
- },
-/obj/item/stack/sheet/mineral/gold{
- pixel_y = 2
- },
-/obj/item/stack/sheet/mineral/gold{
- pixel_x = 1;
- pixel_y = -2
- },
-/obj/item/storage/belt/champion,
/obj/effect/turf_decal/bot_white/right,
+/obj/structure/closet/crate/goldcrate,
/turf/open/floor/plasteel/vault{
dir = 1
},
@@ -11781,30 +11767,8 @@
/turf/open/floor/circuit,
/area/ai_monitored/nuke_storage)
"aEP" = (
-/obj/item/coin/silver{
- pixel_x = 7;
- pixel_y = 12
- },
-/obj/item/coin/silver{
- pixel_x = 12;
- pixel_y = 7
- },
-/obj/item/coin/silver{
- pixel_x = 4;
- pixel_y = 8
- },
-/obj/item/coin/silver{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/coin/silver{
- pixel_x = 5;
- pixel_y = -8
- },
-/obj/structure/closet/crate{
- name = "Silver Crate"
- },
/obj/effect/turf_decal/bot_white/left,
+/obj/structure/closet/crate/silvercrate,
/turf/open/floor/plasteel/vault{
dir = 4
},
@@ -33128,14 +33092,7 @@
/area/storage/tech)
"bGt" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/borgupload{
- pixel_x = -1;
- pixel_y = 1
- },
-/obj/item/circuitboard/computer/aiupload{
- pixel_x = 2;
- pixel_y = -2
- },
+/obj/effect/spawner/lootdrop/techstorage/AI,
/turf/open/floor/plasteel,
/area/storage/tech)
"bGu" = (
@@ -33152,45 +33109,20 @@
/area/storage/tech)
"bGw" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/pandemic{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/computer/rdconsole,
-/obj/item/circuitboard/machine/rdserver{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/circuitboard/machine/destructive_analyzer,
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/item/circuitboard/computer/aifixer,
-/obj/item/circuitboard/computer/teleporter,
-/obj/item/circuitboard/machine/circuit_imprinter,
-/obj/item/circuitboard/machine/mechfab,
+/obj/effect/spawner/lootdrop/techstorage/rnd,
/turf/open/floor/plating,
/area/storage/tech)
"bGx" = (
/obj/structure/rack,
-/obj/item/circuitboard/machine/telecomms/processor,
-/obj/item/circuitboard/machine/telecomms/receiver,
-/obj/item/circuitboard/machine/telecomms/server,
-/obj/item/circuitboard/machine/telecomms/bus,
-/obj/item/circuitboard/machine/telecomms/broadcaster,
-/obj/item/circuitboard/computer/message_monitor{
- pixel_y = -5
- },
+/obj/effect/spawner/lootdrop/techstorage/tcomms,
/turf/open/floor/plating,
/area/storage/tech)
"bGy" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/mining,
-/obj/item/circuitboard/machine/autolathe{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/circuitboard/computer/arcade/battle,
+/obj/effect/spawner/lootdrop/techstorage/service,
/turf/open/floor/plating,
/area/storage/tech)
"bGz" = (
@@ -33668,21 +33600,10 @@
/area/crew_quarters/theatre)
"bHG" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/crew{
- pixel_x = -1;
- pixel_y = 1
- },
-/obj/item/circuitboard/computer/card{
- pixel_x = 2;
- pixel_y = -2
- },
-/obj/item/circuitboard/computer/communications{
- pixel_x = 5;
- pixel_y = -5
- },
/obj/machinery/light/small{
dir = 8
},
+/obj/effect/spawner/lootdrop/techstorage/command,
/turf/open/floor/plasteel,
/area/storage/tech)
"bHH" = (
@@ -34387,14 +34308,7 @@
/area/storage/tech)
"bJh" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/robotics{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/circuitboard/computer/mecha_control{
- pixel_x = 1;
- pixel_y = -1
- },
+/obj/effect/spawner/lootdrop/techstorage/RnD_secure,
/turf/open/floor/plasteel,
/area/storage/tech)
"bJi" = (
@@ -34410,43 +34324,17 @@
/area/storage/tech)
"bJk" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/cloning,
-/obj/item/circuitboard/computer/med_data{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/circuitboard/machine/clonescanner,
-/obj/item/circuitboard/machine/clonepod,
-/obj/item/circuitboard/computer/scan_consolenew,
-/obj/item/circuitboard/machine/smoke_machine,
+/obj/effect/spawner/lootdrop/techstorage/medical,
/turf/open/floor/plating,
/area/storage/tech)
"bJl" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/powermonitor{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/circuitboard/computer/stationalert{
- pixel_x = 1;
- pixel_y = -1
- },
-/obj/item/circuitboard/computer/atmos_alert{
- pixel_x = 3;
- pixel_y = -3
- },
+/obj/effect/spawner/lootdrop/techstorage/engineering,
/turf/open/floor/plating,
/area/storage/tech)
"bJm" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/secure_data{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/circuitboard/computer/security{
- pixel_x = 1;
- pixel_y = -1
- },
+/obj/effect/spawner/lootdrop/techstorage/security,
/turf/open/floor/plating,
/area/storage/tech)
"bJn" = (
@@ -45458,28 +45346,10 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"ckG" = (
-/obj/structure/closet/crate{
- name = "solar pack crate"
- },
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/circuitboard/computer/solar_control,
-/obj/item/electronics/tracker,
-/obj/item/paper/guides/jobs/engi/solars,
/obj/effect/turf_decal/bot{
dir = 1
},
+/obj/structure/closet/crate/solarpanel_small,
/turf/open/floor/plasteel,
/area/engine/engineering)
"ckH" = (
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 1890626a71..02529a8c6b 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -2953,8 +2953,8 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"alK" = (
-/obj/structure/closet/secure_closet/freezer/kitchen,
/obj/effect/turf_decal/bot,
+/obj/structure/closet/secure_closet/freezer/kitchen/maintenance,
/turf/open/floor/plasteel,
/area/maintenance/starboard/fore)
"alL" = (
@@ -5799,12 +5799,6 @@
dir = 4
},
/area/maintenance/disposal)
-"asj" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plasteel/airless/solarpanel,
-/area/solar/port/fore)
"ask" = (
/obj/structure/lattice/catwalk,
/turf/open/space,
@@ -10313,7 +10307,7 @@
/area/quartermaster/warehouse)
"aBM" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/deadcockroach,
+/obj/effect/decal/cleanable/insectguts,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -32288,23 +32282,10 @@
},
/area/security/nuke_storage)
"bvQ" = (
-/obj/structure/closet/crate{
- name = "Silver Crate"
- },
/obj/machinery/light/small{
dir = 1
},
-/obj/item/coin/silver{
- pixel_x = -6
- },
-/obj/item/coin/silver{
- pixel_x = 6
- },
-/obj/item/coin/silver{
- pixel_x = 6
- },
-/obj/item/coin/silver,
-/obj/item/coin/silver,
+/obj/structure/closet/crate/silvercrate,
/turf/open/floor/plasteel/vault{
dir = 8
},
@@ -32718,30 +32699,17 @@
/area/hallway/primary/port)
"bwJ" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/robotics{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/computer/mecha_control,
/obj/structure/cable/white{
icon_state = "4-8"
},
/obj/effect/turf_decal/stripes/line{
dir = 10
},
+/obj/effect/spawner/lootdrop/techstorage/command,
/turf/open/floor/plasteel,
/area/storage/tech)
"bwK" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/communications{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/computer/card,
-/obj/item/circuitboard/computer/crew{
- pixel_x = 3;
- pixel_y = -3
- },
/obj/structure/cable/white{
icon_state = "2-8"
},
@@ -32752,25 +32720,18 @@
icon_state = "1-2"
},
/obj/effect/turf_decal/stripes/line,
+/obj/effect/spawner/lootdrop/techstorage/AI,
/turf/open/floor/plasteel,
/area/storage/tech)
"bwL" = (
/obj/structure/rack,
-/obj/item/circuitboard/aicore{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/computer/aiupload,
-/obj/item/circuitboard/computer/borgupload{
- pixel_x = 3;
- pixel_y = -3
- },
/obj/structure/cable/white{
icon_state = "4-8"
},
/obj/effect/turf_decal/stripes/line{
dir = 6
},
+/obj/effect/spawner/lootdrop/techstorage/RnD_secure,
/turf/open/floor/plasteel,
/area/storage/tech)
"bwM" = (
@@ -35297,17 +35258,12 @@
},
/area/security/nuke_storage)
"bBU" = (
-/obj/structure/closet/crate{
- name = "Gold Crate"
- },
-/obj/item/storage/belt/champion,
/obj/machinery/airalarm{
dir = 1;
pixel_y = -22
},
/obj/machinery/light/small,
-/obj/item/stack/sheet/mineral/gold,
-/obj/item/stack/sheet/mineral/gold,
+/obj/structure/closet/crate/goldcrate,
/turf/open/floor/plasteel/vault{
dir = 8
},
@@ -37169,32 +37125,14 @@
/area/storage/tech)
"bET" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/scan_consolenew{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/computer/med_data,
-/obj/item/circuitboard/computer/pandemic{
- pixel_x = 3;
- pixel_y = -3
- },
/obj/effect/turf_decal/bot,
-/obj/item/circuitboard/machine/smoke_machine,
+/obj/effect/spawner/lootdrop/techstorage/service,
/turf/open/floor/plasteel,
/area/storage/tech)
"bEU" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/aifixer{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/computer/rdconsole,
-/obj/item/circuitboard/machine/rdserver{
- pixel_x = 3;
- pixel_y = -3
- },
/obj/effect/turf_decal/bot,
-/obj/item/circuitboard/machine/autolathe,
+/obj/effect/spawner/lootdrop/techstorage/medical,
/turf/open/floor/plasteel,
/area/storage/tech)
"bEV" = (
@@ -38079,30 +38017,14 @@
/area/storage/tech)
"bGD" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/cloning{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/machine/clonescanner,
-/obj/item/circuitboard/machine/clonepod{
- pixel_x = 3;
- pixel_y = -3
- },
/obj/effect/turf_decal/bot,
+/obj/effect/spawner/lootdrop/techstorage/security,
/turf/open/floor/plasteel,
/area/storage/tech)
"bGE" = (
/obj/structure/rack,
-/obj/item/circuitboard/machine/destructive_analyzer{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/machine/mechfab,
-/obj/item/circuitboard/machine/circuit_imprinter{
- pixel_x = 3;
- pixel_y = -3
- },
/obj/effect/turf_decal/bot,
+/obj/effect/spawner/lootdrop/techstorage/rnd,
/turf/open/floor/plasteel,
/area/storage/tech)
"bGF" = (
@@ -38971,7 +38893,6 @@
dir = 4
},
/obj/effect/turf_decal/bot,
-/obj/item/circuitboard/machine/autolathe,
/turf/open/floor/plasteel,
/area/storage/tech)
"bIu" = (
@@ -39924,31 +39845,16 @@
/area/storage/tech)
"bKp" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/security{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/computer/prisoner,
-/obj/item/circuitboard/computer/secure_data{
- pixel_x = 3;
- pixel_y = -3
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/bot,
+/obj/item/electronics/apc,
+/obj/item/electronics/airalarm,
/turf/open/floor/plasteel,
/area/storage/tech)
"bKq" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/atmos_alert{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/computer/powermonitor,
-/obj/item/circuitboard/computer/stationalert{
- pixel_x = 3;
- pixel_y = -3
- },
/obj/effect/turf_decal/bot,
+/obj/effect/spawner/lootdrop/techstorage/engineering,
/turf/open/floor/plasteel,
/area/storage/tech)
"bKr" = (
@@ -40845,30 +40751,14 @@
pixel_y = 3
},
/obj/item/circuitboard/machine/teleporter_station,
-/obj/item/circuitboard/computer/teleporter{
- pixel_x = 3;
- pixel_y = -3
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/storage/tech)
"bMi" = (
/obj/structure/rack,
-/obj/item/circuitboard/machine/telecomms/server{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/machine/telecomms/relay,
-/obj/item/circuitboard/machine/telecomms/receiver,
-/obj/item/circuitboard/machine/telecomms/processor,
-/obj/item/circuitboard/machine/telecomms/hub,
-/obj/item/circuitboard/machine/telecomms/bus,
-/obj/item/circuitboard/machine/telecomms/broadcaster{
- pixel_x = 3;
- pixel_y = -3
- },
/obj/effect/turf_decal/bot,
+/obj/effect/spawner/lootdrop/techstorage/tcomms,
/turf/open/floor/plasteel,
/area/storage/tech)
"bMj" = (
@@ -45017,6 +44907,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bUw" = (
@@ -46188,13 +46081,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/neutral,
/area/hallway/primary/port)
-"bWH" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
"bWI" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel/neutral,
@@ -47415,6 +47301,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bYS" = (
@@ -56553,6 +56442,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"crY" = (
@@ -56560,6 +56452,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"crZ" = (
@@ -77373,6 +77268,12 @@
/obj/machinery/light{
dir = 1
},
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
/turf/open/floor/plasteel/whitepurple/side{
dir = 1
},
@@ -78220,6 +78121,9 @@
dir = 10
},
/obj/structure/chair/comfy,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
/turf/open/floor/plasteel/whitepurple/side{
dir = 8
},
@@ -78230,6 +78134,9 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/vending/snack/random,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
/turf/open/floor/plasteel/whitepurple/side{
dir = 4
},
@@ -80499,6 +80406,9 @@
dir = 9
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
/turf/open/floor/plasteel/whitepurple/side{
dir = 8
},
@@ -80524,6 +80434,7 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
},
+/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plasteel/whitepurple/side{
dir = 4
},
@@ -88708,6 +88619,12 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
/turf/open/floor/plasteel/neutral/side,
/area/science/mixing)
"dHg" = (
@@ -89263,6 +89180,12 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
/turf/open/floor/plasteel/neutral/side{
dir = 4
},
@@ -89288,6 +89211,10 @@
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/stripes/corner,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
/turf/open/floor/plasteel/neutral/side{
dir = 8;
heat_capacity = 1e+006
@@ -90061,6 +89988,10 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/effect/turf_decal/stripes/corner,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
/turf/open/floor/plasteel/neutral/side{
dir = 1
},
@@ -100658,6 +100589,10 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/light,
/obj/structure/reagent_dispensers/water_cooler,
+/obj/effect/turf_decal/stripes/corner,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
/turf/open/floor/plasteel/whitepurple/side,
/area/science/misc_lab)
"uYS" = (
@@ -119104,7 +119039,7 @@ aoG
apI
aqJ
aaa
-asj
+aoG
apI
aqJ
aaa
@@ -132520,7 +132455,7 @@ bOp
bQq
bDu
bUv
-bWH
+bWC
bYR
caG
caG
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 303d28895d..e6ef58c9af 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -7234,14 +7234,7 @@
/area/maintenance/port/fore)
"apx" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/secure_data{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/circuitboard/computer/security{
- pixel_x = 1;
- pixel_y = -1
- },
+/obj/effect/spawner/lootdrop/techstorage/service,
/turf/open/floor/plasteel/dark,
/area/storage/tech)
"apy" = (
@@ -12528,25 +12521,11 @@
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aAP" = (
-/obj/structure/closet/crate{
- name = "Gold Crate"
- },
-/obj/item/stack/sheet/mineral/gold{
- pixel_x = -1;
- pixel_y = 5
- },
-/obj/item/stack/sheet/mineral/gold{
- pixel_y = 2
- },
-/obj/item/stack/sheet/mineral/gold{
- pixel_x = 1;
- pixel_y = -2
- },
-/obj/item/storage/belt/champion,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
/obj/effect/turf_decal/bot_white/right,
+/obj/structure/closet/crate/goldcrate,
/turf/open/floor/plasteel/vault{
dir = 1
},
@@ -12580,30 +12559,8 @@
},
/area/security/nuke_storage)
"aAT" = (
-/obj/item/coin/silver{
- pixel_x = 7;
- pixel_y = 12
- },
-/obj/item/coin/silver{
- pixel_x = 12;
- pixel_y = 7
- },
-/obj/item/coin/silver{
- pixel_x = 4;
- pixel_y = 8
- },
-/obj/item/coin/silver{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/coin/silver{
- pixel_x = 5;
- pixel_y = -8
- },
-/obj/structure/closet/crate{
- name = "Silver Crate"
- },
/obj/effect/turf_decal/bot_white/left,
+/obj/structure/closet/crate/silvercrate,
/turf/open/floor/plasteel/vault{
dir = 1
},
@@ -15507,28 +15464,10 @@
},
/area/engine/engineering)
"aGT" = (
-/obj/structure/closet/crate{
- name = "solar pack crate"
- },
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/circuitboard/computer/solar_control,
-/obj/item/electronics/tracker,
-/obj/item/paper/guides/jobs/engi/solars,
/obj/effect/turf_decal/bot{
dir = 1
},
+/obj/structure/closet/crate/solarpanel_small,
/turf/open/floor/plasteel{
dir = 1
},
@@ -23157,45 +23096,20 @@
/area/storage/tech)
"aYj" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/pandemic{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/computer/rdconsole,
-/obj/item/circuitboard/machine/rdserver{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/circuitboard/machine/destructive_analyzer,
-/obj/item/circuitboard/computer/aifixer,
-/obj/item/circuitboard/computer/teleporter,
-/obj/item/circuitboard/machine/circuit_imprinter,
-/obj/item/circuitboard/machine/mechfab,
+/obj/effect/spawner/lootdrop/techstorage/engineering,
/turf/open/floor/plasteel/dark,
/area/storage/tech)
"aYk" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/mining,
-/obj/item/circuitboard/machine/autolathe{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/circuitboard/computer/arcade/battle,
/obj/machinery/ai_status_display{
pixel_y = 31
},
+/obj/effect/spawner/lootdrop/techstorage/medical,
/turf/open/floor/plasteel/dark,
/area/storage/tech)
"aYl" = (
/obj/structure/rack,
-/obj/item/circuitboard/machine/telecomms/processor,
-/obj/item/circuitboard/machine/telecomms/receiver,
-/obj/item/circuitboard/machine/telecomms/server,
-/obj/item/circuitboard/machine/telecomms/bus,
-/obj/item/circuitboard/machine/telecomms/broadcaster,
-/obj/item/circuitboard/computer/message_monitor{
- pixel_y = -5
- },
+/obj/effect/spawner/lootdrop/techstorage/rnd,
/turf/open/floor/plasteel/dark,
/area/storage/tech)
"aYm" = (
@@ -24761,14 +24675,7 @@
/area/maintenance/starboard/fore)
"bbk" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/borgupload{
- pixel_x = -1;
- pixel_y = 1
- },
-/obj/item/circuitboard/computer/aiupload{
- pixel_x = 2;
- pixel_y = -2
- },
+/obj/effect/spawner/lootdrop/techstorage/AI,
/turf/open/floor/plasteel/dark,
/area/storage/tech)
"bbl" = (
@@ -24799,15 +24706,7 @@
/area/storage/tech)
"bbn" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/cloning,
-/obj/item/circuitboard/computer/med_data{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/circuitboard/machine/clonescanner,
-/obj/item/circuitboard/machine/clonepod,
-/obj/item/circuitboard/computer/scan_consolenew,
-/obj/item/circuitboard/machine/smoke_machine,
+/obj/effect/spawner/lootdrop/techstorage/security,
/turf/open/floor/plasteel/dark,
/area/storage/tech)
"bbo" = (
@@ -24815,19 +24714,8 @@
/area/maintenance/solars/port/fore)
"bbp" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/powermonitor{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/circuitboard/computer/stationalert{
- pixel_x = 1;
- pixel_y = -1
- },
-/obj/item/circuitboard/computer/atmos_alert{
- pixel_x = 3;
- pixel_y = -3
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/spawner/lootdrop/techstorage/tcomms,
/turf/open/floor/plasteel/dark,
/area/storage/tech)
"bbq" = (
@@ -25325,18 +25213,7 @@
/area/storage/tech)
"bcv" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/crew{
- pixel_x = -1;
- pixel_y = 1
- },
-/obj/item/circuitboard/computer/card{
- pixel_x = 2;
- pixel_y = -2
- },
-/obj/item/circuitboard/computer/communications{
- pixel_x = 5;
- pixel_y = -5
- },
+/obj/effect/spawner/lootdrop/techstorage/RnD_secure,
/turf/open/floor/plasteel/dark,
/area/storage/tech)
"bcw" = (
@@ -26032,14 +25909,7 @@
/area/maintenance/starboard/fore)
"bdX" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/robotics{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/circuitboard/computer/mecha_control{
- pixel_x = 1;
- pixel_y = -1
- },
+/obj/effect/spawner/lootdrop/techstorage/command,
/turf/open/floor/plasteel/dark,
/area/storage/tech)
"bdY" = (
@@ -58226,15 +58096,6 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/science/storage)
-"ctk" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"ctl" = (
/obj/machinery/camera{
active_power_usage = 0;
@@ -112953,7 +112814,7 @@ cJa
cpG
kVo
dDu
-ctk
+kVo
cuc
cuZ
dyp
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index 735beb6d4c..1390460fd2 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -31225,9 +31225,6 @@
},
/turf/closed/wall/r_wall,
/area/maintenance/disposal/incinerator)
-"dWc" = (
-/turf/closed/mineral/random/labormineral,
-/area/space)
"dYC" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
@@ -33239,28 +33236,10 @@
},
/area/maintenance/starboard)
"sFp" = (
-/obj/structure/closet/crate{
- name = "solar pack crate"
- },
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/circuitboard/computer/solar_control,
-/obj/item/electronics/tracker,
-/obj/item/paper/guides/jobs/engi/solars,
/obj/effect/turf_decal/bot{
dir = 1
},
+/obj/structure/closet/crate/solarpanel_small,
/turf/open/floor/plasteel/vault/side{
dir = 5
},
@@ -79414,7 +79393,7 @@ bfP
bjc
bfP
bfP
-dWc
+aad
aaa
aaa
aaa
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index a1fd4f8886..ac4d2a12dc 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -6985,21 +6985,7 @@
/turf/closed/wall/r_wall,
/area/bridge)
"asV" = (
-/obj/structure/closet/crate{
- name = "Gold Crate"
- },
-/obj/item/stack/sheet/mineral/gold{
- pixel_x = -1;
- pixel_y = 5
- },
-/obj/item/stack/sheet/mineral/gold{
- pixel_y = 2
- },
-/obj/item/stack/sheet/mineral/gold{
- pixel_x = 1;
- pixel_y = -2
- },
-/obj/item/storage/belt/champion,
+/obj/structure/closet/crate/goldcrate,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
@@ -7036,29 +7022,7 @@
},
/area/ai_monitored/nuke_storage)
"asZ" = (
-/obj/item/coin/silver{
- pixel_x = 7;
- pixel_y = 12
- },
-/obj/item/coin/silver{
- pixel_x = 12;
- pixel_y = 7
- },
-/obj/item/coin/silver{
- pixel_x = 4;
- pixel_y = 8
- },
-/obj/item/coin/silver{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/coin/silver{
- pixel_x = 5;
- pixel_y = -8
- },
-/obj/structure/closet/crate{
- name = "Silver Crate"
- },
+/obj/structure/closet/crate/silvercrate,
/turf/open/floor/plasteel/vault{
dir = 4
},
@@ -11737,7 +11701,7 @@
dir = 8;
pixel_x = 23
},
-/obj/effect/decal/cleanable/deadcockroach,
+/obj/effect/decal/cleanable/insectguts,
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/toilet/restrooms)
"aEi" = (
@@ -13428,7 +13392,7 @@
/obj/machinery/light/small{
dir = 8
},
-/obj/effect/decal/cleanable/deadcockroach,
+/obj/effect/decal/cleanable/insectguts,
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/toilet/restrooms)
"aIo" = (
@@ -20061,7 +20025,7 @@
/obj/item/shard{
icon_state = "small"
},
-/obj/effect/decal/cleanable/deadcockroach,
+/obj/effect/decal/cleanable/insectguts,
/obj/item/light/bulb,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
@@ -33065,7 +33029,7 @@
/area/maintenance/department/engine)
"bDj" = (
/obj/item/trash/candy,
-/obj/effect/decal/cleanable/deadcockroach,
+/obj/effect/decal/cleanable/insectguts,
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/obj/structure/cable{
icon_state = "1-2"
@@ -34329,7 +34293,7 @@
/turf/open/floor/plasteel/freezer,
/area/medical/virology)
"bFL" = (
-/obj/effect/decal/cleanable/deadcockroach,
+/obj/effect/decal/cleanable/insectguts,
/turf/open/floor/plasteel/freezer,
/area/medical/virology)
"bFM" = (
@@ -38227,7 +38191,7 @@
/area/maintenance/department/engine)
"bPq" = (
/obj/item/trash/chips,
-/obj/effect/decal/cleanable/deadcockroach,
+/obj/effect/decal/cleanable/insectguts,
/turf/open/floor/plasteel/dark,
/area/maintenance/department/engine)
"bPr" = (
@@ -38600,34 +38564,14 @@
/area/storage/tech)
"bQv" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/pandemic{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/circuitboard/computer/rdconsole,
-/obj/item/circuitboard/machine/rdserver{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/circuitboard/machine/destructive_analyzer,
-/obj/item/circuitboard/computer/aifixer,
-/obj/item/circuitboard/computer/teleporter,
-/obj/item/circuitboard/machine/circuit_imprinter,
-/obj/item/circuitboard/machine/mechfab,
/obj/structure/sign/poster/official/random{
pixel_y = 32
},
-/obj/item/circuitboard/machine/smoke_machine,
+/obj/effect/spawner/lootdrop/techstorage/engineering,
/turf/open/floor/plasteel/darkgreen,
/area/storage/tech)
"bQw" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/mining,
-/obj/item/circuitboard/machine/autolathe{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/circuitboard/computer/arcade/battle,
/obj/machinery/light{
dir = 1;
light_color = "#cee5d2"
@@ -38637,18 +38581,12 @@
dir = 2
},
/obj/item/circuitboard/computer/monastery_shuttle,
+/obj/effect/spawner/lootdrop/techstorage/service,
/turf/open/floor/plasteel/darkgreen,
/area/storage/tech)
"bQx" = (
/obj/structure/rack,
-/obj/item/circuitboard/machine/telecomms/processor,
-/obj/item/circuitboard/machine/telecomms/receiver,
-/obj/item/circuitboard/machine/telecomms/server,
-/obj/item/circuitboard/machine/telecomms/bus,
-/obj/item/circuitboard/machine/telecomms/broadcaster,
-/obj/item/circuitboard/computer/message_monitor{
- pixel_y = -5
- },
+/obj/effect/spawner/lootdrop/techstorage/rnd,
/turf/open/floor/plasteel/darkgreen,
/area/storage/tech)
"bQy" = (
@@ -39226,42 +39164,17 @@
/area/storage/tech)
"bRO" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/cloning,
-/obj/item/circuitboard/computer/med_data{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/circuitboard/machine/clonescanner,
-/obj/item/circuitboard/machine/clonepod,
-/obj/item/circuitboard/computer/scan_consolenew,
+/obj/effect/spawner/lootdrop/techstorage/medical,
/turf/open/floor/plasteel/darkgreen,
/area/storage/tech)
"bRP" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/secure_data{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/circuitboard/computer/security{
- pixel_x = 1;
- pixel_y = -1
- },
+/obj/effect/spawner/lootdrop/techstorage/tcomms,
/turf/open/floor/plasteel/darkgreen,
/area/storage/tech)
"bRQ" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/powermonitor{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/circuitboard/computer/stationalert{
- pixel_x = 1;
- pixel_y = -1
- },
-/obj/item/circuitboard/computer/atmos_alert{
- pixel_x = 3;
- pixel_y = -3
- },
+/obj/effect/spawner/lootdrop/techstorage/security,
/turf/open/floor/plasteel/darkgreen,
/area/storage/tech)
"bRR" = (
@@ -39952,25 +39865,6 @@
/turf/open/floor/plasteel/darkgreen,
/area/storage/tech)
"bTB" = (
-/obj/structure/closet/crate{
- name = "solar pack crate"
- },
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/solar_assembly,
-/obj/item/circuitboard/computer/solar_control,
-/obj/item/electronics/tracker,
-/obj/item/paper/guides/jobs/engi/solars,
/obj/machinery/power/apc{
dir = 2;
name = "Tech Storage APC";
@@ -39978,6 +39872,7 @@
pixel_y = -24
},
/obj/structure/cable,
+/obj/structure/closet/crate/solarpanel_small,
/turf/open/floor/plasteel/darkgreen,
/area/storage/tech)
"bTC" = (
@@ -41189,46 +41084,21 @@
/area/crew_quarters/heads/chief)
"bWs" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/robotics{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/circuitboard/computer/mecha_control{
- pixel_x = 1;
- pixel_y = -1
- },
+/obj/effect/spawner/lootdrop/techstorage/AI,
/turf/open/floor/plasteel/darkred,
/area/storage/tech)
"bWt" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/crew{
- pixel_x = -1;
- pixel_y = 1
- },
-/obj/item/circuitboard/computer/card{
- pixel_x = 2;
- pixel_y = -2
- },
-/obj/item/circuitboard/computer/communications{
- pixel_x = 5;
- pixel_y = -5
- },
/obj/machinery/camera{
c_tag = "Secure Tech Storage";
dir = 1
},
+/obj/effect/spawner/lootdrop/techstorage/RnD_secure,
/turf/open/floor/plasteel/darkred,
/area/storage/tech)
"bWu" = (
/obj/structure/rack,
-/obj/item/circuitboard/computer/borgupload{
- pixel_x = -1;
- pixel_y = 1
- },
-/obj/item/circuitboard/computer/aiupload{
- pixel_x = 2;
- pixel_y = -2
- },
+/obj/effect/spawner/lootdrop/techstorage/command,
/turf/open/floor/plasteel/darkred,
/area/storage/tech)
"bWv" = (
@@ -43055,7 +42925,7 @@
"cba" = (
/obj/structure/table,
/obj/item/storage/fancy/cigarettes/cigpack_robustgold,
-/obj/effect/decal/cleanable/deadcockroach,
+/obj/effect/decal/cleanable/insectguts,
/turf/open/floor/plating,
/area/maintenance/department/engine)
"cbb" = (
diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm
index 73a6d6fca8..3629dd5f05 100644
--- a/_maps/map_files/debug/runtimestation.dmm
+++ b/_maps/map_files/debug/runtimestation.dmm
@@ -25,6 +25,9 @@
/area/engine/atmos)
"ai" = (
/obj/machinery/power/rtg/advanced,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
/turf/open/floor/plating/airless,
/area/space/nearstation)
"aj" = (
@@ -73,7 +76,7 @@
/obj/structure/cable{
icon_state = "0-4"
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aq" = (
/obj/machinery/computer/monitor,
@@ -84,11 +87,11 @@
/obj/machinery/light{
dir = 1
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"ar" = (
/obj/structure/closet/secure_closet/engineering_welding,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"as" = (
/obj/machinery/power/smes{
@@ -182,12 +185,6 @@
/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plating,
/area/engine/engineering)
-"aD" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"aE" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -195,10 +192,16 @@
/obj/structure/cable{
icon_state = "2-8"
},
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aF" = (
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aG" = (
/obj/machinery/power/terminal{
@@ -292,7 +295,7 @@
},
/obj/item/storage/toolbox/syndicate,
/obj/item/stock_parts/cell/infinite,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aT" = (
/obj/structure/cable{
@@ -301,7 +304,8 @@
/obj/structure/cable{
icon_state = "2-4"
},
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aU" = (
/obj/machinery/door/airlock/engineering/glass{
@@ -382,17 +386,18 @@
/obj/structure/table,
/obj/item/weldingtool/experimental,
/obj/item/inducer,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"be" = (
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"bf" = (
/obj/machinery/suit_storage_unit/captain,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"bg" = (
/obj/effect/turf_decal/stripes/line{
@@ -453,16 +458,15 @@
/turf/open/floor/plating,
/area/engine/atmos)
"bo" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/table,
/obj/item/screwdriver/power,
/obj/item/wirecutters/power,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"bp" = (
/obj/machinery/light,
/obj/structure/tank_dispenser,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"bq" = (
/obj/effect/turf_decal/stripes/line{
@@ -496,15 +500,12 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/bridge)
-"bw" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
"bx" = (
/obj/machinery/door/airlock,
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/engine/engineering)
"by" = (
@@ -534,20 +535,14 @@
/obj/machinery/autolathe/hacked,
/turf/open/floor/plasteel,
/area/science)
-"bC" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/science)
"bD" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
-/obj/machinery/robotic_fabricator,
/obj/machinery/light{
dir = 1
},
+/obj/machinery/mecha_part_fabricator,
/turf/open/floor/plasteel,
/area/science)
"bE" = (
@@ -634,11 +629,7 @@
/turf/open/floor/plasteel/dark,
/area/medical/chemistry)
"bS" = (
-/obj/machinery/chem_dispenser,
-/turf/open/floor/plasteel/dark,
-/area/medical/chemistry)
-"bT" = (
-/obj/machinery/chem_dispenser,
+/obj/machinery/chem_dispenser/fullupgrade,
/turf/open/floor/plasteel/dark,
/area/medical/chemistry)
"bU" = (
@@ -751,16 +742,6 @@
/obj/machinery/door/airlock,
/turf/open/floor/plating,
/area/bridge)
-"ci" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/medical/chemistry)
"cj" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -801,8 +782,10 @@
/area/science)
"cp" = (
/obj/machinery/light,
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/closet/secure_closet/engineering_chief,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
/turf/open/floor/plasteel/blue/side{
dir = 10
},
@@ -824,7 +807,6 @@
/turf/closed/wall/r_wall,
/area/bridge)
"ct" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/light{
dir = 8
},
@@ -898,8 +880,10 @@
/turf/closed/wall/r_wall,
/area/medical/chemistry)
"cF" = (
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/medical/chemistry)
"cG" = (
@@ -1013,12 +997,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/storage/primary)
-"db" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/storage/primary)
"dc" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -1320,11 +1298,22 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/science)
+"gM" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/storage/primary)
"gY" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/science)
"hD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/power/apc{
dir = 1;
pixel_y = 25
@@ -1405,6 +1394,11 @@
},
/turf/open/floor/plasteel,
/area/medical/chemistry)
+"sE" = (
+/obj/machinery/power/rtg/advanced,
+/obj/structure/cable,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"vv" = (
/obj/machinery/door/airlock,
/turf/open/floor/plating,
@@ -1440,6 +1434,22 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/medical/chemistry)
+"yp" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
+"AP" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/science)
"BB" = (
/obj/item/storage/backpack/duffelbag/syndie/surgery,
/obj/structure/table,
@@ -1460,19 +1470,32 @@
/turf/open/floor/plasteel,
/area/medical/chemistry)
"Ct" = (
-/obj/item/disk/tech_disk/debug,
+/obj/machinery/rnd/production/circuit_imprinter/department,
/turf/open/floor/plasteel,
/area/science)
+"CK" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
"CV" = (
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/medical/chemistry)
+"EI" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/blue/side,
+/area/bridge)
"If" = (
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/rnd/destructive_analyzer,
/turf/open/floor/plasteel,
/area/science)
"In" = (
@@ -1489,8 +1512,12 @@
/obj/machinery/door/airlock,
/turf/open/floor/plating,
/area/hallway/primary/central)
+"Ly" = (
+/obj/machinery/chem_dispenser/chem_synthesizer,
+/turf/open/floor/plasteel/dark,
+/area/medical/chemistry)
"NZ" = (
-/obj/machinery/rnd/production/protolathe,
+/obj/machinery/rnd/production/protolathe/department,
/turf/open/floor/plasteel,
/area/science)
"Qt" = (
@@ -1500,6 +1527,20 @@
/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plating,
/area/medical/medbay)
+"RC" = (
+/obj/machinery/power/rtg/advanced,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"RY" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/item/disk/tech_disk/debug,
+/turf/open/floor/plasteel,
+/area/science)
"Ut" = (
/obj/structure/closet/secure_closet/medical3,
/turf/open/floor/plasteel,
@@ -1508,6 +1549,12 @@
/obj/machinery/light,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"Vy" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"WT" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -2301,9 +2348,9 @@ aw
ba
bk
bt
-bC
-cb
fT
+cb
+AP
pA
kQ
bN
@@ -2409,7 +2456,7 @@ aO
bc
bm
ah
-NZ
+bF
cc
Ct
gd
@@ -2463,8 +2510,8 @@ aP
aP
bn
ah
-bF
-cc
+NZ
+RY
co
bA
wS
@@ -2620,14 +2667,14 @@ ae
ab
ai
an
-ai
+RC
aQ
-ai
+sE
ab
bv
bI
cf
-cq
+EI
bv
dU
bE
@@ -2676,7 +2723,7 @@ ai
ao
aA
aR
-ai
+sE
ab
bv
BG
@@ -2890,7 +2937,7 @@ ae
ac
ac
aj
-aD
+Vy
aj
ac
ac
@@ -2998,20 +3045,20 @@ ad
af
aj
ap
-aD
+Vy
aS
bd
bo
-bw
+aj
hD
-ci
+cj
ct
-wT
+Ce
cF
-bN
-bN
-cU
-db
+bE
+bE
+cS
+dl
dl
dl
dl
@@ -3058,14 +3105,14 @@ be
be
bx
CV
-cj
-Ce
-Ce
-oV
-bE
-bE
-cS
-dc
+yp
+wT
+wT
+CK
+bN
+bN
+cU
+gM
dc
dA
dl
@@ -3107,7 +3154,7 @@ af
aj
ar
aF
-aD
+Vy
bf
bp
aj
@@ -3327,7 +3374,7 @@ aX
aI
aI
ak
-bT
+Ly
pQ
Xg
Ce
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index 5ca6b8b965..499a89a0cd 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -2526,6 +2526,10 @@
/obj/machinery/capture_the_flag/red,
/turf/open/floor/circuit/green/anim,
/area/ctf)
+"hH" = (
+/obj/machinery/vending/coffee,
+/turf/open/floor/wood,
+/area/centcom/holding)
"hI" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -3324,6 +3328,10 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/centcom/supply)
+"jO" = (
+/obj/machinery/vending/cigarette,
+/turf/open/floor/wood,
+/area/centcom/holding)
"jP" = (
/obj/machinery/conveyor_switch/oneway{
dir = 8;
@@ -5318,6 +5326,20 @@
dir = 8
},
/area/tdome/tdomeobserve)
+"oU" = (
+/obj/structure/closet/secure_closet/bar{
+ locked = 0;
+ req_access_txt = "25"
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"oV" = (
+/obj/structure/reagent_dispensers/beerkeg,
+/turf/open/floor/wood,
+/area/centcom/holding)
"oW" = (
/obj/structure/flora/bush,
/obj/effect/light_emitter{
@@ -5562,6 +5584,70 @@
dir = 8
},
/area/centcom/control)
+"px" = (
+/obj/machinery/chem_dispenser/drinks/beer,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"py" = (
+/obj/machinery/chem_dispenser/drinks,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pz" = (
+/obj/item/storage/box/donkpockets{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/box/donkpockets{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/box/donkpockets{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/box/donkpockets{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pA" = (
+/obj/machinery/vending/cola/random,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pB" = (
+/obj/structure/rack,
+/obj/item/toy/sword,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/item/coin/gold{
+ pixel_x = 8;
+ pixel_y = -3
+ },
+/obj/item/camera,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pC" = (
+/obj/structure/rack,
+/obj/item/toy/gun,
+/obj/item/coin/gold{
+ pixel_w = -9;
+ pixel_y = 6
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pD" = (
+/obj/machinery/computer/arcade/battle,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pE" = (
+/obj/machinery/computer/arcade/orion_trail,
+/turf/open/floor/wood,
+/area/centcom/holding)
"pF" = (
/obj/machinery/door/airlock/centcom{
name = "Auxillary Dock";
@@ -5686,6 +5772,25 @@
dir = 5
},
/area/centcom/ferry)
+"pS" = (
+/obj/machinery/computer/slot_machine,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pT" = (
+/obj/machinery/vending/snack/random,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pU" = (
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pV" = (
+/obj/item/clothing/head/that,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"pW" = (
+/turf/open/floor/carpet/black,
+/area/centcom/holding)
"pX" = (
/obj/item/storage/crayons,
/obj/structure/table,
@@ -5951,6 +6056,30 @@
"qE" = (
/turf/closed/indestructible/riveted/uranium,
/area/wizard_station)
+"qF" = (
+/obj/structure/chair/stool{
+ pixel_y = 8
+ },
+/turf/open/floor/carpet/black,
+/area/centcom/holding)
+"qG" = (
+/obj/structure/table/wood,
+/obj/item/storage/box/drinkingglasses,
+/obj/item/storage/box/drinkingglasses{
+ pixel_x = 2;
+ pixel_y = 4
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"qH" = (
+/obj/item/reagent_containers/food/drinks/shaker,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"qI" = (
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
"qJ" = (
/obj/machinery/computer/shuttle/syndicate/recall,
/turf/open/floor/plasteel/bar{
@@ -6076,6 +6205,16 @@
/obj/machinery/computer/shuttle,
/turf/open/floor/engine/cult,
/area/wizard_station)
+"rb" = (
+/obj/item/lighter,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"rc" = (
+/obj/item/reagent_containers/food/drinks/soda_cans/cola,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
"rd" = (
/obj/structure/flora/grass/brown,
/obj/effect/light_emitter{
@@ -6502,6 +6641,48 @@
},
/turf/open/floor/engine/cult,
/area/wizard_station)
+"rY" = (
+/obj/item/dice/d20,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"rZ" = (
+/obj/structure/rack,
+/obj/item/clothing/head/that,
+/obj/item/clothing/under/suit_jacket,
+/obj/item/clothing/accessory/waistcoat,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"sa" = (
+/obj/structure/rack,
+/obj/item/storage/crayons,
+/obj/item/gun/ballistic/automatic/toy/pistol,
+/obj/item/ammo_box/foambox,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"sb" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"sc" = (
+/obj/structure/rack,
+/obj/item/storage/crayons,
+/obj/item/gun/ballistic/shotgun/toy/crossbow,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"sd" = (
+/obj/structure/rack,
+/obj/item/clothing/shoes/laceup,
+/obj/item/clothing/under/suit_jacket/female{
+ desc = "A black trouser suit for women. Very formal.";
+ name = "black suit";
+ pixel_x = 3;
+ pixel_y = 1
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
"se" = (
/obj/machinery/light{
dir = 8
@@ -6903,6 +7084,34 @@
},
/turf/open/floor/engine/cult,
/area/wizard_station)
+"sY" = (
+/mob/living/simple_animal/bot/medbot,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"sZ" = (
+/obj/machinery/sleeper{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"ta" = (
+/obj/machinery/light,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"tb" = (
+/obj/machinery/vending/clothing,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"tc" = (
+/obj/structure/closet/wardrobe/mixed,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"td" = (
+/obj/structure/rack,
+/obj/effect/spawner/lootdrop/costume,
+/obj/effect/spawner/lootdrop/costume,
+/turf/open/floor/wood,
+/area/centcom/holding)
"te" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/pizzaslice/mushroom,
@@ -6943,6 +7152,40 @@
},
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
+"tj" = (
+/obj/structure/rack,
+/obj/effect/spawner/lootdrop/costume,
+/obj/effect/spawner/lootdrop/costume,
+/obj/machinery/light,
+/obj/machinery/button/door{
+ id = "Ninjaholdingsuicide";
+ name = "SUICIDE CHAMBER LOCK";
+ normaldoorcontrol = 1;
+ pixel_x = 4;
+ pixel_y = -24;
+ specialfunctions = 4
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"tk" = (
+/obj/machinery/door/airlock/wood/glass{
+ name = "Private Rooms"
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"tl" = (
+/obj/machinery/door/airlock/maintenance_hatch{
+ id_tag = "Ninjaholdingsuicide";
+ locked = 1;
+ name = "SUICIDE CHAMBER"
+ },
+/turf/open/floor/wood{
+ icon_state = "wood-broken5"
+ },
+/area/centcom/holding)
+"tm" = (
+/turf/open/floor/carpet,
+/area/centcom/holding)
"tn" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -7243,6 +7486,10 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/centcom/evac)
+"tW" = (
+/obj/structure/table/wood/fancy/black,
+/turf/open/floor/carpet,
+/area/centcom/holding)
"tX" = (
/obj/machinery/door/airlock{
icon = 'icons/obj/doors/airlocks/station/uranium.dmi';
@@ -7250,6 +7497,40 @@
},
/turf/open/floor/engine/cult,
/area/wizard_station)
+"tY" = (
+/obj/structure/chair/comfy/black{
+ dir = 4
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"tZ" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"ua" = (
+/obj/structure/plasticflaps,
+/turf/open/floor/wood{
+ icon_state = "wood-broken4"
+ },
+/area/centcom/holding)
+"ub" = (
+/obj/machinery/door/airlock/wood{
+ id_tag = "Proom1";
+ name = "Room 1"
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"uc" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/chair/comfy/black{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
"ud" = (
/obj/machinery/door/poddoor/shutters{
id = "nukeop_ready";
@@ -7263,6 +7544,25 @@
},
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
+"uf" = (
+/turf/open/lava,
+/area/centcom/holding)
+"ug" = (
+/obj/machinery/button/door{
+ id = "Proom1";
+ name = "Door Lock";
+ normaldoorcontrol = 1;
+ pixel_x = -24;
+ pixel_y = 4;
+ specialfunctions = 4
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/random,
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"uh" = (
+/turf/open/chasm/lavaland,
+/area/centcom/holding)
"ui" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -7464,12 +7764,37 @@
/obj/structure/chair/wood/wings,
/turf/open/floor/carpet,
/area/wizard_station)
+"uG" = (
+/obj/structure/chair/sofa/left,
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"uH" = (
+/obj/structure/chair/sofa/corner{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"uI" = (
+/obj/structure/chair/sofa,
+/turf/open/floor/carpet,
+/area/centcom/holding)
"uJ" = (
/obj/machinery/door/airlock/external{
req_access_txt = "150"
},
/turf/open/floor/plating,
/area/syndicate_mothership/control)
+"uK" = (
+/obj/machinery/button/door{
+ id = "Proom2";
+ name = "Door Lock";
+ normaldoorcontrol = 1;
+ pixel_x = 24;
+ pixel_y = 4;
+ specialfunctions = 4
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
"uL" = (
/obj/machinery/button/door{
id = "nukeop_ready";
@@ -7488,6 +7813,10 @@
},
/turf/open/floor/mineral/plastitanium,
/area/syndicate_mothership/control)
+"uN" = (
+/obj/structure/table/wood/poker,
+/turf/open/floor/carpet,
+/area/centcom/holding)
"uO" = (
/obj/machinery/door/airlock/centcom{
name = "Shuttle Control Office";
@@ -7693,6 +8022,45 @@
},
/turf/open/floor/carpet,
/area/wizard_station)
+"vo" = (
+/obj/structure/chair/sofa{
+ icon_state = "sofamiddle";
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"vp" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"vq" = (
+/obj/machinery/door/airlock/wood{
+ id_tag = "Proom2";
+ name = "Room 2"
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"vr" = (
+/obj/structure/chair/sofa/corner{
+ dir = 4
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"vs" = (
+/obj/structure/chair/sofa/left{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"vt" = (
+/obj/machinery/vending/games,
+/turf/open/floor/carpet,
+/area/centcom/holding)
"vu" = (
/obj/item/storage/box/drinkingglasses,
/obj/item/reagent_containers/food/drinks/bottle/rum,
@@ -7715,6 +8083,19 @@
/obj/item/toy/nuke,
/turf/open/floor/wood,
/area/syndicate_mothership/control)
+"vy" = (
+/obj/structure/chair/sofa{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"vz" = (
+/obj/machinery/door/airlock/wood{
+ id_tag = "Proom3";
+ name = "Room 3"
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
"vA" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/directions/engineering{
@@ -7982,6 +8363,68 @@
},
/turf/open/floor/carpet,
/area/wizard_station)
+"we" = (
+/obj/machinery/button/door{
+ id = "Proom3";
+ name = "Door Lock";
+ normaldoorcontrol = 1;
+ pixel_x = -24;
+ pixel_y = 4;
+ specialfunctions = 4
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/random,
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"wf" = (
+/obj/machinery/button/door{
+ id = "Proom4";
+ name = "Door Lock";
+ normaldoorcontrol = 1;
+ pixel_x = 24;
+ pixel_y = 4;
+ specialfunctions = 4
+ },
+/turf/open/floor/carpet,
+/area/centcom/holding)
+"wg" = (
+/obj/machinery/door/airlock/wood{
+ id_tag = "Proom4";
+ name = "Room 4"
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"wh" = (
+/obj/structure/table/wood,
+/obj/item/soap/nanotrasen,
+/obj/item/reagent_containers/spray/cleaner,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"wi" = (
+/obj/structure/table/wood,
+/obj/structure/bedsheetbin,
+/turf/open/floor/wood,
+/area/centcom/holding)
+"wj" = (
+/obj/machinery/door/airlock/wood{
+ id_tag = "Proom5";
+ name = "Room 5"
+ },
+/turf/open/floor/wood,
+/area/centcom/holding)
+"wk" = (
+/obj/machinery/button/door{
+ id = "Proom5";
+ name = "Door Lock";
+ normaldoorcontrol = 1;
+ pixel_x = -24;
+ pixel_y = 4;
+ specialfunctions = 4
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/random,
+/turf/open/floor/carpet,
+/area/centcom/holding)
"wl" = (
/obj/machinery/light,
/turf/open/floor/wood,
@@ -10763,77 +11206,6 @@
},
/turf/open/floor/engine/cult,
/area/wizard_station)
-"EZ" = (
-/obj/structure/table,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"Fa" = (
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"Fb" = (
-/obj/structure/closet/secure_closet/bar{
- req_access_txt = "25"
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"Fc" = (
-/obj/structure/reagent_dispensers/beerkeg,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"Fd" = (
-/obj/structure/table,
-/obj/item/storage/box/donkpockets{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/box/donkpockets{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/box/donkpockets{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/box/donkpockets{
- pixel_x = 3;
- pixel_y = 3
- },
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"Fe" = (
-/obj/structure/rack,
-/obj/item/camera,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"Ff" = (
-/obj/structure/rack,
-/obj/item/toy/sword,
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"Fg" = (
-/obj/structure/rack,
-/obj/item/toy/gun,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"Fh" = (
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
"Fi" = (
/turf/open/floor/plating/beach/sand,
/area/centcom/holding)
@@ -10950,19 +11322,6 @@
dir = 5
},
/area/tdome/tdomeobserve)
-"FA" = (
-/obj/structure/table,
-/obj/item/clothing/head/that,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"FB" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
"FC" = (
/obj/item/camera,
/turf/open/floor/plating/beach/sand,
@@ -11069,41 +11428,6 @@
},
/turf/open/floor/engine/cult,
/area/wizard_station)
-"FU" = (
-/obj/structure/table,
-/obj/item/ammo_box/foambox,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"FV" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/drinks/shaker,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"FW" = (
-/obj/structure/table,
-/obj/item/lighter,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"FX" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/drinks/soda_cans/cola,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
-"FY" = (
-/obj/structure/table,
-/obj/item/dice/d20,
-/turf/open/floor/plasteel/freezer{
- dir = 2
- },
-/area/centcom/holding)
"FZ" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -11224,13 +11548,6 @@
},
/turf/open/lava,
/area/wizard_station)
-"Gs" = (
-/obj/structure/rack,
-/obj/item/clothing/head/that,
-/obj/item/clothing/under/suit_jacket,
-/obj/item/clothing/accessory/waistcoat,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
"Gt" = (
/obj/item/toy/beach_ball,
/turf/open/floor/plating/beach/sand,
@@ -11278,18 +11595,6 @@
},
/turf/open/lava/airless,
/area/wizard_station)
-"GA" = (
-/obj/structure/rack,
-/obj/item/storage/crayons,
-/obj/item/gun/ballistic/automatic/toy/pistol,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"GB" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
"GC" = (
/obj/structure/table,
/obj/structure/bedsheetbin,
@@ -11522,12 +11827,6 @@
/obj/structure/shuttle/engine/propulsion,
/turf/open/space,
/area/wizard_station)
-"GY" = (
-/obj/structure/rack,
-/obj/item/storage/crayons,
-/obj/item/gun/ballistic/shotgun/toy/crossbow,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
"GZ" = (
/turf/open/floor/plating/beach/coastline_b,
/area/centcom/holding)
@@ -11580,33 +11879,6 @@
dir = 4
},
/area/tdome/tdomeobserve)
-"Hi" = (
-/obj/structure/rack,
-/obj/item/clothing/shoes/laceup,
-/obj/item/clothing/under/suit_jacket/female{
- desc = "A black trouser suit for women. Very formal.";
- name = "black suit";
- pixel_x = 3;
- pixel_y = 1
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"Hj" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"Hk" = (
-/obj/structure/table,
-/obj/item/gun/ballistic/automatic/toy/pistol,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
-"Hl" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/machinery/light,
-/turf/open/floor/plasteel/cafeteria,
-/area/centcom/holding)
"Hm" = (
/turf/open/floor/plating/beach/water,
/area/centcom/holding)
@@ -39483,25 +39755,25 @@ aa
aa
aa
ED
-EZ
-EZ
-FU
-Gs
-GA
-GY
-Hi
+hH
+pU
+qG
+rZ
+sa
+sc
+sd
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
ED
ED
ED
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -39740,25 +40012,25 @@ aa
aa
aa
ED
-Fa
-Fa
-Fa
-Fh
-Fh
-Fh
-Fh
+jO
+pU
+pU
+pW
+pW
+pW
+pU
Hy
HH
HH
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+uH
+vo
+vr
+ED
+uH
+vo
+vr
+ED
aa
aa
aa
@@ -39997,25 +40269,25 @@ aa
aa
aa
ED
-Fb
-Fa
-FV
-FB
-Fh
-Fh
-Fh
+oU
+pU
+qH
+qF
+pW
+pW
+pU
Hz
HH
HH
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+uI
+uN
+vy
+ED
+uI
+uN
+vy
+ED
aa
aa
aa
@@ -40254,25 +40526,25 @@ aa
aa
aa
ED
-Fc
-Fa
-EZ
-FB
-Fh
-Fh
-Fh
+oV
+pU
+qI
+qF
+pW
+pW
+sY
Hz
HH
HH
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+uG
+uN
+vs
+ED
+uG
+uN
+vs
+ED
aa
aa
aa
@@ -40511,25 +40783,25 @@ aa
aa
aa
ED
-Fc
-Fa
-FW
-FB
-Fh
-Fh
-Fh
+px
+pU
+rb
+qF
+pW
+pW
+sZ
Hy
HH
HH
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+tm
+tm
+tm
+ED
+tm
+tm
+tm
+ED
aa
aa
aa
@@ -40768,25 +41040,25 @@ aa
aa
aa
ED
-Fa
-Fa
-FX
-FB
-Fh
-Fh
-Hj
+py
+pU
+rc
+qF
+pW
+pW
+ta
ED
ED
ED
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+uK
+tm
+vt
+ED
+wf
+tm
+vt
+ED
aa
aa
aa
@@ -41025,26 +41297,26 @@ aa
aa
aa
ED
-Fd
-FA
-FY
-FB
-Fh
-Fh
-Fh
+pz
+pV
+rY
+qF
+pW
+pW
+pU
+ED
+ED
+ED
+ED
+ED
+vq
+ED
+ED
+ED
+wg
+ED
+ED
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -41282,13 +41554,25 @@ aa
aa
aa
ED
-Fe
-Fh
-Fh
-Fh
-Fh
-Fh
-Fh
+pA
+pW
+pW
+pW
+pW
+pW
+pU
+tk
+pU
+tZ
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+tZ
+wh
ED
aa
aa
@@ -41299,18 +41583,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
KH
KU
Lb
@@ -41539,13 +41811,25 @@ aa
aa
aa
ED
-Ff
-Fh
-Fh
-Fh
-Fh
-Fh
-FB
+pB
+pW
+pW
+pW
+pW
+pW
+pU
+tk
+pU
+pU
+pU
+pU
+vp
+pU
+pU
+pU
+pU
+pU
+wi
ED
aa
aa
@@ -41555,18 +41839,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
KH
KH
KS
@@ -41796,26 +42068,26 @@ aa
aa
aa
ED
-Fg
-Fh
-Fh
-Fh
-Fh
-FB
-Hk
+pC
+pW
+pW
+pW
+pW
+pW
+tb
+ED
+ED
+ub
+ED
+ED
+ED
+vz
+ED
+ED
+ED
+wj
+ED
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -42053,26 +42325,26 @@ aa
aa
aa
ED
-Fh
-FB
-Fh
-Fh
-Fh
-Fh
-FB
+pD
+qF
+pW
+pW
+pW
+pW
+tc
+ED
+tY
+tm
+ug
+ED
+tY
+tm
+we
+ED
+tY
+tm
+wk
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -42310,26 +42582,26 @@ aa
aa
aa
ED
-Fi
-Fi
-Fi
-Fi
-GB
-GB
-Hl
+pE
+qF
+pW
+pW
+pW
+pW
+td
+ED
+tW
+uc
+tm
+ED
+tW
+uc
+tm
+ED
+tW
+uc
+tm
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -42567,26 +42839,26 @@ aa
aa
aa
ED
-Fj
-Fi
-Fi
-Fi
-Fi
-GZ
-Hm
+pS
+qF
+pW
+pW
+pW
+pW
+td
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -42824,6 +43096,777 @@ aa
aa
aa
ED
+pS
+qF
+pW
+pW
+pW
+pW
+tj
+ED
+ED
+ED
+ED
+ED
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(115,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ED
+pT
+pU
+pU
+pU
+sb
+sb
+sb
+tl
+ua
+uf
+uh
+ED
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(116,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ED
+Fj
+Fi
+Fi
+Fi
+Fi
+GZ
+Hm
+ED
+ED
+ED
+ED
+ED
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(117,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ED
Fi
Fi
FZ
@@ -42890,7 +43933,7 @@ aa
aa
aa
"}
-(115,1,1) = {"
+(118,1,1) = {"
aa
aa
aa
@@ -43147,7 +44190,7 @@ aa
aa
aa
"}
-(116,1,1) = {"
+(119,1,1) = {"
aa
aa
aa
@@ -43404,7 +44447,7 @@ aa
aa
aa
"}
-(117,1,1) = {"
+(120,1,1) = {"
aa
aa
aa
@@ -43661,777 +44704,6 @@ aa
aa
aa
"}
-(118,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ED
-ED
-ED
-ED
-ED
-ED
-ED
-ED
-ED
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(119,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(120,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
(121,1,1) = {"
aa
aa
@@ -44622,15 +44894,15 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
+ED
aa
aa
aa
diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin_syndicate_dropship.dmm
new file mode 100644
index 0000000000..d635953737
--- /dev/null
+++ b/_maps/shuttles/ruin_syndicate_dropship.dmm
@@ -0,0 +1,656 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"al" = (
+/obj/machinery/airalarm/syndicate{
+ dir = 4;
+ pixel_x = -24
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/caravan/syndicate3)
+"bo" = (
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = -24
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/caravan/syndicate3)
+"bB" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/machinery/button/door{
+ id = "caravansyndicate3_bolt_starboard";
+ name = "External Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = -24;
+ pixel_y = -6;
+ req_access_txt = "150";
+ specialfunctions = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/caravan/syndicate3)
+"bN" = (
+/obj/machinery/power/smes{
+ charge = 5e+006
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-4"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/caravan/syndicate3)
+"cB" = (
+/turf/open/floor/plasteel/vault{
+ dir = 5
+ },
+/area/shuttle/caravan/syndicate3)
+"dZ" = (
+/obj/structure/shuttle/engine/propulsion/burst{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/caravan/syndicate3)
+"gl" = (
+/obj/machinery/door/airlock/hatch{
+ id_tag = "caravansyndicate3_bolt_port";
+ name = "External Airlock";
+ normalspeed = 0;
+ req_access_txt = "150"
+ },
+/obj/docking_port/mobile{
+ dir = 2;
+ dwidth = 6;
+ height = 7;
+ id = "caravansyndicate3";
+ name = "Syndicate Drop Ship";
+ port_direction = 8;
+ preferred_direction = 4;
+ timid = 1;
+ width = 15
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/plating,
+/area/shuttle/caravan/syndicate3)
+"ha" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/structure/cable,
+/obj/machinery/power/port_gen/pacman{
+ anchored = 1
+ },
+/obj/item/wrench,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/caravan/syndicate3)
+"hF" = (
+/obj/structure/chair,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/obj/machinery/power/apc/syndicate{
+ dir = 8;
+ name = "Syndicate Drop Ship APC";
+ pixel_x = -24
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/pod/dark,
+/area/shuttle/caravan/syndicate3)
+"ka" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/pod/dark,
+/area/shuttle/caravan/syndicate3)
+"mJ" = (
+/obj/structure/shuttle/engine/propulsion/burst/left{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/caravan/syndicate3)
+"ns" = (
+/obj/structure/table/reinforced,
+/obj/machinery/button/door{
+ id = "caravansyndicate3_bridge";
+ name = "Bridge Blast Door Control";
+ pixel_x = -16;
+ pixel_y = 5;
+ req_access_txt = "150"
+ },
+/obj/machinery/button/door{
+ id = "caravansyndicate3_bolt_bridge";
+ name = "Bridge Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = -16;
+ pixel_y = -5;
+ req_access_txt = "150";
+ specialfunctions = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/darkred/side{
+ dir = 6
+ },
+/area/shuttle/caravan/syndicate3)
+"qE" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/syndicate{
+ anchored = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/caravan/syndicate3)
+"rz" = (
+/obj/machinery/computer/shuttle/caravan/syndicate3{
+ dir = 8
+ },
+/turf/open/floor/plasteel/darkred/side{
+ dir = 8
+ },
+/area/shuttle/caravan/syndicate3)
+"rU" = (
+/obj/structure/grille,
+/obj/structure/window/plastitanium,
+/obj/machinery/door/poddoor{
+ id = "caravansyndicate3_bridge"
+ },
+/turf/open/floor/plating,
+/area/shuttle/caravan/syndicate3)
+"rV" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/pod/dark,
+/area/shuttle/caravan/syndicate3)
+"sb" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/syndicate3{
+ dir = 8
+ },
+/turf/open/floor/plasteel/darkred/side{
+ dir = 10
+ },
+/area/shuttle/caravan/syndicate3)
+"sn" = (
+/obj/structure/chair,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/pod/dark,
+/area/shuttle/caravan/syndicate3)
+"ss" = (
+/turf/open/floor/plasteel/darkred/side{
+ dir = 1
+ },
+/area/shuttle/caravan/syndicate3)
+"uy" = (
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plasteel/darkred/side{
+ dir = 10
+ },
+/area/shuttle/caravan/syndicate3)
+"vw" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/firstaid/regular,
+/obj/item/assembly/flash/handheld,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/darkred/side{
+ dir = 5
+ },
+/area/shuttle/caravan/syndicate3)
+"vQ" = (
+/obj/structure/shuttle/engine/propulsion/burst/right{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/caravan/syndicate3)
+"wH" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/caravan/syndicate3)
+"xC" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/machinery/button/door{
+ id = "caravansyndicate3_bolt_port";
+ name = "External Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = -24;
+ pixel_y = 6;
+ req_access_txt = "150";
+ specialfunctions = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/caravan/syndicate3)
+"BQ" = (
+/turf/open/floor/plasteel/darkred/side,
+/area/shuttle/caravan/syndicate3)
+"Cm" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -26
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/pod/dark,
+/area/shuttle/caravan/syndicate3)
+"Dt" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/syndicate/personal{
+ anchored = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/caravan/syndicate3)
+"Dx" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/vault{
+ dir = 5
+ },
+/area/shuttle/caravan/syndicate3)
+"EO" = (
+/obj/structure/chair,
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/pod/dark,
+/area/shuttle/caravan/syndicate3)
+"Fa" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/syndicate{
+ anchored = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/caravan/syndicate3)
+"Gx" = (
+/obj/machinery/airalarm/syndicate{
+ dir = 4;
+ pixel_x = -24
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/caravan/syndicate3)
+"HJ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/sign/warning/vacuum{
+ pixel_y = -32
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/syndicate{
+ anchored = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/caravan/syndicate3)
+"HM" = (
+/obj/structure/chair/office/dark{
+ dir = 4
+ },
+/mob/living/simple_animal/hostile/syndicate{
+ environment_smash = 0;
+ name = "Syndicate Salvage Pilot"
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/caravan/syndicate3)
+"Ij" = (
+/obj/structure/chair/office/dark{
+ dir = 4
+ },
+/obj/machinery/turretid{
+ ailock = 1;
+ control_area = null;
+ desc = "A specially designed set of turret controls. Looks to be covered in protective casing to prevent AI interfacing.";
+ icon_state = "control_kill";
+ lethal = 1;
+ name = "Shuttle turret control";
+ pixel_y = 34;
+ req_access = null;
+ req_access_txt = "150"
+ },
+/turf/open/floor/plasteel/darkred/corner{
+ dir = 4
+ },
+/area/shuttle/caravan/syndicate3)
+"IR" = (
+/obj/effect/mapping_helpers/airlock/locked,
+/obj/machinery/door/airlock/hatch{
+ id_tag = "caravansyndicate3_bolt_bridge";
+ name = "Bridge";
+ req_access_txt = "150"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plasteel/vault{
+ dir = 5
+ },
+/area/shuttle/caravan/syndicate3)
+"Jv" = (
+/turf/template_noop,
+/area/template_noop)
+"KS" = (
+/obj/machinery/door/airlock/hatch{
+ id_tag = "caravansyndicate3_bolt_starboard";
+ name = "External Airlock";
+ normalspeed = 0;
+ req_access_txt = "150"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/caravan/syndicate3)
+"Lq" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/closet/syndicate{
+ anchored = 1
+ },
+/obj/structure/sign/warning/vacuum{
+ pixel_y = 32
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/caravan/syndicate3)
+"NH" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/closet/syndicate/personal{
+ anchored = 1
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/caravan/syndicate3)
+"Pt" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/closet/crate,
+/obj/machinery/power/terminal{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/item/stack/sheet/metal/twenty,
+/obj/item/stack/sheet/glass{
+ amount = 10
+ },
+/obj/item/stack/sheet/mineral/plastitanium{
+ amount = 20
+ },
+/obj/item/storage/box/lights/bulbs,
+/obj/item/storage/toolbox/mechanical,
+/obj/item/stack/sheet/mineral/plasma{
+ amount = 20
+ },
+/turf/open/floor/plating,
+/area/shuttle/caravan/syndicate3)
+"PL" = (
+/obj/machinery/porta_turret/syndicate/energy{
+ dir = 2;
+ icon_state = "standard_lethal";
+ mode = 1
+ },
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/caravan/syndicate3)
+"Rj" = (
+/obj/machinery/porta_turret/syndicate/energy{
+ dir = 1;
+ icon_state = "standard_lethal";
+ mode = 1
+ },
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/caravan/syndicate3)
+"Sl" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/emergency,
+/obj/item/wrench,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/darkred/side{
+ dir = 9
+ },
+/area/shuttle/caravan/syndicate3)
+"Tn" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/caravan/syndicate3)
+"UD" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/darkred/side,
+/area/shuttle/caravan/syndicate3)
+"US" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/darkred/side{
+ dir = 1
+ },
+/area/shuttle/caravan/syndicate3)
+"Vf" = (
+/obj/machinery/door/airlock/hatch{
+ name = "Ready Room";
+ req_access_txt = "150"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/turf/open/floor/plasteel/vault{
+ dir = 5
+ },
+/area/shuttle/caravan/syndicate3)
+"Wr" = (
+/obj/structure/chair/office/dark{
+ dir = 4
+ },
+/turf/open/floor/plasteel/darkred/corner,
+/area/shuttle/caravan/syndicate3)
+"YU" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/structure/closet/syndicate{
+ anchored = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/caravan/syndicate3)
+"ZB" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/caravan/syndicate3)
+"ZJ" = (
+/turf/open/floor/plasteel/dark,
+/area/shuttle/caravan/syndicate3)
+"ZK" = (
+/obj/machinery/computer/crew{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/darkred/side{
+ dir = 9
+ },
+/area/shuttle/caravan/syndicate3)
+"ZZ" = (
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = -24
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/caravan/syndicate3)
+
+(1,1,1) = {"
+Jv
+mJ
+dZ
+dZ
+dZ
+vQ
+Jv
+"}
+(2,1,1) = {"
+ZB
+wH
+wH
+wH
+wH
+wH
+ZB
+"}
+(3,1,1) = {"
+Tn
+Tn
+bN
+Pt
+ha
+Tn
+Tn
+"}
+(4,1,1) = {"
+Tn
+hF
+US
+ZJ
+BQ
+ka
+Tn
+"}
+(5,1,1) = {"
+Tn
+EO
+ss
+cB
+BQ
+Cm
+Tn
+"}
+(6,1,1) = {"
+Tn
+sn
+ss
+cB
+UD
+rV
+Tn
+"}
+(7,1,1) = {"
+Tn
+NH
+Fa
+cB
+qE
+Dt
+Tn
+"}
+(8,1,1) = {"
+Rj
+Tn
+Tn
+Vf
+Tn
+Tn
+PL
+"}
+(9,1,1) = {"
+gl
+xC
+al
+cB
+bo
+bB
+KS
+"}
+(10,1,1) = {"
+Tn
+Lq
+YU
+Dx
+qE
+HJ
+Tn
+"}
+(11,1,1) = {"
+Tn
+Tn
+Tn
+IR
+Tn
+Tn
+Tn
+"}
+(12,1,1) = {"
+Tn
+uy
+Gx
+cB
+ZZ
+Sl
+Tn
+"}
+(13,1,1) = {"
+rU
+ns
+Ij
+HM
+Wr
+vw
+rU
+"}
+(14,1,1) = {"
+rU
+rU
+sb
+rz
+ZK
+rU
+rU
+"}
+(15,1,1) = {"
+Jv
+rU
+rU
+rU
+rU
+rU
+Jv
+"}
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index a1a1a25724..a05aaf3265 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -56,6 +56,8 @@
#define FIRE_SPREAD_RADIOSITY_SCALE 0.85
#define FIRE_GROWTH_RATE 40000 //For small fires
#define PLASMA_MINIMUM_BURN_TEMPERATURE (100+T0C)
+#define PLASMA_UPPER_TEMPERATURE (1370+T0C)
+#define PLASMA_OXYGEN_FULLBURN 10
//GASES
#define MIN_TOXIC_GAS_DAMAGE 1
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index 512e2cc4d9..a5aa63e6a1 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -138,11 +138,14 @@
#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items.
#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool
#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location.
-#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into)
+#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE)
#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool
/*******Non-Signal Component Related Defines*******/
+//Redirection component init flags
+#define REDIRECT_TRANSFER_WITH_TURF 1
+
//Arch
#define ARCH_PROB "probability" //Probability for each item
#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index f871ac6a44..8513f40577 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -10,13 +10,9 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define DF_USE_TAG (1<<0)
#define DF_VAR_EDITED (1<<1)
-//FLAGS BITMASK
-#define STOPSPRESSUREDMAGE_1 (1<<0) //This flag is used on the flags_1 variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere
-//To successfully stop you taking all pressure damage you must have both a suit and head item with this flag.
-
#define NODROP_1 (1<<1) // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted.
#define NOBLUDGEON_1 (1<<2) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
-#define MASKINTERNALS_1 (1<<3) // mask allows internals
+
#define HEAR_1 (1<<4) // This flag is what recursive_hear_check() uses to determine wether to add an item to the hearer list or not.
#define CHECK_RICOCHET_1 (1<<5) // Projectiels will check ricochet on things impacted that have this.
#define CONDUCT_1 (1<<6) // conducts electricity (metal etc.)
@@ -25,11 +21,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define OVERLAY_QUEUED_1 (1<<8) // atom queued to SSoverlay
#define ON_BORDER_1 (1<<9) // item has priority to check when entering or leaving
-#define NOSLIP_1 (1<<10) //prevents from slipping on wet floors, in space etc
-
-// BLOCK_GAS_SMOKE_EFFECT_1 only used in masks at the moment.
-#define BLOCK_GAS_SMOKE_EFFECT_1 (1<<12) // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
-#define THICKMATERIAL_1 (1<<13) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body.
#define DROPDEL_1 (1<<14) // When dropped, it calls qdel on itself
#define PREVENT_CLICK_UNDER_1 (1<<15) //Prevent clicking things below it on the same turf eg. doors/ fulltile windows
@@ -57,9 +48,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
// Stops you from putting things like an RCD or other items into an ORM or protolathe for materials.
#define NO_MAT_REDEMPTION_2 (1<<10)
-// LAVA_PROTECT used on the flags_2 variable for both SUIT and HEAD items, and stops lava damage. Must be present in both to stop lava damage.
-#define LAVA_PROTECT_2 (1<<11)
-
//turf-only flags
#define NOJAUNT_1 (1<<0)
#define UNUSED_TRANSIT_TURF_1 (1<<1)
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index beea132890..7ad5041344 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -14,76 +14,76 @@
#define STORAGE_VIEW_DEPTH 2
//ITEM INVENTORY SLOT BITMASKS
-#define SLOT_OCLOTHING (1<<0)
-#define SLOT_ICLOTHING (1<<1)
-#define SLOT_GLOVES (1<<2)
-#define SLOT_EYES (1<<3)
-#define SLOT_EARS (1<<4)
-#define SLOT_MASK (1<<5)
-#define SLOT_HEAD (1<<6)
-#define SLOT_FEET (1<<7)
-#define SLOT_ID (1<<8)
-#define SLOT_BELT (1<<9)
-#define SLOT_BACK (1<<10)
-#define SLOT_POCKET (1<<11) // this is to allow items with a w_class of WEIGHT_CLASS_NORMAL or WEIGHT_CLASS_BULKY to fit in pockets.
-#define SLOT_DENYPOCKET (1<<12) // this is to deny items with a w_class of WEIGHT_CLASS_SMALL or WEIGHT_CLASS_TINY to fit in pockets.
-#define SLOT_NECK (1<<13)
+#define ITEM_SLOT_OCLOTHING (1<<0)
+#define ITEM_SLOT_ICLOTHING (1<<1)
+#define ITEM_SLOT_GLOVES (1<<2)
+#define ITEM_SLOT_EYES (1<<3)
+#define ITEM_SLOT_EARS (1<<4)
+#define ITEM_SLOT_MASK (1<<5)
+#define ITEM_SLOT_HEAD (1<<6)
+#define ITEM_SLOT_FEET (1<<7)
+#define ITEM_SLOT_ID (1<<8)
+#define ITEM_SLOT_BELT (1<<9)
+#define ITEM_SLOT_BACK (1<<10)
+#define ITEM_SLOT_POCKET (1<<11) // this is to allow items with a w_class of WEIGHT_CLASS_NORMAL or WEIGHT_CLASS_BULKY to fit in pockets.
+#define ITEM_SLOT_DENYPOCKET (1<<12) // this is to deny items with a w_class of WEIGHT_CLASS_SMALL or WEIGHT_CLASS_TINY to fit in pockets.
+#define ITEM_SLOT_NECK (1<<13)
//SLOTS
-#define slot_back 1
-#define slot_wear_mask 2
-#define slot_handcuffed 3
-#define slot_hands 4 //wherever you provide a slot for hands you provide slot_hands
- //slot_hands as a slot will pick ANY available hand
-#define slot_belt 5
-#define slot_wear_id 6
-#define slot_ears 7
-#define slot_glasses 8
-#define slot_gloves 9
-#define slot_neck 10
-#define slot_head 11
-#define slot_shoes 12
-#define slot_wear_suit 13
-#define slot_w_uniform 14
-#define slot_l_store 15
-#define slot_r_store 16
-#define slot_s_store 17
-#define slot_in_backpack 18
-#define slot_legcuffed 19
-#define slot_generic_dextrous_storage 20
+#define SLOT_BACK 1
+#define SLOT_WEAR_MASK 2
+#define SLOT_HANDCUFFED 3
+#define SLOT_HANDS 4 //wherever you provide a slot for hands you provide SLOT_HANDS
+ //SLOT_HANDS as a slot will pick ANY available hand
+#define SLOT_BELT 5
+#define SLOT_WEAR_ID 6
+#define SLOT_EARS 7
+#define SLOT_GLASSES 8
+#define SLOT_GLOVES 9
+#define SLOT_NECK 10
+#define SLOT_HEAD 11
+#define SLOT_SHOES 12
+#define SLOT_WEAR_SUIT 13
+#define SLOT_W_UNIFORM 14
+#define SLOT_L_STORE 15
+#define SLOT_R_STORE 16
+#define SLOT_S_STORE 17
+#define SLOT_IN_BACKPACK 18
+#define SLOT_LEGCUFFED 19
+#define SLOT_GENERC_DEXTROUS_STORAGE 20
-#define slots_amt 20 // Keep this up to date!
+#define SLOTS_AMT 20 // Keep this up to date!
//I hate that this has to exist
/proc/slotdefine2slotbit(slotdefine) //Keep this up to date with the value of SLOT BITMASKS and SLOTS (the two define sections above)
. = 0
switch(slotdefine)
- if(slot_back)
- . = SLOT_BACK
- if(slot_wear_mask)
- . = SLOT_MASK
- if(slot_neck)
- . = SLOT_NECK
- if(slot_belt)
- . = SLOT_BELT
- if(slot_wear_id)
- . = SLOT_ID
- if(slot_ears)
- . = SLOT_EARS
- if(slot_glasses)
- . = SLOT_EYES
- if(slot_gloves)
- . = SLOT_GLOVES
- if(slot_head)
- . = SLOT_HEAD
- if(slot_shoes)
- . = SLOT_FEET
- if(slot_wear_suit)
- . = SLOT_OCLOTHING
- if(slot_w_uniform)
- . = SLOT_ICLOTHING
- if(slot_l_store, slot_r_store)
- . = SLOT_POCKET
+ if(SLOT_BACK)
+ . = ITEM_SLOT_BACK
+ if(SLOT_WEAR_MASK)
+ . = ITEM_SLOT_MASK
+ if(SLOT_NECK)
+ . = ITEM_SLOT_NECK
+ if(SLOT_BELT)
+ . = ITEM_SLOT_BELT
+ if(SLOT_WEAR_ID)
+ . = ITEM_SLOT_ID
+ if(SLOT_EARS)
+ . = ITEM_SLOT_EARS
+ if(SLOT_GLASSES)
+ . = ITEM_SLOT_EYES
+ if(SLOT_GLOVES)
+ . = ITEM_SLOT_GLOVES
+ if(SLOT_HEAD)
+ . = ITEM_SLOT_HEAD
+ if(SLOT_SHOES)
+ . = ITEM_SLOT_FEET
+ if(SLOT_WEAR_SUIT)
+ . = ITEM_SLOT_OCLOTHING
+ if(SLOT_W_UNIFORM)
+ . = ITEM_SLOT_ICLOTHING
+ if(SLOT_L_STORE, SLOT_R_STORE)
+ . = ITEM_SLOT_POCKET
//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses.
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index 9350116635..9f0fdc27b2 100644
--- a/code/__DEFINES/layers.dm
+++ b/code/__DEFINES/layers.dm
@@ -6,6 +6,7 @@
#define PLANE_SPACE -95
#define PLANE_SPACE_PARALLAX -90
+#define FLOOR_PLANE -2
#define GAME_PLANE -1
#define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals
#define SPACE_LAYER 1.8
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 3267a43d5a..391d55fe59 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -378,7 +378,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define BEAT_SLOW 2
#define BEAT_NONE 0
-//http://www.byond.com/docs/ref/info.html#/atom/var/mouse_opacity
+//https://secure.byond.com/docs/ref/info.html#/atom/var/mouse_opacity
#define MOUSE_OPACITY_TRANSPARENT 0
#define MOUSE_OPACITY_ICON 1
#define MOUSE_OPACITY_OPAQUE 2
@@ -445,3 +445,8 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define NO_INIT_PARAMETER "no-init"
#define EGG_LAYING_MESSAGES list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")
+
+// Used by PDA and cartridge code to reduce repetitiveness of spritesheets
+#define PDAIMG(what) {" "}
+//Filters
+#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA")
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 15033fcf48..64a4089543 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -258,7 +258,7 @@
// Roundstart trait system
-#define MAX_TRAITS 6 //The maximum amount of traits one character can have at roundstart
+#define MAX_QUIRKS 6 //The maximum amount of quirks one character can have at roundstart
// AI Toggles
#define AI_CAMERA_LUMINOSITY 5
diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm
index bfbf6f866a..1f4739491a 100644
--- a/code/__DEFINES/obj_flags.dm
+++ b/code/__DEFINES/obj_flags.dm
@@ -18,3 +18,12 @@
#define IN_INVENTORY (1<<1) //is this item equipped into an inventory slot or hand of a mob? used for tooltips
#define FORCE_STRING_OVERRIDE (1<<2) // used for tooltips
#define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use.
+
+// Flags for the clothing_flags var on /obj/item/clothing
+
+#define LAVAPROTECT (1<<0)
+#define STOPSPRESSUREDAMAGE (1<<1) //SUIT and HEAD items which stop pressure damage. To stop you taking all pressure damage you must have both a suit and head item with this flag.
+#define BLOCK_GAS_SMOKE_EFFECT (1<<2) // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
+#define MASKINTERNALS (1<<3) // mask allows internals
+#define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc
+#define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body.
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 7ba693be0a..0dc8a38899 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -64,6 +64,7 @@
#define EXP_TYPE_ANTAG "Antag"
#define EXP_TYPE_SPECIAL "Special"
#define EXP_TYPE_GHOST "Ghost"
+#define EXP_TYPE_ADMIN "Admin"
//Flags in the players table in the db
#define DB_FLAG_EXEMPT 1
diff --git a/code/__DEFINES/server_tools.dm b/code/__DEFINES/server_tools.dm
deleted file mode 100644
index a1764880c3..0000000000
--- a/code/__DEFINES/server_tools.dm
+++ /dev/null
@@ -1,128 +0,0 @@
-// /tg/station 13 server tools API
-#define SERVICE_API_VERSION_STRING "3.2.0.2"
-
-//CONFIGURATION
-//use this define if you want to do configuration outside of this file
-#ifndef SERVER_TOOLS_EXTERNAL_CONFIGURATION
-//Comment this out once you've filled in the below
-#error /tg/station server tools interface unconfigured
-
-//Required interfaces (fill in with your codebase equivalent):
-
-//create a global variable named `Name` and set it to `Value`
-//These globals must not be modifiable from anywhere outside of the server tools
-#define SERVER_TOOLS_DEFINE_AND_SET_GLOBAL(Name, Value)
-//Read the value in the global variable `Name`
-#define SERVER_TOOLS_READ_GLOBAL(Name)
-//Set the value in the global variable `Name` to `Value`
-#define SERVER_TOOLS_WRITE_GLOBAL(Name, Value)
-//display an announcement `message` from the server to all players
-#define SERVER_TOOLS_WORLD_ANNOUNCE(message)
-//Write a string `message` to a server log
-#define SERVER_TOOLS_LOG(message)
-//Notify current in-game administrators of a string `event`
-#define SERVER_TOOLS_NOTIFY_ADMINS(event)
-//The current amount of connected clients
-#define SERVER_TOOLS_CLIENT_COUNT
-#endif
-
-//Required hooks:
-
-//Put this somewhere in /world/New() that is always run
-#define SERVER_TOOLS_ON_NEW ServiceInit()
-//Put this somewhere in /world/Topic(T, Addr, Master, Keys) that is always run before T is modified
-#define SERVER_TOOLS_ON_TOPIC var/service_topic_return = ServiceCommand(params2list(T)); if(service_topic_return) return service_topic_return
-//Put at the beginning of world/Reboot(reason)
-#define SERVER_TOOLS_ON_REBOOT ServiceReboot()
-
-//Optional callable functions:
-
-//Returns the string version of the API
-#define SERVER_TOOLS_API_VERSION ServiceAPIVersion()
-//Returns TRUE if the world was launched under the server tools and the API matches, FALSE otherwise
-//No function below this succeed if this is FALSE
-#define SERVER_TOOLS_PRESENT RunningService()
-//Gets the current version of the service running the server
-#define SERVER_TOOLS_VERSION ServiceVersion()
-//Forces a hard reboot of BYOND by ending the process
-//unlike del(world) clients will try to reconnect
-//If the service has not requested a shutdown, the world will reboot shortly after
-#define SERVER_TOOLS_REBOOT_BYOND world.ServiceEndProcess()
-/*
- Gets the list of any testmerged github pull requests
-
- "[PR Number]" => list(
- "title" -> PR title
- "commit" -> Full hash of commit merged
- "author" -> Github username of the author of the PR
- )
-*/
-#define SERVER_TOOLS_PR_LIST GetTestMerges()
-//Sends a message to connected game chats
-#define SERVER_TOOLS_CHAT_BROADCAST(message) world.ChatBroadcast(message)
-//Sends a message to connected admin chats
-#define SERVER_TOOLS_RELAY_BROADCAST(message) world.AdminBroadcast(message)
-
-//IMPLEMENTATION
-
-#define REBOOT_MODE_NORMAL 0
-#define REBOOT_MODE_HARD 1
-#define REBOOT_MODE_SHUTDOWN 2
-
-#define SERVICE_WORLD_PARAM "server_service"
-#define SERVICE_VERSION_PARAM "server_service_version"
-#define SERVICE_INSTANCE_PARAM "server_instance"
-#define SERVICE_PR_TEST_JSON "prtestjob.json"
-#define SERVICE_INTERFACE_DLL "TGDreamDaemonBridge.dll"
-#define SERVICE_INTERFACE_FUNCTION "DDEntryPoint"
-
-#define SERVICE_CMD_HARD_REBOOT "hard_reboot"
-#define SERVICE_CMD_GRACEFUL_SHUTDOWN "graceful_shutdown"
-#define SERVICE_CMD_WORLD_ANNOUNCE "world_announce"
-#define SERVICE_CMD_LIST_CUSTOM "list_custom_commands"
-#define SERVICE_CMD_API_COMPATIBLE "api_compat"
-#define SERVICE_CMD_PLAYER_COUNT "client_count"
-
-#define SERVICE_CMD_PARAM_KEY "serviceCommsKey"
-#define SERVICE_CMD_PARAM_COMMAND "command"
-#define SERVICE_CMD_PARAM_SENDER "sender"
-#define SERVICE_CMD_PARAM_CUSTOM "custom"
-
-#define SERVICE_JSON_PARAM_HELPTEXT "help_text"
-#define SERVICE_JSON_PARAM_ADMINONLY "admin_only"
-#define SERVICE_JSON_PARAM_REQUIREDPARAMETERS "required_parameters"
-
-#define SERVICE_REQUEST_KILL_PROCESS "killme"
-#define SERVICE_REQUEST_IRC_BROADCAST "irc"
-#define SERVICE_REQUEST_IRC_ADMIN_CHANNEL_MESSAGE "send2irc"
-#define SERVICE_REQUEST_WORLD_REBOOT "worldreboot"
-#define SERVICE_REQUEST_API_VERSION "api_ver"
-
-#define SERVICE_RETURN_SUCCESS "SUCCESS"
-
-/*
-The MIT License
-
-Copyright (c) 2017 Jordan Brown
-
-Permission is hereby granted, free of charge,
-to any person obtaining a copy of this software and
-associated documentation files (the "Software"), to
-deal in the Software without restriction, including
-without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom
-the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
-ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 36b25bf6c6..9b49ec2e9d 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -1,7 +1,7 @@
//Update this whenever the db schema changes
//make sure you add an update to the schema_version stable in the db changelog
#define DB_MAJOR_VERSION 4
-#define DB_MINOR_VERSION 1
+#define DB_MINOR_VERSION 2
//Timing subsystem
//Don't run if there is an identical unique timer active
@@ -56,7 +56,7 @@
#define INIT_ORDER_RESEARCH 14
#define INIT_ORDER_EVENTS 13
#define INIT_ORDER_JOBS 12
-#define INIT_ORDER_TRAITS 11
+#define INIT_ORDER_QUIRKS 11
#define INIT_ORDER_TICKER 10
#define INIT_ORDER_MAPPING 9
#define INIT_ORDER_NETWORKS 8
@@ -82,6 +82,7 @@
// Subsystem fire priority, from lowest to highest priority
// If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child)
+#define FIRE_PRIORITY_PING 10
#define FIRE_PRIORITY_IDLE_NPC 10
#define FIRE_PRIORITY_SERVER_MAINT 10
#define FIRE_PRIORITY_RESEARCH 10
diff --git a/code/__DEFINES/tgs.config.dm b/code/__DEFINES/tgs.config.dm
new file mode 100644
index 0000000000..00cbae7629
--- /dev/null
+++ b/code/__DEFINES/tgs.config.dm
@@ -0,0 +1,19 @@
+#define TGS_EXTERNAL_CONFIGURATION
+#define TGS_DEFINE_AND_SET_GLOBAL(Name, Value) GLOBAL_VAR_INIT(##Name, ##Value); GLOBAL_PROTECT(##Name)
+#define TGS_READ_GLOBAL(Name) GLOB.##Name
+#define TGS_WRITE_GLOBAL(Name, Value) GLOB.##Name = ##Value
+#define TGS_WORLD_ANNOUNCE(message) to_chat(world, "[html_encode(##message)] ")
+#define TGS_INFO_LOG(message) log_world("TGS: Info: [##message]")
+#define TGS_ERROR_LOG(message) log_world("TGS: Error: [##message]")
+#define TGS_NOTIFY_ADMINS(event) message_admins(##event)
+#define TGS_CLIENT_COUNT GLOB.clients.len
+#define TGS_PROTECT_DATUM(Path)\
+##Path/can_vv_get(var_name){\
+ return FALSE;\
+}\
+##Path/vv_edit_var(var_name, var_value){\
+ return FALSE;\
+}\
+##Path/CanProcCall(procname){\
+ return FALSE;\
+}
diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm
new file mode 100644
index 0000000000..651be685c5
--- /dev/null
+++ b/code/__DEFINES/tgs.dm
@@ -0,0 +1,202 @@
+//tgstation-server DMAPI
+
+//All functions and datums outside this document are subject to change with any version and should not be relied on
+
+//CONFIGURATION
+
+//create this define if you want to do configuration outside of this file
+#ifndef TGS_EXTERNAL_CONFIGURATION
+
+//Comment this out once you've filled in the below
+#error TGS API unconfigured
+
+//Required interfaces (fill in with your codebase equivalent):
+
+//create a global variable named `Name` and set it to `Value`
+//These globals must not be modifiable from anywhere outside of the server tools
+#define TGS_DEFINE_AND_SET_GLOBAL(Name, Value)
+
+//Read the value in the global variable `Name`
+#define TGS_READ_GLOBAL(Name)
+
+//Set the value in the global variable `Name` to `Value`
+#define TGS_WRITE_GLOBAL(Name, Value)
+
+//Disallow ANYONE from reflecting a given `path`, security measure to prevent in-game priveledge escalation
+#define TGS_PROTECT_DATUM(Path)
+
+//display an announcement `message` from the server to all players
+#define TGS_WORLD_ANNOUNCE(message)
+
+//Notify current in-game administrators of a string `event`
+#define TGS_NOTIFY_ADMINS(event)
+
+//Write an info `message` to a server log
+#define TGS_INFO_LOG(message)
+
+//Write an error `message` to a server log
+#define TGS_ERROR_LOG(message)
+
+//Get the number of connected /clients
+#define TGS_CLIENT_COUNT
+
+#endif
+
+//EVENT CODES
+
+//TODO
+
+//REQUIRED HOOKS
+
+//Call this somewhere in /world/New() that is always run
+//event_handler: optional user defined event handler. The default behaviour is to broadcast the event in english to all connected admin channels
+/world/proc/TgsNew(datum/tgs_event_handler/event_handler)
+ return
+
+//Call this when your initializations are complete and your game is ready to play before any player interactions happen
+//This may use world.sleep_offline to make this happen so ensure no changes are made to it while this call is running
+/world/proc/TgsInitializationComplete()
+ return
+
+//Put this somewhere in /world/Topic(T, Addr, Master, Keys) that is always run before T is modified
+#define TGS_TOPIC var/tgs_topic_return = TgsTopic(T); if(tgs_topic_return) return tgs_topic_return
+
+//Call this at the beginning of world/Reboot(reason)
+/world/proc/TgsReboot()
+ return
+
+//DATUM DEFINITIONS
+//unless otherwise specified all datums defined here should be considered read-only, warranty void if written
+
+//represents git revision information about the current world build
+/datum/tgs_revision_information
+ var/commit //full sha of compiled commit
+ var/origin_commit //full sha of last known remote commit. This may be null if the TGS repository is not currently tracking a remote branch
+
+//represents a merge of a GitHub pull request
+/datum/tgs_revision_information/test_merge
+ var/number //pull request number
+ var/title //pull request title
+ var/body //pull request body
+ var/author //pull request github author
+ var/url //link to pull request html
+ var/pull_request_commit //commit of the pull request when it was merged
+ var/time_merged //timestamp of when the merge commit for the pull request was created
+ var/comment //optional comment left by the one who initiated the test merge
+
+//represents a connected chat channel
+/datum/tgs_chat_channel
+ var/id //internal channel representation
+ var/friendly_name //user friendly channel name
+ var/server_name //server name the channel resides on
+ var/provider_name //chat provider for the channel
+ var/is_admin_channel //if the server operator has marked this channel for game admins only
+ var/is_private_channel //if this is a private chat channel
+
+//represents a chat user
+/datum/tgs_chat_user
+ var/id //Internal user representation
+ var/friendly_name //The user's public name
+ var/mention //The text to use to ping this user in a message
+ var/datum/tgs_chat_channel/channel //The /datum/tgs_chat_channel this user was from
+
+//user definable callback for handling events
+/datum/tgs_event_handler/proc/HandleEvent(event_code)
+ return
+
+//user definable chat command
+/datum/tgs_chat_command
+ var/name = "" //the string to trigger this command on a chat bot. e.g. TGS3_BOT: do_this_command
+ var/help_text = "" //help text for this command
+ var/admin_only = FALSE //set to TRUE if this command should only be usable by registered chat admins
+
+//override to implement command
+//sender: The tgs_chat_user who send to command
+//params: The trimmed string following the command name
+//The return value will be stringified and sent to the appropriate chat
+/datum/tgs_chat_command/proc/Run(datum/tgs_chat_user/sender, params)
+ CRASH("[type] has no implementation for Run()")
+
+//FUNCTIONS
+
+//Returns the respective string version of the API
+/world/proc/TgsMaximumAPIVersion()
+ return
+
+/world/proc/TgsMinimumAPIVersion()
+ return
+
+//Gets the current version of the server tools running the server
+/world/proc/TgsVersion()
+ return
+
+//Returns TRUE if the world was launched under the server tools and the API matches, FALSE otherwise
+//No function below this succeeds if it returns FALSE
+/world/proc/TgsAvailable()
+ return
+
+/world/proc/TgsInstanceName()
+ return
+
+//Get the current `/datum/tgs_revision_information`
+/world/proc/TgsRevision()
+ return
+
+//Gets a list of active `/datum/tgs_revision_information/test_merge`s
+/world/proc/TgsTestMerges()
+ return
+
+//Forces a hard reboot of BYOND by ending the process
+//unlike del(world) clients will try to reconnect
+//If the service has not requested a shutdown, the next server will take over
+/world/proc/TgsEndProcess()
+ return
+
+//Gets a list of connected tgs_chat_channel
+/world/proc/TgsChatChannelInfo()
+ return
+
+//Sends a message to connected game chats
+//message: The message to send
+//channels: optional channels to limit the broadcast to
+/world/proc/TgsChatBroadcast(message, list/channels)
+ return
+
+//Send a message to non-admin connected chats
+//message: The message to send
+//admin_only: If TRUE, message will instead be sent to only admin connected chats
+/world/proc/TgsTargetedChatBroadcast(message, admin_only)
+ return
+
+//Send a private message to a specific user
+//message: The message to send
+//user: The /datum/tgs_chat_user to send to
+/world/proc/TgsChatPrivateMessage(message, datum/tgs_chat_user/user)
+ return
+
+/*
+The MIT License
+
+Copyright (c) 2017 Jordan Brown
+
+Permission is hereby granted, free of charge,
+to any person obtaining a copy of this software and
+associated documentation files (the "Software"), to
+deal in the Software without restriction, including
+without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom
+the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 94606273be..384e65bdcb 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -68,6 +68,7 @@
#define MAGIC_TRAIT "magic"
#define TRAUMA_TRAIT "trauma"
#define SPECIES_TRAIT "species"
+#define ORGAN_TRAIT "organ"
#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention
// unique trait sources, still defines
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index 6585aebd36..48e2baac6e 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -128,6 +128,9 @@
/proc/log_qdel(text)
WRITE_LOG(GLOB.world_qdel_log, "QDEL: [text]")
+/proc/log_query_debug(text)
+ WRITE_LOG(GLOB.query_debug_log, "SQL: [text]")
+
/* Log to both DD and the logfile. */
/proc/log_world(text)
WRITE_LOG(GLOB.world_runtime_log, text)
diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm
index 3446a750ee..26af8b4489 100644
--- a/code/__HELPERS/pronouns.dm
+++ b/code/__HELPERS/pronouns.dm
@@ -188,55 +188,55 @@
/mob/living/carbon/human/p_they(capitalized, temp_gender)
var/list/obscured = check_obscured_slots()
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
- if((slot_w_uniform in obscured) && skipface)
+ if((SLOT_W_UNIFORM in obscured) && skipface)
temp_gender = PLURAL
return ..()
/mob/living/carbon/human/p_their(capitalized, temp_gender)
var/list/obscured = check_obscured_slots()
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
- if((slot_w_uniform in obscured) && skipface)
+ if((SLOT_W_UNIFORM in obscured) && skipface)
temp_gender = PLURAL
return ..()
/mob/living/carbon/human/p_them(capitalized, temp_gender)
var/list/obscured = check_obscured_slots()
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
- if((slot_w_uniform in obscured) && skipface)
+ if((SLOT_W_UNIFORM in obscured) && skipface)
temp_gender = PLURAL
return ..()
/mob/living/carbon/human/p_have(temp_gender)
var/list/obscured = check_obscured_slots()
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
- if((slot_w_uniform in obscured) && skipface)
+ if((SLOT_W_UNIFORM in obscured) && skipface)
temp_gender = PLURAL
return ..()
/mob/living/carbon/human/p_are(temp_gender)
var/list/obscured = check_obscured_slots()
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
- if((slot_w_uniform in obscured) && skipface)
+ if((SLOT_W_UNIFORM in obscured) && skipface)
temp_gender = PLURAL
return ..()
/mob/living/carbon/human/p_were(temp_gender)
var/list/obscured = check_obscured_slots()
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
- if((slot_w_uniform in obscured) && skipface)
+ if((SLOT_W_UNIFORM in obscured) && skipface)
temp_gender = PLURAL
return ..()
/mob/living/carbon/human/p_do(temp_gender)
var/list/obscured = check_obscured_slots()
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
- if((slot_w_uniform in obscured) && skipface)
+ if((SLOT_W_UNIFORM in obscured) && skipface)
temp_gender = PLURAL
return ..()
/mob/living/carbon/human/p_s(temp_gender)
var/list/obscured = check_obscured_slots()
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
- if((slot_w_uniform in obscured) && skipface)
+ if((SLOT_W_UNIFORM in obscured) && skipface)
temp_gender = PLURAL
return ..()
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index f16745979c..4a0be437c3 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -290,19 +290,26 @@
parts += "[GLOB.TAB]Nobody died this shift! "
return parts.Join(" ")
-/datum/controller/subsystem/ticker/proc/show_roundend_report(client/C,common_report, popcount)
- var/list/report_parts = list()
-
- report_parts += personal_report(C, popcount)
- report_parts += common_report
+/client/proc/roundend_report_file()
+ return "data/roundend_reports/[ckey].html"
+/datum/controller/subsystem/ticker/proc/show_roundend_report(client/C, previous = FALSE)
var/datum/browser/roundend_report = new(C, "roundend")
roundend_report.width = 800
roundend_report.height = 600
- roundend_report.set_content(report_parts.Join())
+ var/content
+ var/filename = C.roundend_report_file()
+ if(!previous)
+ var/list/report_parts = list(personal_report(C), GLOB.common_report)
+ content = report_parts.Join()
+ C.verbs -= /client/proc/show_previous_roundend_report
+ fdel(filename)
+ text2file(content, filename)
+ else
+ content = file2text(filename)
+ roundend_report.set_content(content)
roundend_report.stylesheets = list()
- roundend_report.add_stylesheet("roundend",'html/browser/roundend.css')
-
+ roundend_report.add_stylesheet("roundend", 'html/browser/roundend.css')
roundend_report.open(0)
/datum/controller/subsystem/ticker/proc/personal_report(client/C, popcount)
@@ -327,8 +334,6 @@
else
parts += "
"
parts += " "
- if(!GLOB.survivor_report)
- GLOB.survivor_report = survivor_report(popcount)
parts += GLOB.survivor_report
parts += "
"
@@ -336,8 +341,9 @@
/datum/controller/subsystem/ticker/proc/display_report(popcount)
GLOB.common_report = build_roundend_report()
+ GLOB.survivor_report = survivor_report(popcount)
for(var/client/C in GLOB.clients)
- show_roundend_report(C,GLOB.common_report, popcount)
+ show_roundend_report(C, FALSE)
give_show_report_button(C)
CHECK_TICK
@@ -359,7 +365,7 @@
for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots)
borg_num--
if(robo.mind)
- robolist += "[robo.name] (Played by: [robo.mind.key] )[robo.stat ? " (Deactivated) " : ""][borg_num ?", ":""] "
+ robolist += "[robo.name] (Played by: [robo.mind.key] )[robo.stat == DEAD ? " (Deactivated) " : ""][borg_num ?", ":""] "
parts += "[robolist]"
if(!borg_spacer)
borg_spacer = TRUE
@@ -458,7 +464,7 @@
/datum/action/report/Trigger()
if(owner && GLOB.common_report && SSticker.current_state == GAME_STATE_FINISHED)
- SSticker.show_roundend_report(owner.client,GLOB.common_report)
+ SSticker.show_roundend_report(owner.client, FALSE)
/datum/action/report/IsAvailable()
return 1
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index a840d6144a..2db7b8bc78 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -698,7 +698,7 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
var/macro = lowertext(copytext(string, next_backslash + 1, next_space))
var/rest = next_backslash > leng ? "" : copytext(string, next_space + 1)
- //See http://www.byond.com/docs/ref/info.html#/DM/text/macros
+ //See https://secure.byond.com/docs/ref/info.html#/DM/text/macros
switch(macro)
//prefixes/agnostic
if("the")
@@ -766,4 +766,3 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
return "twelfth"
else
return "[number]\th"
-
\ No newline at end of file
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 79f6a2c007..1f788cf445 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -400,25 +400,25 @@
/proc/slot2body_zone(slot)
switch(slot)
- if(slot_back, slot_wear_suit, slot_w_uniform, slot_belt, slot_wear_id)
+ if(SLOT_BACK, SLOT_WEAR_SUIT, SLOT_W_UNIFORM, SLOT_BELT, SLOT_WEAR_ID)
return BODY_ZONE_CHEST
- if(slot_gloves, slot_hands, slot_handcuffed)
+ if(SLOT_GLOVES, SLOT_HANDS, SLOT_HANDCUFFED)
return pick(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND)
- if(slot_head, slot_neck, slot_neck, slot_ears)
+ if(SLOT_HEAD, SLOT_NECK, SLOT_NECK, SLOT_EARS)
return BODY_ZONE_HEAD
- if(slot_wear_mask)
+ if(SLOT_WEAR_MASK)
return BODY_ZONE_PRECISE_MOUTH
- if(slot_glasses)
+ if(SLOT_GLASSES)
return BODY_ZONE_PRECISE_EYES
- if(slot_shoes)
+ if(SLOT_SHOES)
return pick(BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT)
- if(slot_legcuffed)
+ if(SLOT_LEGCUFFED)
return pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
//adapted from http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/
diff --git a/code/_compile_options.dm b/code/_compile_options.dm
index 8e2c03238d..67bbe24e38 100644
--- a/code/_compile_options.dm
+++ b/code/_compile_options.dm
@@ -30,7 +30,7 @@
#define MIN_COMPILER_VERSION 512
#if DM_VERSION < MIN_COMPILER_VERSION
//Don't forget to update this part
-#error Your version of BYOND is too out-of-date to compile this project. Go to byond.com/download and update.
+#error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update.
#error You need version 512 or higher
#endif
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index 168863708c..aad1622a52 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -106,17 +106,15 @@ GLOBAL_LIST_INIT(bitfields, list(
"REAGENT_NOREACT" = REAGENT_NOREACT
),
"flags_1" = list(
- "STOPSPRESSUREDMAGE_1 / NOJAUNT_1 (turfs)" = STOPSPRESSUREDMAGE_1,
+ "NOJAUNT_1" = NOJAUNT_1,
"NODROP_1 / UNUSED_TRANSIT_TURF_1 (turfs)" = NODROP_1,
"NOBLUDGEON_1 / CAN_BE_DIRTY_1 (turfs)" = NOBLUDGEON_1,
- "MASKINTERNALS_1" = MASKINTERNALS_1,
"HEAR_1 / NO_DEATHRATTLE_1 (turfs)" = HEAR_1,
"CHECK_RICOCHET_1 / NO_RUINS_1 (turfs)" = CHECK_RICOCHET_1,
"CONDUCT_1 / NO_LAVA_GEN_1" = CONDUCT_1,
"ABSTRACT_1" = ABSTRACT_1,
"NODECONSTRUCT_1" = NODECONSTRUCT_1,
"OVERLAY_QUEUED_1" = OVERLAY_QUEUED_1,
- "NOSLIP_1" = NOSLIP_1
),
"flags_2" = list(
"SLOWS_WHILE_IN_HAND_2" = SLOWS_WHILE_IN_HAND_2,
@@ -127,7 +125,14 @@ GLOBAL_LIST_INIT(bitfields, list(
"HEALS_EARS_2" = HEALS_EARS_2,
"OMNITONGUE_2" = OMNITONGUE_2,
"TESLA_IGNORE_2" = TESLA_IGNORE_2,
- "NO_MAT_REDEMPTION_2" = NO_MAT_REDEMPTION_2,
- "LAVA_PROTECT_2" = LAVA_PROTECT_2
- )
+ "NO_MAT_REDEMPTION_2" = NO_MAT_REDEMPTION_2
+ ),
+ "clothing_flags" = list(
+ "LAVAPROTECT" = LAVAPROTECT,
+ "STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE,
+ "BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT,
+ "MASKINTERNALS" = MASKINTERNALS,
+ "NOSLIP" = NOSLIP,
+ "THICKMATERIAL" = THICKMATERIAL,
+ )
))
diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm
index f580eab3d5..7c5715e1bb 100644
--- a/code/_globalvars/configuration.dm
+++ b/code/_globalvars/configuration.dm
@@ -1,6 +1,6 @@
GLOBAL_REAL(config, /datum/controller/configuration)
-GLOBAL_DATUM_INIT(revdata, /datum/getrev, new)
+GLOBAL_DATUM(revdata, /datum/getrev)
GLOBAL_VAR(host)
GLOBAL_VAR(station_name)
diff --git a/code/_globalvars/lists/typecache.dm b/code/_globalvars/lists/typecache.dm
index f1e2b03790..f4e73f2994 100644
--- a/code/_globalvars/lists/typecache.dm
+++ b/code/_globalvars/lists/typecache.dm
@@ -10,3 +10,5 @@ GLOBAL_LIST_INIT(typecache_living, typecacheof(/mob/living))
GLOBAL_LIST_INIT(typecache_machine_or_structure, typecacheof(list(/obj/machinery, /obj/structure)))
GLOBAL_LIST_INIT(typecache_shuttle_area, typecacheof(/area/shuttle))
+
+GLOBAL_LIST_INIT(typecache_clothing, typecacheof(/obj/item/clothing))
diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm
index ff397785d8..545ffbcbef 100644
--- a/code/_globalvars/logging.dm
+++ b/code/_globalvars/logging.dm
@@ -20,6 +20,8 @@ GLOBAL_VAR(world_pda_log)
GLOBAL_PROTECT(world_pda_log)
GLOBAL_VAR(world_manifest_log)
GLOBAL_PROTECT(world_manifest_log)
+GLOBAL_VAR(query_debug_log)
+GLOBAL_PROTECT(query_debug_log)
GLOBAL_LIST_EMPTY(bombers)
GLOBAL_PROTECT(bombers)
diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm
index b6708b266d..8e39d96bf6 100644
--- a/code/_onclick/hud/drones.dm
+++ b/code/_onclick/hud/drones.dm
@@ -8,7 +8,7 @@
inv_box.icon_state = "suit_storage"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_drone_storage
- inv_box.slot_id = slot_generic_dextrous_storage
+ inv_box.slot_id = SLOT_GENERC_DEXTROUS_STORAGE
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -17,7 +17,7 @@
inv_box.icon_state = "mask"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_drone_head
- inv_box.slot_id = slot_head
+ inv_box.slot_id = SLOT_HEAD
static_inventory += inv_box
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm
index dc57c2b25c..628efbffe5 100644
--- a/code/_onclick/hud/guardian.dm
+++ b/code/_onclick/hud/guardian.dm
@@ -45,7 +45,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "suit_storage"
inv_box.screen_loc = ui_id
- inv_box.slot_id = slot_generic_dextrous_storage
+ inv_box.slot_id = SLOT_GENERC_DEXTROUS_STORAGE
static_inventory += inv_box
using = new /obj/screen/guardian/Communicate()
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index e5de695789..e4318059d6 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -33,7 +33,7 @@
var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys
var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...)
var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...)
- var/list/inv_slots[slots_amt] // /obj/screen/inventory objects, ordered by their slot ID.
+ var/list/inv_slots[SLOTS_AMT] // /obj/screen/inventory objects, ordered by their slot ID.
var/list/hand_slots // /obj/screen/inventory/hand objects, assoc list of "[held_index]" = object
var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object
@@ -196,7 +196,9 @@
screenmob.client.screen -= infodisplay
for(var/thing in plane_masters)
- screenmob.client.screen += plane_masters[thing]
+ var/obj/screen/plane_master/PM = plane_masters[thing]
+ PM.backdrop(screenmob)
+ screenmob.client.screen += PM
hud_version = display_hud_version
persistent_inventory_update(screenmob)
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 501c5fb601..2ac0f14f95 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -139,7 +139,7 @@
inv_box = new /obj/screen/inventory()
inv_box.name = "i_clothing"
inv_box.icon = ui_style
- inv_box.slot_id = slot_w_uniform
+ inv_box.slot_id = SLOT_W_UNIFORM
inv_box.icon_state = "uniform"
inv_box.screen_loc = ui_iclothing
toggleable_inventory += inv_box
@@ -147,7 +147,7 @@
inv_box = new /obj/screen/inventory()
inv_box.name = "o_clothing"
inv_box.icon = ui_style
- inv_box.slot_id = slot_wear_suit
+ inv_box.slot_id = SLOT_WEAR_SUIT
inv_box.icon_state = "suit"
inv_box.screen_loc = ui_oclothing
toggleable_inventory += inv_box
@@ -171,7 +171,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "id"
inv_box.screen_loc = ui_id
- inv_box.slot_id = slot_wear_id
+ inv_box.slot_id = SLOT_WEAR_ID
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -179,7 +179,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "mask"
inv_box.screen_loc = ui_mask
- inv_box.slot_id = slot_wear_mask
+ inv_box.slot_id = SLOT_WEAR_MASK
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -187,7 +187,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "neck"
inv_box.screen_loc = ui_neck
- inv_box.slot_id = slot_neck
+ inv_box.slot_id = SLOT_NECK
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -195,7 +195,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "back"
inv_box.screen_loc = ui_back
- inv_box.slot_id = slot_back
+ inv_box.slot_id = SLOT_BACK
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -203,7 +203,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "pocket"
inv_box.screen_loc = ui_storage1
- inv_box.slot_id = slot_l_store
+ inv_box.slot_id = SLOT_L_STORE
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -211,7 +211,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "pocket"
inv_box.screen_loc = ui_storage2
- inv_box.slot_id = slot_r_store
+ inv_box.slot_id = SLOT_R_STORE
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -219,7 +219,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "suit_storage"
inv_box.screen_loc = ui_sstore1
- inv_box.slot_id = slot_s_store
+ inv_box.slot_id = SLOT_S_STORE
static_inventory += inv_box
using = new /obj/screen/resist()
@@ -254,7 +254,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "gloves"
inv_box.screen_loc = ui_gloves
- inv_box.slot_id = slot_gloves
+ inv_box.slot_id = SLOT_GLOVES
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -262,7 +262,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "glasses"
inv_box.screen_loc = ui_glasses
- inv_box.slot_id = slot_glasses
+ inv_box.slot_id = SLOT_GLASSES
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -270,7 +270,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "ears"
inv_box.screen_loc = ui_ears
- inv_box.slot_id = slot_ears
+ inv_box.slot_id = SLOT_EARS
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -278,7 +278,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "head"
inv_box.screen_loc = ui_head
- inv_box.slot_id = slot_head
+ inv_box.slot_id = SLOT_HEAD
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -286,7 +286,7 @@
inv_box.icon = ui_style
inv_box.icon_state = "shoes"
inv_box.screen_loc = ui_shoes
- inv_box.slot_id = slot_shoes
+ inv_box.slot_id = SLOT_SHOES
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -295,7 +295,7 @@
inv_box.icon_state = "belt"
// inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_belt
- inv_box.slot_id = slot_belt
+ inv_box.slot_id = SLOT_BELT
static_inventory += inv_box
throw_icon = new /obj/screen/throw_catch()
diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm
index 06dbf15cd7..c469c1ef20 100644
--- a/code/_onclick/hud/monkey.dm
+++ b/code/_onclick/hud/monkey.dm
@@ -1,155 +1,155 @@
-/datum/hud/monkey/New(mob/living/carbon/monkey/owner, ui_style = 'icons/mob/screen_midnight.dmi')
- ..()
- var/obj/screen/using
- var/obj/screen/inventory/inv_box
-
- action_intent = new /obj/screen/act_intent()
- action_intent.icon = ui_style
- action_intent.icon_state = mymob.a_intent
- action_intent.screen_loc = ui_acti
- static_inventory += action_intent
-
- using = new /obj/screen/mov_intent()
- using.icon = ui_style
- using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
- using.screen_loc = ui_movi
- static_inventory += using
-
- using = new/obj/screen/language_menu
- using.icon = ui_style
- static_inventory += using
-
- using = new /obj/screen/drop()
- using.icon = ui_style
- using.screen_loc = ui_drop_throw
- static_inventory += using
-
- build_hand_slots(ui_style)
-
- using = new /obj/screen/swap_hand()
- using.icon = ui_style
- using.icon_state = "swap_1_m" //extra wide!
- using.screen_loc = ui_swaphand_position(owner,1)
- static_inventory += using
-
- using = new /obj/screen/swap_hand()
- using.icon = ui_style
- using.icon_state = "swap_2"
- using.screen_loc = ui_swaphand_position(owner,2)
- static_inventory += using
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "mask"
- inv_box.icon = ui_style
- inv_box.icon_state = "mask"
-// inv_box.icon_full = "template"
- inv_box.screen_loc = ui_monkey_mask
- inv_box.slot_id = slot_wear_mask
- static_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "neck"
- inv_box.icon = ui_style
- inv_box.icon_state = "neck"
-// inv_box.icon_full = "template"
- inv_box.screen_loc = ui_monkey_neck
- inv_box.slot_id = slot_neck
- static_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "head"
- inv_box.icon = ui_style
- inv_box.icon_state = "head"
-// inv_box.icon_full = "template"
- inv_box.screen_loc = ui_monkey_head
- inv_box.slot_id = slot_head
- static_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "back"
- inv_box.icon = ui_style
- inv_box.icon_state = "back"
- inv_box.screen_loc = ui_monkey_back
- inv_box.slot_id = slot_back
- static_inventory += inv_box
-
- throw_icon = new /obj/screen/throw_catch()
- throw_icon.icon = ui_style
- throw_icon.screen_loc = ui_drop_throw
- hotkeybuttons += throw_icon
-
- internals = new /obj/screen/internals()
- infodisplay += internals
-
- healths = new /obj/screen/healths()
- infodisplay += healths
-
- pull_icon = new /obj/screen/pull()
- pull_icon.icon = ui_style
- pull_icon.update_icon(mymob)
- pull_icon.screen_loc = ui_pull_resist
- static_inventory += pull_icon
-
- lingchemdisplay = new /obj/screen/ling/chems()
- infodisplay += lingchemdisplay
-
- lingstingdisplay = new /obj/screen/ling/sting()
- infodisplay += lingstingdisplay
-
-
- zone_select = new /obj/screen/zone_sel()
- zone_select.icon = ui_style
- zone_select.update_icon(mymob)
- static_inventory += zone_select
-
- mymob.client.screen = list()
-
- using = new /obj/screen/resist()
- using.icon = ui_style
- using.screen_loc = ui_pull_resist
- hotkeybuttons += using
-
- for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
- if(inv.slot_id)
- inv.hud = src
- inv_slots[inv.slot_id] = inv
- inv.update_icon()
-
-/datum/hud/monkey/persistent_inventory_update()
- if(!mymob)
- return
- var/mob/living/carbon/monkey/M = mymob
-
- if(hud_shown)
- if(M.back)
- M.back.screen_loc = ui_monkey_back
- M.client.screen += M.back
- if(M.wear_mask)
- M.wear_mask.screen_loc = ui_monkey_mask
- M.client.screen += M.wear_mask
- if(M.wear_neck)
- M.wear_neck.screen_loc = ui_monkey_neck
- M.client.screen += M.wear_neck
- if(M.head)
- M.head.screen_loc = ui_monkey_head
- M.client.screen += M.head
- else
- if(M.back)
- M.back.screen_loc = null
- if(M.wear_mask)
- M.wear_mask.screen_loc = null
- if(M.head)
- M.head.screen_loc = null
-
- if(hud_version != HUD_STYLE_NOHUD)
- for(var/obj/item/I in M.held_items)
- I.screen_loc = ui_hand_position(M.get_held_index_of_item(I))
- M.client.screen += I
- else
- for(var/obj/item/I in M.held_items)
- I.screen_loc = null
- M.client.screen -= I
-
-/mob/living/carbon/monkey/create_mob_hud()
- if(client && !hud_used)
- hud_used = new /datum/hud/monkey(src, ui_style2icon(client.prefs.UI_style))
+/datum/hud/monkey/New(mob/living/carbon/monkey/owner, ui_style = 'icons/mob/screen_midnight.dmi')
+ ..()
+ var/obj/screen/using
+ var/obj/screen/inventory/inv_box
+
+ action_intent = new /obj/screen/act_intent()
+ action_intent.icon = ui_style
+ action_intent.icon_state = mymob.a_intent
+ action_intent.screen_loc = ui_acti
+ static_inventory += action_intent
+
+ using = new /obj/screen/mov_intent()
+ using.icon = ui_style
+ using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
+ using.screen_loc = ui_movi
+ static_inventory += using
+
+ using = new/obj/screen/language_menu
+ using.icon = ui_style
+ static_inventory += using
+
+ using = new /obj/screen/drop()
+ using.icon = ui_style
+ using.screen_loc = ui_drop_throw
+ static_inventory += using
+
+ build_hand_slots(ui_style)
+
+ using = new /obj/screen/swap_hand()
+ using.icon = ui_style
+ using.icon_state = "swap_1_m" //extra wide!
+ using.screen_loc = ui_swaphand_position(owner,1)
+ static_inventory += using
+
+ using = new /obj/screen/swap_hand()
+ using.icon = ui_style
+ using.icon_state = "swap_2"
+ using.screen_loc = ui_swaphand_position(owner,2)
+ static_inventory += using
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "mask"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "mask"
+// inv_box.icon_full = "template"
+ inv_box.screen_loc = ui_monkey_mask
+ inv_box.slot_id = SLOT_WEAR_MASK
+ static_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "neck"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "neck"
+// inv_box.icon_full = "template"
+ inv_box.screen_loc = ui_monkey_neck
+ inv_box.slot_id = SLOT_NECK
+ static_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "head"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "head"
+// inv_box.icon_full = "template"
+ inv_box.screen_loc = ui_monkey_head
+ inv_box.slot_id = SLOT_HEAD
+ static_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "back"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "back"
+ inv_box.screen_loc = ui_monkey_back
+ inv_box.slot_id = SLOT_BACK
+ static_inventory += inv_box
+
+ throw_icon = new /obj/screen/throw_catch()
+ throw_icon.icon = ui_style
+ throw_icon.screen_loc = ui_drop_throw
+ hotkeybuttons += throw_icon
+
+ internals = new /obj/screen/internals()
+ infodisplay += internals
+
+ healths = new /obj/screen/healths()
+ infodisplay += healths
+
+ pull_icon = new /obj/screen/pull()
+ pull_icon.icon = ui_style
+ pull_icon.update_icon(mymob)
+ pull_icon.screen_loc = ui_pull_resist
+ static_inventory += pull_icon
+
+ lingchemdisplay = new /obj/screen/ling/chems()
+ infodisplay += lingchemdisplay
+
+ lingstingdisplay = new /obj/screen/ling/sting()
+ infodisplay += lingstingdisplay
+
+
+ zone_select = new /obj/screen/zone_sel()
+ zone_select.icon = ui_style
+ zone_select.update_icon(mymob)
+ static_inventory += zone_select
+
+ mymob.client.screen = list()
+
+ using = new /obj/screen/resist()
+ using.icon = ui_style
+ using.screen_loc = ui_pull_resist
+ hotkeybuttons += using
+
+ for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
+ if(inv.slot_id)
+ inv.hud = src
+ inv_slots[inv.slot_id] = inv
+ inv.update_icon()
+
+/datum/hud/monkey/persistent_inventory_update()
+ if(!mymob)
+ return
+ var/mob/living/carbon/monkey/M = mymob
+
+ if(hud_shown)
+ if(M.back)
+ M.back.screen_loc = ui_monkey_back
+ M.client.screen += M.back
+ if(M.wear_mask)
+ M.wear_mask.screen_loc = ui_monkey_mask
+ M.client.screen += M.wear_mask
+ if(M.wear_neck)
+ M.wear_neck.screen_loc = ui_monkey_neck
+ M.client.screen += M.wear_neck
+ if(M.head)
+ M.head.screen_loc = ui_monkey_head
+ M.client.screen += M.head
+ else
+ if(M.back)
+ M.back.screen_loc = null
+ if(M.wear_mask)
+ M.wear_mask.screen_loc = null
+ if(M.head)
+ M.head.screen_loc = null
+
+ if(hud_version != HUD_STYLE_NOHUD)
+ for(var/obj/item/I in M.held_items)
+ I.screen_loc = ui_hand_position(M.get_held_index_of_item(I))
+ M.client.screen += I
+ else
+ for(var/obj/item/I in M.held_items)
+ I.screen_loc = null
+ M.client.screen -= I
+
+/mob/living/carbon/monkey/create_mob_hud()
+ if(client && !hud_used)
+ hud_used = new /datum/hud/monkey(src, ui_style2icon(client.prefs.UI_style))
diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm
index bc3df4de83..8592383a4f 100755
--- a/code/_onclick/hud/parallax.dm
+++ b/code/_onclick/hud/parallax.dm
@@ -167,6 +167,8 @@
/datum/hud/proc/update_parallax()
var/client/C = mymob.client
var/turf/posobj = get_turf(C.eye)
+ if(!posobj)
+ return
var/area/areaobj = posobj.loc
// Update the movement direction of the parallax if necessary (for shuttles)
diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm
index f0c56b84ac..d4559ed66d 100644
--- a/code/_onclick/hud/plane_master.dm
+++ b/code/_onclick/hud/plane_master.dm
@@ -12,16 +12,27 @@
/obj/screen/plane_master/proc/Hide(override)
alpha = override || hide_alpha
-//Why do plane masters need a backdrop sometimes? Read http://www.byond.com/forum/?post=2141928
+//Why do plane masters need a backdrop sometimes? Read https://secure.byond.com/forum/?post=2141928
//Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong.
/obj/screen/plane_master/proc/backdrop(mob/mymob)
+/obj/screen/plane_master/floor
+ name = "floor plane master"
+ plane = FLOOR_PLANE
+ appearance_flags = PLANE_MASTER
+ blend_mode = BLEND_OVERLAY
+
/obj/screen/plane_master/game_world
name = "game world plane master"
plane = GAME_PLANE
appearance_flags = PLANE_MASTER //should use client color
blend_mode = BLEND_OVERLAY
+/obj/screen/plane_master/game_world/backdrop(mob/mymob)
+ filters = list()
+ if(istype(mymob) && mymob.client && mymob.client.prefs && mymob.client.prefs.ambientocclusion)
+ filters += AMBIENT_OCCLUSION
+
/obj/screen/plane_master/lighting
name = "lighting plane master"
plane = LIGHTING_PLANE
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 0b895cb600..02ece81b41 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -264,7 +264,7 @@
var/obj/item/clothing/mask/M = C.wear_mask
if(M.mask_adjusted) // if mask on face but pushed down
M.adjustmask(C) // adjust it back
- if( !(M.flags_1 & MASKINTERNALS_1) )
+ if( !(M.clothing_flags & MASKINTERNALS) )
to_chat(C, "You are not wearing an internals mask! ")
return
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index eb5f623035..a060cbb834 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -99,7 +99,7 @@
//stops TK grabs being equipped anywhere but into hands
/obj/item/tk_grab/equipped(mob/user, slot)
- if(slot == slot_hands)
+ if(slot == SLOT_HANDS)
return
qdel(src)
return
diff --git a/code/controllers/configuration/entries/dbconfig.dm b/code/controllers/configuration/entries/dbconfig.dm
index c9dbdb4f54..1eb1186a8b 100644
--- a/code/controllers/configuration/entries/dbconfig.dm
+++ b/code/controllers/configuration/entries/dbconfig.dm
@@ -4,7 +4,7 @@
/datum/config_entry/string/address
config_entry_value = "localhost"
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
-
+
/datum/config_entry/number/port
config_entry_value = 3306
min_val = 0
@@ -24,3 +24,8 @@
/datum/config_entry/string/feedback_tableprefix
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
+
+/datum/config_entry/number/query_debug_log_timeout
+ config_entry_value = 70
+ min_val = 1
+ protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index 2b1e9bcda9..0cc0c622d7 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -199,11 +199,14 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
// Sort subsystems by display setting for easy access.
sortTim(subsystems, /proc/cmp_subsystem_display)
// Set world options.
- if(sleep_offline_after_initializations)
- world.sleep_offline = TRUE
world.fps = CONFIG_GET(number/fps)
var/initialized_tod = REALTIMEOFDAY
+
+ world.TgsInitializationComplete()
+ if(sleep_offline_after_initializations)
+ world.sleep_offline = TRUE
sleep(1)
+
if(sleep_offline_after_initializations && CONFIG_GET(flag/resume_after_initializations))
world.sleep_offline = FALSE
initializations_finished_with_no_players_logged_in = initialized_tod < REALTIMEOFDAY - 10
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index ce4e6ee271..a46a283254 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -29,7 +29,8 @@ SUBSYSTEM_DEF(air)
var/list/obj/machinery/atmos_machinery = list()
var/list/pipe_init_dirs_cache = list()
-
+ //atmos singletons
+ var/list/gas_reactions = list()
//Special functions lists
var/list/turf/active_super_conductivity = list()
diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm
index fd27c9424f..7285298283 100644
--- a/code/controllers/subsystem/assets.dm
+++ b/code/controllers/subsystem/assets.dm
@@ -6,9 +6,10 @@ SUBSYSTEM_DEF(assets)
var/list/preload = list()
/datum/controller/subsystem/assets/Initialize(timeofday)
- for(var/type in typesof(/datum/asset) - list(/datum/asset, /datum/asset/simple))
- var/datum/asset/A = new type()
- A.register()
+ for(var/type in typesof(/datum/asset))
+ var/datum/asset/A = type
+ if (type != initial(A._abstract))
+ get_asset_datum(type)
preload = cache.Copy() //don't preload assets generated during the round
diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm
index 0609b78d99..fd780e030c 100644
--- a/code/controllers/subsystem/dbcore.dm
+++ b/code/controllers/subsystem/dbcore.dm
@@ -231,10 +231,24 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table
to_chat(usr, "A SQL error occurred during this operation, check the server logs. ")
/datum/DBQuery/proc/Execute(sql_query = sql, cursor_handler = default_cursor, log_error = TRUE)
+ var/start_time
+ var/timeout = CONFIG_GET(number/query_debug_log_timeout)
+ if(timeout)
+ start_time = REALTIMEOFDAY
Close()
. = _dm_db_execute(_db_query, sql_query, db_connection._db_con, cursor_handler, null)
if(!. && log_error)
log_sql("[ErrorMsg()] | Query used: [sql]")
+ if(timeout)
+ if((REALTIMEOFDAY - start_time) > timeout)
+ log_query_debug("Query execution started at [start_time]")
+ log_query_debug("Query execution ended at [REALTIMEOFDAY]")
+ log_query_debug("Possible slow query timeout detected.")
+ log_query_debug("Query used: [sql]")
+ slow_query_check()
+
+/datum/DBQuery/proc/slow_query_check()
+ message_admins("HEY! A database query may have timed out. Did the server just hang? \[YES\] |\[NO\] ")
/datum/DBQuery/proc/NextRow()
return _dm_db_next_row(_db_query,item,conversions)
diff --git a/code/controllers/subsystem/ping.dm b/code/controllers/subsystem/ping.dm
new file mode 100644
index 0000000000..2cf88bc7ad
--- /dev/null
+++ b/code/controllers/subsystem/ping.dm
@@ -0,0 +1,32 @@
+SUBSYSTEM_DEF(ping)
+ name = "Ping"
+ priority = FIRE_PRIORITY_PING
+ wait = 3 SECONDS
+ flags = SS_NO_INIT
+
+ var/list/currentrun = list()
+
+/datum/controller/subsystem/ping/stat_entry()
+ ..("P:[GLOB.clients.len]")
+
+
+/datum/controller/subsystem/ping/fire(resumed = 0)
+ if (!resumed)
+ src.currentrun = GLOB.clients.Copy()
+
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+
+ while (currentrun.len)
+ var/client/C = currentrun[currentrun.len]
+ currentrun.len--
+
+ if (!C || !C.chatOutput || !C.chatOutput.loaded)
+ if (MC_TICK_CHECK)
+ return
+ continue
+
+ // softPang isn't handled anywhere but it'll always reset the opts.lastPang.
+ C.chatOutput.ehjax_send(data = C.is_afk(29) ? "softPang" : "pang")
+ if (MC_TICK_CHECK)
+ return
diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm
new file mode 100644
index 0000000000..cec8b2832b
--- /dev/null
+++ b/code/controllers/subsystem/processing/quirks.dm
@@ -0,0 +1,34 @@
+//Used to process and handle roundstart quirks
+// - Quirk strings are used for faster checking in code
+// - Quirk datums are stored and hold different effects, as well as being a vector for applying trait string
+PROCESSING_SUBSYSTEM_DEF(quirks)
+ name = "Quirks"
+ init_order = INIT_ORDER_QUIRKS
+ flags = SS_BACKGROUND
+ wait = 10
+ runlevels = RUNLEVEL_GAME
+
+ var/list/quirks = list() //Assoc. list of all roundstart quirk datum types; "name" = /path/
+ var/list/quirk_points = list() //Assoc. list of quirk names and their "point cost"; positive numbers are good traits, and negative ones are bad
+ var/list/quirk_objects = list() //A list of all quirk objects in the game, since some may process
+
+/datum/controller/subsystem/processing/quirks/Initialize(timeofday)
+ if(!quirks.len)
+ SetupQuirks()
+ ..()
+
+/datum/controller/subsystem/processing/quirks/proc/SetupQuirks()
+ for(var/V in subtypesof(/datum/quirk))
+ var/datum/quirk/T = V
+ quirks[initial(T.name)] = T
+ quirk_points[initial(T.name)] = initial(T.value)
+
+/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects)
+ GenerateQuirks(cli)
+ for(var/V in cli.prefs.character_quirks)
+ user.add_quirk(V, spawn_effects)
+
+/datum/controller/subsystem/processing/quirks/proc/GenerateQuirks(client/user)
+ if(user.prefs.character_quirks.len)
+ return
+ user.prefs.character_quirks = user.prefs.all_quirks
diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm
index dd68443bd7..dd45f9146f 100644
--- a/code/controllers/subsystem/server_maint.dm
+++ b/code/controllers/subsystem/server_maint.dm
@@ -55,8 +55,8 @@ SUBSYSTEM_DEF(server_maint)
co.ehjax_send(data = "roundrestart")
if(server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
C << link("byond://[server]")
- if(SERVER_TOOLS_PRESENT)
- SSblackbox.record_feedback("text", "server_tools", 1, SERVER_TOOLS_VERSION)
- SSblackbox.record_feedback("text", "server_tools_api", 1, SERVER_TOOLS_API_VERSION)
+ var/tgsversion = world.TgsVersion()
+ if(tgsversion)
+ SSblackbox.record_feedback("text", "server_tools", 1, tgsversion)
#undef PING_BUFFER_TIME
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 5fc77669bc..0471afceea 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -158,7 +158,7 @@ SUBSYSTEM_DEF(ticker)
window_flash(C, ignorepref = TRUE) //let them know lobby has opened up.
to_chat(world, "Welcome to [station_name()]! ")
if(CONFIG_GET(flag/irc_announce_new_game))
- SERVER_TOOLS_CHAT_BROADCAST("New round starting on [SSmapping.config.map_name]!")
+ world.TgsTargetedChatBroadcast("New round starting on [SSmapping.config.map_name]!", FALSE)
current_state = GAME_STATE_PREGAME
//Everyone who wants to be an observer is now spawned
create_observers()
@@ -391,7 +391,7 @@ SUBSYSTEM_DEF(ticker)
if(player.mind.assigned_role != player.mind.special_role)
SSjob.EquipRank(N, player.mind.assigned_role, 0)
if(CONFIG_GET(flag/roundstart_traits))
- SStraits.AssignTraits(player, N.client, TRUE)
+ SSquirks.AssignQuirks(player, N.client, TRUE)
CHECK_TICK
if(captainless)
for(var/mob/dead/new_player/N in GLOB.player_list)
diff --git a/code/datums/action.dm b/code/datums/action.dm
index f7b1d6b258..f9575a56ef 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -480,7 +480,7 @@
H.attack_self(owner)
return
var/obj/item/I = target
- if(owner.can_equip(I, slot_hands))
+ if(owner.can_equip(I, SLOT_HANDS))
owner.temporarilyRemoveItemFromInventory(I)
owner.put_in_hands(I)
I.attack_self(owner)
diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm
index 821770e9c5..a8adbfbce8 100644
--- a/code/datums/brain_damage/severe.dm
+++ b/code/datums/brain_damage/severe.dm
@@ -160,7 +160,7 @@
to_chat(owner, "You feel really lonely... ")
else
to_chat(owner, "You're going mad with loneliness! ")
- owner.hallucination += 20
+ owner.hallucination += 30
if(5)
if(!high_stress)
diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm
new file mode 100644
index 0000000000..0b94c389ce
--- /dev/null
+++ b/code/datums/components/armor_plate.dm
@@ -0,0 +1,78 @@
+/datum/component/armor_plate
+ var/amount = 0
+ var/maxamount = 3
+ var/upgrade_item = /obj/item/stack/sheet/animalhide/goliath_hide
+ var/datum/armor/added_armor = list("melee" = 10)
+ var/upgrade_name
+
+/datum/component/armor_plate/Initialize(_maxamount,obj/item/_upgrade_item,datum/armor/_added_armor)
+ if(!isobj(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine)
+ RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/applyplate)
+ RegisterSignal(COMSIG_PARENT_PREQDELETED, .proc/dropplates)
+
+ if(_maxamount)
+ maxamount = _maxamount
+ if(_upgrade_item)
+ upgrade_item = _upgrade_item
+ if(_added_armor)
+ if(islist(_added_armor))
+ added_armor = getArmor(arglist(_added_armor))
+ else if (istype(_added_armor, /datum/armor))
+ added_armor = _added_armor
+ else
+ stack_trace("Invalid type [_added_armor.type] passed as _armor_item argument to armorplate component")
+ else
+ added_armor = getArmor(arglist(added_armor))
+ var/obj/item/typecast = upgrade_item
+ upgrade_name = initial(typecast.name)
+
+/datum/component/armor_plate/proc/examine(mob/user)
+ //upgrade_item could also be typecast here instead
+ if(ismecha(parent))
+ if(amount)
+ if(amount < maxamount)
+ to_chat(user, "Its armor is enhanced with [amount] [upgrade_name]. ")
+ else
+ to_chat(user, "It's wearing a fearsome carapace entirely composed of [upgrade_name] - its pilot must be an experienced monster hunter. ")
+ else
+ to_chat(user, "It has attachment points for strapping monster hide on for added protection. ")
+ else
+ if(amount)
+ to_chat(user, "It has been strengthened with [amount]/[maxamount] [upgrade_name]. ")
+ else
+ to_chat(user, "It can be strengthened with up to [maxamount] [upgrade_name]. ")
+
+/datum/component/armor_plate/proc/applyplate(obj/item/I, mob/user, params)
+ if(!istype(I,upgrade_item))
+ return
+ if(amount >= maxamount)
+ to_chat(user, "You can't improve [parent] any further! ")
+ return
+
+ if(istype(I,/obj/item/stack))
+ I.use(1)
+ else
+ if(length(I.contents))
+ to_chat(user, "[I] cannot be used for armoring while there's something inside! ")
+ return
+ qdel(I)
+
+ var/obj/O = parent
+ amount++
+ O.armor = O.armor.attachArmor(added_armor)
+
+ if(ismecha(O))
+ var/obj/mecha/R = O
+ R.update_icon()
+ to_chat(user, "You strengthen [R], improving its resistance against melee, bullet and laser damage. ")
+ else
+ to_chat(user, "You strengthen [O], improving its resistance against melee attacks. ")
+
+
+/datum/component/armor_plate/proc/dropplates(force)
+ if(ismecha(parent)) //items didn't drop the plates before and it causes erroneous behavior for the time being with collapsible helmets
+ for(var/i in 1 to amount)
+ new upgrade_item(get_turf(parent))
\ No newline at end of file
diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm
index 6f4e8d586d..56301cdc8b 100644
--- a/code/datums/components/material_container.dm
+++ b/code/datums/components/material_container.dm
@@ -15,16 +15,18 @@
var/sheet_type
var/list/materials
var/show_on_examine
+ var/disable_attackby
var/list/allowed_typecache
var/last_inserted_id
var/precise_insertion = FALSE
var/datum/callback/precondition
var/datum/callback/after_insert
-/datum/component/material_container/Initialize(list/mat_list, max_amt = 0, _show_on_examine = FALSE, list/allowed_types, datum/callback/_precondition, datum/callback/_after_insert)
+/datum/component/material_container/Initialize(list/mat_list, max_amt = 0, _show_on_examine = FALSE, list/allowed_types, datum/callback/_precondition, datum/callback/_after_insert, _disable_attackby)
materials = list()
max_amount = max(0, max_amt)
show_on_examine = _show_on_examine
+ disable_attackby = _disable_attackby
if(allowed_types)
allowed_typecache = typecacheof(allowed_types)
precondition = _precondition
@@ -43,14 +45,17 @@
materials[id] = new mat_path()
/datum/component/material_container/proc/OnExamine(mob/user)
- for(var/I in materials)
- var/datum/material/M = materials[I]
- var/amt = amount(M.id)
- if(amt)
- to_chat(user, "It has [amt] units of [lowertext(M.name)] stored. ")
+ if(show_on_examine)
+ for(var/I in materials)
+ var/datum/material/M = materials[I]
+ var/amt = amount(M.id)
+ if(amt)
+ to_chat(user, "It has [amt] units of [lowertext(M.name)] stored. ")
/datum/component/material_container/proc/OnAttackBy(obj/item/I, mob/living/user)
var/list/tc = allowed_typecache
+ if(disable_attackby)
+ return
if(user.a_intent != INTENT_HELP)
return
if((I.flags_2 & (HOLOGRAM_2 | NO_MAT_REDEMPTION_2)) || (tc && !is_type_in_typecache(I, tc)))
diff --git a/code/datums/components/signal_redirect.dm b/code/datums/components/signal_redirect.dm
index 764a44e4a9..8828c03c2d 100644
--- a/code/datums/components/signal_redirect.dm
+++ b/code/datums/components/signal_redirect.dm
@@ -1,8 +1,13 @@
/datum/component/redirect
dupe_mode = COMPONENT_DUPE_ALLOWED
-/datum/component/redirect/Initialize(list/signals, datum/callback/_callback)
+/datum/component/redirect/Initialize(list/signals, datum/callback/_callback, flags=NONE)
//It's not our job to verify the right signals are registered here, just do it.
if(!LAZYLEN(signals) || !istype(_callback))
return COMPONENT_INCOMPATIBLE
+ if(flags & REDIRECT_TRANSFER_WITH_TURF && isturf(parent))
+ RegisterSignal(COMSIG_TURF_CHANGE, .proc/turf_change)
RegisterSignal(signals, _callback)
+
+/datum/component/redirect/proc/turf_change(path, new_baseturfs, flags, list/transfers)
+ transfers += src
diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm
index a999624c32..54f8b107e0 100644
--- a/code/datums/components/stationloving.dm
+++ b/code/datums/components/stationloving.dm
@@ -28,13 +28,7 @@
CRASH("Unable to find a blobstart landmark")
var/atom/movable/AM = parent
- if(ismob(AM.loc))
- var/mob/M = AM.loc
- M.transferItemToLoc(AM, targetturf, TRUE) //nodrops disks when?
- else if(AM.loc.SendSignal(COMSIG_CONTAINS_STORAGE))
- AM.loc.SendSignal(COMSIG_TRY_STORAGE_TAKE, src, targetturf, TRUE)
- else
- AM.forceMove(targetturf)
+ AM.forceMove(targetturf)
// move the disc, so ghosts remain orbiting it even if it's "destroyed"
return targetturf
diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm
index 4234dadd85..8701252fe6 100644
--- a/code/datums/components/storage/concrete/_concrete.dm
+++ b/code/datums/components/storage/concrete/_concrete.dm
@@ -73,6 +73,8 @@
slave.refresh_mob_views()
/datum/component/storage/concrete/emp_act(severity)
+ if(emp_shielded)
+ return
var/atom/real_location = real_location()
for(var/i in real_location)
var/atom/A = i
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index 58ebf73d15..e6d43ed65a 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -87,7 +87,8 @@
RegisterSignal(COMSIG_ATOM_ATTACK_PAW, .proc/on_attack_hand)
RegisterSignal(COMSIG_ATOM_EMP_ACT, .proc/emp_act)
RegisterSignal(COMSIG_ATOM_ATTACK_GHOST, .proc/show_to_ghost)
- RegisterSignal(COMSIG_ATOM_EXITED, .proc/_removal_reset)
+ RegisterSignal(COMSIG_ATOM_ENTERED, .proc/refresh_mob_views)
+ RegisterSignal(COMSIG_ATOM_EXITED, .proc/_remove_and_refresh)
RegisterSignal(COMSIG_ITEM_PRE_ATTACK, .proc/preattack_intercept)
RegisterSignal(COMSIG_ITEM_ATTACK_SELF, .proc/attack_self)
@@ -232,13 +233,15 @@
stoplag(1)
qdel(progress)
-/datum/component/storage/proc/mass_remove_from_storage(atom/target, list/things, datum/progressbar/progress)
+/datum/component/storage/proc/mass_remove_from_storage(atom/target, list/things, datum/progressbar/progress, trigger_on_found = TRUE)
var/atom/real_location = real_location()
for(var/obj/item/I in things)
things -= I
if(I.loc != real_location)
continue
remove_from_storage(I, target)
+ if(trigger_on_found && I.on_found())
+ return FALSE
if(TICK_CHECK)
progress.update(progress.goal - length(things))
return TRUE
@@ -367,10 +370,10 @@
. = TRUE //returns TRUE if any mobs actually got a close(M) call
/datum/component/storage/proc/emp_act(severity)
- var/atom/A = parent
- if(!isliving(A.loc) && !emp_shielded)
- var/datum/component/storage/concrete/master = master()
- master.emp_act(severity)
+ if(emp_shielded)
+ return
+ var/datum/component/storage/concrete/master = master()
+ master.emp_act(severity)
//This proc draws out the inventory and places the items on it. tx and ty are the upper left tile and mx, my are the bottm right.
//The numbers are calculated from the bottom-left The bottom-left slot being 1,1.
@@ -400,6 +403,10 @@
return FALSE
return master._removal_reset(thing)
+/datum/component/storage/proc/_remove_and_refresh(atom/movable/thing)
+ _removal_reset(thing)
+ refresh_mob_views()
+
//Call this proc to handle the removal of an item from the storage item. The item will be moved to the new_location target, if that is null it's being deleted
/datum/component/storage/proc/remove_from_storage(atom/movable/AM, atom/new_location)
if(!istype(AM))
@@ -453,23 +460,24 @@
return FALSE
handle_item_insertion(I, FALSE, M)
-/datum/component/storage/proc/return_inv()
- . = list()
- . += contents()
- for(var/i in contents())
- var/atom/a = i
- GET_COMPONENT_FROM(STR, /datum/component/storage, a)
- if(STR)
- . += STR.return_inv()
+/datum/component/storage/proc/return_inv(recursive)
+ var/list/ret = list()
+ ret |= contents()
+ if(recursive)
+ for(var/i in ret.Copy())
+ var/atom/A = i
+ A.SendSignal(COMSIG_TRY_STORAGE_RETURN_INVENTORY, ret, TRUE)
+ return ret
/datum/component/storage/proc/contents() //ONLY USE IF YOU NEED TO COPY CONTENTS OF REAL LOCATION, COPYING IS NOT AS FAST AS DIRECT ACCESS!
var/atom/real_location = real_location()
return real_location.contents.Copy()
-/datum/component/storage/proc/signal_return_inv(list/interface)
+//Abuses the fact that lists are just references, or something like that.
+/datum/component/storage/proc/signal_return_inv(list/interface, recursive = TRUE)
if(!islist(interface))
return FALSE
- interface |= return_inv()
+ interface |= return_inv(recursive)
return TRUE
/datum/component/storage/proc/mousedrop_onto(atom/over_object, mob/M)
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index c6c0f2353a..59953a4ce1 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -1,3 +1,6 @@
+/datum/proc/CanProcCall(procname)
+ return TRUE
+
/datum/proc/can_vv_get(var_name)
return TRUE
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index 74d4b90493..ba570eca06 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -79,8 +79,8 @@
if(isobj(H.wear_suit))
Cl = H.wear_suit
passed = prob((Cl.permeability_coefficient*100) - 1)
- if(passed && isobj(slot_w_uniform))
- Cl = slot_w_uniform
+ if(passed && isobj(SLOT_W_UNIFORM))
+ Cl = SLOT_W_UNIFORM
passed = prob((Cl.permeability_coefficient*100) - 1)
if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS)
diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm
index 14d7f105ab..53e79f0cc1 100644
--- a/code/datums/diseases/advance/symptoms/vomit.dm
+++ b/code/datums/diseases/advance/symptoms/vomit.dm
@@ -55,7 +55,7 @@ Bonus
switch(A.stage)
if(1, 2, 3, 4)
if(prob(base_message_chance) && !suppress_warning)
- to_chat(M, "[pick("You feel nauseous.", "You feel like you're going to throw up!")] ")
+ to_chat(M, "[pick("You feel nauseated.", "You feel like you're going to throw up!")] ")
else
vomit(M)
diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm
index a9adf39812..3fbf6ef177 100644
--- a/code/datums/diseases/heart_failure.dm
+++ b/code/datums/diseases/heart_failure.dm
@@ -34,7 +34,7 @@
to_chat(H, "You feel dizzy. ")
H.confused += 6
if(prob(3))
- to_chat(H, "You feel [pick("full", "nauseous", "sweaty", "weak", "tired", "short on breath", "uneasy")]. ")
+ to_chat(H, "You feel [pick("full", "nauseated", "sweaty", "weak", "tired", "short on breath", "uneasy")]. ")
if(3 to 4)
if(!sound)
H.playsound_local(H, 'sound/health/slowbeat.ogg',40,0, channel = CHANNEL_HEARTBEAT)
diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm
index 2df4466822..52e9c2e19f 100644
--- a/code/datums/diseases/rhumba_beat.dm
+++ b/code/datums/diseases/rhumba_beat.dm
@@ -9,7 +9,6 @@
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 1
severity = DISEASE_SEVERITY_BIOHAZARD
- process_dead = TRUE
/datum/disease/rhumba_beat/stage_act()
..()
diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm
index cfc848000b..919eaa6e12 100644
--- a/code/datums/diseases/wizarditis.dm
+++ b/code/datums/diseases/wizarditis.dm
@@ -61,19 +61,19 @@ STI KALY - blind
if(!istype(H.head, /obj/item/clothing/head/wizard))
if(!H.dropItemToGround(H.head))
qdel(H.head)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), SLOT_HEAD)
return
if(prob(chance))
if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe))
if(!H.dropItemToGround(H.wear_suit))
qdel(H.wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), SLOT_WEAR_SUIT)
return
if(prob(chance))
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal/magic))
if(!H.dropItemToGround(H.shoes))
qdel(H.shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(H), SLOT_SHOES)
return
else
var/mob/living/carbon/H = affected_mob
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index 9b431732aa..b459b31fcb 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -5,7 +5,7 @@
var/date
/datum/getrev/New()
- testmerge = SERVER_TOOLS_PR_LIST
+ testmerge = world.TgsTestMerges()
log_world("Running /tg/ revision:")
var/list/logs = world.file2list(".git/logs/HEAD")
if(logs)
@@ -21,7 +21,8 @@
log_world(commit)
for(var/line in testmerge)
if(line)
- var/tmcommit = testmerge[line]["commit"]
+ var/datum/tgs_revision_information/test_merge/tm = line
+ var/tmcommit = tm.commit
log_world("Test merge active of PR #[line] commit [tmcommit]")
SSblackbox.record_feedback("nested tally", "testmerged_prs", 1, list("[line]", "[tmcommit]"))
if(originmastercommit)
@@ -34,11 +35,12 @@
return ""
. = header ? "The following pull requests are currently test merged: " : ""
for(var/line in testmerge)
- var/cm = testmerge[line]["commit"]
- var/details = ": '" + html_encode(testmerge[line]["title"]) + "' by " + html_encode(testmerge[line]["author"]) + " at commit " + html_encode(copytext(cm, 1, min(length(cm), 7)))
+ var/datum/tgs_revision_information/test_merge/tm = line
+ var/cm = tm.pull_request_commit
+ var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext(cm, 1, min(length(cm), 11)))
if(details && findtext(details, "\[s\]") && (!usr || !usr.client.holder))
continue
- . += "#[line][details] "
+ . += "#[tm.number][details] "
/client/verb/showrevinfo()
set category = "OOC"
@@ -54,13 +56,12 @@
to_chat(src, GLOB.revdata.GetTestMergeInfo())
prefix = "Based off origin/master commit: "
var/pc = GLOB.revdata.originmastercommit
- to_chat(src, "[prefix][copytext(pc, 1, min(length(pc), 7))] ")
+ to_chat(src, "[prefix][copytext(pc, 1, min(length(pc), 11))] ")
else
to_chat(src, "Master revision unknown")
to_chat(src, "Revision: [GLOB.revdata.commit]")
- if(SERVER_TOOLS_PRESENT)
- to_chat(src, "Server tools version: [SERVER_TOOLS_VERSION]")
- to_chat(src, "Server tools API version: [SERVER_TOOLS_API_VERSION]")
+ if(world.TgsAvailable())
+ to_chat(src, "Server tools version: [world.TgsVersion()]")
to_chat(src, "Current Informational Settings: ")
to_chat(src, "Protect Authority Roles From Traitor: [CONFIG_GET(flag/protect_roles_from_antagonist)]")
to_chat(src, "Protect Assistant Role From Traitor: [CONFIG_GET(flag/protect_assistant_from_antagonist)]")
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index 5f97db0827..68b021bc7d 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -53,7 +53,7 @@
/obj/item/clothing/gloves/boxing/equipped(mob/user, slot)
if(!ishuman(user))
return
- if(slot == slot_gloves)
+ if(slot == SLOT_GLOVES)
var/mob/living/carbon/human/H = user
style.teach(H,1)
return
@@ -62,6 +62,6 @@
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
- if(H.get_item_by_slot(slot_gloves) == src)
+ if(H.get_item_by_slot(SLOT_GLOVES) == src)
style.remove(H)
return
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 82497adf45..21a82c7b7e 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -170,7 +170,7 @@
/obj/item/clothing/gloves/krav_maga/equipped(mob/user, slot)
if(!ishuman(user))
return
- if(slot == slot_gloves)
+ if(slot == SLOT_GLOVES)
var/mob/living/carbon/human/H = user
style.teach(H,1)
@@ -178,7 +178,7 @@
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
- if(H.get_item_by_slot(slot_gloves) == src)
+ if(H.get_item_by_slot(SLOT_GLOVES) == src)
style.remove(H)
/obj/item/clothing/gloves/krav_maga/sec//more obviously named, given to sec
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 845a7507bd..4c25db4e85 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -161,7 +161,7 @@
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
force = 10
w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
force_unwielded = 10
force_wielded = 24
throwforce = 20
diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm
index 8ac7e76cdb..62a03af933 100644
--- a/code/datums/martial/wrestling.dm
+++ b/code/datums/martial/wrestling.dm
@@ -448,7 +448,7 @@
/obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot)
if(!ishuman(user))
return
- if(slot == slot_belt)
+ if(slot == SLOT_BELT)
var/mob/living/carbon/human/H = user
style.teach(H,1)
return
@@ -457,6 +457,6 @@
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
- if(H.get_item_by_slot(slot_belt) == src)
+ if(H.get_item_by_slot(SLOT_BELT) == src)
style.remove(H)
return
diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm
index e5e13f597f..90feeacb79 100755
--- a/code/datums/outfit.dm
+++ b/code/datums/outfit.dm
@@ -39,31 +39,31 @@
//Start with uniform,suit,backpack for additional slots
if(uniform)
- H.equip_to_slot_or_del(new uniform(H),slot_w_uniform)
+ H.equip_to_slot_or_del(new uniform(H),SLOT_W_UNIFORM)
if(suit)
- H.equip_to_slot_or_del(new suit(H),slot_wear_suit)
+ H.equip_to_slot_or_del(new suit(H),SLOT_WEAR_SUIT)
if(back)
- H.equip_to_slot_or_del(new back(H),slot_back)
+ H.equip_to_slot_or_del(new back(H),SLOT_BACK)
if(belt)
- H.equip_to_slot_or_del(new belt(H),slot_belt)
+ H.equip_to_slot_or_del(new belt(H),SLOT_BELT)
if(gloves)
- H.equip_to_slot_or_del(new gloves(H),slot_gloves)
+ H.equip_to_slot_or_del(new gloves(H),SLOT_GLOVES)
if(shoes)
- H.equip_to_slot_or_del(new shoes(H),slot_shoes)
+ H.equip_to_slot_or_del(new shoes(H),SLOT_SHOES)
if(head)
- H.equip_to_slot_or_del(new head(H),slot_head)
+ H.equip_to_slot_or_del(new head(H),SLOT_HEAD)
if(mask)
- H.equip_to_slot_or_del(new mask(H),slot_wear_mask)
+ H.equip_to_slot_or_del(new mask(H),SLOT_WEAR_MASK)
if(neck)
- H.equip_to_slot_or_del(new neck(H),slot_neck)
+ H.equip_to_slot_or_del(new neck(H),SLOT_NECK)
if(ears)
- H.equip_to_slot_or_del(new ears(H),slot_ears)
+ H.equip_to_slot_or_del(new ears(H),SLOT_EARS)
if(glasses)
- H.equip_to_slot_or_del(new glasses(H),slot_glasses)
+ H.equip_to_slot_or_del(new glasses(H),SLOT_GLASSES)
if(id)
- H.equip_to_slot_or_del(new id(H),slot_wear_id)
+ H.equip_to_slot_or_del(new id(H),SLOT_WEAR_ID)
if(suit_store)
- H.equip_to_slot_or_del(new suit_store(H),slot_s_store)
+ H.equip_to_slot_or_del(new suit_store(H),SLOT_S_STORE)
if(accessory)
var/obj/item/clothing/under/U = H.w_uniform
@@ -79,16 +79,16 @@
if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon.
if(l_pocket)
- H.equip_to_slot_or_del(new l_pocket(H),slot_l_store)
+ H.equip_to_slot_or_del(new l_pocket(H),SLOT_L_STORE)
if(r_pocket)
- H.equip_to_slot_or_del(new r_pocket(H),slot_r_store)
+ H.equip_to_slot_or_del(new r_pocket(H),SLOT_R_STORE)
if(backpack_contents)
for(var/path in backpack_contents)
var/number = backpack_contents[path]
if(!isnum(number))//Default to 1
number = 1
for(var/i in 1 to number)
- H.equip_to_slot_or_del(new path(H),slot_in_backpack)
+ H.equip_to_slot_or_del(new path(H),SLOT_IN_BACKPACK)
if(!H.head && toggle_helmet && istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit))
var/obj/item/clothing/suit/space/hardsuit/HS = H.wear_suit
diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm
index 68d8ebc31f..f02d352310 100644
--- a/code/datums/radiation_wave.dm
+++ b/code/datums/radiation_wave.dm
@@ -29,6 +29,9 @@
/datum/radiation_wave/process()
master_turf = get_step(master_turf, move_dir)
+ if(!master_turf)
+ qdel(src)
+ return
steps++
var/list/atoms = get_rad_atoms()
diff --git a/code/datums/traits/_trait.dm b/code/datums/traits/_quirk.dm
similarity index 59%
rename from code/datums/traits/_trait.dm
rename to code/datums/traits/_quirk.dm
index 96f6857970..b39da84575 100644
--- a/code/datums/traits/_trait.dm
+++ b/code/datums/traits/_quirk.dm
@@ -1,94 +1,94 @@
-//every trait in this folder should be coded around being applied on spawn
-//these are NOT "mob traits" like GOTTAGOFAST, but exist as a medium to apply them and other different effects
-/datum/trait
- var/name = "Test Trait"
- var/desc = "This is a test trait."
+//every quirk in this folder should be coded around being applied on spawn
+//these are NOT "mob quirks" like GOTTAGOFAST, but exist as a medium to apply them and other different effects
+/datum/quirk
+ var/name = "Test Quirk"
+ var/desc = "This is a test quirk."
var/value = 0
var/human_only = TRUE
var/gain_text
var/lose_text
var/medical_record_text //This text will appear on medical records for the trait. Not yet implemented
- var/mood_trait = FALSE //if true, this trait affects mood and is unavailable if moodlets are disabled
+ var/mood_quirk = FALSE //if true, this quirk affects mood and is unavailable if moodlets are disabled
var/mob_trait //if applicable, apply and remove this mob trait
- var/mob/living/trait_holder
+ var/mob/living/quirk_holder
-/datum/trait/New(mob/living/trait_mob, spawn_effects)
+/datum/quirk/New(mob/living/quirk_mob, spawn_effects)
..()
- if(!trait_mob || (human_only && !ishuman(trait_mob)) || trait_mob.has_trait_datum(type))
+ if(!quirk_mob || (human_only && !ishuman(quirk_mob)) || quirk_mob.has_quirk(type))
qdel(src)
- trait_holder = trait_mob
- SStraits.trait_objects += src
- to_chat(trait_holder, gain_text)
- trait_holder.roundstart_traits += src
+ quirk_holder = quirk_mob
+ SSquirks.quirk_objects += src
+ to_chat(quirk_holder, gain_text)
+ quirk_holder.roundstart_quirks += src
if(mob_trait)
- trait_holder.add_trait(mob_trait, ROUNDSTART_TRAIT)
- START_PROCESSING(SStraits, src)
+ quirk_holder.add_trait(mob_trait, ROUNDSTART_TRAIT)
+ START_PROCESSING(SSquirks, src)
add()
if(spawn_effects)
on_spawn()
addtimer(CALLBACK(src, .proc/post_add), 30)
-/datum/trait/Destroy()
- STOP_PROCESSING(SStraits, src)
+/datum/quirk/Destroy()
+ STOP_PROCESSING(SSquirks, src)
remove()
- if(trait_holder)
- to_chat(trait_holder, lose_text)
- trait_holder.roundstart_traits -= src
+ if(quirk_holder)
+ to_chat(quirk_holder, lose_text)
+ quirk_holder.roundstart_quirks -= src
if(mob_trait)
- trait_holder.remove_trait(mob_trait, ROUNDSTART_TRAIT, TRUE)
- SStraits.trait_objects -= src
+ quirk_holder.remove_trait(mob_trait, ROUNDSTART_TRAIT, TRUE)
+ SSquirks.quirk_objects -= src
return ..()
-/datum/trait/proc/transfer_mob(mob/living/to_mob)
- trait_holder.roundstart_traits -= src
- to_mob.roundstart_traits += src
+/datum/quirk/proc/transfer_mob(mob/living/to_mob)
+ quirk_holder.roundstart_quirks -= src
+ to_mob.roundstart_quirks += src
if(mob_trait)
- trait_holder.remove_trait(mob_trait, ROUNDSTART_TRAIT)
+ quirk_holder.remove_trait(mob_trait, ROUNDSTART_TRAIT)
to_mob.add_trait(mob_trait, ROUNDSTART_TRAIT)
- trait_holder = to_mob
+ quirk_holder = to_mob
on_transfer()
-/datum/trait/proc/add() //special "on add" effects
-/datum/trait/proc/on_spawn() //these should only trigger when the character is being created for the first time, i.e. roundstart/latejoin
-/datum/trait/proc/remove() //special "on remove" effects
-/datum/trait/proc/on_process() //process() has some special checks, so this is the actual process
-/datum/trait/proc/post_add() //for text, disclaimers etc. given after you spawn in with the trait
-/datum/trait/proc/on_transfer() //code called when the trait is transferred to a new mob
+/datum/quirk/proc/add() //special "on add" effects
+/datum/quirk/proc/on_spawn() //these should only trigger when the character is being created for the first time, i.e. roundstart/latejoin
+/datum/quirk/proc/remove() //special "on remove" effects
+/datum/quirk/proc/on_process() //process() has some special checks, so this is the actual process
+/datum/quirk/proc/post_add() //for text, disclaimers etc. given after you spawn in with the trait
+/datum/quirk/proc/on_transfer() //code called when the trait is transferred to a new mob
-/datum/trait/process()
- if(QDELETED(trait_holder))
- trait_holder = null
+/datum/quirk/process()
+ if(QDELETED(quirk_holder))
+ quirk_holder = null
qdel(src)
return
- if(trait_holder.stat == DEAD)
+ if(quirk_holder.stat == DEAD)
return
on_process()
/mob/living/proc/get_trait_string(medical) //helper string. gets a string of all the traits the mob has
var/list/dat = list()
if(!medical)
- for(var/V in roundstart_traits)
- var/datum/trait/T = V
+ for(var/V in roundstart_quirks)
+ var/datum/quirk/T = V
dat += T.name
if(!dat.len)
return "None"
return dat.Join(", ")
else
- for(var/V in roundstart_traits)
- var/datum/trait/T = V
+ for(var/V in roundstart_quirks)
+ var/datum/quirk/T = V
dat += T.medical_record_text
if(!dat.len)
return "None"
return dat.Join(" ")
/mob/living/proc/cleanse_trait_datums() //removes all trait datums
- for(var/V in roundstart_traits)
- var/datum/trait/T = V
+ for(var/V in roundstart_quirks)
+ var/datum/quirk/T = V
qdel(T)
/mob/living/proc/transfer_trait_datums(mob/living/to_mob)
- for(var/V in roundstart_traits)
- var/datum/trait/T = V
+ for(var/V in roundstart_quirks)
+ var/datum/quirk/T = V
T.transfer_mob(to_mob)
/*
@@ -96,7 +96,7 @@
Commented version of Nearsighted to help you add your own traits
Use this as a guideline
-/datum/trait/nearsighted
+/datum/quirk/nearsighted
name = "Nearsighted"
///The trait's name
@@ -116,11 +116,11 @@ Use this as a guideline
medical_record_text = "Subject has permanent nearsightedness."
///These three are self-explanatory
-/datum/trait/nearsighted/on_spawn()
- var/mob/living/carbon/human/H = trait_holder
+/datum/quirk/nearsighted/on_spawn()
+ var/mob/living/carbon/human/H = quirk_holder
var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H))
H.put_in_hands(glasses)
- H.equip_to_slot(glasses, slot_glasses)
+ H.equip_to_slot(glasses, SLOT_GLASSES)
H.regenerate_icons()
//This whole proc is called automatically
@@ -130,3 +130,5 @@ Use this as a guideline
//If you don't need any special effects like spawning glasses, then you don't need an add()
*/
+
+
diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm
index d05541fafb..d48c70f31b 100644
--- a/code/datums/traits/good.dm
+++ b/code/datums/traits/good.dm
@@ -1,7 +1,7 @@
//predominantly positive traits
//this file is named weirdly so that positive traits are listed above negative ones
-/datum/trait/alcohol_tolerance
+/datum/quirk/alcohol_tolerance
name = "Alcohol Tolerance"
desc = "You become drunk more slowly and suffer fewer drawbacks from alcohol."
value = 1
@@ -11,25 +11,25 @@
-/datum/trait/apathetic
+/datum/quirk/apathetic
name = "Apathetic"
desc = "You just don't care as much as other people. That's nice to have in a place like this, I guess."
value = 1
- mood_trait = TRUE
+ mood_quirk = TRUE
-/datum/trait/apathetic/add()
- GET_COMPONENT_FROM(mood, /datum/component/mood, trait_holder)
+/datum/quirk/apathetic/add()
+ GET_COMPONENT_FROM(mood, /datum/component/mood, quirk_holder)
if(mood)
mood.mood_modifier = 0.8
-/datum/trait/apathetic/remove()
- GET_COMPONENT_FROM(mood, /datum/component/mood, trait_holder)
+/datum/quirk/apathetic/remove()
+ GET_COMPONENT_FROM(mood, /datum/component/mood, quirk_holder)
if(mood)
mood.mood_modifier = 1 //Change this once/if species get their own mood modifiers.
-/datum/trait/freerunning
+/datum/quirk/freerunning
name = "Freerunning"
desc = "You're great at quick moves! You can climb tables more quickly."
value = 2
@@ -39,16 +39,16 @@
-/datum/trait/jolly
+/datum/quirk/jolly
name = "Jolly"
desc = "You sometimes just feel happy, for no reason at all."
value = 1
mob_trait = TRAIT_JOLLY
- mood_trait = TRUE
+ mood_quirk = TRUE
-/datum/trait/light_step
+/datum/quirk/light_step
name = "Light Step"
desc = "You walk with a gentle step, making stepping on sharp objects quieter and less painful."
value = 1
@@ -58,7 +58,7 @@
-/datum/trait/night_vision
+/datum/quirk/night_vision
name = "Night Vision"
desc = "You can see slightly more clearly in full darkness than most people."
value = 1
@@ -66,8 +66,8 @@
gain_text = "The shadows seem a little less dark. "
lose_text = "Everything seems a little darker. "
-/datum/trait/night_vision/on_spawn()
- var/mob/living/carbon/human/H = trait_holder
+/datum/quirk/night_vision/on_spawn()
+ var/mob/living/carbon/human/H = quirk_holder
var/obj/item/organ/eyes/eyes = H.getorgan(/obj/item/organ/eyes)
if(!eyes || eyes.lighting_alpha)
return
@@ -75,7 +75,7 @@
-/datum/trait/selfaware
+/datum/quirk/selfaware
name = "Self-Aware"
desc = "You know your body well, and can accurately assess the extent of your wounds."
value = 2
@@ -83,7 +83,7 @@
-/datum/trait/skittish
+/datum/quirk/skittish
name = "Skittish"
desc = "You can conceal yourself in danger. Ctrl-shift-click a closed locker to jump into it, as long as you have access."
value = 2
@@ -91,7 +91,7 @@
-/datum/trait/spiritual
+/datum/quirk/spiritual
name = "Spiritual"
desc = "You're in tune with the gods, and your prayers may be more likely to be heard. Or not."
value = 1
@@ -101,7 +101,7 @@
-/datum/trait/voracious
+/datum/quirk/voracious
name = "Voracious"
desc = "Nothing gets between you and your food. You eat twice as fast as everyone else!"
value = 1
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index 57284a2558..7752cc31c3 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -1,6 +1,6 @@
//predominantly negative traits
-/datum/trait/blooddeficiency
+/datum/quirk/blooddeficiency
name = "Acute Blood Deficiency"
desc = "Your body can't produce enough blood to sustain itself."
value = -2
@@ -8,12 +8,12 @@
lose_text = "You feel vigorous again. "
medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood."
-/datum/trait/blooddeficiency/on_process()
- trait_holder.blood_volume -= 0.275
+/datum/quirk/blooddeficiency/on_process()
+ quirk_holder.blood_volume -= 0.275
-/datum/trait/depression
+/datum/quirk/depression
name = "Depression"
desc = "You sometimes just hate life."
mob_trait = TRAIT_DEPRESSION
@@ -21,22 +21,22 @@
gain_text = "You start feeling depressed. "
lose_text = "You no longer feel depressed. " //if only it were that easy!
medical_record_text = "Patient has a severe mood disorder causing them to experience sudden moments of sadness."
- mood_trait = TRUE
+ mood_quirk = TRUE
-/datum/trait/family_heirloom
+/datum/quirk/family_heirloom
name = "Family Heirloom"
desc = "You are the current owner of an heirloom. passed down for generations. You have to keep it safe!"
value = -1
- mood_trait = TRUE
+ mood_quirk = TRUE
var/obj/item/heirloom
var/where_text
-/datum/trait/family_heirloom/on_spawn()
- var/mob/living/carbon/human/H = trait_holder
+/datum/quirk/family_heirloom/on_spawn()
+ var/mob/living/carbon/human/H = quirk_holder
var/obj/item/heirloom_type
- switch(trait_holder.mind.assigned_role)
+ switch(quirk_holder.mind.assigned_role)
if("Clown")
heirloom_type = /obj/item/bikehorn/golden
if("Mime")
@@ -56,35 +56,35 @@
/obj/item/toy/cards/deck,
/obj/item/lighter,
/obj/item/dice/d20)
- heirloom = new heirloom_type(get_turf(trait_holder))
+ heirloom = new heirloom_type(get_turf(quirk_holder))
var/list/slots = list(
- "in your backpack" = slot_in_backpack,
- "in your left pocket" = slot_l_store,
- "in your right pocket" = slot_r_store
+ "in your backpack" = SLOT_IN_BACKPACK,
+ "in your left pocket" = SLOT_L_STORE,
+ "in your right pocket" = SLOT_R_STORE
)
var/where = H.equip_in_one_of_slots(heirloom, slots)
if(!where)
where = "at your feet"
- if(where == "in your backpack")
- H.back.SendSignal(COMSIG_TRY_STORAGE_SHOW, H)
+ else if(where == "in your backpack")
+ H.back.SendSignal(COMSIG_TRY_STORAGE_SHOW, H)
where_text = "There is a precious family [heirloom.name] [where], passed down from generation to generation. Keep it safe! "
-/datum/trait/family_heirloom/post_add()
- to_chat(trait_holder, where_text)
- var/list/family_name = splittext(trait_holder.real_name, " ")
+/datum/quirk/family_heirloom/post_add()
+ to_chat(quirk_holder, where_text)
+ var/list/family_name = splittext(quirk_holder.real_name, " ")
heirloom.name = "\improper [family_name[family_name.len]] family [heirloom.name]"
-/datum/trait/family_heirloom/on_process()
- if(heirloom in trait_holder.GetAllContents())
- trait_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing")
- trait_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom)
+/datum/quirk/family_heirloom/on_process()
+ if(heirloom in quirk_holder.GetAllContents())
+ quirk_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing")
+ quirk_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom)
else
- trait_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom")
- trait_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing)
+ quirk_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom")
+ quirk_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing)
-/datum/trait/heavy_sleeper
+/datum/quirk/heavy_sleeper
name = "Heavy Sleeper"
desc = "You sleep like a rock! Whenever you're put to sleep, you sleep for a little bit longer."
value = -1
@@ -93,20 +93,20 @@
lose_text = "You feel awake again. "
medical_record_text = "Patient has abnormal sleep study results and is difficult to wake up."
-/datum/trait/brainproblems
+/datum/quirk/brainproblems
name = "Brain Tumor"
desc = "You have a little friend in your brain that is slowly destroying it. Better bring some mannitol!"
- value = -2
+ value = -3
gain_text = "You feel smooth. "
lose_text = "You feel wrinkled again. "
medical_record_text = "Patient has a tumor in their brain that is slowly driving them to brain death."
-/datum/trait/brainproblems/on_process()
- trait_holder.adjustBrainLoss(0.2)
+/datum/quirk/brainproblems/on_process()
+ quirk_holder.adjustBrainLoss(0.2)
-/datum/trait/nearsighted //t. errorage
+/datum/quirk/nearsighted //t. errorage
name = "Nearsighted"
desc = "You are nearsighted without prescription glasses, but spawn with a pair."
value = -1
@@ -114,40 +114,40 @@
lose_text = "You start seeing faraway things normally again. "
medical_record_text = "Patient requires prescription glasses in order to counteract nearsightedness."
-/datum/trait/nearsighted/add()
- trait_holder.become_nearsighted(ROUNDSTART_TRAIT)
+/datum/quirk/nearsighted/add()
+ quirk_holder.become_nearsighted(ROUNDSTART_TRAIT)
-/datum/trait/nearsighted/on_spawn()
- var/mob/living/carbon/human/H = trait_holder
+/datum/quirk/nearsighted/on_spawn()
+ var/mob/living/carbon/human/H = quirk_holder
var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H))
H.put_in_hands(glasses)
- H.equip_to_slot(glasses, slot_glasses)
+ H.equip_to_slot(glasses, SLOT_GLASSES)
H.regenerate_icons() //this is to remove the inhand icon, which persists even if it's not in their hands
-/datum/trait/nyctophobia
+/datum/quirk/nyctophobia
name = "Nyctophobia"
desc = "As far as you can remember, you've always been afraid of the dark. While in the dark without a light source, you instinctually act careful, and constantly feel a sense of dread."
value = -1
-/datum/trait/nyctophobia/on_process()
- var/mob/living/carbon/human/H = trait_holder
+/datum/quirk/nyctophobia/on_process()
+ var/mob/living/carbon/human/H = quirk_holder
if(H.dna.species.id in list("shadow", "nightmare"))
return //we're tied with the dark, so we don't get scared of it; don't cleanse outright to avoid cheese
- var/turf/T = get_turf(trait_holder)
+ var/turf/T = get_turf(quirk_holder)
var/lums = T.get_lumcount()
if(lums <= 0.2)
- if(trait_holder.m_intent == MOVE_INTENT_RUN)
- to_chat(trait_holder, "Easy, easy, take it slow... you're in the dark... ")
- trait_holder.toggle_move_intent()
- trait_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia)
+ if(quirk_holder.m_intent == MOVE_INTENT_RUN)
+ to_chat(quirk_holder, "Easy, easy, take it slow... you're in the dark... ")
+ quirk_holder.toggle_move_intent()
+ quirk_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia)
else
- trait_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "nyctophobia")
+ quirk_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "nyctophobia")
-/datum/trait/nonviolent
+/datum/quirk/nonviolent
name = "Pacifist"
desc = "The thought of violence makes you sick. So much so, in fact, that you can't hurt anyone."
value = -2
@@ -156,14 +156,14 @@
lose_text = "You think you can defend yourself again. "
medical_record_text = "Patient is unusually pacifistic and cannot bring themselves to cause physical harm."
-/datum/trait/nonviolent/on_process()
- if(trait_holder.mind && LAZYLEN(trait_holder.mind.antag_datums))
- to_chat(trait_holder, "Your antagonistic nature has caused you to renounce your pacifism. ")
+/datum/quirk/nonviolent/on_process()
+ if(quirk_holder.mind && LAZYLEN(quirk_holder.mind.antag_datums))
+ to_chat(quirk_holder, "Your antagonistic nature has caused you to renounce your pacifism. ")
qdel(src)
-/datum/trait/poor_aim
+/datum/quirk/poor_aim
name = "Poor Aim"
desc = "You're terrible with guns and can't line up a straight shot to save your life. Dual-wielding is right out."
value = -1
@@ -172,7 +172,7 @@
-/datum/trait/prosopagnosia
+/datum/quirk/prosopagnosia
name = "Prosopagnosia"
desc = "You have a mental disorder that prevents you from being able to recognize faces at all."
value = -1
@@ -181,41 +181,41 @@
-/datum/trait/prosthetic_limb
+/datum/quirk/prosthetic_limb
name = "Prosthetic Limb"
desc = "An accident caused you to lose one of your limbs. Because of this, you now have a random prosthetic!"
value = -1
var/slot_string = "limb"
-/datum/trait/prosthetic_limb/on_spawn()
+/datum/quirk/prosthetic_limb/on_spawn()
var/limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
- var/mob/living/carbon/human/H = trait_holder
+ var/mob/living/carbon/human/H = quirk_holder
var/obj/item/bodypart/old_part = H.get_bodypart(limb_slot)
var/obj/item/bodypart/prosthetic
switch(limb_slot)
if(BODY_ZONE_L_ARM)
- prosthetic = new/obj/item/bodypart/l_arm/robot/surplus(trait_holder)
+ prosthetic = new/obj/item/bodypart/l_arm/robot/surplus(quirk_holder)
slot_string = "left arm"
if(BODY_ZONE_R_ARM)
- prosthetic = new/obj/item/bodypart/r_arm/robot/surplus(trait_holder)
+ prosthetic = new/obj/item/bodypart/r_arm/robot/surplus(quirk_holder)
slot_string = "right arm"
if(BODY_ZONE_L_LEG)
- prosthetic = new/obj/item/bodypart/l_leg/robot/surplus(trait_holder)
+ prosthetic = new/obj/item/bodypart/l_leg/robot/surplus(quirk_holder)
slot_string = "left leg"
if(BODY_ZONE_R_LEG)
- prosthetic = new/obj/item/bodypart/r_leg/robot/surplus(trait_holder)
+ prosthetic = new/obj/item/bodypart/r_leg/robot/surplus(quirk_holder)
slot_string = "right leg"
prosthetic.replace_limb(H)
qdel(old_part)
H.regenerate_icons()
-/datum/trait/prosthetic_limb/post_add()
- to_chat(trait_holder, "Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \
+/datum/quirk/prosthetic_limb/post_add()
+ to_chat(quirk_holder, "Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \
you need to use a welding tool and cables to repair it, instead of bruise packs and ointment. ")
-/datum/trait/insanity
+/datum/quirk/insanity
name = "Reality Dissociation Syndrome"
desc = "You suffer from a severe disorder that causes very vivid hallucinations. Mindbreaker toxin can suppress its effects, and you are immune to mindbreaker's hallucinogenic properties. This is not a license to grief. "
value = -2
@@ -224,32 +224,25 @@
lose_text = "You feel in tune with the world again. "
medical_record_text = "Patient suffers from acute Reality Dissociation Syndrome and experiences vivid hallucinations."
-/datum/trait/insanity/on_process()
- if(trait_holder.reagents.has_reagent("mindbreaker"))
- trait_holder.hallucination = 0
+/datum/quirk/insanity/on_process()
+ if(quirk_holder.reagents.has_reagent("mindbreaker"))
+ quirk_holder.hallucination = 0
return
if(prob(2)) //we'll all be mad soon enough
madness()
+
+/datum/quirk/insanity/proc/madness()
+ quirk_holder.hallucination += rand(10, 25)
-/datum/trait/insanity/proc/madness(mad_fools)
- set waitfor = FALSE
- if(!mad_fools)
- mad_fools = prob(20)
- if(mad_fools)
- var/hallucination_type = pick(subtypesof(/datum/hallucination/rds))
- new hallucination_type (trait_holder, FALSE)
- else
- trait_holder.hallucination += rand(10, 50)
-
-/datum/trait/insanity/post_add() //I don't /think/ we'll need this but for newbies who think "roleplay as insane" = "license to kill" it's probably a good thing to have
- if(!trait_holder.mind || trait_holder.mind.special_role)
+/datum/quirk/insanity/post_add() //I don't /think/ we'll need this but for newbies who think "roleplay as insane" = "license to kill" it's probably a good thing to have
+ if(!quirk_holder.mind || quirk_holder.mind.special_role)
return
- to_chat(trait_holder, "Please note that your dissociation syndrome does NOT give you the right to attack people or otherwise cause any interference to \
+ to_chat(quirk_holder, "Please note that your dissociation syndrome does NOT give you the right to attack people or otherwise cause any interference to \
the round. You are not an antagonist, and the rules will treat you the same as other crewmembers. ")
-/datum/trait/social_anxiety
+/datum/quirk/social_anxiety
name = "Social Anxiety"
desc = "Talking to people is very difficult for you, and you often stutter or even lock up."
value = -1
@@ -258,12 +251,12 @@
medical_record_text = "Patient is usually anxious in social encounters and prefers to avoid them."
var/dumb_thing = TRUE
-/datum/trait/social_anxiety/on_process()
+/datum/quirk/social_anxiety/on_process()
var/nearby_people = 0
- for(var/mob/living/carbon/human/H in view(5, trait_holder))
+ for(var/mob/living/carbon/human/H in view(5, quirk_holder))
if(H.client)
nearby_people++
- var/mob/living/carbon/human/H = trait_holder
+ var/mob/living/carbon/human/H = quirk_holder
if(prob(2 + nearby_people))
H.stuttering = max(3, H.stuttering)
else if(prob(min(3, nearby_people)) && !H.silent)
diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm
index 61c7addd6c..8ef9bf0a11 100644
--- a/code/datums/traits/neutral.dm
+++ b/code/datums/traits/neutral.dm
@@ -1,7 +1,7 @@
//traits with no real impact that can be taken freely
//MAKE SURE THESE DO NOT MAJORLY IMPACT GAMEPLAY. those should be positive or negative traits.
-/datum/trait/no_taste
+/datum/quirk/no_taste
name = "Ageusia"
desc = "You can't taste anything! Toxic food will still poison you."
value = 0
@@ -12,75 +12,75 @@
-/datum/trait/pineapple_liker
+/datum/quirk/pineapple_liker
name = "Ananas Affinity"
desc = "You find yourself greatly enjoying fruits of the ananas genus. You can't seem to ever get enough of their sweet goodness!"
value = 0
gain_text = "You feel an intense craving for pineapple. "
lose_text = "Your feelings towards pineapples seem to return to a lukewarm state. "
-/datum/trait/pineapple_liker/add()
- var/mob/living/carbon/human/H = trait_holder
+/datum/quirk/pineapple_liker/add()
+ var/mob/living/carbon/human/H = quirk_holder
var/datum/species/species = H.dna.species
species.liked_food |= PINEAPPLE
-/datum/trait/pineapple_liker/remove()
- var/mob/living/carbon/human/H = trait_holder
+/datum/quirk/pineapple_liker/remove()
+ var/mob/living/carbon/human/H = quirk_holder
var/datum/species/species = H.dna.species
species.liked_food &= ~PINEAPPLE
-/datum/trait/pineapple_hater
+/datum/quirk/pineapple_hater
name = "Ananas Aversion"
desc = "You find yourself greatly detesting fruits of the ananas genus. Serious, how the hell can anyone say these things are good? And what kind of madman would even dare putting it on a pizza!?"
value = 0
gain_text = "You find yourself pondering what kind of idiot actually enjoys pineapples... "
lose_text = "Your feelings towards pineapples seem to return to a lukewarm state. "
-/datum/trait/pineapple_hater/add()
- var/mob/living/carbon/human/H = trait_holder
+/datum/quirk/pineapple_hater/add()
+ var/mob/living/carbon/human/H = quirk_holder
var/datum/species/species = H.dna.species
species.disliked_food |= PINEAPPLE
-/datum/trait/pineapple_hater/remove()
- var/mob/living/carbon/human/H = trait_holder
+/datum/quirk/pineapple_hater/remove()
+ var/mob/living/carbon/human/H = quirk_holder
var/datum/species/species = H.dna.species
species.disliked_food &= ~PINEAPPLE
-/datum/trait/deviant_tastes
+/datum/quirk/deviant_tastes
name = "Deviant Tastes"
desc = "You dislike food that most people enjoy, and find delicious what they don't."
value = 0
gain_text = "You start craving something that tastes strange. "
lose_text = "You feel like eating normal food again. "
-/datum/trait/deviant_tastes/add()
- var/mob/living/carbon/human/H = trait_holder
+/datum/quirk/deviant_tastes/add()
+ var/mob/living/carbon/human/H = quirk_holder
var/datum/species/species = H.dna.species
var/liked = species.liked_food
species.liked_food = species.disliked_food
species.disliked_food = liked
-/datum/trait/deviant_tastes/remove()
- var/mob/living/carbon/human/H = trait_holder
+/datum/quirk/deviant_tastes/remove()
+ var/mob/living/carbon/human/H = quirk_holder
var/datum/species/species = H.dna.species
species.liked_food = initial(species.liked_food)
species.disliked_food = initial(species.disliked_food)
-/datum/trait/monochromatic
+/datum/quirk/monochromatic
name = "Monochromacy"
desc = "You suffer from full colorblindness, and perceive nearly the entire world in blacks and whites."
value = 0
medical_record_text = "Patient is afflicted with almost complete color blindness."
-/datum/trait/monochromatic/add()
- trait_holder.add_client_colour(/datum/client_colour/monochrome)
+/datum/quirk/monochromatic/add()
+ quirk_holder.add_client_colour(/datum/client_colour/monochrome)
-/datum/trait/monochromatic/post_add()
- if(trait_holder.mind.assigned_role == "Detective")
- to_chat(trait_holder, "Mmm. Nothing's ever clear on this station. It's all shades of gray... ")
- trait_holder.playsound_local(trait_holder, 'sound/ambience/ambidet1.ogg', 50, FALSE)
+/datum/quirk/monochromatic/post_add()
+ if(quirk_holder.mind.assigned_role == "Detective")
+ to_chat(quirk_holder, "Mmm. Nothing's ever clear on this station. It's all shades of gray... ")
+ quirk_holder.playsound_local(quirk_holder, 'sound/ambience/ambidet1.ogg', 50, FALSE)
-/datum/trait/monochromatic/remove()
- trait_holder.remove_client_colour(/datum/client_colour/monochrome)
+/datum/quirk/monochromatic/remove()
+ quirk_holder.remove_client_colour(/datum/client_colour/monochrome)
diff --git a/code/datums/verbs.dm b/code/datums/verbs.dm
index 72634a3ff5..79fe256bb4 100644
--- a/code/datums/verbs.dm
+++ b/code/datums/verbs.dm
@@ -1,102 +1,102 @@
-/datum/verbs
- var/name
- var/list/children
- var/datum/verbs/parent
- var/list/verblist
- var/abstract = FALSE
-
-//returns the master list for verbs of a type
-/datum/verbs/proc/GetList()
- CRASH("Abstract verblist for [type]")
-
-//do things for each entry in Generate_list
-//return value sets Generate_list[verbpath]
-/datum/verbs/proc/HandleVerb(list/entry, atom/verb/verbpath, ...)
- return entry
-
-/datum/verbs/New()
- var/mainlist = GetList()
- var/ourentry = mainlist[type]
- children = list()
- verblist = list()
- if (ourentry)
- if (!islist(ourentry)) //some of our childern already loaded
- qdel(src)
- CRASH("Verb double load: [type]")
- Add_children(ourentry)
-
- mainlist[type] = src
-
- Load_verbs(type, typesof("[type]/verb"))
-
- var/datum/verbs/parent = mainlist[parent_type]
- if (!parent)
- mainlist[parent_type] = list(src)
- else if (islist(parent))
- parent += src
- else
- parent.Add_children(list(src))
-
-/datum/verbs/proc/Set_parent(datum/verbs/_parent)
- parent = _parent
- if (abstract)
- parent.Add_children(children)
- var/list/verblistoftypes = list()
- for(var/thing in verblist)
- LAZYADD(verblistoftypes[verblist[thing]], thing)
-
- for(var/verbparenttype in verblistoftypes)
- parent.Load_verbs(verbparenttype, verblistoftypes[verbparenttype])
-
-/datum/verbs/proc/Add_children(list/kids)
- if (abstract && parent)
- parent.Add_children(kids)
- return
-
- for(var/thing in kids)
- var/datum/verbs/item = thing
- item.Set_parent(src)
- if (!item.abstract)
- children += item
-
-/datum/verbs/proc/Load_verbs(verb_parent_type, list/verbs)
- if (abstract && parent)
- parent.Load_verbs(verb_parent_type, verbs)
- return
-
- for (var/verbpath in verbs)
- verblist[verbpath] = verb_parent_type
-
-/datum/verbs/proc/Generate_list(...)
- . = list()
- if (length(children))
- for (var/thing in children)
- var/datum/verbs/child = thing
- var/list/childlist = child.Generate_list(arglist(args))
- if (childlist)
- var/childname = "[child]"
- if (childname == "[child.type]")
- var/list/tree = splittext(childname, "/")
- childname = tree[tree.len]
- .[child.type] = "parent=[url_encode(type)];name=[url_encode(childname)]"
- . += childlist
-
- for (var/thing in verblist)
- var/atom/verb/verbpath = thing
- if (!verbpath)
- stack_trace("Bad VERB in [type] verblist: [english_list(verblist)]")
- var/list/entry = list()
- entry["parent"] = "[type]"
- entry["name"] = verbpath.desc
- if (copytext(verbpath.name,1,2) == "@")
- entry["command"] = copytext(verbpath.name,2)
- else
- entry["command"] = replacetext(verbpath.name, " ", "-")
-
- .[verbpath] = HandleVerb(arglist(list(entry, verbpath) + args))
-
-/world/proc/LoadVerbs(verb_type)
- if(!ispath(verb_type, /datum/verbs) || verb_type == /datum/verbs)
- CRASH("Invalid verb_type: [verb_type]")
- for (var/typepath in subtypesof(verb_type))
- new typepath()
+/datum/verbs
+ var/name
+ var/list/children
+ var/datum/verbs/parent
+ var/list/verblist
+ var/abstract = FALSE
+
+//returns the master list for verbs of a type
+/datum/verbs/proc/GetList()
+ CRASH("Abstract verblist for [type]")
+
+//do things for each entry in Generate_list
+//return value sets Generate_list[verbpath]
+/datum/verbs/proc/HandleVerb(list/entry, atom/verb/verbpath, ...)
+ return entry
+
+/datum/verbs/New()
+ var/mainlist = GetList()
+ var/ourentry = mainlist[type]
+ children = list()
+ verblist = list()
+ if (ourentry)
+ if (!islist(ourentry)) //some of our childern already loaded
+ qdel(src)
+ CRASH("Verb double load: [type]")
+ Add_children(ourentry)
+
+ mainlist[type] = src
+
+ Load_verbs(type, typesof("[type]/verb"))
+
+ var/datum/verbs/parent = mainlist[parent_type]
+ if (!parent)
+ mainlist[parent_type] = list(src)
+ else if (islist(parent))
+ parent += src
+ else
+ parent.Add_children(list(src))
+
+/datum/verbs/proc/Set_parent(datum/verbs/_parent)
+ parent = _parent
+ if (abstract)
+ parent.Add_children(children)
+ var/list/verblistoftypes = list()
+ for(var/thing in verblist)
+ LAZYADD(verblistoftypes[verblist[thing]], thing)
+
+ for(var/verbparenttype in verblistoftypes)
+ parent.Load_verbs(verbparenttype, verblistoftypes[verbparenttype])
+
+/datum/verbs/proc/Add_children(list/kids)
+ if (abstract && parent)
+ parent.Add_children(kids)
+ return
+
+ for(var/thing in kids)
+ var/datum/verbs/item = thing
+ item.Set_parent(src)
+ if (!item.abstract)
+ children += item
+
+/datum/verbs/proc/Load_verbs(verb_parent_type, list/verbs)
+ if (abstract && parent)
+ parent.Load_verbs(verb_parent_type, verbs)
+ return
+
+ for (var/verbpath in verbs)
+ verblist[verbpath] = verb_parent_type
+
+/datum/verbs/proc/Generate_list(...)
+ . = list()
+ if (length(children))
+ for (var/thing in children)
+ var/datum/verbs/child = thing
+ var/list/childlist = child.Generate_list(arglist(args))
+ if (childlist)
+ var/childname = "[child]"
+ if (childname == "[child.type]")
+ var/list/tree = splittext(childname, "/")
+ childname = tree[tree.len]
+ .[child.type] = "parent=[url_encode(type)];name=[childname]"
+ . += childlist
+
+ for (var/thing in verblist)
+ var/atom/verb/verbpath = thing
+ if (!verbpath)
+ stack_trace("Bad VERB in [type] verblist: [english_list(verblist)]")
+ var/list/entry = list()
+ entry["parent"] = "[type]"
+ entry["name"] = verbpath.desc
+ if (copytext(verbpath.name,1,2) == "@")
+ entry["command"] = copytext(verbpath.name,2)
+ else
+ entry["command"] = replacetext(verbpath.name, " ", "-")
+
+ .[verbpath] = HandleVerb(arglist(list(entry, verbpath) + args))
+
+/world/proc/LoadVerbs(verb_type)
+ if(!ispath(verb_type, /datum/verbs) || verb_type == /datum/verbs)
+ CRASH("Invalid verb_type: [verb_type]")
+ for (var/typepath in subtypesof(verb_type))
+ new typepath()
diff --git a/code/datums/weather/weather_types/floor_is_lava.dm b/code/datums/weather/weather_types/floor_is_lava.dm
index 5db27b9f6e..00ecfff0b3 100644
--- a/code/datums/weather/weather_types/floor_is_lava.dm
+++ b/code/datums/weather/weather_types/floor_is_lava.dm
@@ -25,8 +25,10 @@
/datum/weather/floor_is_lava/weather_act(mob/living/L)
if(issilicon(L))
return
+ if(istype(L.buckled, /obj/structure/bed))
+ return
for(var/obj/structure/O in L.loc)
- if(O.density || (L in O.buckled_mobs && istype(O, /obj/structure/bed)))
+ if(O.density)
return
if(L.loc.density)
return
diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm
index 9fcec7cc11..9cbccb8fe9 100644
--- a/code/datums/world_topic.dm
+++ b/code/datums/world_topic.dm
@@ -120,8 +120,12 @@
require_comms_key = TRUE
/datum/world_topic/namecheck/Run(list/input)
- var/datum/server_tools_command/namecheck/NC = new
- return NC.Run(input["sender"], input["namecheck"])
+ //Oh this is a hack, someone refactor the functionality out of the chat command PLS
+ var/datum/tgs_chat_command/namecheck/NC = new
+ var/datum/tgs_chat_user/user = new
+ user.friendly_name = input["sender"]
+ user.mention = user.friendly_name
+ return NC.Run(user, input["namecheck"])
/datum/world_topic/adminwho
keyword = "adminwho"
@@ -164,9 +168,16 @@
.["security_level"] = get_security_level()
.["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0
// Amount of world's ticks in seconds, useful for calculating round duration
+
+ //Time dilation stats.
+ .["time_dilation_current"] = SStime_track.time_dilation_current
+ .["time_dilation_avg"] = SStime_track.time_dilation_avg
+ .["time_dilation_avg_slow"] = SStime_track.time_dilation_avg_slow
+ .["time_dilation_avg_fast"] = SStime_track.time_dilation_avg_fast
if(SSshuttle && SSshuttle.emergency)
.["shuttle_mode"] = SSshuttle.emergency.mode
// Shuttle status, see /__DEFINES/stat.dm
.["shuttle_timer"] = SSshuttle.emergency.timeLeft()
// Shuttle timer, in seconds
+
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 87894dd4d7..85a0fd1d4e 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -7,6 +7,7 @@
icon = 'icons/turf/areas.dmi'
icon_state = "unknown"
layer = AREA_LAYER
+ plane = BLACKNESS_PLANE //Keeping this on the default plane, GAME_PLANE, will make area overlays fail to render on FLOOR_PLANE.
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
invisibility = INVISIBILITY_LIGHTING
@@ -518,4 +519,4 @@ GLOBAL_LIST_EMPTY(teleportlocs)
// A hook so areas can modify the incoming args
/area/proc/PlaceOnTopReact(list/new_baseturfs, turf/fake_turf_type, flags)
- return flags
\ No newline at end of file
+ return flags
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index a77bf196c2..93d77209e0 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -1,6 +1,6 @@
GLOBAL_LIST_INIT(possible_changeling_IDs, list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega"))
GLOBAL_LIST_INIT(slots, list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store"))
-GLOBAL_LIST_INIT(slot2slot, list("head" = slot_head, "wear_mask" = slot_wear_mask, "neck" = slot_neck, "back" = slot_back, "wear_suit" = slot_wear_suit, "w_uniform" = slot_w_uniform, "shoes" = slot_shoes, "belt" = slot_belt, "gloves" = slot_gloves, "glasses" = slot_glasses, "ears" = slot_ears, "wear_id" = slot_wear_id, "s_store" = slot_s_store))
+GLOBAL_LIST_INIT(slot2slot, list("head" = SLOT_HEAD, "wear_mask" = SLOT_WEAR_MASK, "neck" = SLOT_NECK, "back" = SLOT_BACK, "wear_suit" = SLOT_WEAR_SUIT, "w_uniform" = SLOT_W_UNIFORM, "shoes" = SLOT_SHOES, "belt" = SLOT_BELT, "gloves" = SLOT_GLOVES, "glasses" = SLOT_GLASSES, "ears" = SLOT_EARS, "wear_id" = SLOT_WEAR_ID, "s_store" = SLOT_S_STORE))
GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "wear_mask" = /obj/item/clothing/mask/changeling, "back" = /obj/item/changeling, "wear_suit" = /obj/item/clothing/suit/changeling, "w_uniform" = /obj/item/clothing/under/changeling, "shoes" = /obj/item/clothing/shoes/changeling, "belt" = /obj/item/changeling, "gloves" = /obj/item/clothing/gloves/changeling, "glasses" = /obj/item/clothing/glasses/changeling, "ears" = /obj/item/changeling, "wear_id" = /obj/item/changeling, "s_store" = /obj/item/changeling))
GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our this objective to all lings
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index 03de28e0ff..355dd869b1 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -198,7 +198,7 @@ Credit where due:
L.equipOutfit(/datum/outfit/servant_of_ratvar)
var/obj/item/clockwork/slab/S = new
var/slot = "At your feet"
- var/list/slots = list("In your left pocket" = slot_l_store, "In your right pocket" = slot_r_store, "In your backpack" = slot_in_backpack, "On your belt" = slot_belt)
+ var/list/slots = list("In your left pocket" = SLOT_L_STORE, "In your right pocket" = SLOT_R_STORE, "In your backpack" = SLOT_IN_BACKPACK, "On your belt" = SLOT_BELT)
if(ishuman(L))
var/mob/living/carbon/human/H = L
slot = H.equip_in_one_of_slots(S, slots)
@@ -211,7 +211,7 @@ Credit where due:
to_chat(L, "There is a paper in your backpack! It'll tell you if anything's changed, as well as what to expect. ")
to_chat(L, "[slot] is a clockwork slab , a multipurpose tool used to construct machines and invoke ancient words of power. If this is your first time \
as a servant, you can find a concise tutorial in the Recollection category of its interface. ")
- to_chat(L, "If you want more information, you can find a wiki link here! https://tgstation13.org/wiki/Clockwork_Cult")
+ to_chat(L, "If you want more information, you can read the wiki page to learn more. ")
return TRUE
return FALSE
diff --git a/code/game/gamemodes/clown_ops/bananium_bomb.dm b/code/game/gamemodes/clown_ops/bananium_bomb.dm
index 86db2e94f9..c7212a671c 100644
--- a/code/game/gamemodes/clown_ops/bananium_bomb.dm
+++ b/code/game/gamemodes/clown_ops/bananium_bomb.dm
@@ -43,17 +43,17 @@
if(!H.w_uniform || H.dropItemToGround(H.w_uniform))
C = new /obj/item/clothing/under/rank/clown(H)
C.flags_1 |= NODROP_1 //mwahaha
- H.equip_to_slot_or_del(C, slot_w_uniform)
+ H.equip_to_slot_or_del(C, SLOT_W_UNIFORM)
if(!H.shoes || H.dropItemToGround(H.shoes))
C = new /obj/item/clothing/shoes/clown_shoes(H)
C.flags_1 |= NODROP_1
- H.equip_to_slot_or_del(C, slot_shoes)
+ H.equip_to_slot_or_del(C, SLOT_SHOES)
if(!H.wear_mask || H.dropItemToGround(H.wear_mask))
C = new /obj/item/clothing/mask/gas/clown_hat(H)
C.flags_1 |= NODROP_1
- H.equip_to_slot_or_del(C, slot_wear_mask)
+ H.equip_to_slot_or_del(C, SLOT_WEAR_MASK)
H.dna.add_mutation(CLOWNMUT)
H.gain_trauma(/datum/brain_trauma/mild/phobia, TRAUMA_RESILIENCE_LOBOTOMY, "clowns") //MWA HA HA
diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm
index 6488a98d7d..edd05aa49b 100644
--- a/code/game/gamemodes/clown_ops/clown_weapons.dm
+++ b/code/game/gamemodes/clown_ops/clown_weapons.dm
@@ -15,7 +15,7 @@
/obj/item/clothing/shoes/clown_shoes/combat
name = "combat clown shoes"
desc = "advanced clown shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeek at 100% capacity."
- flags_1 = NOSLIP_1
+ clothing_flags = NOSLIP
slowdown = SHOES_SLOWDOWN
armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50)
strip_delay = 70
@@ -209,7 +209,7 @@
if(!istype(M.wear_mask, /obj/item/clothing/mask/gas/clown_hat) && !istype(M.wear_mask, /obj/item/clothing/mask/gas/mime) )
if(!M.wear_mask || M.dropItemToGround(M.wear_mask))
var/obj/item/clothing/mask/fakemoustache/sticky/the_stash = new /obj/item/clothing/mask/fakemoustache/sticky()
- M.equip_to_slot_or_del(the_stash, slot_wear_mask, TRUE, TRUE, TRUE, TRUE)
+ M.equip_to_slot_or_del(the_stash, SLOT_WEAR_MASK, TRUE, TRUE, TRUE, TRUE)
/obj/item/clothing/mask/fakemoustache/sticky
var/unstick_time = 600
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index b6ea8c5234..3b7dca1a81 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -155,7 +155,7 @@
if(tc)
var/obj/item/radio/uplink/U = new uplink_type(H, H.key, tc)
- H.equip_to_slot_or_del(U, slot_in_backpack)
+ H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK)
var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H)
W.implant(H)
@@ -171,7 +171,7 @@
mask = /obj/item/clothing/mask/gas/syndicate
suit = /obj/item/clothing/suit/space/hardsuit/syndi
r_pocket = /obj/item/tank/internals/emergency_oxygen/engi
- internals_slot = slot_r_store
+ internals_slot = SLOT_R_STORE
belt = /obj/item/storage/belt/military
r_hand = /obj/item/gun/ballistic/automatic/shotgun/bulldog
backpack_contents = list(/obj/item/storage/box/syndie=1,\
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 04753e3d50..7559e21e21 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -114,7 +114,7 @@ GLOBAL_LIST_EMPTY(objectives)
if(receiver && receiver.current)
if(ishuman(receiver.current))
var/mob/living/carbon/human/H = receiver.current
- var/list/slots = list("backpack" = slot_in_backpack)
+ var/list/slots = list("backpack" = SLOT_IN_BACKPACK)
for(var/eq_path in special_equipment)
var/obj/O = new eq_path
H.equip_in_one_of_slots(O, slots)
@@ -712,6 +712,8 @@ GLOBAL_LIST_EMPTY(possible_items_special)
var/min_lings = 3 //Minimum amount of lings for this team objective to be possible
var/escape_objective_compatible = FALSE
+/datum/objective/changeling_team_objective/proc/prepare()
+ return FALSE
//Impersonate department
//Picks as many people as it can from a department (Security,Engineer,Medical,Science)
@@ -724,6 +726,19 @@ GLOBAL_LIST_EMPTY(possible_items_special)
var/department_string = ""
+/datum/objective/changeling_team_objective/impersonate_department/prepare()
+ var/result = FALSE
+ if(command_staff_only)
+ result = get_heads()
+ else
+ result = get_department_staff()
+ if(result)
+ update_explanation_text()
+ return TRUE
+ else
+ return FALSE
+
+
/datum/objective/changeling_team_objective/impersonate_department/proc/get_department_staff()
department_minds = list()
department_real_names = list()
@@ -756,9 +771,8 @@ GLOBAL_LIST_EMPTY(possible_items_special)
if(!department_minds.len)
log_game("[type] has failed to find department staff, and has removed itself. the round will continue normally")
- owner.objectives -= src
- qdel(src)
- return
+ return FALSE
+ return TRUE
/datum/objective/changeling_team_objective/impersonate_department/proc/get_heads()
@@ -785,19 +799,8 @@ GLOBAL_LIST_EMPTY(possible_items_special)
if(!department_minds.len)
log_game("[type] has failed to find department heads, and has removed itself. the round will continue normally")
- owner.objectives -= src
- qdel(src)
- return
-
-
-/datum/objective/changeling_team_objective/impersonate_department/New(var/text)
- ..()
- if(command_staff_only)
- get_heads()
- else
- get_department_staff()
-
- update_explanation_text()
+ return FALSE
+ return TRUE
/datum/objective/changeling_team_objective/impersonate_department/update_explanation_text()
@@ -862,9 +865,6 @@ GLOBAL_LIST_EMPTY(possible_items_special)
return TRUE
return FALSE
-
-
-
//A subtype of impersonate_department
//This subtype always picks as many command staff as it can (HoS,HoP,Cap,CE,CMO,RD)
//and tasks the lings with killing and replacing them
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index 64fda883b9..d42c546990 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -41,7 +41,7 @@
name = "a hand teleporter."
targetitem = /obj/item/hand_tele
difficulty = 5
- excludefromjob = list("Captain")
+ excludefromjob = list("Captain", "Research Director")
/datum/objective_item/steal/jetpack
name = "the Captain's jetpack."
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index 253f18f717..a09db0a3cc 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "ai-slipper0"
layer = PROJECTILE_HIT_THRESHHOLD_LAYER
+ plane = FLOOR_PLANE
anchored = TRUE
max_integrity = 200
armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index a399e4f291..17bfe5e02c 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -126,7 +126,7 @@
return examine(user)
//Start growing a human clone in the pod!
-/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, se, mindref, datum/species/mrace, list/features, factions, list/traits)
+/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, se, mindref, datum/species/mrace, list/features, factions, list/quirks)
if(panel_open)
return FALSE
if(mess || attempting)
@@ -203,7 +203,7 @@
if(H)
H.faction |= factions
- for(var/V in traits)
+ for(var/V in quirks)
new V(H)
H.set_cloned_appearance()
@@ -399,7 +399,7 @@
QDEL_IN(mob_occupant, 40)
/obj/machinery/clonepod/relaymove(mob/user)
- container_resist()
+ container_resist(user)
/obj/machinery/clonepod/container_resist(mob/living/user)
if(user.stat == CONSCIOUS)
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index e90f69bf23..46898bb2d7 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -291,6 +291,7 @@
/obj/machinery/computer/arcade/battle/emag_act(mob/user)
if(obj_flags & EMAGGED)
return
+ to_chat(user, "A mesmerizing Rhumba beat starts playing from the arcade machine's speakers! ")
temp = "If you die in the game, you die for real!"
player_hp = 30
player_mp = 10
@@ -506,9 +507,9 @@
if(ORION_TRAIL_ILLNESS)
var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS
if(severity == 1)
- to_chat(M, "You suddenly feel slightly nauseous. " )
+ to_chat(M, "You suddenly feel slightly nauseated. " )
if(severity == 2)
- to_chat(usr, "You suddenly feel extremely nauseous and hunch over until it passes. ")
+ to_chat(usr, "You suddenly feel extremely nauseated and hunch over until it passes. ")
M.Stun(60)
if(severity >= 3) //you didn't pray hard enough
to_chat(M, "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit. ")
@@ -614,7 +615,7 @@
L.Stun(200, ignore_canstun = TRUE) //you can't run :^)
var/S = new /obj/singularity/academy(usr.loc)
addtimer(CALLBACK(src, /atom/movable/proc/say, "[S] winks out, just as suddenly as it appeared."), 50)
- QDEL_IN(src, 50)
+ QDEL_IN(S, 50)
else
event = null
turns += 1
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index b43ffdfec8..95b4ea9f80 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -71,7 +71,7 @@
if(pod.occupant)
continue //how though?
- if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["traits"]))
+ if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"]))
temp = "[R.fields["name"]] => Cloning cycle in progress... "
records -= R
@@ -400,7 +400,7 @@
else if(pod.occupant)
temp = "Cloning cycle already in progress. "
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["traits"]))
+ else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"]))
temp = "[C.fields["name"]] => Cloning cycle in progress... "
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
records.Remove(C)
@@ -473,10 +473,10 @@
R.fields["blood_type"] = dna.blood_type
R.fields["features"] = dna.features
R.fields["factions"] = mob_occupant.faction
- R.fields["traits"] = list()
- for(var/V in mob_occupant.roundstart_traits)
- var/datum/trait/T = V
- R.fields["traits"] += T.type
+ R.fields["quirks"] = list()
+ for(var/V in mob_occupant.roundstart_quirks)
+ var/datum/quirk/T = V
+ R.fields["quirks"] += T.type
if (!isnull(mob_occupant.mind)) //Save that mind so traitors can continue traitoring after cloning.
R.fields["mind"] = "[REF(mob_occupant.mind)]"
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 9f50afdfee..14d02e9752 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -45,7 +45,7 @@
/obj/machinery/computer/communications/process()
if(..())
- if(state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE && state != STATE_PURCHASE)
+ if(state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE && state != STATE_PURCHASE && state != STATE_VIEWMESSAGE)
updateDialog()
/obj/machinery/computer/communications/Topic(href, href_list)
diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm
index 978f7adcf0..93b997eee6 100644
--- a/code/game/machinery/computer/teleporter.dm
+++ b/code/game/machinery/computer/teleporter.dm
@@ -174,25 +174,26 @@
else
var/list/S = power_station.linked_stations
- if(!S.len)
- to_chat(user, "No connected stations located. ")
- return
for(var/obj/machinery/teleport/station/R in S)
- if(is_eligible(R))
+ if(is_eligible(R) && R.teleporter_hub)
var/area/A = get_area(R)
L[avoid_assoc_duplicate_keys(A.name, areaindex)] = R
+ if(!L.len)
+ to_chat(user, "No active connected stations located. ")
+ return
var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L
- target = L[desc]
- if(target)
- var/obj/machinery/teleport/station/trg = target
- trg.linked_stations |= power_station
- trg.stat &= ~NOPOWER
- if(trg.teleporter_hub)
- trg.teleporter_hub.stat &= ~NOPOWER
- trg.teleporter_hub.update_icon()
- if(trg.teleporter_console)
- trg.teleporter_console.stat &= ~NOPOWER
- trg.teleporter_console.update_icon()
+ var/obj/machinery/teleport/station/target_station = L[desc]
+ if(!target_station || !target_station.teleporter_hub)
+ return
+ target = target_station.teleporter_hub
+ target_station.linked_stations |= power_station
+ target_station.stat &= ~NOPOWER
+ if(target_station.teleporter_hub)
+ target_station.teleporter_hub.stat &= ~NOPOWER
+ target_station.teleporter_hub.update_icon()
+ if(target_station.teleporter_console)
+ target_station.teleporter_console.stat &= ~NOPOWER
+ target_station.teleporter_console.update_icon()
/obj/machinery/computer/teleporter/proc/is_eligible(atom/movable/AM)
var/turf/T = get_turf(AM)
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 7aab26dc63..59bf9f86fd 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -4,7 +4,7 @@
icon_state = "box_0"
density = TRUE
max_integrity = 250
- var/obj/item/circuitboard/circuit = null
+ var/obj/item/circuitboard/machine/circuit = null
var/state = 1
/obj/structure/frame/examine(user)
@@ -165,6 +165,13 @@
icon_state = "box_1"
return
+ if(istype(P, /obj/item/wrench) && !circuit.needs_anchored)
+ to_chat(user, "You start [anchored ? "un" : ""]securing [name]... ")
+ if(P.use_tool(src, user, 40, volume=75))
+ to_chat(user, "You [anchored ? "un" : ""]secure [name]. ")
+ anchored = !anchored
+ return
+
if(istype(P, /obj/item/screwdriver))
var/component_check = 1
for(var/R in req_components)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 880f0fe8c8..db0a9a5866 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -323,12 +323,12 @@
return
else
return
- else if(user.hallucinating() && ishuman(user) && prob(4) && !operating)
+ else if(user.hallucinating() && ishuman(user) && prob(1) && !operating)
var/mob/living/carbon/human/H = user
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.siemens_coefficient)//not insulated
- hallucinate_shock(H)
+ new /datum/hallucination/shock(H)
return
if (cyclelinkedairlock)
if (!shuttledocked && !emergency && !cyclelinkedairlock.shuttledocked && !cyclelinkedairlock.emergency && allowed(user))
@@ -338,34 +338,6 @@
addtimer(CALLBACK(cyclelinkedairlock, .proc/close), 2)
..()
-/obj/machinery/door/airlock/proc/hallucinate_shock(mob/living/user)
- var/image/shock_image = image(user, user, dir = user.dir)
- var/image/electrocution_skeleton_anim = image('icons/mob/human.dmi', user, icon_state = "electrocuted_base", layer=ABOVE_MOB_LAYER)
- shock_image.color = rgb(0,0,0)
- shock_image.override = TRUE
- electrocution_skeleton_anim.appearance_flags |= RESET_COLOR|KEEP_APART
-
- to_chat(user, "You feel a powerful shock course through your body! ")
- if(user.client)
- user.client.images |= shock_image
- user.client.images |= electrocution_skeleton_anim
- addtimer(CALLBACK(src, .proc/reset_hallucinate_shock_animation, user, shock_image, electrocution_skeleton_anim), 40)
- user.playsound_local(get_turf(src), "sparks", 100, 1)
- user.staminaloss += 50
- user.Stun(40)
- user.jitteriness += 1000
- user.do_jitter_animation(user.jitteriness)
- addtimer(CALLBACK(src, .proc/hallucinate_shock_drop, user), 20)
-
-/obj/machinery/door/airlock/proc/reset_hallucinate_shock_animation(mob/living/user, shock_image, electrocution_skeleton_anim)
- if(user.client)
- user.client.images.Remove(shock_image)
- user.client.images.Remove(electrocution_skeleton_anim)
-
-/obj/machinery/door/airlock/proc/hallucinate_shock_drop(mob/living/user)
- user.jitteriness = max(user.jitteriness - 990, 10) //Still jittery, but vastly less
- user.Knockdown(60)
-
/obj/machinery/door/airlock/proc/isElectrified()
if(src.secondsElectrified != NOT_ELECTRIFIED)
return TRUE
@@ -1098,10 +1070,8 @@
else
playsound(src.loc, 'sound/machines/airlockforced.ogg', 30, 1)
- if(autoclose && normalspeed)
- addtimer(CALLBACK(src, .proc/autoclose), 150)
- else if(autoclose && !normalspeed)
- addtimer(CALLBACK(src, .proc/autoclose), 15)
+ if(autoclose)
+ autoclose_in(normalspeed ? 150 : 15)
if(!density)
return TRUE
@@ -1134,7 +1104,7 @@
if(safe)
for(var/atom/movable/M in get_turf(src))
if(M.density && M != src) //something is blocking the door
- addtimer(CALLBACK(src, .proc/autoclose), 60)
+ autoclose_in(60)
return
if(forced < 2)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 4685097de1..c7369a6d29 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -274,7 +274,7 @@
for(var/atom/movable/M in get_turf(src))
if(M.density && M != src) //something is blocking the door
if(autoclose)
- addtimer(CALLBACK(src, .proc/autoclose), 60)
+ autoclose_in(60)
return
operating = TRUE
@@ -326,6 +326,9 @@
if(!QDELETED(src) && !density && !operating && !locked && !welded && autoclose)
close()
+/obj/machinery/door/proc/autoclose_in(wait)
+ addtimer(CALLBACK(src, .proc/autoclose), wait, TIMER_UNIQUE | TIMER_NO_HASH_WAIT | TIMER_OVERRIDE)
+
/obj/machinery/door/proc/requiresID()
return 1
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 1635b448f4..4a2df11151 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -144,9 +144,7 @@
else
close()
-/obj/machinery/door/firedoor/interact(mob/user)
- if(!issilicon(user))
- return TRUE
+/obj/machinery/door/firedoor/attack_ai(mob/user)
add_fingerprint(user)
if(welded || operating || stat & NOPOWER)
return TRUE
@@ -156,6 +154,9 @@
close()
return TRUE
+/obj/machinery/door/firedoor/attack_robot(mob/user)
+ return attack_ai(user)
+
/obj/machinery/door/firedoor/attack_alien(mob/user)
add_fingerprint(user)
if(welded)
@@ -355,8 +356,7 @@
return
user.visible_message("[user] removes the wires from [src]. ", \
"You remove the wiring from [src], exposing the circuit board. ")
- var/obj/item/stack/cable_coil/B = new(get_turf(src))
- B.amount = 5
+ new/obj/item/stack/cable_coil(get_turf(src), 5)
constructionStep = CONSTRUCTION_GUTTED
update_icon()
return
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm
index cf2eed6f53..9d4f5dd936 100644
--- a/code/game/machinery/droneDispenser.dm
+++ b/code/game/machinery/droneDispenser.dm
@@ -51,7 +51,7 @@
/obj/machinery/droneDispenser/Initialize()
. = ..()
- var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), MINERAL_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, TRUE)
+ var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), MINERAL_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, TRUE, list(/obj/item/stack))
materials.insert_amount(starting_amount)
materials.precise_insertion = TRUE
using_materials = list(MAT_METAL=metal_cost, MAT_GLASS=glass_cost)
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index ab2694769f..61ee4eb178 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -32,6 +32,7 @@ Possible to do for anyone motivated enough:
desc = "It's a floor-mounted device for projecting holographic images."
icon_state = "holopad0"
layer = LOW_OBJ_LAYER
+ plane = FLOOR_PLANE
flags_1 = HEAR_1
anchored = TRUE
use_power = IDLE_POWER_USE
@@ -66,7 +67,7 @@ Possible to do for anyone motivated enough:
flags_1 = NODECONSTRUCT_1
on_network = FALSE
var/proximity_range = 1
-
+
/obj/machinery/holopad/tutorial/Initialize(mapload)
. = ..()
if(proximity_range)
@@ -86,7 +87,7 @@ Possible to do for anyone motivated enough:
replay_stop()
else if(disk && disk.record)
replay_start()
-
+
/obj/machinery/holopad/tutorial/HasProximity(atom/movable/AM)
if (!isliving(AM))
return
@@ -487,7 +488,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
if(QDELETED(user) || user.incapacitated() || !user.client)
return FALSE
return TRUE
-
+
//Can we display holos there
//Area check instead of line of sight check because this is a called a lot if AI wants to move around.
/obj/machinery/holopad/proc/validate_location(turf/T,check_los = FALSE)
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 79954693c3..f6182fdae0 100644
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -3,6 +3,7 @@
desc = "It's useful for igniting plasma."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "igniter0"
+ plane = FLOOR_PLANE
var/id = null
var/on = FALSE
anchored = TRUE
@@ -12,7 +13,7 @@
max_integrity = 300
armor = list("melee" = 50, "bullet" = 30, "laser" = 70, "energy" = 50, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
resistance_flags = FIRE_PROOF
-
+
/obj/machinery/igniter/on
on = TRUE
icon_state = "igniter1"
diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm
index 93a6cfca62..95bf10bc6c 100644
--- a/code/game/machinery/launch_pad.dm
+++ b/code/game/machinery/launch_pad.dm
@@ -242,7 +242,7 @@
icon = 'icons/obj/telescience.dmi'
icon_state = "blpad-remote"
w_class = WEIGHT_CLASS_SMALL
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
var/sending = TRUE
var/obj/machinery/launchpad/briefcase/pad
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index ec20efbf84..08fcb1baa8 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -19,7 +19,7 @@
var/item_recycle_sound = 'sound/items/welder.ogg'
/obj/machinery/recycler/Initialize()
- AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM))
+ AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE, MAT_PLASTIC), INFINITY, FALSE, null, null, null, TRUE)
AddComponent(/datum/component/butchering, 1, amount_produced,amount_produced/5)
. = ..()
update_icon()
diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm
deleted file mode 100644
index 1fdc9b56dc..0000000000
--- a/code/game/machinery/robot_fabricator.dm
+++ /dev/null
@@ -1,143 +0,0 @@
-/obj/machinery/robotic_fabricator
- name = "robotic fabricator"
- icon = 'icons/obj/robotics.dmi'
- icon_state = "fab-idle"
- density = TRUE
- anchored = TRUE
- var/metal_amount = 0
- var/operating = FALSE
- var/obj/item/being_built = null
- use_power = IDLE_POWER_USE
- idle_power_usage = 20
- active_power_usage = 5000
-
-/obj/machinery/robotic_fabricator/attackby(obj/item/O, mob/living/user, params)
- if (istype(O, /obj/item/stack/sheet/metal))
- if (metal_amount < 150000)
- add_overlay("fab-load-metal")
- addtimer(CALLBACK(src, .proc/FinishLoadingMetal, O, user), 15)
- else
- to_chat(user, "\The [src] is full.")
- else
- return ..()
-
-/obj/machinery/robotic_fabricator/proc/FinishLoadingMetal(obj/item/stack/sheet/metal/M, mob/living/user)
- cut_overlay("fab-load-metal")
- if(QDELETED(M) || QDELETED(user))
- return
- var/count = 0
- while(metal_amount < 150000 && !QDELETED(M))
- metal_amount += M.materials[MAT_METAL]
- M.use(1)
- count++
-
- to_chat(user, "You insert [count] metal sheet\s into \the [src]. ")
- updateDialog()
-
-/obj/machinery/robotic_fabricator/power_change()
- if (powered())
- stat &= ~NOPOWER
- else
- stat |= NOPOWER
-
-/obj/machinery/robotic_fabricator/ui_interact(mob/user)
- . = ..()
- var/dat
-
- if (src.operating)
- dat = {"
-Building [src.being_built.name].
-Please wait until completion...
-
-"}
- else
- dat = {"
-Metal Amount: [min(150000, src.metal_amount)] cm3 (MAX: 150,000)
-
-Left Arm (25,000 cc metal.)
- Right Arm (25,000 cc metal.)
- Left Leg (25,000 cc metal.)
- Right Leg (25,000 cc metal).
- Chest (50,000 cc metal).
- Head (50,000 cc metal).
- Robot Frame (75,000 cc metal).
-"}
-
- user << browse("Robotic Fabricator Control Panel [dat] ", "window=robot_fabricator")
- onclose(user, "robot_fabricator")
- return
-
-/obj/machinery/robotic_fabricator/Topic(href, href_list)
- if (..())
- return
-
- usr.set_machine(src)
- src.add_fingerprint(usr)
-
- if (href_list["make"])
- if (!src.operating)
- var/part_type = text2num(href_list["make"])
-
- var/build_type = ""
- var/build_time = 200
- var/build_cost = 25000
-
- switch (part_type)
- if (1)
- build_type = "/obj/item/bodypart/l_arm/robot"
- build_time = 200
- build_cost = 10000
-
- if (2)
- build_type = "/obj/item/bodypart/r_arm/robot"
- build_time = 200
- build_cost = 10000
-
- if (3)
- build_type = "/obj/item/bodypart/l_leg/robot"
- build_time = 200
- build_cost = 10000
-
- if (4)
- build_type = "/obj/item/bodypart/r_leg/robot"
- build_time = 200
- build_cost = 10000
-
- if (5)
- build_type = "/obj/item/bodypart/chest/robot"
- build_time = 350
- build_cost = 40000
-
- if (6)
- build_type = "/obj/item/bodypart/head/robot"
- build_time = 350
- build_cost = 5000
-
- if (7)
- build_type = "/obj/item/robot_suit"
- build_time = 600
- build_cost = 15000
-
- var/building = text2path(build_type)
- if (!isnull(building))
- if (src.metal_amount >= build_cost)
- operating = TRUE
- src.use_power = ACTIVE_POWER_USE
-
- src.metal_amount = max(0, src.metal_amount - build_cost)
-
- src.being_built = new building(src)
-
- src.add_overlay("fab-active")
- src.updateUsrDialog()
-
- spawn (build_time)
- if (!isnull(src.being_built))
- src.being_built.forceMove(drop_location())
- src.being_built = null
- src.use_power = IDLE_POWER_USE
- operating = FALSE
- cut_overlay("fab-active")
- return
-
- updateUsrDialog()
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index 7d7d010b2c..be5b404edc 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -5,7 +5,7 @@
name = "ominous beacon"
desc = "This looks suspicious..."
icon = 'icons/obj/singularity.dmi'
- icon_state = "beacon"
+ icon_state = "beacon0"
anchored = FALSE
density = TRUE
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 7b66a57f59..cef200173c 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -47,7 +47,6 @@
return
if(is_ready())
teleport(AM)
- use_power(5000)
/obj/machinery/teleport/hub/attackby(obj/item/W, mob/user, params)
if(default_deconstruction_screwdriver(user, "tele-o", "tele0", W))
@@ -61,13 +60,15 @@
/obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj, turf/T)
var/obj/machinery/computer/teleporter/com = power_station.teleporter_console
- if (!com)
+ if (QDELETED(com))
return
- if (!com.target)
+ if (QDELETED(com.target))
+ com.target = null
visible_message("Cannot authenticate locked on coordinates. Please reinstate coordinate matrix. ")
return
if (ismovableatom(M))
if(do_teleport(M, com.target))
+ use_power(5000)
if(!calibrated && prob(30 - ((accurate) * 10))) //oh dear a problem
if(ishuman(M))//don't remove people from the round randomly you jerks
var/mob/living/carbon/human/human = M
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index cdb12eaf5c..ab906f1bfa 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -65,8 +65,7 @@
return
/obj/item/stack/sheet/hairlesshide/machine_wash(obj/machinery/washing_machine/WM)
- var/obj/item/stack/sheet/wetleather/WL = new(loc)
- WL.amount = amount
+ new /obj/item/stack/sheet/wetleather(drop_location(), amount)
qdel(src)
/obj/item/clothing/suit/hooded/ian_costume/machine_wash(obj/machinery/washing_machine/WM)
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index 980b7170c1..0d1651c491 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -367,8 +367,7 @@
return ..()
/obj/item/mecha_parts/mecha_equipment/generator/proc/generator_init()
- fuel = new /obj/item/stack/sheet/mineral/plasma(src)
- fuel.amount = 0
+ fuel = new /obj/item/stack/sheet/mineral/plasma(src, 0)
/obj/item/mecha_parts/mecha_equipment/generator/detach()
STOP_PROCESSING(SSobj, src)
@@ -472,8 +471,7 @@
var/rad_per_cycle = 3
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/generator_init()
- fuel = new /obj/item/stack/sheet/mineral/uranium(src)
- fuel.amount = 0
+ fuel = new /obj/item/stack/sheet/mineral/uranium(src, 0)
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/critfail()
return
diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm
index 2054a6ba9a..96adece298 100644
--- a/code/game/mecha/equipment/tools/work_tools.dm
+++ b/code/game/mecha/equipment/tools/work_tools.dm
@@ -301,8 +301,7 @@
/obj/item/mecha_parts/mecha_equipment/cable_layer/Initialize()
. = ..()
- cable = new(src)
- cable.amount = 0
+ cable = new(src, 0)
/obj/item/mecha_parts/mecha_equipment/cable_layer/can_attach(obj/mecha/working/M)
if(..())
@@ -333,8 +332,7 @@
if(to_load)
to_load = min(target.amount, to_load)
if(!cable)
- cable = new(src)
- cable.amount = 0
+ cable = new(src, 0)
cable.amount += to_load
target.use(to_load)
occupant_message("[to_load] meters of cable successfully loaded. ")
@@ -358,8 +356,7 @@
m = min(m, cable.amount)
if(m)
use_cable(m)
- var/obj/item/stack/cable_coil/CC = new (get_turf(chassis))
- CC.amount = m
+ new /obj/item/stack/cable_coil(get_turf(chassis), m)
else
occupant_message("There's no more cable on the reel.")
return
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 49f29b5969..526c808809 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -37,7 +37,7 @@
/obj/machinery/mecha_part_fabricator/Initialize()
var/datum/component/material_container/materials = AddComponent(/datum/component/material_container,
list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0,
- FALSE, list(/obj/item/stack, /obj/item/stack/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
+ FALSE, list(/obj/item/stack), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
materials.precise_insertion = TRUE
stored_research = new
return ..()
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 616cd27a2d..b00212b0de 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -812,16 +812,18 @@
to_chat(usr, "The [name] is already occupied! ")
log_append_to_last("Permission denied.")
return
- var/passed
if(dna_lock)
+ var/passed = FALSE
if(user.has_dna())
var/mob/living/carbon/C = user
if(C.dna.unique_enzymes==dna_lock)
- passed = 1
- else if(operation_allowed(user))
- passed = 1
- if(!passed)
- to_chat(user, "Access denied. ")
+ passed = TRUE
+ if (!passed)
+ to_chat(user, "Access denied. [name] is secured with a DNA lock. ")
+ log_append_to_last("Permission denied.")
+ return
+ if(!operation_allowed(user))
+ to_chat(user, "Access denied. Insufficient operation keycodes. ")
log_append_to_last("Permission denied.")
return
if(user.buckled)
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 429d954451..21ecc26905 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -31,8 +31,6 @@
ore.forceMove(ore_box)
/obj/mecha/working/ripley/Destroy()
- for(var/i=1, i <= hides, i++)
- new /obj/item/stack/sheet/animalhide/goliath_hide(loc) //If a goliath-plated ripley gets killed, all the plates drop
for(var/atom/movable/A in cargo)
A.forceMove(drop_location())
step_rand(A)
@@ -49,13 +47,18 @@
/obj/mecha/working/ripley/update_icon()
..()
- if (hides)
+ GET_COMPONENT(C,/datum/component/armor_plate)
+ if (C.amount)
cut_overlays()
- if(hides < 3)
+ if(C.amount < 3)
add_overlay(occupant ? "ripley-g" : "ripley-g-open")
else
add_overlay(occupant ? "ripley-g-full" : "ripley-g-full-open")
+/obj/mecha/working/ripley/Initialize()
+ . = ..()
+ AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list("melee" = 10, "bullet" = 5, "laser" = 5))
+
/obj/mecha/working/ripley/firefighter
desc = "Autonomous Power Loader Unit. This model is refitted with additional thermal protection."
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index b3cb0ff9c4..035fc845c4 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -8,7 +8,7 @@
anchored = TRUE
light_range = 3
var/movechance = 70
- var/obj/item/assembly/signaler/anomaly/aSignal = null
+ var/obj/item/assembly/signaler/anomaly/aSignal
var/area/impact_area
var/lifespan = 990
@@ -26,10 +26,12 @@
aSignal = new(src)
aSignal.name = "[name] core"
aSignal.code = rand(1,100)
+ aSignal.anomaly_type = type
- aSignal.frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ)
- if(ISMULTIPLE(aSignal.frequency, 2))//signaller frequencies are always uneven!
- aSignal.frequency++
+ var/frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ)
+ if(ISMULTIPLE(frequency, 2))//signaller frequencies are always uneven!
+ frequency++
+ aSignal.set_frequency(frequency)
if(new_lifespan)
lifespan = new_lifespan
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index 0794b818da..43ee2991e0 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -1,7 +1,7 @@
/obj/effect/decal/cleanable
gender = PLURAL
layer = ABOVE_NORMAL_TURF_LAYER
- var/list/random_icon_states = list()
+ var/list/random_icon_states = null
var/blood_state = "" //I'm sorry but cleanable/blood code is ass, and so is blood_DNA
var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints
var/mergeable_decal = TRUE //when two of these are on a same tile or do we need to merge them into just one?
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index 4591d5d567..a8a76ad2a9 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -224,3 +224,11 @@
icon_state = "flour"
color = "#C8A5DC"
beauty = -200
+
+/obj/effect/decal/cleanable/insectguts
+ name = "insect guts"
+ desc = "One bug squashed. Four more will rise in its place."
+ icon = 'icons/effects/blood.dmi'
+ icon_state = "xfloor1"
+ random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
+ beauty = -300
diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm
index d26dbb72e7..eec91657a9 100644
--- a/code/game/objects/effects/decals/decal.dm
+++ b/code/game/objects/effects/decals/decal.dm
@@ -1,5 +1,6 @@
/obj/effect/decal
name = "decal"
+ plane = FLOOR_PLANE
anchored = TRUE
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/turf_loc_check = TRUE
diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm
index add653238e..ef074f4cec 100644
--- a/code/game/objects/effects/forcefields.dm
+++ b/code/game/objects/effects/forcefields.dm
@@ -27,11 +27,11 @@
///////////Mimewalls///////////
/obj/effect/forcefield/mime
- icon_state = "empty"
+ icon_state = "nothing"
name = "invisible wall"
desc = "You have a bad feeling about this."
/obj/effect/forcefield/mime/advanced
name = "invisible blockade"
- desc = "You're goona be here a while."
- timeleft = 600
\ No newline at end of file
+ desc = "You're gonna be here awhile."
+ timeleft = 600
diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm
index 8dab6e4246..42d0f097d9 100644
--- a/code/game/objects/effects/glowshroom.dm
+++ b/code/game/objects/effects/glowshroom.dm
@@ -78,7 +78,7 @@
pixel_x = -32
icon_state = "[base_icon_state][rand(1,3)]"
else //if on the floor, glowshroom on-floor sprite
- icon_state = "[base_icon_state]f"
+ icon_state = base_icon_state
addtimer(CALLBACK(src, .proc/Spread), delay)
diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm
index 2de7770b72..b1bb3e6b4d 100644
--- a/code/game/objects/effects/spawners/bombspawner.dm
+++ b/code/game/objects/effects/spawners/bombspawner.dm
@@ -1,46 +1,67 @@
+#define CELSIUS_TO_KELVIN(T_K) ((T_K) + T0C)
+
+#define OPTIMAL_TEMP_K_PLA_BURN_SCALE(PRESSURE_P,PRESSURE_O,TEMP_O) (((PRESSURE_P) * GLOB.meta_gas_info[/datum/gas/plasma][META_GAS_SPECIFIC_HEAT]) / (((PRESSURE_P) * GLOB.meta_gas_info[/datum/gas/plasma][META_GAS_SPECIFIC_HEAT] + (PRESSURE_O) * GLOB.meta_gas_info[/datum/gas/oxygen][META_GAS_SPECIFIC_HEAT]) / PLASMA_UPPER_TEMPERATURE - (PRESSURE_O) * GLOB.meta_gas_info[/datum/gas/oxygen][META_GAS_SPECIFIC_HEAT] / CELSIUS_TO_KELVIN(TEMP_O)))
+#define OPTIMAL_TEMP_K_PLA_BURN_RATIO(PRESSURE_P,PRESSURE_O,TEMP_O) (CELSIUS_TO_KELVIN(TEMP_O) * PLASMA_OXYGEN_FULLBURN * (PRESSURE_P) / (PRESSURE_O))
+
/obj/effect/spawner/newbomb
name = "bomb"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x"
- var/btemp1 = 1500
- var/btemp2 = 1000 // tank temperatures
+ var/temp_p = 1500
+ var/temp_o = 1000 // tank temperatures
+ var/pressure_p = 10 * ONE_ATMOSPHERE
+ var/pressure_o = 10 * ONE_ATMOSPHERE //tank pressures
var/assembly_type
/obj/effect/spawner/newbomb/Initialize()
. = ..()
var/obj/item/transfer_valve/V = new(src.loc)
- var/obj/item/tank/internals/plasma/full/PT = new(V)
+ var/obj/item/tank/internals/plasma/PT = new(V)
var/obj/item/tank/internals/oxygen/OT = new(V)
- PT.air_contents.temperature = btemp1 + T0C
- OT.air_contents.temperature = btemp2 + T0C
+ PT.air_contents.assert_gas(/datum/gas/plasma)
+ PT.air_contents.gases[/datum/gas/plasma][MOLES] = pressure_p*PT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p))
+ PT.air_contents.temperature = CELSIUS_TO_KELVIN(temp_p)
+
+ OT.air_contents.assert_gas(/datum/gas/oxygen)
+ OT.air_contents.gases[/datum/gas/oxygen][MOLES] = pressure_o*OT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o))
+ OT.air_contents.temperature = CELSIUS_TO_KELVIN(temp_o)
V.tank_one = PT
V.tank_two = OT
PT.master = V
OT.master = V
-
+
if(assembly_type)
var/obj/item/assembly/A = new assembly_type(V)
V.attached_device = A
A.holder = V
- A.toggle_secure()
V.update_icon()
-
+
return INITIALIZE_HINT_QDEL
+/obj/effect/spawner/newbomb/timer/syndicate/Initialize()
+ temp_p = (OPTIMAL_TEMP_K_PLA_BURN_SCALE(pressure_p, pressure_o, temp_o)/2 + OPTIMAL_TEMP_K_PLA_BURN_RATIO(pressure_p, pressure_o, temp_o)/2) - T0C
+ . = ..()
+
/obj/effect/spawner/newbomb/timer
assembly_type = /obj/item/assembly/timer
/obj/effect/spawner/newbomb/timer/syndicate
- btemp1 = 150
- btemp2 = 20
+ pressure_o = TANK_LEAK_PRESSURE - 1
+ temp_o = 20
+
+ pressure_p = TANK_LEAK_PRESSURE - 1
/obj/effect/spawner/newbomb/proximity
assembly_type = /obj/item/assembly/prox_sensor
/obj/effect/spawner/newbomb/radio
assembly_type = /obj/item/assembly/signaler
-
+
+#undef CELSIUS_TO_KELVIN
+
+#undef OPTIMAL_TEMP_K_PLA_BURN_SCALE
+#undef OPTIMAL_TEMP_K_PLA_BURN_RATIO
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 0bf7edbd7b..bd4237a9db 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -5,7 +5,7 @@
var/lootcount = 1 //how many items will be spawned
var/lootdoubles = TRUE //if the same item can be spawned twice
var/list/loot //a list of possible items to spawn e.g. list(/obj/item, /obj/structure, /obj/effect)
- var/fan_out_items = FALSE //Whether the items should be distributed to offsets 0,3,-3,6,-6,9,-9.. This overrides pixel_x/y on the spawner itself
+ var/fan_out_items = FALSE //Whether the items should be distributed to offsets 0,1,-1,2,-2,3,-3.. This overrides pixel_x/y on the spawner itself
/obj/effect/spawner/lootdrop/Initialize(mapload)
..()
@@ -26,7 +26,7 @@
spawned_loot.pixel_y = pixel_y
else
if (loot_spawned)
- spawned_loot.pixel_x = spawned_loot.pixel_y = ((!(loot_spawned%2)*loot_spawned/2)*-3)+((loot_spawned%2)*(loot_spawned+1)/2*3)
+ spawned_loot.pixel_x = spawned_loot.pixel_y = ((!(loot_spawned%2)*loot_spawned/2)*-1)+((loot_spawned%2)*(loot_spawned+1)/2*1)
loot_spawned++
return INITIALIZE_HINT_QDEL
@@ -206,3 +206,115 @@
/obj/item/aiModule/core/full/thermurderdynamic,
/obj/item/aiModule/core/full/damaged
)
+
+// Tech storage circuit board spawners
+// For these, make sure that lootcount equals the number of list items
+
+/obj/effect/spawner/lootdrop/techstorage
+ name = "generic circuit board spawner"
+ lootdoubles = FALSE
+ fan_out_items = TRUE
+
+/obj/effect/spawner/lootdrop/techstorage/service
+ name = "service circuit board spawner"
+ lootcount = 10
+ loot = list(
+ /obj/item/circuitboard/computer/arcade/battle,
+ /obj/item/circuitboard/computer/arcade/orion_trail,
+ /obj/item/circuitboard/machine/autolathe,
+ /obj/item/circuitboard/computer/mining,
+ /obj/item/circuitboard/machine/ore_redemption,
+ /obj/item/circuitboard/machine/mining_equipment_vendor,
+ /obj/item/circuitboard/machine/microwave,
+ /obj/item/circuitboard/machine/chem_dispenser/drinks,
+ /obj/item/circuitboard/machine/chem_dispenser/drinks/beer,
+ /obj/item/circuitboard/computer/slot_machine
+ )
+
+/obj/effect/spawner/lootdrop/techstorage/rnd
+ name = "RnD circuit board spawner"
+ lootcount = 8
+ loot = list(
+ /obj/item/circuitboard/computer/aifixer,
+ /obj/item/circuitboard/machine/rdserver,
+ /obj/item/circuitboard/computer/pandemic,
+ /obj/item/circuitboard/machine/mechfab,
+ /obj/item/circuitboard/machine/circuit_imprinter/department,
+ /obj/item/circuitboard/computer/teleporter,
+ /obj/item/circuitboard/machine/destructive_analyzer,
+ /obj/item/circuitboard/computer/rdconsole
+ )
+
+/obj/effect/spawner/lootdrop/techstorage/security
+ name = "security circuit board spawner"
+ lootcount = 3
+ loot = list(
+ /obj/item/circuitboard/computer/secure_data,
+ /obj/item/circuitboard/computer/security,
+ /obj/item/circuitboard/computer/prisoner
+ )
+
+/obj/effect/spawner/lootdrop/techstorage/engineering
+ name = "engineering circuit board spawner"
+ lootcount = 3
+ loot = list(
+ /obj/item/circuitboard/computer/atmos_alert,
+ /obj/item/circuitboard/computer/stationalert,
+ /obj/item/circuitboard/computer/powermonitor
+ )
+
+/obj/effect/spawner/lootdrop/techstorage/tcomms
+ name = "tcomms circuit board spawner"
+ lootcount = 9
+ loot = list(
+ /obj/item/circuitboard/computer/message_monitor,
+ /obj/item/circuitboard/machine/telecomms/broadcaster,
+ /obj/item/circuitboard/machine/telecomms/bus,
+ /obj/item/circuitboard/machine/telecomms/server,
+ /obj/item/circuitboard/machine/telecomms/receiver,
+ /obj/item/circuitboard/machine/telecomms/processor,
+ /obj/item/circuitboard/machine/announcement_system,
+ /obj/item/circuitboard/computer/comm_server,
+ /obj/item/circuitboard/computer/comm_monitor
+ )
+
+/obj/effect/spawner/lootdrop/techstorage/medical
+ name = "medical circuit board spawner"
+ lootcount = 8
+ loot = list(
+ /obj/item/circuitboard/computer/cloning,
+ /obj/item/circuitboard/machine/clonepod,
+ /obj/item/circuitboard/machine/chem_dispenser,
+ /obj/item/circuitboard/computer/scan_consolenew,
+ /obj/item/circuitboard/computer/med_data,
+ /obj/item/circuitboard/machine/smoke_machine,
+ /obj/item/circuitboard/machine/chem_master,
+ /obj/item/circuitboard/machine/clonescanner
+ )
+
+/obj/effect/spawner/lootdrop/techstorage/AI
+ name = "secure AI circuit board spawner"
+ lootcount = 3
+ loot = list(
+ /obj/item/circuitboard/computer/aiupload,
+ /obj/item/circuitboard/computer/borgupload,
+ /obj/item/circuitboard/aicore
+ )
+
+/obj/effect/spawner/lootdrop/techstorage/command
+ name = "secure command circuit board spawner"
+ lootcount = 3
+ loot = list(
+ /obj/item/circuitboard/computer/crew,
+ /obj/item/circuitboard/computer/communications,
+ /obj/item/circuitboard/computer/card
+ )
+
+/obj/effect/spawner/lootdrop/techstorage/RnD_secure
+ name = "secure RnD circuit board spawner"
+ lootcount = 3
+ loot = list(
+ /obj/item/circuitboard/computer/mecha_control,
+ /obj/item/circuitboard/computer/apc_control,
+ /obj/item/circuitboard/computer/robotics
+ )
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 4e298032db..13b58933ac 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -381,7 +381,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
//sometimes we only want to grant the item's action if it's equipped in a specific slot.
/obj/item/proc/item_action_slot_check(slot, mob/user)
- if(slot == slot_in_backpack || slot == slot_legcuffed) //these aren't true slots, so avoid granting actions there
+ if(slot == SLOT_IN_BACKPACK || slot == SLOT_LEGCUFFED) //these aren't true slots, so avoid granting actions there
return FALSE
return TRUE
@@ -545,29 +545,29 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
return
var/mob/owner = loc
var/flags = slot_flags
- if(flags & SLOT_OCLOTHING)
+ if(flags & ITEM_SLOT_OCLOTHING)
owner.update_inv_wear_suit()
- if(flags & SLOT_ICLOTHING)
+ if(flags & ITEM_SLOT_ICLOTHING)
owner.update_inv_w_uniform()
- if(flags & SLOT_GLOVES)
+ if(flags & ITEM_SLOT_GLOVES)
owner.update_inv_gloves()
- if(flags & SLOT_EYES)
+ if(flags & ITEM_SLOT_EYES)
owner.update_inv_glasses()
- if(flags & SLOT_EARS)
+ if(flags & ITEM_SLOT_EARS)
owner.update_inv_ears()
- if(flags & SLOT_MASK)
+ if(flags & ITEM_SLOT_MASK)
owner.update_inv_wear_mask()
- if(flags & SLOT_HEAD)
+ if(flags & ITEM_SLOT_HEAD)
owner.update_inv_head()
- if(flags & SLOT_FEET)
+ if(flags & ITEM_SLOT_FEET)
owner.update_inv_shoes()
- if(flags & SLOT_ID)
+ if(flags & ITEM_SLOT_ID)
owner.update_inv_wear_id()
- if(flags & SLOT_BELT)
+ if(flags & ITEM_SLOT_BELT)
owner.update_inv_belt()
- if(flags & SLOT_BACK)
+ if(flags & ITEM_SLOT_BACK)
owner.update_inv_back()
- if(flags & SLOT_NECK)
+ if(flags & ITEM_SLOT_NECK)
owner.update_inv_neck()
/obj/item/proc/is_hot()
@@ -592,7 +592,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
if(ismob(location))
var/mob/M = location
var/success = FALSE
- if(src == M.get_item_by_slot(slot_wear_mask))
+ if(src == M.get_item_by_slot(SLOT_WEAR_MASK))
success = TRUE
if(success)
location = get_turf(M)
@@ -766,3 +766,18 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
// Returns a numeric value for sorting items used as parts in machines, so they can be replaced by the rped
/obj/item/proc/get_part_rating()
return 0
+
+/obj/item/doMove(atom/destination)
+ if (ismob(loc))
+ var/mob/M = loc
+ var/hand_index = M.get_held_index_of_item(src)
+ if(hand_index)
+ M.held_items[hand_index] = null
+ M.update_inv_hands()
+ if(M.client)
+ M.client.screen -= src
+ layer = initial(layer)
+ plane = initial(plane)
+ appearance_flags &= ~NO_CLIENT_COLOR
+ dropped(M)
+ return ..()
diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm
index b005d0dd64..2c977e9d09 100644
--- a/code/game/objects/items/RPD.dm
+++ b/code/game/objects/items/RPD.dm
@@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
return "makepipe=[id]&type=[dirtype]"
/datum/pipe_info/meter
- icon_state = "meterX"
+ icon_state = "meter"
dirtype = PIPE_ONEDIR
/datum/pipe_info/meter/New(label)
@@ -228,7 +228,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- var/datum/asset/assets = get_asset_datum(/datum/asset/simple/icon_states/multiple_icons/pipes)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/pipes)
assets.send(user)
ui = new(user, src, ui_key, "rpd", name, 300, 550, master_ui, state)
diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm
index 365c96233a..8d9fab4f38 100644
--- a/code/game/objects/items/airlock_painter.dm
+++ b/code/game/objects/items/airlock_painter.dm
@@ -10,7 +10,7 @@
materials = list(MAT_METAL=50, MAT_GLASS=50)
flags_1 = CONDUCT_1 | NOBLUDGEON_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
usesound = 'sound/effects/spray2.ogg'
var/obj/item/toner/ink = null
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index 5048f6ed2d..87b90d5b8f 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -104,8 +104,7 @@
to_chat(user, "There is another network terminal here! ")
return
else
- var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(T)
- C.amount = 10
+ new /obj/item/stack/cable_coil(T, 10)
to_chat(user, "You cut the cables and disassemble the unused power terminal. ")
qdel(E)
return TRUE
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 08e6204c63..ea332c77de 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -97,7 +97,7 @@
item_state = "card-id"
lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
- slot_flags = SLOT_ID
+ slot_flags = ITEM_SLOT_ID
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
var/mining_points = 0 //For redeeming at mining equipment vendors
diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm
index 107e4eb5db..d861b515f8 100644
--- a/code/game/objects/items/chrono_eraser.dm
+++ b/code/game/objects/items/chrono_eraser.dm
@@ -9,7 +9,7 @@
lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
slowdown = 1
actions_types = list(/datum/action/item_action/equip_unequip_TED_Gun)
var/obj/item/gun/energy/chrono_gun/PA = null
@@ -38,7 +38,7 @@
user.put_in_hands(PA)
/obj/item/chrono_eraser/item_action_slot_check(slot, mob/user)
- if(slot == slot_back)
+ if(slot == SLOT_BACK)
return 1
/obj/item/gun/energy/chrono_gun
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 230177cc61..0fd16a95bd 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -86,7 +86,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
..()
/obj/item/proc/help_light_cig(mob/living/M)
- var/mask_item = M.get_item_by_slot(slot_wear_mask)
+ var/mask_item = M.get_item_by_slot(SLOT_WEAR_MASK)
if(istype(mask_item, /obj/item/clothing/mask/cigarette))
return mask_item
@@ -129,7 +129,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
reagents.add_reagent_list(list_reagents)
if(starts_lit)
light()
- AddComponent(/datum/component/knockoff,90,list(BODY_ZONE_PRECISE_MOUTH),list(slot_wear_mask))//90% to knock off when wearing a mask
+ AddComponent(/datum/component/knockoff,90,list(BODY_ZONE_PRECISE_MOUTH),list(SLOT_WEAR_MASK))//90% to knock off when wearing a mask
/obj/item/clothing/mask/cigarette/Destroy()
STOP_PROCESSING(SSobj, src)
@@ -489,7 +489,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
item_state = "zippo"
w_class = WEIGHT_CLASS_TINY
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
var/lit = 0
var/fancy = TRUE
heat = 1500
@@ -749,7 +749,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
return
/obj/item/clothing/mask/vape/equipped(mob/user, slot)
- if(slot == slot_wear_mask)
+ if(slot == SLOT_WEAR_MASK)
if(!screw)
to_chat(user, "You start puffing on the vape. ")
reagents.set_reacting(TRUE)
@@ -759,7 +759,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/vape/dropped(mob/user)
var/mob/living/carbon/C = user
- if(C.get_item_by_slot(slot_wear_mask) == src)
+ if(C.get_item_by_slot(SLOT_WEAR_MASK) == src)
reagents.set_reacting(FALSE)
STOP_PROCESSING(SSobj, src)
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index 8d90e1bc56..8053c00daf 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -154,6 +154,10 @@
name = "Labor Camp teleporter console (Computer Board)"
build_path = /obj/machinery/computer/gulag_teleporter_computer
+/obj/item/circuitboard/computer/rdconsole/production
+ name = "R&D Console Production Only (Computer Board)"
+ build_path = /obj/machinery/computer/rdconsole/production
+
/obj/item/circuitboard/computer/rdconsole
name = "R&D Console (Computer Board)"
build_path = /obj/machinery/computer/rdconsole/core
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 2efc952c8b..c4aa6f52cc 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -204,6 +204,7 @@
/obj/item/circuitboard/machine/vendor
name = "Booze-O-Mat Vendor (Machine Board)"
+ desc = "You can turn the \"brand selection\" dial using a screwdriver."
build_path = /obj/machinery/vending/boozeomat
req_components = list(
/obj/item/vending_refill/boozeomat = 3)
@@ -650,6 +651,7 @@
/obj/item/circuitboard/machine/chem_master
name = "ChemMaster 3000 (Machine Board)"
build_path = /obj/machinery/chem_master
+ desc = "You can turn the \"mode selection\" dial using a screwdriver."
req_components = list(
/obj/item/reagent_containers/glass/beaker = 2,
/obj/item/stock_parts/manipulator = 1,
@@ -839,6 +841,13 @@
/obj/item/stack/sheet/glass = 1,
/obj/item/vending_refill/donksoft = 3)
+/obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor
+ name = "Syndicate Donksoft Toy Vendor (Machine Board)"
+ build_path = /obj/machinery/vending/toyliberationstation
+ req_components = list(
+ /obj/item/stack/sheet/glass = 1,
+ /obj/item/vending_refill/donksoft = 3)
+
/obj/item/circuitboard/machine/dish_drive
name = "Dish Drive (Machine Board)"
build_path = /obj/machinery/dish_drive
@@ -864,3 +873,17 @@
return
transmit = !transmit
to_chat(user, "You [transmit ? "enable" : "disable"] the board's automatic disposal transmission. ")
+
+/obj/item/circuitboard/machine/stacking_unit_console
+ name = "Stacking Machine Console (Machine Board)"
+ build_path = /obj/machinery/mineral/stacking_unit_console
+ req_components = list(
+ /obj/item/stack/sheet/glass = 2,
+ /obj/item/stack/cable_coil = 5)
+
+/obj/item/circuitboard/machine/stacking_machine
+ name = "Stacking Machine (Machine Board)"
+ build_path = /obj/machinery/mineral/stacking_machine
+ req_components = list(
+ /obj/item/stock_parts/manipulator = 2,
+ /obj/item/stock_parts/matter_bin = 2)
diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm
index 9b615b68b5..fa5748c1d9 100644
--- a/code/game/objects/items/clown_items.dm
+++ b/code/game/objects/items/clown_items.dm
@@ -118,6 +118,7 @@
/obj/item/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user)
M.SendSignal(COMSIG_ADD_MOOD_EVENT, "honk", /datum/mood_event/honk)
+ return ..()
/obj/item/bikehorn/suicide_act(mob/user)
user.visible_message("[user] solemnly points the horn at [user.p_their()] temple! It looks like [user.p_theyre()] trying to commit suicide! ")
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 7480f7b489..a9b5924a71 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -247,6 +247,8 @@
var/cost = 1
if(paint_mode == PAINT_LARGE_HORIZONTAL)
cost = 5
+ if(istype(target, /obj/item/canvas))
+ cost = 0
var/charges_used = use_charges(user, cost)
if(!charges_used)
return
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 47d7b1e525..875b25a9a5 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -9,7 +9,7 @@
item_state = "defibunit"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
force = 5
throwforce = 6
w_class = WEIGHT_CLASS_BULKY
@@ -46,11 +46,11 @@
update_charge()
/obj/item/defibrillator/proc/update_power()
- if(cell)
- if(cell.charge < paddles.revivecost)
+ if(!QDELETED(cell))
+ if(QDELETED(paddles) || cell.charge < paddles.revivecost)
powered = FALSE
else
- powered = 1
+ powered = TRUE
else
powered = FALSE
@@ -67,7 +67,7 @@
/obj/item/defibrillator/proc/update_charge()
if(powered) //so it doesn't show charge if it's unpowered
- if(cell)
+ if(!QDELETED(cell))
var/ratio = cell.charge / cell.maxcharge
ratio = CEILING(ratio*4, 1) * 25
add_overlay("[initial(icon_state)]-charge[ratio]")
@@ -83,14 +83,14 @@
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/defibrillator/attack_hand(mob/user)
if(loc == user)
- if(slot_flags == SLOT_BACK)
- if(user.get_item_by_slot(slot_back) == src)
+ if(slot_flags == ITEM_SLOT_BACK)
+ if(user.get_item_by_slot(SLOT_BACK) == src)
ui_action_click()
else
to_chat(user, "Put the defibrillator on your back first! ")
- else if(slot_flags == SLOT_BELT)
- if(user.get_item_by_slot(slot_belt) == src)
+ else if(slot_flags == ITEM_SLOT_BELT)
+ if(user.get_item_by_slot(SLOT_BELT) == src)
ui_action_click()
else
to_chat(user, "Strap the defibrillator's belt on first! ")
@@ -170,7 +170,6 @@
to_chat(user, "You need a free hand to hold the paddles! ")
update_icon()
return
- paddles.forceMove(user)
else
//Remove from their hands and back onto the defib unit
paddles.unwield()
@@ -186,7 +185,7 @@
/obj/item/defibrillator/equipped(mob/user, slot)
..()
- if((slot_flags == SLOT_BACK && slot != slot_back) || (slot_flags == SLOT_BELT && slot != slot_belt))
+ if((slot_flags == ITEM_SLOT_BACK && slot != SLOT_BACK) || (slot_flags == ITEM_SLOT_BELT && slot != SLOT_BELT))
remove_paddles(user)
update_icon()
@@ -239,7 +238,7 @@
icon_state = "defibcompact"
item_state = "defibcompact"
w_class = WEIGHT_CLASS_NORMAL
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
/obj/item/defibrillator/compact/item_action_slot_check(slot, mob/user)
if(slot == user.getBeltSlot())
@@ -276,8 +275,8 @@
name = "defibrillator paddles"
desc = "A pair of plastic-gripped paddles with flat metal surfaces that are used to deliver powerful electric shocks."
icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "defibpaddles"
- item_state = "defibpaddles"
+ icon_state = "defibpaddles0"
+ item_state = "defibpaddles0"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index d2324aa56c..093ee1c4b7 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -21,7 +21,7 @@ GLOBAL_LIST_EMPTY(PDAs)
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags_1 = NOBLUDGEON_1
w_class = WEIGHT_CLASS_TINY
- slot_flags = SLOT_ID | SLOT_BELT
+ slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -178,20 +178,20 @@ GLOBAL_LIST_EMPTY(PDAs)
. = ..()
- var/datum/asset/assets = get_asset_datum(/datum/asset/simple/pda)
+ var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/simple/pda)
assets.send(user)
user.set_machine(src)
var/dat = "Personal Data Assistant "
+ dat += assets.css_tag()
-
- dat += " Refresh "
+ dat += "[PDAIMG(refresh)]Refresh "
if ((!isnull(cartridge)) && (mode == 0))
- dat += " | Eject [cartridge] "
+ dat += " | [PDAIMG(eject)]Eject [cartridge] "
if (mode)
- dat += " | Return "
+ dat += " | [PDAIMG(menu)]Return "
if (mode == 0)
dat += ""
@@ -205,7 +205,7 @@ GLOBAL_LIST_EMPTY(PDAs)
if (!owner)
dat += "Warning: No owner information entered. Please swipe card.
"
- dat += "
Retry"
+ dat += "
[PDAIMG(refresh)]Retry "
else
switch (mode)
if (0)
@@ -221,38 +221,38 @@ GLOBAL_LIST_EMPTY(PDAs)
dat += "
General Functions "
dat += "
"
if (cartridge.access & CART_ENGINE)
dat += "
Engineering Functions "
dat += "
"
if (cartridge.access & CART_MEDICAL)
dat += "
Medical Functions "
dat += "
"
if (cartridge.access & CART_SECURITY)
dat += "
Security Functions "
dat += "
"
if(cartridge.access & CART_QUARTERMASTER)
dat += "
Quartermaster Functions: "
dat += "
"
dat += ""
@@ -260,25 +260,25 @@ GLOBAL_LIST_EMPTY(PDAs)
dat += "
"
if (1)
- dat += "
Notekeeper V2.2"
+ dat += "
[PDAIMG(notes)] Notekeeper V2.2 "
dat += "
Edit "
if(notescanned)
dat += "(This is a scanned image, editing it may cause some text formatting to change.)
"
dat += "
[(!notehtml ? note : notehtml)] "
if (2)
- dat += "
SpaceMessenger V3.9.6"
- dat += "
Ringer: [silent == 1 ? "Off" : "On"] | "
- dat += "
Send / Receive: [toff == 1 ? "Off" : "On"] | "
- dat += "
Set Ringtone | "
- dat += "
Messages"
+ dat += "
[PDAIMG(mail)] SpaceMessenger V3.9.6 "
+ dat += "
[PDAIMG(bell)]Ringer: [silent == 1 ? "Off" : "On"] | "
+ dat += "
[PDAIMG(mail)]Send / Receive: [toff == 1 ? "Off" : "On"] | "
+ dat += "
[PDAIMG(bell)]Set Ringtone | "
+ dat += "
[PDAIMG(mail)]Messages "
if(cartridge)
dat += cartridge.message_header()
- dat += "
Detected PDAs"
+ dat += "
[PDAIMG(menu)] Detected PDAs "
dat += "
"
var/count = 0
@@ -326,16 +326,16 @@ GLOBAL_LIST_EMPTY(PDAs)
dat += "Send To All "
if(21)
- dat += " SpaceMessenger V3.9.6 "
- dat += " Clear Messages "
+ dat += "[PDAIMG(mail)] SpaceMessenger V3.9.6 "
+ dat += "[PDAIMG(blank)]Clear Messages "
- dat += " Messages "
+ dat += "[PDAIMG(mail)] Messages "
dat += tnote
dat += " "
if (3)
- dat += " Atmospheric Readings "
+ dat += "[PDAIMG(atmos)] Atmospheric Readings "
var/turf/T = user.loc
if (isnull(T))
@@ -617,7 +617,8 @@ GLOBAL_LIST_EMPTY(PDAs)
return
if((last_text && world.time < last_text + 10) || (everyone && last_everyone && world.time < last_everyone + PDA_SPAM_DELAY))
return
-
+ if(prob(1))
+ message += "\nSent from my PDA"
// Send the signal
var/list/string_targets = list()
for (var/obj/item/pda/P in targets)
@@ -742,7 +743,7 @@ GLOBAL_LIST_EMPTY(PDAs)
var/mob/M = loc
M.put_in_hands(inserted_item)
else
- inserted_item.forceMove(get_turf(src))
+ inserted_item.forceMove(drop_location())
to_chat(usr, "You remove \the [inserted_item] from \the [src]. ")
inserted_item = null
update_icon()
@@ -1017,4 +1018,4 @@ GLOBAL_LIST_EMPTY(PDAs)
#undef PDA_SCANNER_REAGENT
#undef PDA_SCANNER_HALOGEN
#undef PDA_SCANNER_GAS
-#undef PDA_SPAM_DELAY
\ No newline at end of file
+#undef PDA_SPAM_DELAY
diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm
index c1cc5d69a3..089286efda 100644
--- a/code/game/objects/items/devices/PDA/PDA_types.dm
+++ b/code/game/objects/items/devices/PDA/PDA_types.dm
@@ -21,7 +21,7 @@
// Special AI/pAI PDAs that cannot explode.
/obj/item/pda/ai
- icon_state = "NONE"
+ icon = null
ttone = "data"
fon = FALSE
detonatable = FALSE
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 2737f24cbe..e92eb6e617 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -207,13 +207,12 @@
frequency.post_signal(src, status_signal)
-
/obj/item/cartridge/proc/generate_menu(mob/user)
if(!host_pda)
return
switch(host_pda.mode)
if(40) //signaller
- menu = " Remote Signaling System "
+ menu = "[PDAIMG(signaler)] Remote Signaling System "
menu += {"
Send Signal
@@ -232,7 +231,7 @@ Code:
+ "}
if (41) //crew manifest
- menu = " Crew Manifest "
+ menu = "[PDAIMG(notes)] Crew Manifest "
menu += "Entries cannot be modified from this terminal. "
if(GLOB.data_core.general)
for (var/datum/data/record/t in sortRecord(GLOB.data_core.general))
@@ -241,7 +240,7 @@ Code:
if (42) //status displays
- menu = " Station Status Display Interlink "
+ menu = "[PDAIMG(status)] Station Status Display Interlink "
menu += "\[ Clear \] "
menu += "\[ Shuttle ETA \] "
@@ -254,7 +253,7 @@ Code:
menu += " Biohazard \] "
if (43)
- menu = " Power Monitors - Please select one "
+ menu = "[PDAIMG(power)] Power Monitors - Please select one "
powmonitor = null
powermonitors = list()
var/powercount = 0
@@ -280,7 +279,7 @@ Code:
menu += ""
if (433)
- menu = " Power Monitor "
+ menu = "[PDAIMG(power)] Power Monitor "
if(!powmonitor)
menu += "No connection "
else
@@ -307,13 +306,13 @@ Code:
menu += ""
if (44) //medical records //This thing only displays a single screen so it's hard to really get the sub-menu stuff working.
- menu = " Medical Record List "
+ menu = "[PDAIMG(medical)] Medical Record List "
if(GLOB.data_core.general)
for(var/datum/data/record/R in sortRecord(GLOB.data_core.general))
menu += "[R.fields["id"]]: [R.fields["name"]] "
menu += " "
if(441)
- menu = " Medical Record "
+ menu = "[PDAIMG(medical)] Medical Record "
if(active1 in GLOB.data_core.general)
menu += "Name: [active1.fields["name"]] ID: [active1.fields["id"]] "
@@ -328,7 +327,7 @@ Code:
menu += " "
- menu += " Medical Data "
+ menu += "[PDAIMG(medical)] Medical Data "
if(active2 in GLOB.data_core.medical)
menu += "Blood Type: [active2.fields["blood_type"]] "
@@ -350,14 +349,14 @@ Code:
menu += " "
if (45) //security records
- menu = " Security Record List "
+ menu = "[PDAIMG(cuffs)] Security Record List "
if(GLOB.data_core.general)
for (var/datum/data/record/R in sortRecord(GLOB.data_core.general))
menu += " [R.fields["id"]]: [R.fields["name"]] "
menu += " "
if(451)
- menu = " Security Record "
+ menu = "[PDAIMG(cuffs)] Security Record "
if(active1 in GLOB.data_core.general)
menu += "Name: [active1.fields["name"]] ID: [active1.fields["id"]] "
@@ -372,7 +371,7 @@ Code:
menu += " "
- menu += " Security Data "
+ menu += "[PDAIMG(cuffs)] Security Data "
if(active3 in GLOB.data_core.security)
menu += "Criminal Status: [active3.fields["criminal"]] "
@@ -418,7 +417,7 @@ Code:
menu += " "
if (47) //quartermaster order records
- menu = " Supply Record Interlink "
+ menu = "[PDAIMG(crate)] Supply Record Interlink "
menu += "Supply shuttle "
menu += "Location: "
@@ -449,7 +448,7 @@ Code:
menu += "Upgrade NOW to Space Parts & Space Vendors PLUS for full remote order control and inventory management."
if (49) //janitorial locator
- menu = " Persistent Custodial Object Locator "
+ menu = "[PDAIMG(bucket)] Persistent Custodial Object Locator "
var/turf/cl = get_turf(src)
if (cl)
@@ -511,7 +510,7 @@ Code:
menu += "Refresh GPS Locator "
if (53) // Newscaster
- menu = " Newscaster Access "
+ menu = "[PDAIMG(notes)] Newscaster Access "
menu += " Current Newsfeed: [current_channel ? current_channel : "None"] "
var/datum/newscaster/feed_channel/current
for(var/datum/newscaster/feed_channel/chan in GLOB.news_network.network_channels)
@@ -533,7 +532,7 @@ Code:
menu += " Post Message "
if (54) // Beepsky, Medibot, Floorbot, and Cleanbot access
- menu = " Bots Interlink "
+ menu = "[PDAIMG(medbot)] Bots Interlink "
bot_control()
if (99) //Newscaster message permission error
menu = " ERROR : NOT AUTHORIZED [host_pda.id ? "" : "- ID SLOT EMPTY"] "
@@ -652,7 +651,7 @@ Code:
var/mob/living/simple_animal/bot/Bot
if(active_bot)
- menu += "[active_bot] Status: (refresh ) "
+ menu += "[active_bot] Status: ([PDAIMG(refresh)]refresh ) "
menu += "Model: [active_bot.model] "
menu += "Location: [get_area(active_bot)] "
menu += "Mode: [active_bot.get_mode()]"
@@ -688,9 +687,9 @@ Code:
menu += "\[Summon Bot \] " //summon
menu += "Keep an ID inserted to upload access codes upon summoning."
- menu += " Return to bot list "
+ menu += "[PDAIMG(back)]Return to bot list "
else
- menu += " Scan for active bots "
+ menu += "[PDAIMG(refresh)]Scan for active bots "
var/turf/current_turf = get_turf(src)
var/zlevel = current_turf.z
var/botcount = 0
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index 8947009974..cb23b95dc9 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -7,7 +7,7 @@
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
flags_1 = NOBLUDGEON_1
var/flush = FALSE
var/mob/living/silicon/ai/AI
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 181ae9eb41..d5d025619c 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -3,7 +3,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "shield0"
flags_1 = CONDUCT_1 | NOBLUDGEON_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
item_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 8ba7a55d93..3386b975e3 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -8,7 +8,7 @@
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
materials = list(MAT_METAL=50, MAT_GLASS=20)
actions_types = list(/datum/action/item_action/toggle_light)
var/on = FALSE
@@ -348,7 +348,7 @@
icon_state = "slime"
item_state = "slime"
w_class = WEIGHT_CLASS_SMALL
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
materials = list()
brightness_on = 6 //luminosity when on
diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm
index f9c8084ea5..bb0914eeec 100644
--- a/code/game/objects/items/devices/forcefieldprojector.dm
+++ b/code/game/objects/items/devices/forcefieldprojector.dm
@@ -3,7 +3,7 @@
desc = "An experimental device that can create several forcefields at a distance."
icon = 'icons/obj/device.dmi'
icon_state = "signmaker_engi"
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
flags_1 = NOBLUDGEON_1
item_state = "electronic"
diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm
index 364f85fbc4..1b4bb55f99 100644
--- a/code/game/objects/items/devices/geiger_counter.dm
+++ b/code/game/objects/items/devices/geiger_counter.dm
@@ -17,7 +17,7 @@
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
materials = list(MAT_METAL = 150, MAT_GLASS = 150)
var/grace = RAD_GRACE_PERIOD
@@ -131,17 +131,17 @@
update_icon()
to_chat(user, "[icon2html(src, user)] You switch [scanning ? "on" : "off"] [src]. ")
-/obj/item/geiger_counter/attack(mob/living/M, mob/user)
+/obj/item/geiger_counter/afterattack(atom/target, mob/user)
if(user.a_intent == INTENT_HELP)
if(!(obj_flags & EMAGGED))
- user.visible_message("[user] scans [M] with [src]. ", "You scan [M]'s radiation levels with [src]... ")
- addtimer(CALLBACK(src, .proc/scan, M, user), 20, TIMER_UNIQUE) // Let's not have spamming GetAllContents
+ user.visible_message("[user] scans [target] with [src]. ", "You scan [target]'s radiation levels with [src]... ")
+ addtimer(CALLBACK(src, .proc/scan, target, user), 20, TIMER_UNIQUE) // Let's not have spamming GetAllContents
else
- user.visible_message("[user] scans [M] with [src]. ", "You project [src]'s stored radiation into [M]'s body! ")
- M.rad_act(radiation_count)
+ user.visible_message("[user] scans [target] with [src]. ", "You project [src]'s stored radiation into [target]! ")
+ target.rad_act(radiation_count)
radiation_count = 0
- return 1
- ..()
+ return TRUE
+ return ..()
/obj/item/geiger_counter/proc/scan(atom/A, mob/user)
var/rad_strength = 0
@@ -161,9 +161,9 @@
to_chat(user, "[icon2html(src, user)] Subject is irradiated. Radiation levels: [M.radiation]. ")
if(rad_strength)
- to_chat(user, "[icon2html(src, user)] Subject has irradiated objects on them. Radioactive strength: [rad_strength] ")
+ to_chat(user, "[icon2html(src, user)] Target contains radioactive contamination. Radioactive strength: [rad_strength] ")
else
- to_chat(user, "[icon2html(src, user)] Subject is free of radioactive contamination. ")
+ to_chat(user, "[icon2html(src, user)] Target is free of radioactive contamination. ")
/obj/item/geiger_counter/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/screwdriver) && (obj_flags & EMAGGED))
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index f07a95ef20..0030eabcdd 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -5,7 +5,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
icon = 'icons/obj/telescience.dmi'
icon_state = "gps-c"
w_class = WEIGHT_CLASS_SMALL
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
obj_flags = UNIQUE_RENAME
var/gpstag = "COM0"
var/emped = FALSE
diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm
index 7274531420..427437866d 100644
--- a/code/game/objects/items/devices/instruments.dm
+++ b/code/game/objects/items/devices/instruments.dm
@@ -198,7 +198,7 @@
icon_state = "harmonica"
item_state = "harmonica"
instrumentId = "harmonica"
- slot_flags = SLOT_MASK
+ slot_flags = ITEM_SLOT_MASK
force = 5
w_class = WEIGHT_CLASS_SMALL
actions_types = list(/datum/action/item_action/instrument)
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index 116b5982ee..c8f10d7a39 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -6,7 +6,7 @@
item_state = "pen"
var/pointer_icon_state
flags_1 = CONDUCT_1 | NOBLUDGEON_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
materials = list(MAT_METAL=500, MAT_GLASS=500)
w_class = WEIGHT_CLASS_SMALL
var/turf/pointer_loc
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 3fde35383f..750e2a9a9b 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -50,7 +50,7 @@
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 8
var/max_uses = 20
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index 25f3070d9e..f6d3192bce 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -6,7 +6,7 @@
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
var/mob/living/silicon/pai/pai
resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index 7e2c5234fb..1734fa5bfb 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -7,7 +7,7 @@
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
w_class = WEIGHT_CLASS_HUGE
materials = list(MAT_METAL=10000, MAT_GLASS=2500)
var/on = TRUE
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index d16ac424b6..f7caacf816 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -7,7 +7,7 @@
subspace_transmission = TRUE
canhear_range = 0 // can't hear headsets from very far away
- slot_flags = SLOT_EARS
+ slot_flags = ITEM_SLOT_EARS
var/obj/item/encryptionkey/keyslot2 = null
dog_fashion = null
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 9b5ce58867..010372c5c1 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -8,7 +8,7 @@
flags_1 = CONDUCT_1 | HEAR_1
flags_2 = NO_EMP_WIRES_2
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
throw_speed = 3
throw_range = 7
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm
index 7631937de0..fc3812be29 100644
--- a/code/game/objects/items/devices/reverse_bear_trap.dm
+++ b/code/game/objects/items/devices/reverse_bear_trap.dm
@@ -3,7 +3,7 @@
desc = "A horrifying set of shut metal jaws, rigged to a kitchen timer and secured by padlock to a head-mounted clamp. To apply, hit someone with it."
icon = 'icons/obj/device.dmi'
icon_state = "reverse_bear_trap"
- slot_flags = SLOT_HEAD
+ slot_flags = ITEM_SLOT_HEAD
flags_1 = CONDUCT_1
resistance_flags = FIRE_PROOF | UNACIDABLE
w_class = WEIGHT_CLASS_NORMAL
@@ -48,7 +48,7 @@
/obj/item/reverse_bear_trap/attack_hand(mob/user)
if(iscarbon(user))
var/mob/living/carbon/C = user
- if(C.get_item_by_slot(slot_head) == src)
+ if(C.get_item_by_slot(SLOT_HEAD) == src)
if(flags_1 & NODROP_1 && !struggling)
struggling = TRUE
var/fear_string
@@ -82,26 +82,26 @@
..()
/obj/item/reverse_bear_trap/attack(mob/living/target, mob/living/user)
- if(target.get_item_by_slot(slot_head))
+ if(target.get_item_by_slot(SLOT_HEAD))
to_chat(user, "Remove their headgear first! ")
return
target.visible_message("[user] starts forcing [src] onto [target]'s head! ", \
"[target] starts forcing [src] onto your head! ", "You hear clanking. ")
to_chat(user, "You start forcing [src] onto [target]'s head... ")
- if(!do_after(user, 30, target = target) || target.get_item_by_slot(slot_head))
+ if(!do_after(user, 30, target = target) || target.get_item_by_slot(SLOT_HEAD))
return
target.visible_message("[user] forces and locks [src] onto [target]'s head! ", \
"[target] locks [src] onto your head! ", "You hear a click, and then a timer ticking down. ")
to_chat(user, "You force [src] onto [target]'s head and click the padlock shut. ")
user.dropItemToGround(src)
- target.equip_to_slot_if_possible(src, slot_head)
+ target.equip_to_slot_if_possible(src, SLOT_HEAD)
arm()
notify_ghosts("[user] put a reverse bear trap on [target]!", source = src, action = NOTIFY_ORBIT, ghost_sound = 'sound/machines/beep.ogg')
/obj/item/reverse_bear_trap/proc/snap()
reset()
var/mob/living/carbon/human/H = loc
- if(!istype(H) || H.get_item_by_slot(slot_head) != src)
+ if(!istype(H) || H.get_item_by_slot(SLOT_HEAD) != src)
visible_message("[src]'s jaws snap open with an ear-piercing crack! ")
playsound(src, 'sound/effects/snap.ogg', 75, TRUE)
else
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index b574d0c622..332b73c688 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -12,7 +12,7 @@ GAS ANALYZER
icon = 'icons/obj/device.dmi'
icon_state = "t-ray0"
var/on = FALSE
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
@@ -67,7 +67,7 @@ GAS ANALYZER
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
desc = "A hand-held body scanner able to distinguish vital signs of the subject."
flags_1 = CONDUCT_1 | NOBLUDGEON_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
throwforce = 3
w_class = WEIGHT_CLASS_TINY
throw_speed = 3
@@ -174,7 +174,7 @@ GAS ANALYZER
trauma_desc += B.scan_desc
trauma_text += trauma_desc
to_chat(user, "\tCerebral traumas detected: subjects appears to be suffering from [english_list(trauma_text)]. ")
- if(C.roundstart_traits.len)
+ if(C.roundstart_quirks.len)
to_chat(user, "\tSubject has the following physiological traits: [C.get_trait_string()]. ")
if(advanced)
to_chat(user, "\tBrain Activity Level: [(200 - M.getBrainLoss())/2]%. ")
@@ -347,7 +347,7 @@ GAS ANALYZER
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
flags_1 = CONDUCT_1 | NOBLUDGEON_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
throwforce = 0
throw_speed = 3
throw_range = 7
diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm
index 8aa2ec7d4e..79d26776a9 100644
--- a/code/game/objects/items/devices/sensor_device.dm
+++ b/code/game/objects/items/devices/sensor_device.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "scanner"
w_class = WEIGHT_CLASS_SMALL
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
/obj/item/sensor_device/attack_self(mob/user)
GLOB.crewmonitor.show(user,src) //Proc already exists, just had to call it
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 182565da22..50cdbe9c48 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -8,7 +8,7 @@
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
flags_1 = HEAR_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
materials = list(MAT_METAL=60, MAT_GLASS=30)
force = 2
throwforce = 0
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index 9dd6ae5622..c3720f7ac4 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -177,7 +177,7 @@ effective or pretty fucking useless.
icon = 'icons/obj/clothing/belts.dmi'
icon_state = "utilitybelt"
item_state = "utility"
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
attack_verb = list("whipped", "lashed", "disciplined")
var/mob/living/carbon/human/user = null
@@ -188,7 +188,7 @@ effective or pretty fucking useless.
actions_types = list(/datum/action/item_action/toggle)
/obj/item/shadowcloak/ui_action_click(mob/user)
- if(user.get_item_by_slot(slot_belt) == src)
+ if(user.get_item_by_slot(SLOT_BELT) == src)
if(!on)
Activate(usr)
else
@@ -196,7 +196,7 @@ effective or pretty fucking useless.
return
/obj/item/shadowcloak/item_action_slot_check(slot, mob/user)
- if(slot == slot_belt)
+ if(slot == SLOT_BELT)
return 1
/obj/item/shadowcloak/proc/Activate(mob/living/carbon/human/user)
@@ -218,11 +218,11 @@ effective or pretty fucking useless.
/obj/item/shadowcloak/dropped(mob/user)
..()
- if(user && user.get_item_by_slot(slot_belt) != src)
+ if(user && user.get_item_by_slot(SLOT_BELT) != src)
Deactivate()
/obj/item/shadowcloak/process()
- if(user.get_item_by_slot(slot_belt) != src)
+ if(user.get_item_by_slot(SLOT_BELT) != src)
Deactivate()
return
var/turf/T = get_turf(src)
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index 35994d09f5..12d263bf9d 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -58,6 +58,36 @@
attacher = user
return
+//Attached device memes
+/obj/item/transfer_valve/Move()
+ . = ..()
+ if(attached_device)
+ attached_device.holder_movement()
+
+/obj/item/transfer_valve/dropped()
+ . = ..()
+ if(attached_device)
+ attached_device.dropped()
+
+/obj/item/transfer_valve/on_found(mob/finder)
+ if(attached_device)
+ attached_device.on_found(finder)
+
+/obj/item/transfer_valve/Crossed(atom/movable/AM as mob|obj)
+ . = ..()
+ if(attached_device)
+ attached_device.Crossed(AM)
+
+/obj/item/transfer_valve/attack_hand()//Triggers mousetraps
+ . = ..()
+ if(.)
+ return
+ if(attached_device)
+ attached_device.attack_hand()
+
+//These keep attached devices synced up, for example a TTV with a mouse trap being found in a bag so it's triggered, or moving the TTV with an infrared beam sensor to update the beam's direction.
+
+
/obj/item/transfer_valve/attack_self(mob/user)
user.set_machine(src)
var/dat = {" Valve properties:
@@ -91,8 +121,7 @@
toggle_valve()
else if(attached_device)
if(href_list["rem_device"])
- attached_device.forceMove(drop_location())
- attached_device.holder = null
+ attached_device.on_detach()
attached_device = null
update_icon()
if(href_list["device"])
@@ -127,6 +156,10 @@
underlays += J
if(attached_device)
add_overlay("device")
+ if(istype(attached_device, /obj/item/assembly/infra))
+ var/obj/item/assembly/infra/sensor = attached_device
+ if(sensor.on && sensor.visible)
+ add_overlay("proxy_beam")
/obj/item/transfer_valve/proc/merge_gases()
tank_two.air_contents.volume += tank_one.air_contents.volume
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index cf11ac7640..3f97321710 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -208,12 +208,13 @@
if(stored_swap == user)
to_chat(user,"You stare at the book some more, but there doesn't seem to be anything else to learn... ")
return
-
var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new
- swapper.cast(user, stored_swap, TRUE)
+ if(swapper.cast(list(stored_swap), user, TRUE, TRUE))
+ to_chat(user,"You're suddenly somewhere else... and someone else?! ")
+ to_chat(stored_swap,"Suddenly you're staring at [src] again... where are you, who are you?! ")
+ else
+ user.visible_message("[src] fizzles slightly as it stops glowing! ") //if the mind_transfer failed to transfer mobs, likely due to the target being catatonic.
- to_chat(stored_swap,"You're suddenly somewhere else... and someone else?! ")
- to_chat(user,"Suddenly you're staring at [src] again... where are you, who are you?! ")
stored_swap = null
/obj/item/book/granter/spell/forcewall
@@ -257,7 +258,7 @@
magichead.voicechange = TRUE //NEEEEIIGHH
if(!user.dropItemToGround(user.wear_mask))
qdel(user.wear_mask)
- user.equip_to_slot_if_possible(magichead, slot_wear_mask, TRUE, TRUE)
+ user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE)
qdel(src)
else
to_chat(user,"I say thee neigh ") //It still lives here
diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm
index 9d3df9cf7a..8bc1665a3f 100644
--- a/code/game/objects/items/grenades/chem_grenade.dm
+++ b/code/game/objects/items/grenades/chem_grenade.dm
@@ -163,8 +163,10 @@
for(var/obj/item/reagent_containers/glass/G in beakers)
reactants += G.reagents
- if(!chem_splash(get_turf(src), affected_area, reactants, ignition_temp, threatscale) && !no_splash)
- playsound(loc, 'sound/items/screwdriver2.ogg', 50, 1)
+ var/turf/detonation_turf = get_turf(src)
+
+ if(!chem_splash(detonation_turf, affected_area, reactants, ignition_temp, threatscale) && !no_splash)
+ playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
if(beakers.len)
for(var/obj/O in beakers)
O.forceMove(drop_location())
@@ -172,17 +174,15 @@
stage_change(EMPTY)
return
+ var/areas_name = get_area_name(src, TRUE)
+
if(nadeassembly)
var/mob/M = get_mob_by_ckey(assemblyattacher)
var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast)
- var/turf/T = get_turf(src)
- var/area/A = get_area(T)
- message_admins("grenade primed by an assembly, attached by [ADMIN_LOOKUPFLW(M)] and last touched by [ADMIN_LOOKUPFLW(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [ADMIN_JMP(T)] .")
- log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [COORD(T)]")
+ message_admins("grenade primed by an assembly, attached by [ADMIN_LOOKUPFLW(M)] and last touched by [ADMIN_LOOKUPFLW(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [areas_name] [ADMIN_JMP(detonation_turf)].")
+ log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [areas_name] [COORD(detonation_turf)]")
- var/turf/DT = get_turf(src)
- var/area/DA = get_area(DT)
- log_game("A grenade detonated at [DA.name] [COORD(DT)]")
+ log_game("A grenade detonated at [areas_name] [COORD(detonation_turf)]")
update_mob()
diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm
index 5b96b74f41..d450764702 100644
--- a/code/game/objects/items/grenades/ghettobomb.dm
+++ b/code/game/objects/items/grenades/ghettobomb.dm
@@ -12,7 +12,7 @@
throw_speed = 3
throw_range = 7
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
active = 0
det_time = 50
display_timer = 0
diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm
index 929c649e4d..6a08777e61 100644
--- a/code/game/objects/items/grenades/grenade.dm
+++ b/code/game/objects/items/grenades/grenade.dm
@@ -10,7 +10,7 @@
throw_speed = 3
throw_range = 7
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
resistance_flags = FLAMMABLE
max_integrity = 40
var/active = 0
diff --git a/code/game/objects/items/grenades/smokebomb.dm b/code/game/objects/items/grenades/smokebomb.dm
index f5a27cf5c8..d822ede78c 100644
--- a/code/game/objects/items/grenades/smokebomb.dm
+++ b/code/game/objects/items/grenades/smokebomb.dm
@@ -1,31 +1,31 @@
-/obj/item/grenade/smokebomb
- name = "smoke grenade"
- desc = "The word 'Dank' is scribbled on it in crayon."
- icon = 'icons/obj/grenade.dmi'
- icon_state = "smokewhite"
- det_time = 20
- item_state = "flashbang"
- slot_flags = SLOT_BELT
- var/datum/effect_system/smoke_spread/bad/smoke
-
-/obj/item/grenade/smokebomb/New()
- ..()
- src.smoke = new /datum/effect_system/smoke_spread/bad
- src.smoke.attach(src)
-
-/obj/item/grenade/smokebomb/Destroy()
- qdel(smoke)
- return ..()
-
-/obj/item/grenade/smokebomb/prime()
- update_mob()
- playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
- smoke.set_up(4, src)
- smoke.start()
-
-
- for(var/obj/structure/blob/B in view(8,src))
- var/damage = round(30/(get_dist(B,src)+1))
- B.take_damage(damage, BURN, "melee", 0)
- sleep(80)
- qdel(src)
+/obj/item/grenade/smokebomb
+ name = "smoke grenade"
+ desc = "The word 'Dank' is scribbled on it in crayon."
+ icon = 'icons/obj/grenade.dmi'
+ icon_state = "smokewhite"
+ det_time = 20
+ item_state = "flashbang"
+ slot_flags = ITEM_SLOT_BELT
+ var/datum/effect_system/smoke_spread/bad/smoke
+
+/obj/item/grenade/smokebomb/New()
+ ..()
+ src.smoke = new /datum/effect_system/smoke_spread/bad
+ src.smoke.attach(src)
+
+/obj/item/grenade/smokebomb/Destroy()
+ qdel(smoke)
+ return ..()
+
+/obj/item/grenade/smokebomb/prime()
+ update_mob()
+ playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
+ smoke.set_up(4, src)
+ smoke.start()
+
+
+ for(var/obj/structure/blob/B in view(8,src))
+ var/damage = round(30/(get_dist(B,src)+1))
+ B.take_damage(damage, BURN, "melee", 0)
+ sleep(80)
+ qdel(src)
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 09abc25cc1..735bcaeb27 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -29,7 +29,7 @@
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 13ca2b35d6..560a972ee8 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -75,7 +75,7 @@
desc = "It has a mysterious, protective aura."
w_class = WEIGHT_CLASS_HUGE
force = 5
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
block_chance = 50
var/shield_icon = "shield-red"
@@ -98,7 +98,7 @@
name = "holy claymore"
desc = "A weapon fit for a crusade!"
w_class = WEIGHT_CLASS_HUGE
- slot_flags = SLOT_BACK|SLOT_BELT
+ slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT
block_chance = 30
sharpness = IS_SHARP
hitsound = 'sound/weapons/bladeslice.ogg'
@@ -118,7 +118,7 @@
inhand_y_dimension = 64
name = "dark blade"
desc = "Spread the glory of the dark gods!"
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
hitsound = 'sound/hallucinations/growl1.ogg'
/obj/item/nullrod/claymore/chainsaw_sword
@@ -126,7 +126,7 @@
item_state = "chainswordon"
name = "sacred chainsaw sword"
desc = "Suffer not a heretic to live."
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg'
@@ -135,21 +135,21 @@
item_state = "swordon"
name = "force weapon"
desc = "The blade glows with the power of faith. Or possibly a battery."
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
/obj/item/nullrod/claymore/katana
name = "hanzo steel"
desc = "Capable of cutting clean through a holy claymore."
icon_state = "katana"
item_state = "katana"
- slot_flags = SLOT_BELT | SLOT_BACK
+ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
/obj/item/nullrod/claymore/multiverse
name = "extradimensional blade"
desc = "Once the harbinger of an interdimensional war, its sharpness fluctuates wildly."
icon_state = "multiverse"
item_state = "multiverse"
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
/obj/item/nullrod/claymore/multiverse/attack(mob/living/carbon/M, mob/living/carbon/user)
force = rand(1, 30)
@@ -161,7 +161,7 @@
icon_state = "swordblue"
item_state = "swordblue"
desc = "If you strike me down, I shall become more robust than you can possibly imagine."
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
/obj/item/nullrod/claymore/saber/red
name = "dark energy sword"
@@ -182,7 +182,7 @@
item_state = "sord"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 4.13
throwforce = 1
hitsound = 'sound/weapons/bladeslice.ogg'
@@ -197,7 +197,7 @@
desc = "Ask not for whom the bell tolls..."
w_class = WEIGHT_CLASS_BULKY
armour_penetration = 35
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
sharpness = IS_SHARP
attack_verb = list("chopped", "sliced", "cut", "reaped")
@@ -279,7 +279,7 @@
item_state = "chainswordon"
name = "possessed chainsaw sword"
desc = "Suffer not a heretic to live."
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 30
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg'
@@ -292,7 +292,7 @@
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
name = "relic war hammer"
desc = "This war hammer cost the chaplain forty thousand space dollars."
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_HUGE
attack_verb = list("smashed", "bashed", "hammered", "crunched")
@@ -330,7 +330,7 @@
force = 16
throwforce = 15
w_class = 4
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
attack_verb = list("attacked", "smashed", "crushed", "splattered", "cracked")
hitsound = 'sound/weapons/blade1.ogg'
@@ -350,7 +350,7 @@
item_state = "chain"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
attack_verb = list("whipped", "lashed")
hitsound = 'sound/weapons/chainhit.ogg'
@@ -359,7 +359,7 @@
desc = "The brim of the hat is as sharp as your wit. The edge would hurt almost as much as disproving the existence of God."
icon_state = "fedora"
item_state = "fedora"
- slot_flags = SLOT_HEAD
+ slot_flags = ITEM_SLOT_HEAD
icon = 'icons/obj/clothing/hats.dmi'
force = 0
throw_speed = 4
@@ -414,7 +414,7 @@
w_class = WEIGHT_CLASS_BULKY
force = 15
block_chance = 40
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
sharpness = IS_BLUNT
hitsound = "swing_hit"
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 0016bf981f..2df0efd12d 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -17,7 +17,7 @@
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 10
throwforce = 7
w_class = WEIGHT_CLASS_NORMAL
@@ -96,7 +96,7 @@
item_state = "classic_baton"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 12 //9 hit crit
w_class = WEIGHT_CLASS_NORMAL
var/cooldown = 0
@@ -159,7 +159,7 @@
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
item_state = null
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
item_flags = NONE
force = 0
@@ -196,7 +196,7 @@
to_chat(user, "You collapse the baton. ")
icon_state = "telebaton_0"
item_state = null //no sprite for concealment even when in hand
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
force = 0 //not so robust now
attack_verb = list("hit", "poked")
@@ -308,7 +308,7 @@
item_state = "chain"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 15
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
@@ -326,7 +326,7 @@
desc = "A telescopic roasting stick with a miniature shield generator designed to ensure entry into various high-tech shielded cooking ovens and firepits."
icon_state = "roastingstick_0"
item_state = "null"
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
item_flags = NONE
force = 0
diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm
index a6d0d285bf..1fc61985b5 100644
--- a/code/game/objects/items/pinpointer.dm
+++ b/code/game/objects/items/pinpointer.dm
@@ -5,7 +5,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "pinpointer"
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
@@ -87,7 +87,7 @@
return FALSE
var/turf/there = get_turf(H)
- return (H.z != 0 || (there && there.z == H.z))
+ return (H.z != 0 || (there && there.z == here.z))
return FALSE
diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm
index 0f926b4ee3..060448946a 100644
--- a/code/game/objects/items/religion.dm
+++ b/code/game/objects/items/religion.dm
@@ -325,7 +325,7 @@
icon_state = "crusader"
w_class = WEIGHT_CLASS_NORMAL
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //does this even do anything on boots?
- flags_1 = NOSLIP_1
+ clothing_flags = NOSLIP
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index dd8d8f8a10..d6bb54bddf 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -10,7 +10,7 @@
icon_state = "riot"
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
force = 10
throwforce = 5
throw_speed = 2
@@ -45,6 +45,11 @@
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
+/obj/item/shield/riot/roman/fake
+ desc = "Bears an inscription on the inside: \"Romanes venio domus\" . It appears to be a bit flimsy."
+ block_chance = 0
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+
/obj/item/shield/riot/buckler
name = "wooden buckler"
desc = "A medieval wooden buckler."
@@ -138,7 +143,7 @@
throwforce = 5
throw_speed = 2
w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
to_chat(user, "You extend \the [src]. ")
else
force = 3
diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm
index 5d96213934..11248aad50 100644
--- a/code/game/objects/items/singularityhammer.dm
+++ b/code/game/objects/items/singularityhammer.dm
@@ -5,7 +5,7 @@
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
force = 5
force_unwielded = 5
force_wielded = 20
@@ -76,7 +76,7 @@
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
force = 5
force_unwielded = 5
force_wielded = 25
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 511f9754fe..bee37d1ff9 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -127,6 +127,18 @@
self_delay = 20
max_amount = 12
+/obj/item/stack/medical/gauze/wirecutter_act(mob/living/user, obj/item/I)
+ if(get_amount() < 2)
+ to_chat(user, "You need at least two gauze to do this! ")
+ return
+ new /obj/item/stack/sheet/cloth(user.drop_location())
+ user.visible_message("[user] cuts [src] into pieces of cloth with [I].", \
+ "You cut [src] into pieces of cloth with [I]. ", \
+ "You hear cutting. ")
+ var/obj/item/stack/medical/gauze/R = src
+ src = null
+ R.use(2)
+
/obj/item/stack/medical/gauze/suicide_act(mob/living/user)
user.visible_message("[user] begins tightening \the [src] around [user.p_their()] neck! It looks like [user.p_they()] forgot how to use medical supplies! ")
return OXYLOSS
@@ -155,5 +167,5 @@
grind_results = list("silver_sulfadiazine" = 10)
/obj/item/stack/medical/ointment/suicide_act(mob/living/user)
- user.visible_message("[user] is squeezing \the [src] into [user.p_their()] mouth! Don't they know that stuff is toxic? ")
- return TOXLOSS
\ No newline at end of file
+ user.visible_message("[user] is squeezing \the [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic? ")
+ return TOXLOSS
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 9d32504c19..3264deae88 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -82,7 +82,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
singular_name = "plasma glass sheet"
icon_state = "sheet-pglass"
item_state = "sheet-pglass"
- materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plasmaglass
@@ -133,7 +133,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
singular_name = "reinforced glass sheet"
icon_state = "sheet-rglass"
item_state = "sheet-rglass"
- materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/rglass
@@ -175,7 +175,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \
singular_name = "reinforced plasma glass sheet"
icon_state = "sheet-prglass"
item_state = "sheet-prglass"
- materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT, MAT_METAL = MINERAL_MATERIAL_AMOUNT * 0.5,)
armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plasmarglass
@@ -195,7 +195,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list(
singular_name = "titanium glass sheet"
icon_state = "sheet-titaniumglass"
item_state = "sheet-titaniumglass"
- materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/titaniumglass
@@ -214,7 +214,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
singular_name = "plastitanium glass sheet"
icon_state = "sheet-plastitaniumglass"
item_state = "sheet-plastitaniumglass"
- materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plastitaniumglass
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index cfccedcc3a..4eae35a98c 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -211,10 +211,9 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
if(W.is_sharp())
playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
user.visible_message("[user] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]... ", "You hear the sound of a knife rubbing against flesh. ")
- if(do_after(user,50, target = src))
+ if(do_after(user, 50, target = src))
to_chat(user, "You cut the hair from this [src.singular_name]. ")
- var/obj/item/stack/sheet/hairlesshide/HS = new(user.loc)
- HS.amount = 1
+ new /obj/item/stack/sheet/hairlesshide(user.drop_location(), 1)
use(1)
else
return ..()
@@ -228,21 +227,11 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
if(exposed_temperature >= drying_threshold_temperature)
wetness--
if(wetness == 0)
- //Try locating an exisitng stack on the tile and add to there if possible
- for(var/obj/item/stack/sheet/leather/HS in src.loc)
- if(HS.amount < 50)
- HS.amount++
- src.use(1)
- wetness = initial(wetness)
- break
- //If it gets to here it means it did not find a suitable stack on the tile.
- var/obj/item/stack/sheet/leather/HS = new(src.loc)
- HS.amount = 1
+ new /obj/item/stack/sheet/leather(drop_location(), 1)
wetness = initial(wetness)
- src.use(1)
+ use(1)
/obj/item/stack/sheet/wetleather/microwave_act(obj/machinery/microwave/MW)
..()
- var/obj/item/stack/sheet/leather/L = new(loc)
- L.amount = amount
+ new /obj/item/stack/sheet/leather(drop_location(), amount)
qdel(src)
diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm
index b4482a72db..b7c2d5b3f9 100644
--- a/code/game/objects/items/stacks/sheets/light.dm
+++ b/code/game/objects/items/stacks/sheets/light.dm
@@ -14,13 +14,12 @@
grind_results = list("silicon" = 20, "copper" = 5)
/obj/item/stack/light_w/attackby(obj/item/O, mob/user, params)
-
+ var/atom/Tsec = user.drop_location()
if(istype(O, /obj/item/wirecutters))
- var/obj/item/stack/cable_coil/CC = new (user.loc)
- CC.amount = 5
+ var/obj/item/stack/cable_coil/CC = new (Tsec, 5)
CC.add_fingerprint(user)
amount--
- var/obj/item/stack/sheet/glass/G = new (user.loc)
+ var/obj/item/stack/sheet/glass/G = new (Tsec)
G.add_fingerprint(user)
if(amount <= 0)
qdel(src)
@@ -28,7 +27,6 @@
else if(istype(O, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = O
if (M.use(1))
- use(1)
var/obj/item/L = new /obj/item/stack/tile/light(user.loc)
to_chat(user, "You make a light tile. ")
L.add_fingerprint(user)
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 6109f6b0d0..df3d5f799b 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -121,6 +121,9 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
/obj/item/stack/sheet/metal/twenty
amount = 20
+/obj/item/stack/sheet/metal/ten
+ amount = 10
+
/obj/item/stack/sheet/metal/five
amount = 5
@@ -349,6 +352,11 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
if(!iscultist(user))
to_chat(user, "Only one with forbidden knowledge could hope to work this metal... ")
return
+ var/turf/T = get_turf(user) //we may have moved. adjust as needed...
+ var/area/A = get_area(user)
+ if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !A.blob_allowed))
+ to_chat(user, "The veil is not weak enough here. ")
+ return FALSE
return ..()
/obj/item/stack/sheet/runed_metal/Initialize(mapload, new_amount, merge = TRUE)
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index e67efb0c8a..4d5bf2a449 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -33,10 +33,13 @@
return
return TRUE
-/obj/item/stack/Initialize(mapload, new_amount=null , merge = TRUE)
+/obj/item/stack/Initialize(mapload, new_amount, merge = TRUE)
. = ..()
- if(new_amount)
+ if(new_amount != null)
amount = new_amount
+ while(amount > max_amount)
+ amount -= max_amount
+ new type(loc, max_amount, FALSE)
if(!merge_type)
merge_type = type
if(merge)
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 89ce133fcc..d2665be1b0 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -17,7 +17,7 @@
lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK //ERROOOOO
+ slot_flags = ITEM_SLOT_BACK //ERROOOOO
resistance_flags = NONE
max_integrity = 300
@@ -453,7 +453,7 @@
/obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun/PopulateContents()
for(var/i in 1 to 6)
new /obj/item/ammo_box/magazine/m12g(src)
- new /obj/item/ammo_box/magazine/m12g/buckshot(src)
+ new /obj/item/ammo_box/magazine/m12g/stun(src)
new /obj/item/ammo_box/magazine/m12g/slug(src)
new /obj/item/ammo_box/magazine/m12g/dragon(src)
@@ -479,7 +479,7 @@
/obj/item/storage/backpack/duffelbag/syndie/bulldogbundle/PopulateContents()
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/gun/ballistic/automatic/shotgun/bulldog(src)
- new /obj/item/ammo_box/magazine/m12g/buckshot(src)
+ new /obj/item/ammo_box/magazine/m12g/stun(src)
new /obj/item/clothing/glasses/thermal/syndi(src)
/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle
@@ -511,6 +511,8 @@
new /obj/item/storage/box/syringes(src)
new /obj/item/ammo_box/foambox/riot(src)
new /obj/item/grenade/chem_grenade/bioterrorfoam(src)
+ if(prob(5))
+ new /obj/item/reagent_containers/food/snacks/pizza/pineapple(src)
/obj/item/storage/backpack/duffelbag/syndie/c4/PopulateContents()
for(var/i in 1 to 10)
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm
index 5c6a354356..a75d0aa0d9 100644
--- a/code/game/objects/items/storage/bags.dm
+++ b/code/game/objects/items/storage/bags.dm
@@ -17,7 +17,7 @@
// Generic non-item
/obj/item/storage/bag
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
/obj/item/storage/bag/ComponentInitialize()
. = ..()
@@ -94,7 +94,7 @@
desc = "This little bugger can be used to store and transport ores."
icon = 'icons/obj/mining.dmi'
icon_state = "satchel"
- slot_flags = SLOT_BELT | SLOT_POCKET
+ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET
w_class = WEIGHT_CLASS_NORMAL
component_type = /datum/component/storage/concrete/stack
var/spam_protection = FALSE //If this is TRUE, the holder won't receive any messages when they fail to pick up ore through crossing it
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index d934fbe18a..22a8844d1a 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -6,7 +6,7 @@
item_state = "utility"
lefthand_file = 'icons/mob/inhands/equipment/belt_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/belt_righthand.dmi'
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
attack_verb = list("whipped", "lashed", "disciplined")
max_integrity = 300
var/content_overlays = FALSE //If this is true, the belt will gain overlays based on what it's holding
diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm
index 44c41e419b..db47fd3d0b 100644
--- a/code/game/objects/items/storage/book.dm
+++ b/code/game/objects/items/storage/book.dm
@@ -74,7 +74,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
if(B.icon_state == "honk1" || B.icon_state == "honk2")
var/mob/living/carbon/human/H = usr
H.dna.add_mutation(CLOWNMUT)
- H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
+ H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), SLOT_WEAR_MASK)
SSreligion.bible_icon_state = B.icon_state
SSreligion.bible_item_state = B.item_state
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index f892bc50f4..e47ceee7ad 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -544,7 +544,7 @@
icon_state = "matchbox"
item_state = "zippo"
w_class = WEIGHT_CLASS_TINY
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
/obj/item/storage/box/matches/ComponentInitialize()
. = ..()
@@ -966,3 +966,45 @@ obj/item/storage/box/clown
/obj/item/storage/box/holy_grenades/PopulateContents()
for(var/i in 1 to 7)
new/obj/item/grenade/chem_grenade/holy(src)
+
+/obj/item/storage/box/stockparts/basic //for ruins where it's a bad idea to give access to an autolathe/protolathe, but still want to make stock parts accessible
+ name = "box of stock parts"
+ desc = "Contains a variety of basic stock parts."
+
+/obj/item/storage/box/stockparts/basic/PopulateContents()
+ new /obj/item/stock_parts/capacitor(src)
+ new /obj/item/stock_parts/capacitor(src)
+ new /obj/item/stock_parts/capacitor(src)
+ new /obj/item/stock_parts/scanning_module(src)
+ new /obj/item/stock_parts/scanning_module(src)
+ new /obj/item/stock_parts/scanning_module(src)
+ new /obj/item/stock_parts/manipulator(src)
+ new /obj/item/stock_parts/manipulator(src)
+ new /obj/item/stock_parts/manipulator(src)
+ new /obj/item/stock_parts/micro_laser(src)
+ new /obj/item/stock_parts/micro_laser(src)
+ new /obj/item/stock_parts/micro_laser(src)
+ new /obj/item/stock_parts/matter_bin(src)
+ new /obj/item/stock_parts/matter_bin(src)
+ new /obj/item/stock_parts/matter_bin(src)
+
+/obj/item/storage/box/stockparts/deluxe
+ name = "box of deluxe stock parts"
+ desc = "Contains a variety of deluxe stock parts."
+
+/obj/item/storage/box/stockparts/deluxe/PopulateContents()
+ new /obj/item/stock_parts/capacitor/quadratic(src)
+ new /obj/item/stock_parts/capacitor/quadratic(src)
+ new /obj/item/stock_parts/capacitor/quadratic(src)
+ new /obj/item/stock_parts/scanning_module/triphasic(src)
+ new /obj/item/stock_parts/scanning_module/triphasic(src)
+ new /obj/item/stock_parts/scanning_module/triphasic(src)
+ new /obj/item/stock_parts/manipulator/femto(src)
+ new /obj/item/stock_parts/manipulator/femto(src)
+ new /obj/item/stock_parts/manipulator/femto(src)
+ new /obj/item/stock_parts/micro_laser/quadultra(src)
+ new /obj/item/stock_parts/micro_laser/quadultra(src)
+ new /obj/item/stock_parts/micro_laser/quadultra(src)
+ new /obj/item/stock_parts/matter_bin/bluespace(src)
+ new /obj/item/stock_parts/matter_bin/bluespace(src)
+ new /obj/item/stock_parts/matter_bin/bluespace(src)
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index c0389b6bfc..f86188984f 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -109,7 +109,7 @@
icon_type = "candle"
item_state = "candlebox5"
throwforce = 2
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
spawn_type = /obj/item/candle
fancy_open = TRUE
@@ -132,7 +132,7 @@
item_state = "cigpacket"
w_class = WEIGHT_CLASS_TINY
throwforce = 0
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
icon_type = "cigarette"
spawn_type = /obj/item/clothing/mask/cigarette/space_cigarette
@@ -189,7 +189,7 @@
if(M == user && contents.len > 0 && !user.wear_mask)
var/obj/item/clothing/mask/cigarette/W = cig
SendSignal(COMSIG_TRY_STORAGE_TAKE, W, M)
- M.equip_to_slot_if_possible(W, slot_wear_mask)
+ M.equip_to_slot_if_possible(W, SLOT_WEAR_MASK)
contents -= W
to_chat(user, "You take a [icon_type] out of the pack. ")
else
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index c78a20a0ef..689319e672 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -168,7 +168,7 @@
new /obj/item/weldingtool/experimental/brass(src)
/obj/item/storage/toolbox/brass/prefilled/servant
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
fabricator_type = null
/obj/item/storage/toolbox/brass/prefilled/ratvar
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index ec92961387..60675d031f 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -111,8 +111,8 @@
new /obj/item/clothing/suit/space/hardsuit/syndi(src) // 8 tc
new /obj/item/gun/ballistic/automatic/shotgun/bulldog/unrestricted(src) // 8 tc
new /obj/item/implanter/explosive(src) // 2 tc
- new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc
- new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc
+ new /obj/item/ammo_box/magazine/m12g(src) // 2 tc
+ new /obj/item/ammo_box/magazine/m12g(src) // 2 tc
new /obj/item/grenade/plastic/c4 (src) // 1 tc
new /obj/item/grenade/plastic/c4 (src) // 1 tc
new /obj/item/card/emag(src) // 6 tc
@@ -280,7 +280,7 @@
new /obj/item/radio/headset/chameleon(src)
new /obj/item/stamp/chameleon(src)
new /obj/item/pda/chameleon(src)
- new /obj/item/gun/energy/laser/chameleon(src)
+ //new /obj/item/gun/energy/laser/chameleon(src) //crashes the server right now. please fix it!
//5*(2*4) = 5*8 = 45, 45 damage if you hit one person with all 5 stars.
//Not counting the damage it will do while embedded (2*4 = 8, at 15% chance)
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index 6acf72518f..4b14388336 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -4,7 +4,7 @@
icon_state = "wallet"
w_class = WEIGHT_CLASS_SMALL
resistance_flags = FLAMMABLE
- slot_flags = SLOT_ID
+ slot_flags = ITEM_SLOT_ID
var/obj/item/card/id/front_id = null
var/list/combined_access
@@ -38,16 +38,20 @@
/obj/item/storage/wallet/Exited(atom/movable/AM)
. = ..()
- refreshID()
+ // The loc has not actually changed yet when this proc is called, so call
+ // refreshID and have it ignore the outgoing atom.
+ refreshID(AM)
-/obj/item/storage/wallet/proc/refreshID()
- if(!(front_id in src))
+/obj/item/storage/wallet/proc/refreshID(atom/movable/removed)
+ LAZYCLEARLIST(combined_access)
+ if(!(front_id in src) || front_id == removed)
front_id = null
for(var/obj/item/card/id/I in contents)
- LAZYINITLIST(combined_access)
- LAZYCLEARLIST(combined_access)
+ if(I == removed)
+ continue
if(!front_id)
front_id = I
+ LAZYINITLIST(combined_access)
combined_access |= I.access
update_icon()
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index 1bd31e978e..fed7848d69 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -5,7 +5,7 @@
item_state = "baton"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 10
throwforce = 7
w_class = WEIGHT_CLASS_NORMAL
@@ -195,7 +195,7 @@
stunforce = 100
hitcost = 2000
throw_hit_chance = 10
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
var/obj/item/assembly/igniter/sparkler = 0
/obj/item/melee/baton/cattleprod/Initialize()
diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm
index 4a687b458d..f4eb763847 100644
--- a/code/game/objects/items/tanks/tank_types.dm
+++ b/code/game/objects/items/tanks/tank_types.dm
@@ -137,7 +137,7 @@
/obj/item/tank/internals/plasmaman/belt
icon_state = "plasmaman_tank_belt"
item_state = "plasmaman_tank_belt"
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 5
volume = 6
w_class = WEIGHT_CLASS_SMALL //thanks i forgot this
@@ -157,7 +157,7 @@
desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it."
icon_state = "emergency"
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
force = 4
distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index f841822f21..91058528e6 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -4,7 +4,7 @@
lefthand_file = 'icons/mob/inhands/equipment/tanks_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tanks_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
hitsound = 'sound/weapons/smash.ogg'
pressure_resistance = ONE_ATMOSPHERE * 5
force = 5
@@ -38,7 +38,7 @@
return
if(H.wear_mask.mask_adjusted)
H.wear_mask.adjustmask(H)
- if(!(H.wear_mask.flags_1 & MASKINTERNALS_1))
+ if(!(H.wear_mask.clothing_flags & MASKINTERNALS))
to_chat(H, "[H.wear_mask] can't use [src]! ")
return
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index 5c7df452f0..b8eb2dcc00 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -6,7 +6,7 @@
icon_state = "waterbackpack"
item_state = "waterbackpack"
w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
slowdown = 1
actions_types = list(/datum/action/item_action/toggle_mister)
max_integrity = 200
@@ -49,7 +49,6 @@
on = FALSE
to_chat(user, "You need a free hand to hold the mister! ")
return
- noz.forceMove(user)
else
//Remove from their hands and put back "into" the tank
remove_noz()
@@ -60,7 +59,7 @@
/obj/item/watertank/equipped(mob/user, slot)
..()
- if(slot != slot_back)
+ if(slot != SLOT_BACK)
remove_noz()
/obj/item/watertank/proc/remove_noz()
@@ -344,7 +343,7 @@
icon_state = "waterbackpackatmos"
item_state = "waterbackpackatmos"
w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
slowdown = 1
actions_types = list(/datum/action/item_action/activate_injector)
@@ -361,14 +360,14 @@
toggle_injection()
/obj/item/reagent_containers/chemtank/item_action_slot_check(slot, mob/user)
- if(slot == slot_back)
+ if(slot == SLOT_BACK)
return 1
/obj/item/reagent_containers/chemtank/proc/toggle_injection()
var/mob/living/carbon/human/user = usr
if(!istype(user))
return
- if (user.get_item_by_slot(slot_back) != src)
+ if (user.get_item_by_slot(SLOT_BACK) != src)
to_chat(user, "The chemtank needs to be on your back before you can activate it! ")
return
if(on)
diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm
index cc7e3249d4..dc6fbfe25b 100644
--- a/code/game/objects/items/teleportation.dm
+++ b/code/game/objects/items/teleportation.dm
@@ -219,3 +219,17 @@
if(active_portal_pairs[i] == P)
return DESTINATION_PORTAL
return FALSE
+
+/obj/item/hand_tele/suicide_act(mob/user)
+ if(iscarbon(user))
+ user.visible_message("[user] is creating a weak portal and sticking [user.p_their()] head through! It looks like [user.p_theyre()] trying to commit suicide! ")
+ var/mob/living/carbon/itemUser = user
+ var/obj/item/bodypart/head/head = itemUser.get_bodypart(BODY_ZONE_HEAD)
+ if(head)
+ head.drop_limb()
+ var/list/safeLevels = SSmapping.levels_by_any_trait(list(ZTRAIT_SPACE_RUINS, ZTRAIT_LAVA_RUINS, ZTRAIT_STATION, ZTRAIT_MINING))
+ head.forceMove(locate(rand(1, world.maxx), rand(1, world.maxy), pick(safeLevels)))
+ itemUser.visible_message("The portal snaps closed taking [user]'s head with it! ")
+ else
+ itemUser.visible_message("[user] looks even further depressed as they realize they do not have a head...and suddenly dies of shame! ")
+ return (BRUTELOSS)
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index ed6233a0b6..0684da08b2 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -7,7 +7,7 @@
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
usesound = 'sound/items/crowbar.ogg'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 5
throwforce = 7
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index 56537e703a..a29c103fda 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -7,7 +7,7 @@
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 5
w_class = WEIGHT_CLASS_TINY
throwforce = 5
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index dc496187bc..229aa70ee0 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -1,372 +1,372 @@
-#define WELDER_FUEL_BURN_INTERVAL 13
-/obj/item/weldingtool
- name = "welding tool"
- desc = "A standard edition welder provided by Nanotrasen."
- icon = 'icons/obj/tools.dmi'
- icon_state = "welder"
- item_state = "welder"
- lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
- flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
- force = 3
- throwforce = 5
- hitsound = "swing_hit"
- usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg')
- var/acti_sound = 'sound/items/welderactivate.ogg'
- var/deac_sound = 'sound/items/welderdeactivate.ogg'
- throw_speed = 3
- throw_range = 5
- w_class = WEIGHT_CLASS_SMALL
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
- resistance_flags = FIRE_PROOF
-
- materials = list(MAT_METAL=70, MAT_GLASS=30)
- var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
- var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
- var/max_fuel = 20 //The max amount of fuel the welder can hold
- var/change_icons = 1
- var/can_off_process = 0
- var/light_intensity = 2 //how powerful the emitted light is when used.
- var/progress_flash_divisor = 10
- var/burned_fuel_for = 0 //when fuel was last removed
- heat = 3800
- tool_behaviour = TOOL_WELDER
- toolspeed = 1
-
-/obj/item/weldingtool/Initialize()
- . = ..()
- create_reagents(max_fuel)
- reagents.add_reagent("welding_fuel", max_fuel)
- update_icon()
-
-
-/obj/item/weldingtool/proc/update_torch()
- if(welding)
- add_overlay("[initial(icon_state)]-on")
- item_state = "[initial(item_state)]1"
- else
- item_state = "[initial(item_state)]"
-
-
-/obj/item/weldingtool/update_icon()
- cut_overlays()
- if(change_icons)
- var/ratio = get_fuel() / max_fuel
- ratio = CEILING(ratio*4, 1) * 25
- add_overlay("[initial(icon_state)][ratio]")
- update_torch()
- return
-
-
-/obj/item/weldingtool/process()
- switch(welding)
- if(0)
- force = 3
- damtype = "brute"
- update_icon()
- if(!can_off_process)
- STOP_PROCESSING(SSobj, src)
- return
- //Welders left on now use up fuel, but lets not have them run out quite that fast
- if(1)
- force = 15
- damtype = "fire"
- ++burned_fuel_for
- if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL)
- use(1)
- update_icon()
-
- //This is to start fires. process() is only called if the welder is on.
- open_flame()
-
-
-/obj/item/weldingtool/suicide_act(mob/user)
- user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide! ")
- return (FIRELOSS)
-
-
-/obj/item/weldingtool/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/screwdriver))
- flamethrower_screwdriver(I, user)
- else if(istype(I, /obj/item/stack/rods))
- flamethrower_rods(I, user)
- else
- . = ..()
- update_icon()
-
-/obj/item/weldingtool/proc/explode()
- var/turf/T = get_turf(loc)
- var/plasmaAmount = reagents.get_reagent_amount("plasma")
- dyn_explosion(T, plasmaAmount/5)//20 plasma in a standard welder has a 4 power explosion. no breaches, but enough to kill/dismember holder
- qdel(src)
-
-/obj/item/weldingtool/attack(mob/living/carbon/human/H, mob/user)
- if(!istype(H))
- return ..()
-
- var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected))
-
- if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM)
- if(src.use_tool(H, user, 0, volume=50, amount=1))
- if(user == H)
- user.visible_message("[user] starts to fix some of the dents on [H]'s [affecting.name]. ",
- "You start fixing some of the dents on [H]'s [affecting.name]. ")
- if(!do_mob(user, H, 50))
- return
- item_heal_robotic(H, user, 15, 0)
- else
- return ..()
-
-
-/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity)
- if(!proximity)
- return
- if(!status && O.is_refillable())
- reagents.trans_to(O, reagents.total_volume)
- to_chat(user, "You empty [src]'s fuel tank into [O]. ")
- update_icon()
- if(isOn())
- use(1)
- var/turf/location = get_turf(user)
- location.hotspot_expose(700, 50, 1)
- if(get_fuel() <= 0)
- set_light(0)
-
- if(isliving(O))
- var/mob/living/L = O
- if(L.IgniteMob())
- message_admins("[key_name_admin(user)] set [key_name_admin(L)] on fire")
- log_game("[key_name(user)] set [key_name(L)] on fire")
-
-
-/obj/item/weldingtool/attack_self(mob/user)
- if(src.reagents.has_reagent("plasma"))
- message_admins("[key_name_admin(user)] activated a rigged welder.")
- explode()
- switched_on(user)
- if(welding)
- set_light(light_intensity)
-
- update_icon()
-
-
-// Returns the amount of fuel in the welder
-/obj/item/weldingtool/proc/get_fuel()
- return reagents.get_reagent_amount("welding_fuel")
-
-
-// Uses fuel from the welding tool.
-/obj/item/weldingtool/use(used = 0)
- if(!isOn() || !check_fuel())
- return FALSE
-
- if(used)
- burned_fuel_for = 0
- if(get_fuel() >= used)
- reagents.remove_reagent("welding_fuel", used)
- check_fuel()
- return TRUE
- else
- return FALSE
-
-
-//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
-/obj/item/weldingtool/proc/check_fuel(mob/user)
- if(get_fuel() <= 0 && welding)
- switched_on(user)
- update_icon()
- //mob icon update
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands(0)
-
- return 0
- return 1
-
-//Switches the welder on
-/obj/item/weldingtool/proc/switched_on(mob/user)
- if(!status)
- to_chat(user, "[src] can't be turned on while unsecured! ")
- return
- welding = !welding
- if(welding)
- if(get_fuel() >= 1)
- to_chat(user, "You switch [src] on. ")
- playsound(loc, acti_sound, 50, 1)
- force = 15
- damtype = "fire"
- hitsound = 'sound/items/welder.ogg'
- update_icon()
- START_PROCESSING(SSobj, src)
- else
- to_chat(user, "You need more fuel! ")
- switched_off(user)
- else
- to_chat(user, "You switch [src] off. ")
- playsound(loc, deac_sound, 50, 1)
- switched_off(user)
-
-//Switches the welder off
-/obj/item/weldingtool/proc/switched_off(mob/user)
- welding = 0
- set_light(0)
-
- force = 3
- damtype = "brute"
- hitsound = "swing_hit"
- update_icon()
-
-
-/obj/item/weldingtool/examine(mob/user)
- ..()
- to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].")
-
-/obj/item/weldingtool/is_hot()
- return welding * heat
-
-//Returns whether or not the welding tool is currently on.
-/obj/item/weldingtool/proc/isOn()
- return welding
-
-// When welding is about to start, run a normal tool_use_check, then flash a mob if it succeeds.
-/obj/item/weldingtool/tool_start_check(mob/living/user, amount=0)
- . = tool_use_check(user, amount)
- if(. && user)
- user.flash_act(light_intensity)
-
-// Flash the user during welding progress
-/obj/item/weldingtool/tool_check_callback(mob/living/user, amount, datum/callback/extra_checks)
- . = ..()
- if(. && user)
- if (progress_flash_divisor == 0)
- user.flash_act(min(light_intensity,1))
- progress_flash_divisor = initial(progress_flash_divisor)
- else
- progress_flash_divisor--
-
-// If welding tool ran out of fuel during a construction task, construction fails.
-/obj/item/weldingtool/tool_use_check(mob/living/user, amount)
- if(!isOn() || !check_fuel())
- to_chat(user, "[src] has to be on to complete this task! ")
- return FALSE
-
- if(get_fuel() >= amount)
- return TRUE
- else
- to_chat(user, "You need more welding fuel to complete this task! ")
- return FALSE
-
-
-/obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user)
- if(welding)
- to_chat(user, "Turn it off first! ")
- return
- status = !status
- if(status)
- to_chat(user, "You resecure [src] and close the fuel tank. ")
- container_type = NONE
- else
- to_chat(user, "[src] can now be attached, modified, and refuelled. ")
- container_type = OPENCONTAINER
- add_fingerprint(user)
-
-/obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user)
- if(!status)
- var/obj/item/stack/rods/R = I
- if (R.use(1))
- var/obj/item/flamethrower/F = new /obj/item/flamethrower(user.loc)
- if(!remove_item_from_storage(F))
- user.transferItemToLoc(src, F, TRUE)
- F.weldtool = src
- add_fingerprint(user)
- to_chat(user, "You add a rod to a welder, starting to build a flamethrower. ")
- user.put_in_hands(F)
- else
- to_chat(user, "You need one rod to start building a flamethrower! ")
-
-/obj/item/weldingtool/ignition_effect(atom/A, mob/user)
- if(use_tool(A, user, 0, amount=1))
- return "[user] casually lights [A] with [src], what a badass. "
- else
- return ""
-
-/obj/item/weldingtool/largetank
- name = "industrial welding tool"
- desc = "A slightly larger welder with a larger tank."
- icon_state = "indwelder"
- max_fuel = 40
- materials = list(MAT_GLASS=60)
-
-/obj/item/weldingtool/largetank/cyborg
- name = "integrated welding tool"
- desc = "An advanced welder designed to be used in robotic systems."
- toolspeed = 0.5
-
-/obj/item/weldingtool/largetank/flamethrower_screwdriver()
- return
-
-
-/obj/item/weldingtool/mini
- name = "emergency welding tool"
- desc = "A miniature welder used during emergencies."
- icon_state = "miniwelder"
- max_fuel = 10
- w_class = WEIGHT_CLASS_TINY
- materials = list(MAT_METAL=30, MAT_GLASS=10)
- change_icons = 0
-
-/obj/item/weldingtool/mini/flamethrower_screwdriver()
- return
-
-/obj/item/weldingtool/abductor
- name = "alien welding tool"
- desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "welder"
- toolspeed = 0.1
- light_intensity = 0
- change_icons = 0
-
-/obj/item/weldingtool/abductor/process()
- if(get_fuel() <= max_fuel)
- reagents.add_reagent("welding_fuel", 1)
- ..()
-
-/obj/item/weldingtool/hugetank
- name = "upgraded industrial welding tool"
- desc = "An upgraded welder based of the industrial welder."
- icon_state = "upindwelder"
- item_state = "upindwelder"
- max_fuel = 80
- materials = list(MAT_METAL=70, MAT_GLASS=120)
-
-/obj/item/weldingtool/experimental
- name = "experimental welding tool"
- desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes."
- icon_state = "exwelder"
- item_state = "exwelder"
- max_fuel = 40
- materials = list(MAT_METAL=70, MAT_GLASS=120)
- var/last_gen = 0
- change_icons = 0
- can_off_process = 1
- light_intensity = 1
- toolspeed = 0.5
- var/nextrefueltick = 0
-
-/obj/item/weldingtool/experimental/brass
- name = "brass welding tool"
- desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch."
- resistance_flags = FIRE_PROOF | ACID_PROOF
- icon_state = "brasswelder"
- item_state = "brasswelder"
-
-
-/obj/item/weldingtool/experimental/process()
- ..()
- if(get_fuel() < max_fuel && nextrefueltick < world.time)
- nextrefueltick = world.time + 10
- reagents.add_reagent("welding_fuel", 1)
-
-#undef WELDER_FUEL_BURN_INTERVAL
+#define WELDER_FUEL_BURN_INTERVAL 13
+/obj/item/weldingtool
+ name = "welding tool"
+ desc = "A standard edition welder provided by Nanotrasen."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "welder"
+ item_state = "welder"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
+ flags_1 = CONDUCT_1
+ slot_flags = ITEM_SLOT_BELT
+ force = 3
+ throwforce = 5
+ hitsound = "swing_hit"
+ usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg')
+ var/acti_sound = 'sound/items/welderactivate.ogg'
+ var/deac_sound = 'sound/items/welderdeactivate.ogg'
+ throw_speed = 3
+ throw_range = 5
+ w_class = WEIGHT_CLASS_SMALL
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
+ resistance_flags = FIRE_PROOF
+
+ materials = list(MAT_METAL=70, MAT_GLASS=30)
+ var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
+ var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
+ var/max_fuel = 20 //The max amount of fuel the welder can hold
+ var/change_icons = 1
+ var/can_off_process = 0
+ var/light_intensity = 2 //how powerful the emitted light is when used.
+ var/progress_flash_divisor = 10
+ var/burned_fuel_for = 0 //when fuel was last removed
+ heat = 3800
+ tool_behaviour = TOOL_WELDER
+ toolspeed = 1
+
+/obj/item/weldingtool/Initialize()
+ . = ..()
+ create_reagents(max_fuel)
+ reagents.add_reagent("welding_fuel", max_fuel)
+ update_icon()
+
+
+/obj/item/weldingtool/proc/update_torch()
+ if(welding)
+ add_overlay("[initial(icon_state)]-on")
+ item_state = "[initial(item_state)]1"
+ else
+ item_state = "[initial(item_state)]"
+
+
+/obj/item/weldingtool/update_icon()
+ cut_overlays()
+ if(change_icons)
+ var/ratio = get_fuel() / max_fuel
+ ratio = CEILING(ratio*4, 1) * 25
+ add_overlay("[initial(icon_state)][ratio]")
+ update_torch()
+ return
+
+
+/obj/item/weldingtool/process()
+ switch(welding)
+ if(0)
+ force = 3
+ damtype = "brute"
+ update_icon()
+ if(!can_off_process)
+ STOP_PROCESSING(SSobj, src)
+ return
+ //Welders left on now use up fuel, but lets not have them run out quite that fast
+ if(1)
+ force = 15
+ damtype = "fire"
+ ++burned_fuel_for
+ if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL)
+ use(1)
+ update_icon()
+
+ //This is to start fires. process() is only called if the welder is on.
+ open_flame()
+
+
+/obj/item/weldingtool/suicide_act(mob/user)
+ user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide! ")
+ return (FIRELOSS)
+
+
+/obj/item/weldingtool/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/screwdriver))
+ flamethrower_screwdriver(I, user)
+ else if(istype(I, /obj/item/stack/rods))
+ flamethrower_rods(I, user)
+ else
+ . = ..()
+ update_icon()
+
+/obj/item/weldingtool/proc/explode()
+ var/turf/T = get_turf(loc)
+ var/plasmaAmount = reagents.get_reagent_amount("plasma")
+ dyn_explosion(T, plasmaAmount/5)//20 plasma in a standard welder has a 4 power explosion. no breaches, but enough to kill/dismember holder
+ qdel(src)
+
+/obj/item/weldingtool/attack(mob/living/carbon/human/H, mob/user)
+ if(!istype(H))
+ return ..()
+
+ var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected))
+
+ if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM)
+ if(src.use_tool(H, user, 0, volume=50, amount=1))
+ if(user == H)
+ user.visible_message("[user] starts to fix some of the dents on [H]'s [affecting.name]. ",
+ "You start fixing some of the dents on [H]'s [affecting.name]. ")
+ if(!do_mob(user, H, 50))
+ return
+ item_heal_robotic(H, user, 15, 0)
+ else
+ return ..()
+
+
+/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity)
+ if(!proximity)
+ return
+ if(!status && O.is_refillable())
+ reagents.trans_to(O, reagents.total_volume)
+ to_chat(user, "You empty [src]'s fuel tank into [O]. ")
+ update_icon()
+ if(isOn())
+ use(1)
+ var/turf/location = get_turf(user)
+ location.hotspot_expose(700, 50, 1)
+ if(get_fuel() <= 0)
+ set_light(0)
+
+ if(isliving(O))
+ var/mob/living/L = O
+ if(L.IgniteMob())
+ message_admins("[key_name_admin(user)] set [key_name_admin(L)] on fire")
+ log_game("[key_name(user)] set [key_name(L)] on fire")
+
+
+/obj/item/weldingtool/attack_self(mob/user)
+ if(src.reagents.has_reagent("plasma"))
+ message_admins("[key_name_admin(user)] activated a rigged welder.")
+ explode()
+ switched_on(user)
+ if(welding)
+ set_light(light_intensity)
+
+ update_icon()
+
+
+// Returns the amount of fuel in the welder
+/obj/item/weldingtool/proc/get_fuel()
+ return reagents.get_reagent_amount("welding_fuel")
+
+
+// Uses fuel from the welding tool.
+/obj/item/weldingtool/use(used = 0)
+ if(!isOn() || !check_fuel())
+ return FALSE
+
+ if(used)
+ burned_fuel_for = 0
+ if(get_fuel() >= used)
+ reagents.remove_reagent("welding_fuel", used)
+ check_fuel()
+ return TRUE
+ else
+ return FALSE
+
+
+//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
+/obj/item/weldingtool/proc/check_fuel(mob/user)
+ if(get_fuel() <= 0 && welding)
+ switched_on(user)
+ update_icon()
+ //mob icon update
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_hands(0)
+
+ return 0
+ return 1
+
+//Switches the welder on
+/obj/item/weldingtool/proc/switched_on(mob/user)
+ if(!status)
+ to_chat(user, "[src] can't be turned on while unsecured! ")
+ return
+ welding = !welding
+ if(welding)
+ if(get_fuel() >= 1)
+ to_chat(user, "You switch [src] on. ")
+ playsound(loc, acti_sound, 50, 1)
+ force = 15
+ damtype = "fire"
+ hitsound = 'sound/items/welder.ogg'
+ update_icon()
+ START_PROCESSING(SSobj, src)
+ else
+ to_chat(user, "You need more fuel! ")
+ switched_off(user)
+ else
+ to_chat(user, "You switch [src] off. ")
+ playsound(loc, deac_sound, 50, 1)
+ switched_off(user)
+
+//Switches the welder off
+/obj/item/weldingtool/proc/switched_off(mob/user)
+ welding = 0
+ set_light(0)
+
+ force = 3
+ damtype = "brute"
+ hitsound = "swing_hit"
+ update_icon()
+
+
+/obj/item/weldingtool/examine(mob/user)
+ ..()
+ to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].")
+
+/obj/item/weldingtool/is_hot()
+ return welding * heat
+
+//Returns whether or not the welding tool is currently on.
+/obj/item/weldingtool/proc/isOn()
+ return welding
+
+// When welding is about to start, run a normal tool_use_check, then flash a mob if it succeeds.
+/obj/item/weldingtool/tool_start_check(mob/living/user, amount=0)
+ . = tool_use_check(user, amount)
+ if(. && user)
+ user.flash_act(light_intensity)
+
+// Flash the user during welding progress
+/obj/item/weldingtool/tool_check_callback(mob/living/user, amount, datum/callback/extra_checks)
+ . = ..()
+ if(. && user)
+ if (progress_flash_divisor == 0)
+ user.flash_act(min(light_intensity,1))
+ progress_flash_divisor = initial(progress_flash_divisor)
+ else
+ progress_flash_divisor--
+
+// If welding tool ran out of fuel during a construction task, construction fails.
+/obj/item/weldingtool/tool_use_check(mob/living/user, amount)
+ if(!isOn() || !check_fuel())
+ to_chat(user, "[src] has to be on to complete this task! ")
+ return FALSE
+
+ if(get_fuel() >= amount)
+ return TRUE
+ else
+ to_chat(user, "You need more welding fuel to complete this task! ")
+ return FALSE
+
+
+/obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user)
+ if(welding)
+ to_chat(user, "Turn it off first! ")
+ return
+ status = !status
+ if(status)
+ to_chat(user, "You resecure [src] and close the fuel tank. ")
+ container_type = NONE
+ else
+ to_chat(user, "[src] can now be attached, modified, and refuelled. ")
+ container_type = OPENCONTAINER
+ add_fingerprint(user)
+
+/obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user)
+ if(!status)
+ var/obj/item/stack/rods/R = I
+ if (R.use(1))
+ var/obj/item/flamethrower/F = new /obj/item/flamethrower(user.loc)
+ if(!remove_item_from_storage(F))
+ user.transferItemToLoc(src, F, TRUE)
+ F.weldtool = src
+ add_fingerprint(user)
+ to_chat(user, "You add a rod to a welder, starting to build a flamethrower. ")
+ user.put_in_hands(F)
+ else
+ to_chat(user, "You need one rod to start building a flamethrower! ")
+
+/obj/item/weldingtool/ignition_effect(atom/A, mob/user)
+ if(use_tool(A, user, 0, amount=1))
+ return "[user] casually lights [A] with [src], what a badass. "
+ else
+ return ""
+
+/obj/item/weldingtool/largetank
+ name = "industrial welding tool"
+ desc = "A slightly larger welder with a larger tank."
+ icon_state = "indwelder"
+ max_fuel = 40
+ materials = list(MAT_GLASS=60)
+
+/obj/item/weldingtool/largetank/cyborg
+ name = "integrated welding tool"
+ desc = "An advanced welder designed to be used in robotic systems."
+ toolspeed = 0.5
+
+/obj/item/weldingtool/largetank/flamethrower_screwdriver()
+ return
+
+
+/obj/item/weldingtool/mini
+ name = "emergency welding tool"
+ desc = "A miniature welder used during emergencies."
+ icon_state = "miniwelder"
+ max_fuel = 10
+ w_class = WEIGHT_CLASS_TINY
+ materials = list(MAT_METAL=30, MAT_GLASS=10)
+ change_icons = 0
+
+/obj/item/weldingtool/mini/flamethrower_screwdriver()
+ return
+
+/obj/item/weldingtool/abductor
+ name = "alien welding tool"
+ desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "welder"
+ toolspeed = 0.1
+ light_intensity = 0
+ change_icons = 0
+
+/obj/item/weldingtool/abductor/process()
+ if(get_fuel() <= max_fuel)
+ reagents.add_reagent("welding_fuel", 1)
+ ..()
+
+/obj/item/weldingtool/hugetank
+ name = "upgraded industrial welding tool"
+ desc = "An upgraded welder based of the industrial welder."
+ icon_state = "upindwelder"
+ item_state = "upindwelder"
+ max_fuel = 80
+ materials = list(MAT_METAL=70, MAT_GLASS=120)
+
+/obj/item/weldingtool/experimental
+ name = "experimental welding tool"
+ desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes."
+ icon_state = "exwelder"
+ item_state = "exwelder"
+ max_fuel = 40
+ materials = list(MAT_METAL=70, MAT_GLASS=120)
+ var/last_gen = 0
+ change_icons = 0
+ can_off_process = 1
+ light_intensity = 1
+ toolspeed = 0.5
+ var/nextrefueltick = 0
+
+/obj/item/weldingtool/experimental/brass
+ name = "brass welding tool"
+ desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch."
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ icon_state = "brasswelder"
+ item_state = "brasswelder"
+
+
+/obj/item/weldingtool/experimental/process()
+ ..()
+ if(get_fuel() < max_fuel && nextrefueltick < world.time)
+ nextrefueltick = world.time + 10
+ reagents.add_reagent("welding_fuel", 1)
+
+#undef WELDER_FUEL_BURN_INTERVAL
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index f189c26bb2..33c7be5dfd 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -7,7 +7,7 @@
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 6
throw_speed = 3
throw_range = 7
diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm
index 6e399c0909..9a9a3684c3 100644
--- a/code/game/objects/items/tools/wrench.dm
+++ b/code/game/objects/items/tools/wrench.dm
@@ -6,7 +6,7 @@
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 5
throwforce = 7
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 52e98e4a9e..a2fcba3701 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -143,7 +143,7 @@
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=10, MAT_GLASS=10)
attack_verb = list("struck", "pistol whipped", "hit", "bashed")
@@ -341,7 +341,7 @@
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT | SLOT_BACK
+ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
force = 5
throwforce = 5
w_class = WEIGHT_CLASS_NORMAL
@@ -840,7 +840,7 @@
name = "card"
desc = "a card"
icon = 'icons/obj/toy.dmi'
- icon_state = "singlecard_nanotrasen_down"
+ icon_state = "singlecard_down_nanotrasen"
w_class = WEIGHT_CLASS_TINY
var/cardname = null
var/flipped = 0
@@ -1064,7 +1064,7 @@
desc = "A stylish steampunk watch made out of thousands of tiny cogwheels."
icon = 'icons/obj/clockwork_objects.dmi'
icon_state = "dread_ipad"
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index fdbea343e3..9e94b0372c 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -41,7 +41,7 @@
else //something wrong
name = "[initial(name)]"
update_icon()
- if(user.get_item_by_slot(slot_back) == src)
+ if(user.get_item_by_slot(SLOT_BACK) == src)
user.update_inv_back()
else
user.update_inv_hands()
@@ -191,7 +191,7 @@
return
qdel(O)
return
- if(slot == slot_hands)
+ if(slot == SLOT_HANDS)
wield(user)
else
unwield(user)
@@ -224,7 +224,7 @@
force = 5
throwforce = 15
w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
force_unwielded = 5
force_wielded = 24
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
@@ -236,7 +236,7 @@
/obj/item/twohanded/fireaxe/Initialize()
. = ..()
- AddComponent(/datum/component/butchering, 100, 80, hitsound) //axes are not known for being precision butchering tools
+ AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools
/obj/item/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "fireaxe[wielded]"
@@ -458,7 +458,7 @@
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
force = 10
w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
force_unwielded = 10
force_wielded = 18
throwforce = 20
@@ -744,7 +744,7 @@
sharpness = IS_SHARP
attack_verb = list("cut", "sliced", "diced")
w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
hitsound = 'sound/weapons/bladeslice.ogg'
/obj/item/twohanded/vibro_weapon/Initialize()
@@ -791,7 +791,7 @@
desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology."
force = 11
w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
force_unwielded = 11
force_wielded = 20 //I have no idea how to balance
throwforce = 22
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 9fdae18149..fd6fca0a3f 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -3,7 +3,7 @@
name = "banhammer"
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "toyhammer"
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
throwforce = 0
force = 1
w_class = WEIGHT_CLASS_TINY
@@ -34,7 +34,7 @@
item_state = "sord"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 2
throwforce = 1
w_class = WEIGHT_CLASS_NORMAL
@@ -55,7 +55,7 @@
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
hitsound = 'sound/weapons/bladeslice.ogg'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT | SLOT_BACK
+ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
force = 40
throwforce = 10
w_class = WEIGHT_CLASS_NORMAL
@@ -206,7 +206,7 @@
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT | SLOT_BACK
+ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
force = 40
throwforce = 10
w_class = WEIGHT_CLASS_HUGE
@@ -577,7 +577,7 @@
/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag)
if(is_type_in_typecache(target, strong_against))
- new /obj/effect/decal/cleanable/deadcockroach(get_turf(target))
+ new /obj/effect/decal/cleanable/insectguts(target.drop_location())
to_chat(user, "You easily splat the [target]. ")
if(istype(target, /mob/living/))
var/mob/living/bug = target
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 1e76bc7160..2dadafe2cf 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -1,6 +1,9 @@
//the essential proc to call when an obj must receive damage of any kind.
/obj/proc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, armour_penetration = 0)
+ if(QDELETED(src))
+ stack_trace("[src] taking damage after deletion")
+ return
if(sound_effect)
play_attack_sound(damage_amount, damage_type, damage_flag)
if(!(resistance_flags & INDESTRUCTIBLE) && obj_integrity > 0)
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index 0a6dfaa1cf..ed797e4256 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -147,8 +147,7 @@
to_chat(user, "You remove the cables. ")
state = SCREWED_CORE
update_icon()
- var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc )
- A.amount = 5
+ new /obj/item/stack/cable_coil(drop_location(), 5)
return
if(istype(P, /obj/item/stack/sheet/rglass))
diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index b758b33355..ecfd0ba0c7 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -53,7 +53,7 @@
name = "resin"
desc = "Looks like some kind of thick resin."
icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi'
- icon_state = "resin"
+ icon_state = "smooth"
density = TRUE
opacity = 1
anchored = TRUE
@@ -77,7 +77,7 @@
name = "resin wall"
desc = "Thick resin solidified into a wall."
icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi'
- icon_state = "wall0" //same as resin, but consistency ho!
+ icon_state = "smooth" //same as resin, but consistency ho!
resintype = "wall"
canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane)
@@ -88,7 +88,7 @@
name = "resin membrane"
desc = "Resin just thin enough to let light pass through."
icon = 'icons/obj/smooth_structures/alien/resin_membrane.dmi'
- icon_state = "membrane0"
+ icon_state = "smooth"
opacity = 0
max_integrity = 160
resintype = "membrane"
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index cc447a19ad..85e498e9e4 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -10,7 +10,7 @@ LINEN BINS
icon = 'icons/obj/bedsheets.dmi'
icon_state = "sheetwhite"
item_state = "bedsheet"
- slot_flags = SLOT_NECK
+ slot_flags = ITEM_SLOT_NECK
layer = MOB_LAYER
throwforce = 0
throw_speed = 1
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 9f95e71e7f..2302a6b4d0 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -86,31 +86,31 @@
/obj/structure/closet/CanPass(atom/movable/mover, turf/target)
if(wall_mounted)
- return 1
+ return TRUE
return !density
/obj/structure/closet/proc/can_open(mob/living/user)
if(welded || locked)
- return 0
+ return FALSE
var/turf/T = get_turf(src)
for(var/mob/living/L in T)
if(L.anchored || horizontal && L.mob_size > MOB_SIZE_TINY && L.density)
if(user)
to_chat(user, "There's something large on top of [src], preventing it from opening. " )
- return 0
- return 1
+ return FALSE
+ return TRUE
/obj/structure/closet/proc/can_close(mob/living/user)
var/turf/T = get_turf(src)
for(var/obj/structure/closet/closet in T)
if(closet != src && !closet.wall_mounted)
- return 0
+ return FALSE
for(var/mob/living/L in T)
if(L.anchored || horizontal && L.mob_size > MOB_SIZE_TINY && L.density)
if(user)
to_chat(user, "There's something too large in [src], preventing it from closing. ")
- return 0
- return 1
+ return FALSE
+ return TRUE
/obj/structure/closet/proc/dump_contents()
var/atom/L = drop_location()
@@ -180,14 +180,14 @@
/obj/structure/closet/proc/close(mob/living/user)
if(!opened || !can_close(user))
- return 0
+ return FALSE
take_contents()
playsound(loc, close_sound, 15, 1, -3)
climb_time = initial(climb_time)
opened = FALSE
density = TRUE
update_icon()
- return 1
+ return TRUE
/obj/structure/closet/proc/toggle(mob/living/user)
if(opened)
@@ -310,7 +310,7 @@
message_cooldown = world.time + 50
to_chat(user, "[src]'s door won't budge! ")
return
- container_resist()
+ container_resist(user)
/obj/structure/closet/attack_hand(mob/user)
. = ..()
@@ -388,7 +388,7 @@
/obj/structure/closet/proc/bust_open()
welded = FALSE //applies to all lockers
locked = FALSE //applies to critter crates and secure lockers only
- broken = 1 //applies to secure lockers only
+ broken = TRUE //applies to secure lockers only
open()
/obj/structure/closet/AltClick(mob/user)
@@ -427,7 +427,7 @@
"You scramble [src]'s lock, breaking it open! ",
"You hear a faint electrical spark. ")
playsound(src, "sparks", 50, 1)
- broken = 1
+ broken = TRUE
locked = FALSE
update_icon()
@@ -470,16 +470,17 @@
/obj/structure/closet/proc/dive_into(mob/living/user)
var/turf/T1 = get_turf(user)
var/turf/T2 = get_turf(src)
- if(!open() && !opened)
- togglelock(user, TRUE)
- if(!open())
+ if(!opened)
+ if(locked)
+ togglelock(user, TRUE)
+ if(!open(user))
to_chat(user, "It won't budge! ")
return
step_towards(user, T2)
T1 = get_turf(user)
if(T1 == T2)
user.resting = TRUE //so people can jump into crates without slamming the lid on their head
- if(!close())
+ if(!close(user))
to_chat(user, "You can't get [src] to close! ")
user.resting = FALSE
return
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index eb7e7a3f93..90863441a2 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -148,6 +148,8 @@
new /obj/item/storage/backpack/duffelbag/sec(src)
for(var/i in 1 to 3)
new /obj/item/clothing/under/rank/security(src)
+ for(var/i in 1 to 2)
+ new /obj/item/clothing/under/rank/security/skirt(src)
for(var/i in 1 to 3)
new /obj/item/clothing/shoes/jackboots(src)
for(var/i in 1 to 3)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index 5de453beb0..6e5c425b2b 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -24,5 +24,4 @@
new /obj/item/assembly/flash/handheld(src)
new /obj/item/laser_pointer(src)
new /obj/item/door_remote/research_director(src)
- new /obj/item/storage/box/firingpins(src)
new /obj/item/circuitboard/machine/techfab/department/science(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/supplypod.dm b/code/game/objects/structures/crates_lockers/closets/secure/supplypod.dm
index 8a25e831f0..2fcf670101 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/supplypod.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/supplypod.dm
@@ -17,6 +17,7 @@
armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 90, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
anchored = TRUE
anchorable = FALSE
+ var/generated = FALSE
var/datum/supply_order/SupplyOrder
/obj/structure/closet/supplypod/bluespacepod
@@ -45,7 +46,9 @@
/obj/structure/closet/supplypod/open()
var/turf/T = get_turf(src)
opened = TRUE
- SupplyOrder.generate(T)//not called during populateContents as supplyorder generation requires a turf
+ if(!generated)
+ generated = TRUE
+ SupplyOrder.generate(T)//not called during populateContents as supplyorder generation requires a turf
update_icon()
playsound(src, open_sound, 15, 1, -3)
if(istype(src,/obj/structure/closet/supplypod/bluespacepod))
@@ -62,6 +65,7 @@
//------------------------------------FALLING SUPPLY POD-------------------------------------//
/obj/effect/temp_visual/DPfall
icon = 'icons/obj/2x2.dmi'
+ icon_state = "supplypod_falling"
pixel_x = -16
pixel_y = -5
pixel_z = 200
@@ -115,4 +119,4 @@
icon = 'icons/obj/module.dmi'
icon_state = "cargodisk"
item_state = "card-id"
- w_class = WEIGHT_CLASS_SMALL
\ No newline at end of file
+ w_class = WEIGHT_CLASS_SMALL
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index 2214869098..3edbde93b7 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -1,115 +1,115 @@
-/obj/structure/closet/syndicate
- name = "armory closet"
- desc = "Why is this here?"
- icon_state = "syndicate"
-
-/obj/structure/closet/syndicate/personal
- desc = "It's a personal storage unit for operative gear."
-
-/obj/structure/closet/syndicate/personal/PopulateContents()
- ..()
- new /obj/item/clothing/under/syndicate(src)
- new /obj/item/clothing/shoes/sneakers/black(src)
- new /obj/item/radio/headset/syndicate(src)
- new /obj/item/ammo_box/magazine/m10mm(src)
- new /obj/item/storage/belt/military(src)
- new /obj/item/crowbar/red(src)
- new /obj/item/clothing/glasses/night(src)
-
-/obj/structure/closet/syndicate/nuclear
- desc = "It's a storage unit for a Syndicate boarding party."
-
-/obj/structure/closet/syndicate/nuclear/PopulateContents()
- for(var/i in 1 to 5)
- new /obj/item/ammo_box/magazine/m10mm(src)
- new /obj/item/storage/box/flashbangs(src)
- new /obj/item/storage/box/teargas(src)
- new /obj/item/storage/backpack/duffelbag/syndie/med(src)
- new /obj/item/pda/syndicate(src)
-
-/obj/structure/closet/syndicate/resources
- desc = "An old, dusty locker."
-
-/obj/structure/closet/syndicate/resources/PopulateContents()
- ..()
- var/common_min = 30 //Minimum amount of minerals in the stack for common minerals
- var/common_max = 50 //Maximum amount of HONK in the stack for HONK common minerals
- var/rare_min = 5 //Minimum HONK of HONK in the stack HONK HONK rare minerals
- var/rare_max = 20 //Maximum HONK HONK HONK in the HONK for HONK rare HONK
-
-
- var/pickednum = rand(1, 50)
-
- //Sad trombone
- if(pickednum == 1)
- var/obj/item/paper/P = new /obj/item/paper(src)
- P.name = "\improper IOU"
- P.info = "Sorry man, we needed the money so we sold your stash. It's ok, we'll double our money for sure this time!"
-
- //Metal (common ore)
- if(pickednum >= 2)
- new /obj/item/stack/sheet/metal(src, rand(common_min, common_max))
-
- //Glass (common ore)
- if(pickednum >= 5)
- new /obj/item/stack/sheet/glass(src, rand(common_min, common_max))
-
- //Plasteel (common ore) Because it has a million more uses then plasma
- if(pickednum >= 10)
- new /obj/item/stack/sheet/plasteel(src, rand(common_min, common_max))
-
- //Plasma (rare ore)
- if(pickednum >= 15)
- new /obj/item/stack/sheet/mineral/plasma(src, rand(rare_min, rare_max))
-
- //Silver (rare ore)
- if(pickednum >= 20)
- new /obj/item/stack/sheet/mineral/silver(src, rand(rare_min, rare_max))
-
- //Gold (rare ore)
- if(pickednum >= 30)
- new /obj/item/stack/sheet/mineral/gold(src, rand(rare_min, rare_max))
-
- //Uranium (rare ore)
- if(pickednum >= 40)
- new /obj/item/stack/sheet/mineral/uranium(src, rand(rare_min, rare_max))
-
- //Titanium (rare ore)
- if(pickednum >= 40)
- new /obj/item/stack/sheet/mineral/titanium(src, rand(rare_min, rare_max))
-
- //Plastitanium (rare ore)
- if(pickednum >= 40)
- new /obj/item/stack/sheet/mineral/plastitanium(src, rand(rare_min, rare_max))
-
- //Diamond (rare HONK)
- if(pickednum >= 45)
- new /obj/item/stack/sheet/mineral/diamond(src, rand(rare_min, rare_max))
-
- //Jetpack (You hit the jackpot!)
- if(pickednum == 50)
- new /obj/item/tank/jetpack/carbondioxide(src)
-
-/obj/structure/closet/syndicate/resources/everything
- desc = "It's an emergency storage closet for repairs."
-
-/obj/structure/closet/syndicate/resources/everything/PopulateContents()
- var/list/resources = list(
- /obj/item/stack/sheet/metal,
- /obj/item/stack/sheet/glass,
- /obj/item/stack/sheet/mineral/gold,
- /obj/item/stack/sheet/mineral/silver,
- /obj/item/stack/sheet/mineral/plasma,
- /obj/item/stack/sheet/mineral/uranium,
- /obj/item/stack/sheet/mineral/diamond,
- /obj/item/stack/sheet/mineral/bananium,
- /obj/item/stack/sheet/plasteel,
- /obj/item/stack/sheet/mineral/titanium,
- /obj/item/stack/sheet/mineral/plastitanium,
- /obj/item/stack/rods
- )
-
- for(var/i = 0, i<2, i++)
- for(var/res in resources)
- var/obj/item/stack/R = new res(src)
- R.amount = R.max_amount
+/obj/structure/closet/syndicate
+ name = "armory closet"
+ desc = "Why is this here?"
+ icon_state = "syndicate"
+
+/obj/structure/closet/syndicate/personal
+ desc = "It's a personal storage unit for operative gear."
+
+/obj/structure/closet/syndicate/personal/PopulateContents()
+ ..()
+ new /obj/item/clothing/under/syndicate(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/radio/headset/syndicate(src)
+ new /obj/item/ammo_box/magazine/m10mm(src)
+ new /obj/item/storage/belt/military(src)
+ new /obj/item/crowbar/red(src)
+ new /obj/item/clothing/glasses/night(src)
+
+/obj/structure/closet/syndicate/nuclear
+ desc = "It's a storage unit for a Syndicate boarding party."
+
+/obj/structure/closet/syndicate/nuclear/PopulateContents()
+ for(var/i in 1 to 5)
+ new /obj/item/ammo_box/magazine/m10mm(src)
+ new /obj/item/storage/box/flashbangs(src)
+ new /obj/item/storage/box/teargas(src)
+ new /obj/item/storage/backpack/duffelbag/syndie/med(src)
+ new /obj/item/pda/syndicate(src)
+
+/obj/structure/closet/syndicate/resources
+ desc = "An old, dusty locker."
+
+/obj/structure/closet/syndicate/resources/PopulateContents()
+ ..()
+ var/common_min = 30 //Minimum amount of minerals in the stack for common minerals
+ var/common_max = 50 //Maximum amount of HONK in the stack for HONK common minerals
+ var/rare_min = 5 //Minimum HONK of HONK in the stack HONK HONK rare minerals
+ var/rare_max = 20 //Maximum HONK HONK HONK in the HONK for HONK rare HONK
+
+
+ var/pickednum = rand(1, 50)
+
+ //Sad trombone
+ if(pickednum == 1)
+ var/obj/item/paper/P = new /obj/item/paper(src)
+ P.name = "\improper IOU"
+ P.info = "Sorry man, we needed the money so we sold your stash. It's ok, we'll double our money for sure this time!"
+
+ //Metal (common ore)
+ if(pickednum >= 2)
+ new /obj/item/stack/sheet/metal(src, rand(common_min, common_max))
+
+ //Glass (common ore)
+ if(pickednum >= 5)
+ new /obj/item/stack/sheet/glass(src, rand(common_min, common_max))
+
+ //Plasteel (common ore) Because it has a million more uses then plasma
+ if(pickednum >= 10)
+ new /obj/item/stack/sheet/plasteel(src, rand(common_min, common_max))
+
+ //Plasma (rare ore)
+ if(pickednum >= 15)
+ new /obj/item/stack/sheet/mineral/plasma(src, rand(rare_min, rare_max))
+
+ //Silver (rare ore)
+ if(pickednum >= 20)
+ new /obj/item/stack/sheet/mineral/silver(src, rand(rare_min, rare_max))
+
+ //Gold (rare ore)
+ if(pickednum >= 30)
+ new /obj/item/stack/sheet/mineral/gold(src, rand(rare_min, rare_max))
+
+ //Uranium (rare ore)
+ if(pickednum >= 40)
+ new /obj/item/stack/sheet/mineral/uranium(src, rand(rare_min, rare_max))
+
+ //Titanium (rare ore)
+ if(pickednum >= 40)
+ new /obj/item/stack/sheet/mineral/titanium(src, rand(rare_min, rare_max))
+
+ //Plastitanium (rare ore)
+ if(pickednum >= 40)
+ new /obj/item/stack/sheet/mineral/plastitanium(src, rand(rare_min, rare_max))
+
+ //Diamond (rare HONK)
+ if(pickednum >= 45)
+ new /obj/item/stack/sheet/mineral/diamond(src, rand(rare_min, rare_max))
+
+ //Jetpack (You hit the jackpot!)
+ if(pickednum == 50)
+ new /obj/item/tank/jetpack/carbondioxide(src)
+
+/obj/structure/closet/syndicate/resources/everything
+ desc = "It's an emergency storage closet for repairs."
+
+/obj/structure/closet/syndicate/resources/everything/PopulateContents()
+ var/list/resources = list(
+ /obj/item/stack/sheet/metal,
+ /obj/item/stack/sheet/glass,
+ /obj/item/stack/sheet/mineral/gold,
+ /obj/item/stack/sheet/mineral/silver,
+ /obj/item/stack/sheet/mineral/plasma,
+ /obj/item/stack/sheet/mineral/uranium,
+ /obj/item/stack/sheet/mineral/diamond,
+ /obj/item/stack/sheet/mineral/bananium,
+ /obj/item/stack/sheet/plasteel,
+ /obj/item/stack/sheet/mineral/titanium,
+ /obj/item/stack/sheet/mineral/plastitanium,
+ /obj/item/stack/rods
+ )
+
+ for(var/i = 0, i<2, i++)
+ for(var/res in resources)
+ var/obj/item/stack/R = res
+ new res(src, initial(R.max_amount))
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 2889a10e1d..63d700d3ce 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -148,3 +148,32 @@
name = "science crate"
desc = "A science crate."
icon_state = "scicrate"
+
+/obj/structure/closet/crate/solarpanel_small
+ name = "budget solar panel crate"
+ icon_state = "engi_e_crate"
+
+/obj/structure/closet/crate/solarpanel_small/PopulateContents()
+ ..()
+ for(var/i in 1 to 13)
+ new /obj/item/solar_assembly(src)
+ new /obj/item/circuitboard/computer/solar_control(src)
+ new /obj/item/paper/guides/jobs/engi/solars(src)
+ new /obj/item/electronics/tracker(src)
+
+/obj/structure/closet/crate/goldcrate
+ name = "gold crate"
+
+/obj/structure/closet/crate/goldcrate/PopulateContents()
+ ..()
+ for(var/i in 1 to 3)
+ new /obj/item/stack/sheet/mineral/gold(src, 1, FALSE)
+ new /obj/item/storage/belt/champion(src)
+
+/obj/structure/closet/crate/silvercrate
+ name = "silver crate"
+
+/obj/structure/closet/crate/silvercrate/PopulateContents()
+ ..()
+ for(var/i in 1 to 5)
+ new /obj/item/coin/silver(src)
diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm
index 7098520ef5..6c8feae50b 100644
--- a/code/game/objects/structures/crates_lockers/crates/large.dm
+++ b/code/game/objects/structures/crates_lockers/crates/large.dm
@@ -1,15 +1,14 @@
/obj/structure/closet/crate/large
name = "large crate"
- desc = "A hefty wooden crate."
+ desc = "A hefty wooden crate. You'll need a crowbar to get it open."
icon_state = "largecrate"
density = TRUE
material_drop = /obj/item/stack/sheet/mineral/wood
+ material_drop_amount = 4
delivery_icon = "deliverybox"
+ integrity_failure = 0 //Makes the crate break when integrity reaches 0, instead of opening and becoming an invisible sprite.
/obj/structure/closet/crate/large/attack_hand(mob/user)
- . = ..()
- if(.)
- return
add_fingerprint(user)
if(manifest)
tear_manifest(user)
@@ -18,7 +17,6 @@
/obj/structure/closet/crate/large/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/crowbar))
- var/turf/T = get_turf(src)
if(manifest)
tear_manifest(user)
@@ -27,11 +25,19 @@
"You hear splitting wood. ")
playsound(src.loc, 'sound/weapons/slashmiss.ogg', 75, 1)
- for(var/i in 1 to rand(2, 5))
+ var/turf/T = get_turf(src)
+ for(var/i in 1 to material_drop_amount)
new material_drop(src)
for(var/atom/movable/AM in contents)
AM.forceMove(T)
qdel(src)
+
else
- return ..()
+ if(user.a_intent == INTENT_HARM) //Only return ..() if intent is harm, otherwise return 0 or just end it.
+ return ..() //Stops it from opening and turning invisible when items are used on it.
+
+ else
+ to_chat(user, "You need a crowbar to pry this open! ")
+ return FALSE //Just stop. Do nothing. Don't turn into an invisible sprite. Don't open like a locker.
+ //The large crate has no non-attack interactions other than the crowbar, anyway.
\ No newline at end of file
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index f1fbd1febd..5aa88cb0d9 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -263,12 +263,14 @@
/obj/structure/grille/hitby(AM as mob|obj)
if(isobj(AM))
if(prob(50) && anchored && !broken)
- var/turf/T = get_turf(src)
- var/obj/structure/cable/C = T.get_cable_node()
- if(C)
- playsound(src, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5)
- tesla_zap(src, 3, C.powernet.avail * 0.01) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot.
- C.powernet.load += C.powernet.avail * 0.0375 // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock.
+ var/obj/O = AM
+ if(O.throwforce != 0)//don't want to let people spam tesla bolts, this way it will break after time
+ var/turf/T = get_turf(src)
+ var/obj/structure/cable/C = T.get_cable_node()
+ if(C)
+ playsound(src, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5)
+ tesla_zap(src, 3, C.powernet.avail * 0.01) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot.
+ C.powernet.load += C.powernet.avail * 0.0375 // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock.
return ..()
/obj/structure/grille/get_dumping_location(datum/component/storage/source,mob/user)
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index c6273f3049..40435c2000 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -8,6 +8,7 @@
armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50)
max_integrity = 50
layer = LATTICE_LAYER //under pipes
+ plane = FLOOR_PLANE
var/number_of_rods = 1
canSmoothWith = list(/obj/structure/lattice,
/turf/open/floor,
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index 02df5ed3fb..2fc582229d 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -1,4 +1,5 @@
/turf/open
+ plane = FLOOR_PLANE
var/slowdown = 0 //negative for faster, positive for slower
var/mutable_appearance/wet_overlay
diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm
index 78fe2b1bde..a51989d230 100644
--- a/code/game/turfs/simulated/floor/reinf_floor.dm
+++ b/code/game/turfs/simulated/floor/reinf_floor.dm
@@ -117,9 +117,8 @@
/turf/open/floor/engine/cult
name = "engraved floor"
- desc = "The air hangs heavy over this sinister flooring."
+ desc = "The air smells strangely over this sinister flooring."
icon_state = "plating"
- CanAtmosPass = ATMOS_PASS_NO
floor_tile = null
var/obj/effect/clockwork/overlay/floor/bloodcult/realappearance
diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm
index 316391f8de..b6f862cab5 100644
--- a/code/game/turfs/simulated/lava.dm
+++ b/code/game/turfs/simulated/lava.dm
@@ -128,10 +128,10 @@
continue
if(iscarbon(L))
var/mob/living/carbon/C = L
- var/obj/item/clothing/S = C.get_item_by_slot(slot_wear_suit)
- var/obj/item/clothing/H = C.get_item_by_slot(slot_head)
+ var/obj/item/clothing/S = C.get_item_by_slot(SLOT_WEAR_SUIT)
+ var/obj/item/clothing/H = C.get_item_by_slot(SLOT_HEAD)
- if(S && H && S.flags_2 & LAVA_PROTECT_2 && H.flags_2 & LAVA_PROTECT_2)
+ if(S && H && S.clothing_flags & LAVAPROTECT && H.clothing_flags & LAVAPROTECT)
return
L.adjustFireLoss(20)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index c6d2f66900..dcfc1d41f6 100755
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -343,7 +343,7 @@
for(var/V in contents)
var/atom/A = V
- if(A.level >= affecting_level)
+ if(!QDELETED(A) && A.level >= affecting_level)
if(ismovableatom(A))
var/atom/movable/AM = A
if(!AM.ex_check(explosion_id))
diff --git a/code/game/world.dm b/code/game/world.dm
index cc4246a7c8..d121f7e411 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -17,6 +17,10 @@ GLOBAL_PROTECT(security_mode)
make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
+ TgsNew()
+
+ GLOB.revdata = new
+
config.Load()
//SetupLogs depends on the RoundID, so lets check
@@ -25,8 +29,6 @@ GLOBAL_PROTECT(security_mode)
SSdbcore.SetRoundID()
SetupLogs()
- SERVER_TOOLS_ON_NEW
-
load_admins()
LoadVerbs(/datum/verbs/menu)
if(CONFIG_GET(flag/usewhitelist))
@@ -93,6 +95,7 @@ GLOBAL_PROTECT(security_mode)
GLOB.sql_error_log = "[GLOB.log_directory]/sql.log"
GLOB.world_qdel_log = "[GLOB.log_directory]/qdel.log"
GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log"
+ GLOB.query_debug_log = "[GLOB.log_directory]/query_debug.log"
#ifdef UNIT_TESTS
GLOB.test_log = file("[GLOB.log_directory]/tests.log")
@@ -129,7 +132,7 @@ GLOBAL_PROTECT(security_mode)
warning("/tg/station 13 uses many file operations, a few shell()s, and some external call()s. Trusted mode is recommended. You can download our source code for your own browsing and compilation at https://github.com/tgstation/tgstation")
/world/Topic(T, addr, master, key)
- SERVER_TOOLS_ON_TOPIC //redirect to server tools if necessary
+ TGS_TOPIC //redirect to server tools if necessary
var/static/list/topic_handlers = TopicHandlers()
@@ -185,7 +188,7 @@ GLOBAL_PROTECT(security_mode)
qdel(src) //shut it down
/world/Reboot(reason = 0, fast_track = FALSE)
- SERVER_TOOLS_ON_REBOOT
+ TgsReboot()
if (reason || fast_track) //special reboot, do none of the normal stuff
if (usr)
log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
@@ -199,7 +202,7 @@ GLOBAL_PROTECT(security_mode)
FinishTestRun()
return
- if(SERVER_TOOLS_PRESENT)
+ if(TgsAvailable())
var/do_hard_reboot
// check the hard reboot counter
var/ruhr = CONFIG_GET(number/rounds_until_hard_restart)
@@ -218,7 +221,7 @@ GLOBAL_PROTECT(security_mode)
if(do_hard_reboot)
log_world("World hard rebooted at [time_stamp()]")
shutdown_logging() // See comment below.
- SERVER_TOOLS_REBOOT_BYOND
+ TgsEndProcess()
log_world("World rebooted at [time_stamp()]")
shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss.
diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm
index 49c7aeffb6..097076fc74 100644
--- a/code/modules/admin/IsBanned.dm
+++ b/code/modules/admin/IsBanned.dm
@@ -39,7 +39,7 @@
return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.")
if (CONFIG_GET(flag/panic_bunker) && SSdbcore.Connect())
log_access("Failed Login: [key] - Guests not allowed during panic bunker")
- return list("reason"="guest", "desc"="\nReason: You must first join the Discord to verify your account before joining this server. Please ping an admin once you've joined and read the rules. https://discord.gg/E6SQuhz")
+ return list("reason"="guest", "desc"="\nReason: You must first sign into your BYOND account or join the Discord to verify your account before joining this server. Please ping an admin once you've joined and read the rules. https://discord.gg/E6SQuhz")
//Population Cap Checking
var/extreme_popcap = CONFIG_GET(number/extreme_popcap)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 577cca303b..d63b36e6e7 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -434,7 +434,7 @@
return
var/list/options = list("Regular Restart", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)")
- if(SERVER_TOOLS_PRESENT)
+ if(world.TgsAvailable())
options += "Server Restart (Kill and restart DD)";
var/rebootconfirm
@@ -459,7 +459,7 @@
world.Reboot(fast_track = TRUE)
if("Server Restart (Kill and restart DD)")
to_chat(world, "Server restart - [init_by]")
- SERVER_TOOLS_REBOOT_BYOND
+ world.TgsEndProcess()
/datum/admins/proc/end_round()
set category = "Server"
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index eee3ff0edc..0f38f7750d 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -242,7 +242,6 @@ GLOBAL_PROTECT(protected_ranks)
var/skip
if(rank_names[admin_rank] == null)
message_admins("[admin_ckey] loaded with invalid admin rank [admin_rank].")
- log_sql("[admin_ckey] loaded with invalid admin rank [admin_rank].")
skip = 1
if(GLOB.admin_datums[admin_ckey] || GLOB.deadmins[admin_ckey])
skip = 1
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index b309c5bea6..77f48d18f4 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -93,6 +93,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/forceEvent,
/client/proc/admin_change_sec_level,
/client/proc/toggle_nuke,
+ /client/proc/run_weather,
/client/proc/mass_zombie_infection,
/client/proc/mass_zombie_cure,
/client/proc/polymorph_all,
diff --git a/code/modules/admin/chat_commands.dm b/code/modules/admin/chat_commands.dm
index 02402956d9..dbeb6fce7f 100644
--- a/code/modules/admin/chat_commands.dm
+++ b/code/modules/admin/chat_commands.dm
@@ -1,12 +1,12 @@
#define IRC_STATUS_THROTTLE 5
-/datum/server_tools_command/ircstatus
+/datum/tgs_chat_command/ircstatus
name = "status"
help_text = "Gets the admincount, playercount, gamemode, and true game mode of the server"
admin_only = TRUE
- var/static/last_irc_status = 0
+ var/last_irc_status = 0
-/datum/server_tools_command/ircstatus/Run(sender, params)
+/datum/tgs_chat_command/ircstatus/Run(datum/tgs_chat_user/sender, params)
var/rtod = REALTIMEOFDAY
if(rtod - last_irc_status < IRC_STATUS_THROTTLE)
return
@@ -17,12 +17,12 @@
status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode ? SSticker.mode.name : "Not started"]."
return status
-/datum/server_tools_command/irccheck
+/datum/tgs_chat_command/irccheck
name = "check"
help_text = "Gets the playercount, gamemode, and address of the server"
- var/static/last_irc_check = 0
+ var/last_irc_check = 0
-/datum/server_tools_command/irccheck/Run(sender, params)
+/datum/tgs_chat_command/irccheck/Run(datum/tgs_chat_user/sender, params)
var/rtod = REALTIMEOFDAY
if(rtod - last_irc_check < IRC_STATUS_THROTTLE)
return
@@ -30,14 +30,15 @@
var/server = CONFIG_GET(string/server)
return "[GLOB.round_id ? "Round #[GLOB.round_id]: " : ""][GLOB.clients.len] players on [SSmapping.config.map_name]; Round [SSticker.HasRoundStarted() ? (SSticker.IsRoundInProgress() ? "Active" : "Finishing") : "Starting"] -- [server ? server : "[world.internet_address]:[world.port]"]" //CIT CHANGE - obfuscates the current gamemode from players
-/datum/server_tools_command/ahelp
+/datum/tgs_chat_command/ahelp
name = "ahelp"
help_text = " |list>>"
- required_parameters = 2
admin_only = TRUE
-/datum/server_tools_command/ahelp/Run(sender, params)
+/datum/tgs_chat_command/ahelp/Run(datum/tgs_chat_user/sender, params)
var/list/all_params = splittext(params, " ")
+ if(all_params.len < 2)
+ return "Insufficient parameters"
var/target = all_params[1]
all_params.Cut(1, 2)
var/id = text2num(target)
@@ -47,52 +48,54 @@
target = AH.initiator_ckey
else
return "Ticket #[id] not found!"
- var/res = IrcPm(target, all_params.Join(" "), sender)
+ var/res = IrcPm(target, all_params.Join(" "), sender.friendly_name)
if(res != "Message Successful")
return res
-/datum/server_tools_command/namecheck
+/datum/tgs_chat_command/namecheck
name = "namecheck"
help_text = "Returns info on the specified target"
- required_parameters = 1
admin_only = TRUE
-/datum/server_tools_command/namecheck/Run(sender, params)
- log_admin("Chat Name Check: [sender] on [params]")
- message_admins("Name checking [params] from [sender]")
+/datum/tgs_chat_command/namecheck/Run(datum/tgs_chat_user/sender, params)
+ params = trim(params)
+ if(!params)
+ return "Insufficient parameters"
+ log_admin("Chat Name Check: [sender.friendly_name] on [params]")
+ message_admins("Name checking [params] from [sender.friendly_name]")
return keywords_lookup(params, 1)
-/datum/server_tools_command/adminwho
+/datum/tgs_chat_command/adminwho
name = "adminwho"
help_text = "Lists administrators currently on the server"
admin_only = TRUE
-/datum/server_tools_command/adminwho/Run(sender, params)
+/datum/tgs_chat_command/adminwho/Run(datum/tgs_chat_user/sender, params)
return ircadminwho()
GLOBAL_LIST(round_end_notifiees)
-/datum/server_tools_command/notify
+/datum/tgs_chat_command/notify
name = "notify"
help_text = "Pings the invoker when the round ends"
admin_only = TRUE
-/datum/server_tools_command/notify/Run(sender, params)
+/datum/tgs_chat_command/notify/Run(datum/tgs_chat_user/sender, params)
if(!SSticker.IsRoundInProgress() && SSticker.HasRoundStarted())
- return "[sender], the round has already ended!"
+ return "[sender.mention], the round has already ended!"
LAZYINITLIST(GLOB.round_end_notifiees)
GLOB.round_end_notifiees[sender] = TRUE
- return "I will notify [sender] when the round ends."
+ return "I will notify [sender.mention] when the round ends."
-/datum/server_tools_command/sdql
+/datum/tgs_chat_command/sdql
name = "sdql"
help_text = "Runs an SDQL query"
admin_only = TRUE
-/datum/server_tools_command/sdql/Run(sender, params)
+/datum/tgs_chat_command/sdql/Run(datum/tgs_chat_user/sender, params)
if(GLOB.AdminProcCaller)
return "Unable to run query, another admin proc call is in progress. Try again later."
- GLOB.AdminProcCaller = "CHAT_[sender]" //_ won't show up in ckeys so it'll never match with a real admin
+ GLOB.AdminProcCaller = "CHAT_[sender.friendly_name]" //_ won't show up in ckeys so it'll never match with a real admin
var/list/results = world.SDQL2_query(params, GLOB.AdminProcCaller, GLOB.AdminProcCaller)
GLOB.AdminProcCaller = null
if(!results)
@@ -100,13 +103,13 @@ GLOBAL_LIST(round_end_notifiees)
var/list/text_res = results.Copy(1, 3)
var/list/refs = results.len > 3 ? results.Copy(4) : null
. = "[text_res.Join("\n")][refs ? "\nRefs: [refs.Join(" ")]" : ""]"
-
-/datum/server_tools_command/reload_admins
+
+/datum/tgs_chat_command/reload_admins
name = "reload_admins"
help_text = "Forces the server to reload admins."
admin_only = TRUE
-/datum/server_tools_command/reload_admins/Run(sender, params)
+/datum/tgs_chat_command/reload_admins/Run(datum/tgs_chat_user/sender, params)
load_admins()
- log_admin("[sender] reloaded admins via chat command.")
+ log_admin("[sender.friendly_name] reloaded admins via chat command.")
return "Admins reloaded."
diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index b577a84a1d..73b8fa61f0 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -22,6 +22,17 @@
H.facial_hair_color = H.hair_color
H.eye_color = random_eye_color()
H.dna.blood_type = random_blood_type()
+
+ // Mutant randomizing, doesn't affect the mob appearance unless it's the specific mutant.
+ H.dna.features["mcolor"] = random_short_color()
+ H.dna.features["tail_lizard"] = pick(GLOB.tails_list_lizard)
+ H.dna.features["snout"] = pick(GLOB.snouts_list)
+ H.dna.features["horns"] = pick(GLOB.horns_list)
+ H.dna.features["frills"] = pick(GLOB.frills_list)
+ H.dna.features["spines"] = pick(GLOB.spines_list)
+ H.dna.features["body_markings"] = pick(GLOB.body_markings_list)
+ H.dna.features["moth_wings"] = pick(GLOB.moth_wings_list)
+
H.update_body()
H.update_hair()
H.update_body_parts()
\ No newline at end of file
diff --git a/code/modules/admin/create_poll.dm b/code/modules/admin/create_poll.dm
index b1cda46ece..90fd6c66c9 100644
--- a/code/modules/admin/create_poll.dm
+++ b/code/modules/admin/create_poll.dm
@@ -73,7 +73,7 @@
if(!option)
return
option = sanitizeSQL(option)
- var/default_percentage_calc
+ var/default_percentage_calc = 0
if(polltype != POLLTYPE_IRV)
switch(alert("Should this option be included by default when poll result percentages are generated?",,"Yes","No","Cancel"))
if("Yes")
diff --git a/code/modules/admin/permissionedit.dm b/code/modules/admin/permissionedit.dm
index 07d3fced54..44163c2a73 100644
--- a/code/modules/admin/permissionedit.dm
+++ b/code/modules/admin/permissionedit.dm
@@ -6,7 +6,7 @@
return
usr.client.holder.edit_admin_permissions()
-/datum/admins/proc/edit_admin_permissions()
+/datum/admins/proc/edit_admin_permissions(action, target, operation, page)
if(!check_rights(R_PERMISSIONS))
return
var/list/output = list("\[Permissions\] ")
@@ -205,7 +205,7 @@
var/datum/DBQuery/query_add_admin = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin")] (ckey, rank) VALUES ('[.]', 'NEW ADMIN')")
if(!query_add_admin.warn_execute())
return FALSE
- var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, adminckey, adminip, operation, log) VALUES ('[SQLtime()]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'add admin', 'New admin added: [.]')")
+ var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) VALUES ('[SQLtime()]', '[GLOB.round_id]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'add admin', '[.]', 'New admin added: [.]')")
if(!query_add_admin_log.warn_execute())
return FALSE
@@ -213,12 +213,13 @@
if(alert("Are you sure you want to remove [admin_ckey]?","Confirm Removal","Do it","Cancel") == "Do it")
GLOB.admin_datums -= admin_ckey
GLOB.deadmins -= admin_ckey
- D.disassociate()
+ if(D)
+ D.disassociate()
if(use_db)
var/datum/DBQuery/query_add_rank = SSdbcore.NewQuery("DELETE FROM [format_table_name("admin")] WHERE ckey = '[admin_ckey]'")
if(!query_add_rank.warn_execute())
return
- var/datum/DBQuery/query_add_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, adminckey, adminip, operation, log) VALUES ('[SQLtime()]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'remove admin', 'Admin removed: [admin_ckey]')")
+ var/datum/DBQuery/query_add_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) VALUES ('[SQLtime()]', '[GLOB.round_id]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'remove admin', '[admin_ckey]', 'Admin removed: [admin_ckey]')")
if(!query_add_rank_log.warn_execute())
return
message_admins("[key_name_admin(usr)] removed [admin_ckey] from the admins list [use_db ? "permanently" : "temporarily"]")
@@ -276,13 +277,13 @@
var/datum/DBQuery/query_add_rank = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_ranks")] (rank, flags, exclude_flags, can_edit_flags) VALUES ('[new_rank]', '0', '0', '0')")
if(!query_add_rank.warn_execute())
return
- var/datum/DBQuery/query_add_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, adminckey, adminip, operation, log) VALUES ('[SQLtime()]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'add rank', 'New rank added: [admin_ckey]')")
+ var/datum/DBQuery/query_add_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) VALUES ('[SQLtime()]', '[GLOB.round_id]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'add rank', '[new_rank]', 'New rank added: [new_rank]')")
if(!query_add_rank_log.warn_execute())
return
var/datum/DBQuery/query_change_rank = SSdbcore.NewQuery("UPDATE [format_table_name("admin")] SET rank = '[new_rank]' WHERE ckey = '[admin_ckey]'")
if(!query_change_rank.warn_execute())
return
- var/datum/DBQuery/query_change_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, adminckey, adminip, operation, log) VALUES ('[SQLtime()]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'change admin rank', 'Rank of [admin_ckey] changed from [old_rank] to [new_rank]')")
+ var/datum/DBQuery/query_change_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) VALUES ('[SQLtime()]', '[GLOB.round_id]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'change admin rank', '[admin_ckey]', 'Rank of [admin_ckey] changed from [old_rank] to [new_rank]')")
if(!query_change_rank_log.warn_execute())
return
if(D) //they were previously an admin
@@ -319,7 +320,7 @@
var/datum/DBQuery/query_change_rank_flags = SSdbcore.NewQuery("UPDATE [format_table_name("admin_ranks")] SET flags = '[new_flags]', exclude_flags = '[new_exclude_flags]', can_edit_flags = '[new_can_edit_flags]' WHERE rank = '[D.rank.name]'")
if(!query_change_rank_flags.warn_execute())
return
- var/datum/DBQuery/query_change_rank_flags_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, adminckey, adminip, operation, log) VALUES ('[SQLtime()]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'change rank flags', 'Permissions of [admin_ckey] changed from[rights2text(old_flags," ")][rights2text(old_exclude_flags," ", "-")][rights2text(old_can_edit_flags," ", "*")] to[rights2text(new_flags," ")][rights2text(new_exclude_flags," ", "-")][rights2text(new_can_edit_flags," ", "*")]')")
+ var/datum/DBQuery/query_change_rank_flags_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) VALUES ('[SQLtime()]', '[GLOB.round_id]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'change rank flags', '[D.rank.name]', 'Permissions of [D.rank.name] changed from[rights2text(old_flags," ")][rights2text(old_exclude_flags," ", "-")][rights2text(old_can_edit_flags," ", "*")] to[rights2text(new_flags," ")][rights2text(new_exclude_flags," ", "-")][rights2text(new_can_edit_flags," ", "*")]')")
if(!query_change_rank_flags_log.warn_execute())
return
for(var/datum/admin_rank/R in GLOB.admin_ranks)
@@ -354,6 +355,36 @@
message_admins("[key_name_admin(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_ckey] temporarily"]")
log_admin("[key_name(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_ckey] temporarily"]")
+/datum/admins/proc/remove_rank(admin_rank)
+ if(!admin_rank)
+ return
+ for(var/datum/admin_rank/R in GLOB.admin_ranks)
+ if(R.name == admin_rank && (!(R.rights & usr.client.holder.rank.can_edit_rights) == R.rights))
+ to_chat(usr, "You don't have edit rights to all the rights this rank has, rank deletion not permitted. ")
+ return
+ if(!CONFIG_GET(flag/admin_legacy_system) && CONFIG_GET(flag/protect_legacy_ranks) && (admin_rank in GLOB.protected_ranks))
+ to_chat(usr, "Deletion of protected ranks is not permitted, it must be removed from admin_ranks.txt. ")
+ return
+ if(CONFIG_GET(flag/load_legacy_ranks_only))
+ to_chat(usr, "Rank deletion not permitted while database rank loading is disabled. ")
+ return
+ admin_rank = sanitizeSQL(admin_rank)
+ var/datum/DBQuery/query_admins_with_rank = SSdbcore.NewQuery("SELECT 1 FROM [format_table_name("admin")] WHERE rank = '[admin_rank]'")
+ if(!query_admins_with_rank.warn_execute())
+ return
+ if(query_admins_with_rank.NextRow())
+ to_chat(usr, "Error: Rank deletion attempted while rank still used; Tell a coder, this shouldn't happen. ")
+ return
+ if(alert("Are you sure you want to remove [admin_rank]?","Confirm Removal","Do it","Cancel") == "Do it")
+ var/datum/DBQuery/query_add_rank = SSdbcore.NewQuery("DELETE FROM [format_table_name("admin_ranks")] WHERE rank = '[admin_rank]'")
+ if(!query_add_rank.warn_execute())
+ return
+ var/datum/DBQuery/query_add_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) VALUES ('[SQLtime()]', '[GLOB.round_id]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'remove rank', '[admin_rank]', 'Rank removed: [admin_rank]')")
+ if(!query_add_rank_log.warn_execute())
+ return
+ message_admins("[key_name_admin(usr)] removed rank [admin_rank] permanently")
+ log_admin("[key_name(usr)] removed rank [admin_rank] permanently")
+
/datum/admins/proc/sync_lastadminrank(admin_ckey, datum/admins/D)
var/sqlrank = sanitizeSQL(D.rank.name)
admin_ckey = sanitizeSQL(admin_ckey)
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index a8e92db53a..5138089a6c 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -430,7 +430,7 @@
var/obj/item/clothing/under/schoolgirl/I = new seifuku
var/olduniform = H.w_uniform
H.temporarilyRemoveItemFromInventory(H.w_uniform, TRUE, FALSE)
- H.equip_to_slot_or_del(I, slot_w_uniform)
+ H.equip_to_slot_or_del(I, SLOT_W_UNIFORM)
qdel(olduniform)
if(droptype == "Yes")
I.flags_1 |= NODROP_1
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 2fb35e9c45..c8b62bae9e 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -273,6 +273,21 @@
return
create_message("note", banckey, null, banreason, null, null, 0, 0)
+ else if(href_list["editrightsbrowser"])
+ edit_admin_permissions(0)
+
+ else if(href_list["editrightsbrowserlog"])
+ edit_admin_permissions(1, href_list["editrightstarget"], href_list["editrightsoperation"], href_list["editrightspage"])
+
+ if(href_list["editrightsbrowsermanage"])
+ if(href_list["editrightschange"])
+ change_admin_rank(href_list["editrightschange"], TRUE)
+ else if(href_list["editrightsremove"])
+ remove_admin(href_list["editrightsremove"], TRUE)
+ else if(href_list["editrightsremoverank"])
+ remove_rank(href_list["editrightsremoverank"])
+ edit_admin_permissions(2)
+
else if(href_list["editrights"])
edit_rights_topic(href_list)
@@ -1493,8 +1508,8 @@
if(ishuman(L))
var/mob/living/carbon/human/observer = L
- observer.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(observer), slot_w_uniform)
- observer.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(observer), slot_shoes)
+ observer.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(observer), SLOT_W_UNIFORM)
+ observer.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(observer), SLOT_SHOES)
L.Unconscious(100)
sleep(5)
L.forceMove(pick(GLOB.tdomeobserve))
@@ -2448,6 +2463,19 @@
usr.client.cmd_admin_mod_antag_rep(C, href_list["modantagrep"])
show_player_panel(M)
+ else if(href_list["slowquery"])
+ if(!check_rights(R_ADMIN))
+ return
+ var/answer = href_list["slowquery"]
+ if(answer == "yes")
+ log_query_debug("[usr.key] | Reported a server hang")
+ if(alert(usr, "Had you just press any admin buttons?", "Query server hang report", "Yes", "No") == "Yes")
+ var/response = input(usr,"What were you just doing?","Query server hang report") as null|text
+ if(response)
+ log_query_debug("[usr.key] | [response]")
+ else if(answer == "no")
+ log_query_debug("[usr.key] | Reported no server hang")
+
/datum/admins/proc/HandleCMode()
if(!check_rights(R_ADMIN))
return
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 2a6b4448d2..f385cdc1bd 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -594,7 +594,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
/proc/send2irc(msg,msg2)
msg = replacetext(replacetext(msg, "\proper", ""), "\improper", "")
msg2 = replacetext(replacetext(msg2, "\proper", ""), "\improper", "")
- SERVER_TOOLS_RELAY_BROADCAST("[msg] | [msg2]")
+ world.TgsTargetedChatBroadcast("[msg] | [msg2]", TRUE)
/proc/send2otherserver(source,msg,type = "Ahelp")
var/comms_key = CONFIG_GET(string/comms_key)
diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm
index 1e96cc507e..0136efc3b3 100644
--- a/code/modules/admin/verbs/adminjump.dm
+++ b/code/modules/admin/verbs/adminjump.dm
@@ -95,7 +95,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/Getmob(mob/M in GLOB.mob_list)
+/client/proc/Getmob(mob/M in GLOB.mob_list - GLOB.dummy_mob_list)
set category = "Admin"
set name = "Get Mob"
set desc = "Mob to teleport"
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index 54614cf8ef..2fc616d588 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -27,7 +27,7 @@
if(isnewplayer(M))
continue
if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
- M.show_message(rendered, 2)
+ to_chat(M, rendered)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 7d4d5fa05e..28fb4a485d 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -110,10 +110,14 @@ GLOBAL_PROTECT(LastAdminCalledProc)
GLOBAL_LIST_EMPTY(AdminProcCallSpamPrevention)
GLOBAL_PROTECT(AdminProcCallSpamPrevention)
-/proc/WrapAdminProcCall(target, procname, list/arguments)
+/proc/WrapAdminProcCall(datum/target, procname, list/arguments)
if(target && procname == "Del")
to_chat(usr, "Calling Del() is not allowed")
return
+
+ if(!target.CanProcCall(procname))
+ to_chat(usr, "Proccall on [target.type]/proc/[procname] is disallowed!")
+ return
var/current_caller = GLOB.AdminProcCaller
var/ckey = usr ? usr.client.ckey : GLOB.AdminProcCaller
if(!ckey)
@@ -137,7 +141,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
GLOB.AdminProcCaller = null
//adv proc call this, ya nerds
-/world/proc/WrapAdminProcCall(target, procname, list/arguments)
+/world/proc/WrapAdminProcCall(datum/target, procname, list/arguments)
if(target == GLOBAL_PROC)
return call(procname)(arglist(arguments))
else if(target != world)
@@ -476,7 +480,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
id.forceMove(W)
W.update_icon()
else
- H.equip_to_slot(id,slot_wear_id)
+ H.equip_to_slot(id,SLOT_WEAR_ID)
else
alert("Invalid mob")
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 83d4f64748..be0b9d04bb 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -1043,6 +1043,30 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
for(var/obj/machinery/shuttle_manipulator/M in GLOB.machines)
M.ui_interact(usr)
+/client/proc/run_weather()
+ set category = "Fun"
+ set name = "Run Weather"
+ set desc = "Triggers a weather on the z-level you choose."
+
+ if(!holder)
+ return
+
+ var/weather_type = input("Choose a weather", "Weather") as null|anything in subtypesof(/datum/weather)
+ if(!weather_type)
+ return
+
+ var/z_level = input("Z-Level to target? Leave blank to target current Z-Level.", "Z-Level") as num|null
+ if(!isnum(z_level))
+ if(!src.mob)
+ return
+ z_level = src.mob.z
+
+ SSweather.run_weather(weather_type, z_level)
+
+ message_admins("[key_name_admin(usr)] started weather of type [weather_type] on the z-level [z_level].")
+ log_admin("[key_name(usr)] started weather of type [weather_type] on the z-level [z_level].")
+ SSblackbox.record_feedback("tally", "admin_verb", 1, "Run Weather")
+
/client/proc/mass_zombie_infection()
set category = "Fun"
set name = "Mass Zombie Infection"
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index d14c749992..9ad695aa8b 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -53,7 +53,7 @@
A.UpdateButtonIcon()
/obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user)
- if(slot == slot_wear_suit) //we only give the mob the ability to activate the vest if he's actually wearing it.
+ if(slot == SLOT_WEAR_SUIT) //we only give the mob the ability to activate the vest if he's actually wearing it.
return 1
/obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry)
@@ -338,7 +338,7 @@
if(QDELETED(G))
return
- if(istype(C.get_item_by_slot(slot_head), /obj/item/clothing/head/foilhat))
+ if(istype(C.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat))
to_chat(user, "Your target seems to have some sort of protective headgear on, blocking the message from being sent! ")
return
@@ -425,7 +425,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
item_state = "wonderprod"
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 7
w_class = WEIGHT_CLASS_NORMAL
actions_types = list(/datum/action/item_action/toggle_mode)
@@ -515,7 +515,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
/obj/item/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user)
if(L.incapacitated(TRUE, TRUE))
- if(istype(L.get_item_by_slot(slot_head), /obj/item/clothing/head/foilhat))
+ if(istype(L.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat))
to_chat(user, "The specimen's protective headgear is interfering with the sleep inducement! ")
L.visible_message("[user] tried to induced sleep in [L] with [src], but their headgear protected them! ", \
"You feel a strange wave of heavy drowsiness wash over you, but your headgear deflects most of it! ")
@@ -527,7 +527,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
L.Sleeping(1200)
add_logs(user, L, "put to sleep")
else
- if(istype(L.get_item_by_slot(slot_head), /obj/item/clothing/head/foilhat))
+ if(istype(L.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat))
to_chat(user, "The specimen's protective headgear is completely blocking our sleep inducement methods! ")
L.visible_message("[user] tried to induce sleep in [L] with [src], but their headgear completely protected them! ", \
"Any sense of drowsiness is quickly diminished as your headgear deflects the effects! ")
diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm
index c551509cc7..1e53f778d6 100644
--- a/code/modules/antagonists/abductor/equipment/gland.dm
+++ b/code/modules/antagonists/abductor/equipment/gland.dm
@@ -122,7 +122,7 @@
owner.grant_language(/datum/language/slime)
/obj/item/organ/heart/gland/slime/activate()
- to_chat(owner, "You feel nauseous! ")
+ to_chat(owner, "You feel nauseated! ")
owner.vomit(20)
var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey")
@@ -153,7 +153,7 @@
H.confused += 15
H.adjustBrainLoss(10, 160)
if(3)
- H.hallucination += 80
+ H.hallucination += 60
/obj/item/organ/heart/gland/pop
cooldown_low = 900
@@ -272,10 +272,10 @@
/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0)
..()
- owner.add_trait(TRAIT_SHOCKIMMUNE, "abductor_gland")
+ owner.add_trait(TRAIT_SHOCKIMMUNE, ORGAN_TRAIT)
/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0)
- owner.remove_trait(TRAIT_SHOCKIMMUNE, "abductor_gland")
+ owner.remove_trait(TRAIT_SHOCKIMMUNE, ORGAN_TRAIT)
..()
/obj/item/organ/heart/gland/electric/activate()
diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm
index 08776318c8..e629a0b47d 100644
--- a/code/modules/antagonists/abductor/machinery/console.dm
+++ b/code/modules/antagonists/abductor/machinery/console.dm
@@ -167,7 +167,7 @@
c.console = src
/obj/machinery/abductor/console/proc/AddSnapshot(mob/living/carbon/human/target)
- if(istype(target.get_item_by_slot(slot_head), /obj/item/clothing/head/foilhat))
+ if(istype(target.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat))
say("Subject wearing specialized protective headgear, unable to get a proper scan!")
return
var/datum/icon_snapshot/entry = new
diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm
index 8c6d7f52bd..a42ae6ef4f 100644
--- a/code/modules/antagonists/changeling/changeling.dm
+++ b/code/modules/antagonists/changeling/changeling.dm
@@ -353,7 +353,10 @@
if(GLOB.changeling_team_objective_type)
var/datum/objective/changeling_team_objective/team_objective = new GLOB.changeling_team_objective_type
team_objective.owner = owner
- objectives += team_objective
+ if(team_objective.prepare())//Setting up succeeded
+ objectives += team_objective
+ else
+ qdel(team_objective)
return
/datum/antagonist/changeling/proc/forge_objectives()
diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm
index 92c8a3c069..6ae73336d4 100644
--- a/code/modules/antagonists/changeling/changeling_power.dm
+++ b/code/modules/antagonists/changeling/changeling_power.dm
@@ -72,10 +72,10 @@
//used in /mob/Stat()
/obj/effect/proc_holder/changeling/proc/can_be_used_by(mob/user)
- if(!user || QDELETED(user))
- return 0
+ if(QDELETED(user))
+ return FALSE
if(!ishuman(user) && !ismonkey(user))
- return 0
+ return FALSE
if(req_human && !ishuman(user))
- return 0
- return 1
+ return FALSE
+ return TRUE
diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm
index dbb0e3a88a..1e8eaed383 100644
--- a/code/modules/antagonists/changeling/powers/biodegrade.dm
+++ b/code/modules/antagonists/changeling/powers/biodegrade.dm
@@ -13,7 +13,7 @@
return 0
if(user.handcuffed)
- var/obj/O = user.get_item_by_slot(slot_handcuffed)
+ var/obj/O = user.get_item_by_slot(SLOT_HANDCUFFED)
if(!istype(O))
return 0
user.visible_message("[user] vomits a glob of acid on [user.p_their()] [O]! ", \
@@ -23,7 +23,7 @@
used = TRUE
if(user.wear_suit && user.wear_suit.breakouttime && !used)
- var/obj/item/clothing/suit/S = user.get_item_by_slot(slot_wear_suit)
+ var/obj/item/clothing/suit/S = user.get_item_by_slot(SLOT_WEAR_SUIT)
if(!istype(S))
return 0
user.visible_message("[user] vomits a glob of acid across the front of [user.p_their()] [S]! ", \
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index fc98d3182d..72826d086f 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -119,8 +119,8 @@
user.dropItemToGround(user.head)
user.dropItemToGround(user.wear_suit)
- user.equip_to_slot_if_possible(new suit_type(user), slot_wear_suit, 1, 1, 1)
- user.equip_to_slot_if_possible(new helmet_type(user), slot_head, 1, 1, 1)
+ user.equip_to_slot_if_possible(new suit_type(user), SLOT_WEAR_SUIT, 1, 1, 1)
+ user.equip_to_slot_if_possible(new helmet_type(user), SLOT_HEAD, 1, 1, 1)
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
changeling.chem_recharge_slowdown += recharge_slowdown
@@ -445,7 +445,8 @@
name = "flesh mass"
icon_state = "lingspacesuit"
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
- flags_1 = STOPSPRESSUREDMAGE_1 | NODROP_1 | DROPDEL_1 //Not THICKMATERIAL_1 because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff)
+ flags_1 = NODROP_1 | DROPDEL_1
+ clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) //No armor at all.
@@ -464,7 +465,8 @@
name = "flesh mass"
icon_state = "lingspacehelmet"
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
- flags_1 = STOPSPRESSUREDMAGE_1 | NODROP_1 | DROPDEL_1 //Again, no THICKMATERIAL_1.
+ flags_1 = NODROP_1 | DROPDEL_1
+ clothing_flags = STOPSPRESSUREDAMAGE
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
diff --git a/code/modules/antagonists/changeling/powers/revive.dm b/code/modules/antagonists/changeling/powers/revive.dm
index 4fb28b4904..d9c1ca7221 100644
--- a/code/modules/antagonists/changeling/powers/revive.dm
+++ b/code/modules/antagonists/changeling/powers/revive.dm
@@ -29,8 +29,12 @@
return TRUE
/obj/effect/proc_holder/changeling/revive/can_be_used_by(mob/living/user)
+ . = ..()
+ if(!.)
+ return
+
if(user.has_trait(CHANGELING_DRAIN) || ((user.stat != DEAD) && !(user.has_trait(TRAIT_FAKEDEATH))))
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
changeling.purchasedpowers -= src
- return 0
- . = ..()
+ return FALSE
+
diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm
index 10b86ac1ad..6e15334305 100644
--- a/code/modules/antagonists/changeling/powers/tiny_prick.dm
+++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm
@@ -214,19 +214,19 @@
/obj/effect/proc_holder/changeling/sting/LSD
name = "Hallucination Sting"
desc = "Causes terror in the target."
- helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung, and the effect occurs after 30 to 60 seconds."
+ helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung, and the effect begins after a few seconds."
sting_icon = "sting_lsd"
chemical_cost = 10
dna_cost = 1
/obj/effect/proc_holder/changeling/sting/LSD/sting_action(mob/user, mob/living/carbon/target)
add_logs(user, target, "stung", "LSD sting")
- addtimer(CALLBACK(src, .proc/hallucination_time, target), rand(300,600))
+ addtimer(CALLBACK(src, .proc/hallucination_time, target), rand(100,200))
return TRUE
/obj/effect/proc_holder/changeling/sting/LSD/proc/hallucination_time(mob/living/carbon/target)
if(target)
- target.hallucination = max(400, target.hallucination)
+ target.hallucination = max(90, target.hallucination)
/obj/effect/proc_holder/changeling/sting/cryo
name = "Cryogenic Sting"
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm
index 77bfbf4f3b..63de6b8f72 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm
@@ -21,23 +21,23 @@
/obj/item/clothing/head/helmet/clockwork/ratvar_act()
if(GLOB.ratvar_awakens)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
- flags_1 |= STOPSPRESSUREDMAGE_1
+ clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else if(GLOB.ratvar_approaches)
armor = list("melee" = 70, "bullet" = 80, "laser" = -15, "energy" = 25, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
- flags_1 |= STOPSPRESSUREDMAGE_1
+ clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else
armor = list("melee" = 60, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
- flags_1 &= ~STOPSPRESSUREDMAGE_1
+ clothing_flags &= ~STOPSPRESSUREDAMAGE
max_heat_protection_temperature = initial(max_heat_protection_temperature)
min_cold_protection_temperature = initial(min_cold_protection_temperature)
/obj/item/clothing/head/helmet/clockwork/equipped(mob/living/user, slot)
..()
- if(slot == slot_head && !is_servant_of_ratvar(user))
+ if(slot == SLOT_HEAD && !is_servant_of_ratvar(user))
if(!iscultist(user))
to_chat(user, "\"Now now, this is for my servants, not you.\" ")
user.visible_message("As [user] puts [src] on, it flickers off their head! ", "The helmet flickers off your head, leaving only nausea! ")
@@ -82,17 +82,17 @@
/obj/item/clothing/suit/armor/clockwork/ratvar_act()
if(GLOB.ratvar_awakens)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
- flags_1 |= STOPSPRESSUREDMAGE_1
+ clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else if(GLOB.ratvar_approaches)
armor = list("melee" = 70, "bullet" = 80, "laser" = -15, "energy" = 25, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
- flags_1 |= STOPSPRESSUREDMAGE_1
+ clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else
armor = list("melee" = 60, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
- flags_1 &= ~STOPSPRESSUREDMAGE_1
+ clothing_flags &= ~STOPSPRESSUREDAMAGE
max_heat_protection_temperature = initial(max_heat_protection_temperature)
min_cold_protection_temperature = initial(min_cold_protection_temperature)
@@ -103,7 +103,7 @@
/obj/item/clothing/suit/armor/clockwork/equipped(mob/living/user, slot)
..()
- if(slot == slot_wear_suit && !is_servant_of_ratvar(user))
+ if(slot == SLOT_WEAR_SUIT && !is_servant_of_ratvar(user))
if(!iscultist(user))
to_chat(user, "\"Now now, this is for my servants, not you.\" ")
user.visible_message("As [user] puts [src] on, it flickers off their body! ", "The curiass flickers off your body, leaving only nausea! ")
@@ -148,12 +148,12 @@
/obj/item/clothing/gloves/clockwork/ratvar_act()
if(GLOB.ratvar_awakens)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
- flags_1 |= STOPSPRESSUREDMAGE_1
+ clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else
armor = list("melee" = 80, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
- flags_1 &= ~STOPSPRESSUREDMAGE_1
+ clothing_flags &= ~STOPSPRESSUREDAMAGE
max_heat_protection_temperature = initial(max_heat_protection_temperature)
min_cold_protection_temperature = initial(min_cold_protection_temperature)
@@ -164,7 +164,7 @@
/obj/item/clothing/gloves/clockwork/equipped(mob/living/user, slot)
..()
- if(slot == slot_gloves && !is_servant_of_ratvar(user))
+ if(slot == SLOT_GLOVES && !is_servant_of_ratvar(user))
if(!iscultist(user))
to_chat(user, "\"Now now, this is for my servants, not you.\" ")
user.visible_message("As [user] puts [src] on, it flickers off their arms! ", "The gauntlets flicker off your arms, leaving only nausea! ")
@@ -203,9 +203,9 @@
/obj/item/clothing/shoes/clockwork/ratvar_act()
if(GLOB.ratvar_awakens)
- flags_1 |= NOSLIP_1
+ clothing_flags |= NOSLIP
else
- flags_1 &= ~NOSLIP_1
+ clothing_flags &= ~NOSLIP
/obj/item/clothing/shoes/clockwork/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
if(equipper && !is_servant_of_ratvar(equipper))
@@ -214,7 +214,7 @@
/obj/item/clothing/shoes/clockwork/equipped(mob/living/user, slot)
..()
- if(slot == slot_shoes && !is_servant_of_ratvar(user))
+ if(slot == SLOT_SHOES && !is_servant_of_ratvar(user))
if(!iscultist(user))
to_chat(user, "\"Now now, this is for my servants, not you.\" ")
user.visible_message("As [user] puts [src] on, it flickers off their feet! ", "The treads flicker off your feet, leaving only nausea! ")
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
index 5f5bc1b58a..c464656150 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
@@ -9,7 +9,7 @@
righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
var/inhand_overlay //If applicable, this overlay will be applied to the slab's inhand
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
var/busy //If the slab is currently being used by something
diff --git a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm
index ca5fe74f2e..3f3bb58598 100644
--- a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm
+++ b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm
@@ -115,4 +115,4 @@
S.no_cost = TRUE
if(seasonal_hat && seasonal_hat != "none")
var/obj/item/hat = new seasonal_hat(construct)
- construct.equip_to_slot_or_del(hat, slot_head)
+ construct.equip_to_slot_or_del(hat, SLOT_HEAD)
diff --git a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm
index a16a52d7aa..f54d88fc49 100644
--- a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm
+++ b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm
@@ -28,13 +28,13 @@
return ..()
/obj/item/clothing/glasses/judicial_visor/item_action_slot_check(slot, mob/user)
- if(slot != slot_glasses)
+ if(slot != SLOT_GLASSES)
return 0
return ..()
/obj/item/clothing/glasses/judicial_visor/equipped(mob/living/user, slot)
..()
- if(slot != slot_glasses)
+ if(slot != SLOT_GLASSES)
update_status(FALSE)
if(blaster.ranged_ability_user)
blaster.remove_ranged_ability()
@@ -55,13 +55,13 @@
addtimer(CALLBACK(src, .proc/check_on_mob, user), 1) //dropped is called before the item is out of the slot, so we need to check slightly later
/obj/item/clothing/glasses/judicial_visor/proc/check_on_mob(mob/user)
- if(user && src != user.get_item_by_slot(slot_glasses)) //if we happen to check and we AREN'T in the slot, we need to remove our shit from whoever we got dropped from
+ if(user && src != user.get_item_by_slot(SLOT_GLASSES)) //if we happen to check and we AREN'T in the slot, we need to remove our shit from whoever we got dropped from
update_status(FALSE)
if(blaster.ranged_ability_user)
blaster.remove_ranged_ability()
/obj/item/clothing/glasses/judicial_visor/attack_self(mob/user)
- if(is_servant_of_ratvar(user) && src == user.get_item_by_slot(slot_glasses))
+ if(is_servant_of_ratvar(user) && src == user.get_item_by_slot(SLOT_GLASSES))
blaster.toggle(user)
/obj/item/clothing/glasses/judicial_visor/proc/update_status(change_to)
@@ -89,7 +89,7 @@
if(!src)
return 0
recharging = FALSE
- if(user && src == user.get_item_by_slot(slot_glasses))
+ if(user && src == user.get_item_by_slot(SLOT_GLASSES))
to_chat(user, "Your [name] hums. It is ready. ")
else
active = FALSE
@@ -115,7 +115,7 @@
/obj/effect/proc_holder/judicial_visor/InterceptClickOn(mob/living/caller, params, atom/target)
if(..())
return
- if(ranged_ability_user.incapacitated() || !visor || visor != ranged_ability_user.get_item_by_slot(slot_glasses))
+ if(ranged_ability_user.incapacitated() || !visor || visor != ranged_ability_user.get_item_by_slot(SLOT_GLASSES))
remove_ranged_ability()
return
@@ -151,6 +151,7 @@
desc = "You get the feeling that you shouldn't be standing here."
clockwork_desc = "A sigil that will soon erupt and smite any unenlightened nearby."
icon = 'icons/effects/96x96.dmi'
+ icon_state = ""
pixel_x = -32
pixel_y = -32
layer = BELOW_MOB_LAYER
diff --git a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm
index c1bf94842d..dab12dc304 100644
--- a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm
+++ b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm
@@ -74,7 +74,7 @@
/obj/item/clothing/glasses/wraith_spectacles/equipped(mob/living/user, slot)
..()
- if(slot != slot_glasses || up)
+ if(slot != SLOT_GLASSES || up)
return
if(user.has_trait(TRAIT_BLIND))
to_chat(user, "\"You're blind, idiot. Stop embarrassing yourself.\" " )
diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm
index 9a78c64942..4e1a5b42cb 100644
--- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm
+++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm
@@ -160,18 +160,18 @@
/datum/action/innate/clockwork_armaments/Activate()
var/do_message = 0
- var/obj/item/I = owner.get_item_by_slot(slot_wear_suit)
+ var/obj/item/I = owner.get_item_by_slot(SLOT_WEAR_SUIT)
if(remove_item_if_better(I, owner))
- do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/suit/armor/clockwork(null), slot_wear_suit)
- I = owner.get_item_by_slot(slot_head)
+ do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/suit/armor/clockwork(null), SLOT_WEAR_SUIT)
+ I = owner.get_item_by_slot(SLOT_HEAD)
if(remove_item_if_better(I, owner))
- do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork(null), slot_head)
- I = owner.get_item_by_slot(slot_gloves)
+ do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork(null), SLOT_HEAD)
+ I = owner.get_item_by_slot(SLOT_GLOVES)
if(remove_item_if_better(I, owner))
- do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/gloves/clockwork(null), slot_gloves)
- I = owner.get_item_by_slot(slot_shoes)
+ do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/gloves/clockwork(null), SLOT_GLOVES)
+ I = owner.get_item_by_slot(SLOT_SHOES)
if(remove_item_if_better(I, owner))
- do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/shoes/clockwork(null), slot_shoes)
+ do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/shoes/clockwork(null), SLOT_SHOES)
if(do_message)
owner.visible_message("Strange armor appears on [owner]! ", "A bright shimmer runs down your body, equipping you with Ratvarian armor. ")
playsound(owner, 'sound/magic/clockwork/fellowship_armory.ogg', 15 * do_message, TRUE) //get sound loudness based on how much we equipped
diff --git a/code/modules/antagonists/clockcult/clockcult.dm b/code/modules/antagonists/clockcult/clockcult.dm
index f921b6b527..f2c0518cc2 100644
--- a/code/modules/antagonists/clockcult/clockcult.dm
+++ b/code/modules/antagonists/clockcult/clockcult.dm
@@ -159,7 +159,7 @@
SSticker.mode.servants_of_ratvar -= owner
SSticker.mode.update_servant_icons_removed(owner)
if(!silent)
- owner.current.visible_message("[owner] seems to have remembered their true allegiance! ", null, null, null, owner.current)
+ owner.current.visible_message("[owner.current] seems to have remembered [owner.current.p_their()] true allegiance! ", null, null, null, owner.current)
to_chat(owner, "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant. ")
owner.current.log_message("Has renounced the cult of Ratvar! ", INDIVIDUAL_ATTACK_LOG)
owner.special_role = null
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index bb2ce1db2a..f12beef82f 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -260,7 +260,7 @@
if(!ishuman(target) || iscultist(target))
return
var/mob/living/carbon/human/H = target
- H.hallucination = max(H.hallucination, 240)
+ H.hallucination = max(H.hallucination, 120)
SEND_SOUND(ranged_ability_user, sound('sound/effects/ghost.ogg',0,1,50))
var/image/C = image('icons/effects/cult_effects.dmi',H,"bloodsparkles", ABOVE_MOB_LAYER)
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", C, FALSE)
@@ -605,11 +605,11 @@
uses--
var/mob/living/carbon/C = target
C.visible_message("Otherworldly armor suddenly appears on [C]! ")
- C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,slot_w_uniform)
- C.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head)
- C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
- C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes)
- C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), slot_back)
+ C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,SLOT_W_UNIFORM)
+ C.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), SLOT_HEAD)
+ C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), SLOT_WEAR_SUIT)
+ C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), SLOT_SHOES)
+ C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), SLOT_BACK)
if(C == user)
qdel(src) //Clears the hands
C.put_in_hands(new /obj/item/melee/cultblade(user))
diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm
index b7f0b002ec..99941501e3 100644
--- a/code/modules/antagonists/cult/cult.dm
+++ b/code/modules/antagonists/cult/cult.dm
@@ -81,9 +81,9 @@
/datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
var/list/slots = list(
- "backpack" = slot_in_backpack,
- "left pocket" = slot_l_store,
- "right pocket" = slot_r_store
+ "backpack" = SLOT_IN_BACKPACK,
+ "left pocket" = SLOT_L_STORE,
+ "right pocket" = SLOT_R_STORE
)
var/T = new item_path(mob)
@@ -128,7 +128,7 @@
SSticker.mode.cult -= owner
SSticker.mode.update_cult_icons_removed(owner)
if(!silent)
- owner.current.visible_message("[owner.current] looks like [owner.current.p_they()] just reverted to their old faith! ", null, null, null, owner.current)
+ owner.current.visible_message("[owner.current] looks like [owner.current.p_theyve()] just reverted to [owner.current.p_their()] old faith! ", null, null, null, owner.current)
to_chat(owner.current, "An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant. ")
owner.current.log_message("Has renounced the cult of Nar'Sie! ", INDIVIDUAL_ATTACK_LOG)
if(cult_team.blood_target && cult_team.blood_target_image && owner.current.client)
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index a1c16aa078..4de5219d7d 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -33,10 +33,8 @@
desc = "A sword humming with unholy energy. It glows with a dim red light."
icon_state = "cultblade"
item_state = "cultblade"
- lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
- inhand_x_dimension = 64
- inhand_y_dimension = 64
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
flags_1 = CONDUCT_1
sharpness = IS_SHARP
w_class = WEIGHT_CLASS_BULKY
@@ -73,8 +71,6 @@
if(!iscultist(user))
if(!is_servant_of_ratvar(user))
to_chat(user, "\"I wouldn't advise that.\" ")
- to_chat(user, "An overwhelming sense of nausea overpowers you! ")
- user.Dizzy(120)
else
to_chat(user, "\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\" ")
to_chat(user, "A horrible force yanks at your arm! ")
@@ -138,10 +134,7 @@
if(!iscultist(user))
if(!is_servant_of_ratvar(user))
to_chat(user, "\"I wouldn't advise that.\" ")
- to_chat(user, "An overwhelming sense of nausea overpowers you! ")
- user.Dizzy(80)
- user.dropItemToGround(src, TRUE)
- user.Knockdown(30)
+ force = 5
return
else
to_chat(user, "\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\" ")
@@ -151,6 +144,7 @@
user.dropItemToGround(src, TRUE)
user.Knockdown(50)
return
+ force = initial(force)
jaunt.Grant(user, src)
linked_action.Grant(user, src)
user.update_icons()
diff --git a/code/modules/antagonists/cult/ritual.dm b/code/modules/antagonists/cult/ritual.dm
index dd129708a8..ba2ea53ef2 100644
--- a/code/modules/antagonists/cult/ritual.dm
+++ b/code/modules/antagonists/cult/ritual.dm
@@ -144,7 +144,8 @@ This file contains the cult dagger and rune list code
if(locate(/obj/effect/rune) in T)
to_chat(user, "There is already a rune here. ")
return FALSE
- if(!is_station_level(T.z) && !is_mining_level(T.z))
+ var/area/A = get_area(T)
+ if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !A.blob_allowed))
to_chat(user, "The veil is not weak enough here. ")
return FALSE
return TRUE
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index 4307f65a28..a1241d5998 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -708,6 +708,11 @@ structure_check() searches for nearby cultist structures required for the invoca
fail_invoke()
log_game("Summon Cultist rune failed - target died")
return
+ if(cultist_to_summon.pulledby || cultist_to_summon.buckled)
+ to_chat(user, "[cultist_to_summon] is being held in place! ")
+ fail_invoke()
+ log_game("Summon Cultist rune failed - target restrained")
+ return
if(!iscultist(cultist_to_summon))
to_chat(user, "[cultist_to_summon] is not a follower of the Geometer! ")
fail_invoke()
@@ -1056,7 +1061,7 @@ structure_check() searches for nearby cultist structures required for the invoca
/proc/hudFix(mob/living/carbon/human/target)
if(!target || !target.client)
return
- var/obj/O = target.get_item_by_slot(slot_glasses)
+ var/obj/O = target.get_item_by_slot(SLOT_GLASSES)
if(istype(O, /obj/item/clothing/glasses/hud/security))
var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_SECURITY_ADVANCED]
AH.add_hud_to(target)
diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm
index 55a33820f0..3852eb6de1 100644
--- a/code/modules/antagonists/devil/devil.dm
+++ b/code/modules/antagonists/devil/devil.dm
@@ -456,10 +456,10 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
return -1
currentMob.change_mob_type( /mob/living/carbon/human, targetturf, null, 1)
var/mob/living/carbon/human/H = owner.current
- H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), slot_hands)
- H.equip_to_slot_or_del(new /obj/item/pen(H), slot_l_store)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), SLOT_W_UNIFORM)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), SLOT_SHOES)
+ H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), SLOT_HANDS)
+ H.equip_to_slot_or_del(new /obj/item/pen(H), SLOT_L_STORE)
if(SOULVALUE >= BLOOD_THRESHOLD)
H.set_species(/datum/species/lizard, 1)
H.underwear = "Nude"
diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm
index 84faf34387..c55f177b7a 100644
--- a/code/modules/antagonists/highlander/highlander.dm
+++ b/code/modules/antagonists/highlander/highlander.dm
@@ -46,11 +46,11 @@
qdel(I)
for(var/obj/item/I in H.held_items)
qdel(I)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/kilt/highlander(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/radio/headset/heads/captain(H), slot_ears)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/pinpointer/nuke(H), slot_l_store)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/kilt/highlander(H), SLOT_W_UNIFORM)
+ H.equip_to_slot_or_del(new /obj/item/radio/headset/heads/captain(H), SLOT_EARS)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(H), SLOT_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), SLOT_SHOES)
+ H.equip_to_slot_or_del(new /obj/item/pinpointer/nuke(H), SLOT_L_STORE)
for(var/obj/item/pinpointer/nuke/P in H)
P.attack_self(H)
var/obj/item/card/id/W = new(H)
@@ -61,7 +61,7 @@
W.registered_name = H.real_name
W.flags_1 |= NODROP_1
W.update_label(H.real_name)
- H.equip_to_slot_or_del(W, slot_wear_id)
+ H.equip_to_slot_or_del(W, SLOT_WEAR_ID)
sword = new(H)
if(!GLOB.highlander)
diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm
index 8146ab7fbe..6572584eab 100644
--- a/code/modules/antagonists/morph/morph.dm
+++ b/code/modules/antagonists/morph/morph.dm
@@ -27,12 +27,14 @@
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
vision_range = 1 // Only attack when target is close
- wander = 0
+ wander = FALSE
attacktext = "glomps"
attack_sound = 'sound/effects/blobattack.ogg'
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2)
var/morphed = FALSE
+ var/melee_damage_disguised = 0
+ var/eat_while_disguised = FALSE
var/atom/movable/form = null
var/morph_time = 0
var/static/list/blacklist_typecache = typecacheof(list(
@@ -75,11 +77,14 @@
return !is_type_in_typecache(A, blacklist_typecache) && (isobj(A) || ismob(A))
/mob/living/simple_animal/hostile/morph/proc/eat(atom/movable/A)
+ if(morphed && !eat_while_disguised)
+ to_chat(src, "You can not eat anything while you are disguised! ")
+ return FALSE
if(A && A.loc != src)
visible_message("[src] swallows [A] whole! ")
A.forceMove(src)
- return 1
- return 0
+ return TRUE
+ return FALSE
/mob/living/simple_animal/hostile/morph/ShiftClickOn(atom/movable/A)
if(morph_time <= world.time && !stat)
@@ -109,8 +114,8 @@
pixel_x = initial(pixel_x)
//Morphed is weaker
- melee_damage_lower = 5
- melee_damage_upper = 5
+ melee_damage_lower = melee_damage_disguised
+ melee_damage_upper = melee_damage_disguised
speed = 0
morph_time = world.time + MORPH_COOLDOWN
@@ -181,10 +186,13 @@
/mob/living/simple_animal/hostile/morph/can_track(mob/living/user)
if(morphed)
- return 0
+ return FALSE
return ..()
/mob/living/simple_animal/hostile/morph/AttackingTarget()
+ if(morphed && !melee_damage_disguised)
+ to_chat(src, "You can not attack while disguised! ")
+ return
if(isliving(target)) //Eat Corpses to regen health
var/mob/living/L = target
if(L.stat == DEAD)
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index 0e588c4380..a9c6a112bd 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -501,16 +501,37 @@ This is here to make the tiles around the station mininuke change when it's arme
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/fake = FALSE
+ var/turf/lastlocation
+ var/last_disk_move
/obj/item/disk/nuclear/Initialize()
. = ..()
if(!fake)
GLOB.poi_list |= src
+ last_disk_move = world.time
+ START_PROCESSING(SSobj, src)
/obj/item/disk/nuclear/ComponentInitialize()
. = ..()
AddComponent(/datum/component/stationloving, !fake)
+/obj/item/disk/nuclear/process()
+ if(fake)
+ STOP_PROCESSING(SSobj, src)
+ CRASH("A fake nuke disk tried to call process(). Who the fuck and how the fuck")
+ var/turf/newturf = get_turf(src)
+ if(newturf && lastlocation == newturf)
+ if(last_disk_move < world.time - 5000 && prob((world.time - 5000 - last_disk_move)*0.00001))
+ var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control
+ if(istype(loneop))
+ loneop.weight += 1
+ else
+ lastlocation = newturf
+ last_disk_move = world.time
+ var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control
+ if(istype(loneop) && prob(loneop.weight))
+ loneop.weight = max(loneop.weight - 1, 0)
+
/obj/item/disk/nuclear/examine(mob/user)
. = ..()
if(!fake)
diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm
index 648f62c4a5..df7d21e46b 100644
--- a/code/modules/antagonists/nukeop/nukeop.dm
+++ b/code/modules/antagonists/nukeop/nukeop.dm
@@ -218,7 +218,7 @@
else //Already set by admins/something else?
nuke_team.memorized_code = nuke.r_code
else
- stack_trace("Station self destruct ot found during lone op team creation.")
+ stack_trace("Station self destruct not found during lone op team creation.")
nuke_team.memorized_code = null
/datum/antagonist/nukeop/reinforcement
diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm
index 34d30603d6..03150c0254 100644
--- a/code/modules/antagonists/revenant/revenant.dm
+++ b/code/modules/antagonists/revenant/revenant.dm
@@ -90,7 +90,7 @@
to_chat(src, "You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable. ")
to_chat(src, "To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities. ")
to_chat(src, "You do not remember anything of your past lives, nor will you remember anything about this one after your death. ")
- to_chat(src, "Be sure to read the wiki page at https://tgstation13.org/wiki/Revenant to learn more. ")
+ to_chat(src, "Be sure to read the wiki page to learn more. ")
if(!generated_objectives_and_spells)
generated_objectives_and_spells = TRUE
mind.assigned_role = ROLE_REVENANT
diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm
index e3a068eed4..95ea189dde 100644
--- a/code/modules/antagonists/revenant/revenant_abilities.dm
+++ b/code/modules/antagonists/revenant/revenant_abilities.dm
@@ -290,7 +290,7 @@
unlock_amount = 200
action_icon_state = "malfunction"
-//A note to future coders: do not replace this with an EMP because it will wreck malf AIs and gang dominators and everyone will hate you.
+//A note to future coders: do not replace this with an EMP because it will wreck malf AIs and everyone will hate you.
/obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
if(attempt_cast(user))
for(var/turf/T in targets)
@@ -312,7 +312,7 @@
new /obj/effect/temp_visual/revenant(human.loc)
human.emp_act(EMP_HEAVY)
for(var/obj/thing in T)
- if(istype(thing, /obj/machinery/dominator) || istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes)) //Doesn't work on dominators, SMES and APCs, to prevent kekkery
+ if(istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes)) //Doesn't work on SMES and APCs, to prevent kekkery
continue
if(prob(20))
if(prob(50))
diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm
index 1f77866d76..51acdae894 100644
--- a/code/modules/antagonists/revolution/revolution.dm
+++ b/code/modules/antagonists/revolution/revolution.dm
@@ -201,12 +201,13 @@
/datum/antagonist/rev/farewell()
if(ishuman(owner.current))
- owner.current.visible_message("[owner.current] looks like they just remembered their real allegiance! ", null, null, null, owner.current)
+ owner.current.visible_message("[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance! ", null, null, null, owner.current)
to_chat(owner, "You are no longer a brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you... ")
else if(issilicon(owner.current))
owner.current.visible_message("The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it. ", null, null, null, owner.current)
to_chat(owner, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you. ")
+//blunt trauma deconversions call this through species.dm spec_attacked_by()
/datum/antagonist/rev/proc/remove_revolutionary(borged, deconverter)
log_attack("[owner.current] (Key: [key_name(owner.current)]) has been deconverted from the revolution by [deconverter] (Key: [key_name(deconverter)])!")
if(borged)
@@ -234,9 +235,9 @@
if(give_flash)
var/obj/item/assembly/flash/T = new(H)
var/list/slots = list (
- "backpack" = slot_in_backpack,
- "left pocket" = slot_l_store,
- "right pocket" = slot_r_store
+ "backpack" = SLOT_IN_BACKPACK,
+ "left pocket" = SLOT_L_STORE,
+ "right pocket" = SLOT_R_STORE
)
var/where = H.equip_in_one_of_slots(T, slots)
if (!where)
diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm
index 9457e3a8c8..aea9a1862a 100644
--- a/code/modules/antagonists/slaughter/slaughter.dm
+++ b/code/modules/antagonists/slaughter/slaughter.dm
@@ -66,7 +66,7 @@
name = "pile of viscera"
desc = "A repulsive pile of guts and gore."
gender = NEUTER
- random_icon_states = list("innards")
+ icon_state = "innards"
/mob/living/simple_animal/slaughter/phasein()
. = ..()
diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm
index 8a87191c0d..3ea2e1d739 100644
--- a/code/modules/antagonists/swarmer/swarmer.dm
+++ b/code/modules/antagonists/swarmer/swarmer.dm
@@ -302,10 +302,6 @@
to_chat(S, "This device's destruction would result in the extermination of everything in the area. Aborting. ")
return FALSE
-/obj/machinery/dominator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "This device is attempting to corrupt our entire network; attempting to interact with it is too risky. Aborting. ")
- return FALSE
-
/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Searching... sensor malfunction! Target lost. Aborting. ")
return FALSE
@@ -497,10 +493,10 @@
D.pixel_z = target.pixel_z
if(do_mob(src, target, 100))
to_chat(src, "Dismantling complete. ")
- var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc)
- M.amount = 5
+ var/atom/Tsec = target.drop_location()
+ new /obj/item/stack/sheet/metal(Tsec, 5)
for(var/obj/item/I in target.component_parts)
- I.forceMove(M.drop_location())
+ I.forceMove(Tsec)
var/obj/effect/temp_visual/swarmer/disintegration/N = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
N.pixel_x = target.pixel_x
N.pixel_y = target.pixel_y
@@ -509,7 +505,7 @@
if(istype(target, /obj/machinery/computer))
var/obj/machinery/computer/C = target
if(C.circuit)
- C.circuit.forceMove(M.drop_location())
+ C.circuit.forceMove(Tsec)
qdel(target)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index e09b92a083..f3ea4ef2ea 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -296,9 +296,9 @@
folder = new/obj/item/folder/syndicate/blue(mob.loc)
var/list/slots = list (
- "backpack" = slot_in_backpack,
- "left pocket" = slot_l_store,
- "right pocket" = slot_r_store
+ "backpack" = SLOT_IN_BACKPACK,
+ "left pocket" = SLOT_L_STORE,
+ "right pocket" = SLOT_R_STORE
)
var/where = "At your feet"
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index e0db2e5905..fc933a44cf 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -204,12 +204,12 @@
H.dropItemToGround(I)
var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionaire)
- H.equip_to_slot_or_del(new hat(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/roman(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), slot_shoes)
+ H.equip_to_slot_or_del(new hat(H), SLOT_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/roman(H), SLOT_W_UNIFORM)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), SLOT_SHOES)
H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE)
H.put_in_hands(new /obj/item/claymore(H), TRUE)
- H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), SLOT_BACK)
/obj/item/voodoo
diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm
index c0a328b3ae..1c63f4a570 100644
--- a/code/modules/antagonists/wizard/equipment/soulstone.dm
+++ b/code/modules/antagonists/wizard/equipment/soulstone.dm
@@ -8,7 +8,7 @@
layer = HIGH_OBJ_LAYER
desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefact's power."
w_class = WEIGHT_CLASS_TINY
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
var/usability = 0
var/old_shard = FALSE
@@ -33,7 +33,6 @@
..()
if(!iscultist(user) && !iswizard(user) && !usability)
to_chat(user, "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly. ")
- user.Dizzy(120)
/obj/item/soulstone/examine(mob/user)
..()
@@ -223,7 +222,7 @@
if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker && SSticker.mode)
SSticker.mode.add_cultist(newstruct.mind, 0)
if(iscultist(stoner) || cultoverride)
- to_chat(newstruct, "You are still bound to serve the cult[stoner ? " and [stoner]":""], follow their orders and help them complete their goals at all costs. ")
+ to_chat(newstruct, "You are still bound to serve the cult[stoner ? " and [stoner]":""], follow [stoner ? stoner.p_their() : "their"] orders and help [stoner ? stoner.p_them() : "them"] complete [stoner ? stoner.p_their() : "their"] goals at all costs. ")
else if(stoner)
to_chat(newstruct, "You are still bound to serve your creator, [stoner], follow their orders and help them complete their goals at all costs. ")
newstruct.clear_alert("bloodsense")
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index 146d79d413..819e51a77a 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -238,17 +238,17 @@
if(!istype(master_mob) || !istype(H))
return
if(master_mob.ears)
- H.equip_to_slot_or_del(new master_mob.ears.type, slot_ears)
+ H.equip_to_slot_or_del(new master_mob.ears.type, SLOT_EARS)
if(master_mob.w_uniform)
- H.equip_to_slot_or_del(new master_mob.w_uniform.type, slot_w_uniform)
+ H.equip_to_slot_or_del(new master_mob.w_uniform.type, SLOT_W_UNIFORM)
if(master_mob.shoes)
- H.equip_to_slot_or_del(new master_mob.shoes.type, slot_shoes)
+ H.equip_to_slot_or_del(new master_mob.shoes.type, SLOT_SHOES)
if(master_mob.wear_suit)
- H.equip_to_slot_or_del(new master_mob.wear_suit.type, slot_wear_suit)
+ H.equip_to_slot_or_del(new master_mob.wear_suit.type, SLOT_WEAR_SUIT)
if(master_mob.head)
- H.equip_to_slot_or_del(new master_mob.head.type, slot_head)
+ H.equip_to_slot_or_del(new master_mob.head.type, SLOT_HEAD)
if(master_mob.back)
- H.equip_to_slot_or_del(new master_mob.back.type, slot_back)
+ H.equip_to_slot_or_del(new master_mob.back.type, SLOT_BACK)
//Operation: Fuck off and scare people
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index 85d45bd40b..3e291d0eee 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -3,6 +3,7 @@
#define WIRE_PULSE_SPECIAL (1<<2)
#define WIRE_RADIO_RECEIVE (1<<3)
#define WIRE_RADIO_PULSE (1<<4)
+#define ASSEMBLY_BEEP_VOLUME 5
/obj/item/assembly
name = "assembly"
@@ -16,6 +17,8 @@
throw_speed = 3
throw_range = 7
+ var/is_position_sensitive = FALSE //set to true if the device has different icons for each position.
+ //This will prevent things such as visible lasers from facing the incorrect direction when transformed by assembly_holder's update_icon()
var/secured = TRUE
var/list/attached_overlays = null
var/obj/item/assembly_holder/holder = null
@@ -30,14 +33,18 @@
/obj/item/assembly/proc/on_attach()
-/obj/item/assembly/proc/on_detach()
+/obj/item/assembly/proc/on_detach() //call this when detaching it from a device. handles any special functions that need to be updated ex post facto
+ if(!holder)
+ return FALSE
+ forceMove(holder.drop_location())
+ holder = null
+ return TRUE
/obj/item/assembly/proc/holder_movement() //Called when the holder is moved
- return
-
-/obj/item/assembly/proc/describe() // Called by grenades to describe the state of the trigger (time left, etc)
- return "The trigger assembly looks broken!"
-
+ if(!holder)
+ return FALSE
+ setDir(holder.dir)
+ return TRUE
/obj/item/assembly/proc/is_secured(mob/user)
if(!secured)
@@ -47,7 +54,7 @@
//Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs
-/obj/item/assembly/proc/pulsed(radio = 0)
+/obj/item/assembly/proc/pulsed(radio = FALSE)
if(wire_type & WIRE_RECEIVE)
INVOKE_ASYNC(src, .proc/activate)
if(radio && (wire_type & WIRE_RADIO_RECEIVE))
@@ -56,7 +63,7 @@
//Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct
-/obj/item/assembly/proc/pulse(radio = 0)
+/obj/item/assembly/proc/pulse(radio = FALSE)
if(connected && wire_type)
connected.pulse_assembly(src)
return TRUE
@@ -91,21 +98,19 @@
else
to_chat(user, "Both devices must be in attachable mode to be attached together. ")
return
- if(istype(W, /obj/item/screwdriver))
- if(toggle_secure())
- to_chat(user, "\The [src] is ready! ")
- else
- to_chat(user, "\The [src] can now be attached! ")
- return
..()
+/obj/item/assembly/screwdriver_act(mob/living/user, obj/item/I)
+ if(toggle_secure())
+ to_chat(user, "\The [src] is ready! ")
+ else
+ to_chat(user, "\The [src] can now be attached! ")
+ add_fingerprint(user)
+ return TRUE
/obj/item/assembly/examine(mob/user)
..()
- if(secured)
- to_chat(user, "\The [src] is secured and ready to be used.")
- else
- to_chat(user, "\The [src] can be attached to other things.")
+ to_chat(user, "\The [src] [secured? "is secured and ready to be used!" : "can be attached to other things."] ")
/obj/item/assembly/attack_self(mob/user)
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index daca7a5435..ca85255bf0 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -13,11 +13,14 @@
var/obj/item/assembly_holder/bombassembly = null //The first part of the bomb is an assembly holder, holding an igniter+some device
var/obj/item/tank/bombtank = null //the second part of the bomb is a plasma tank
+/obj/item/onetankbomb/IsSpecialAssembly()
+ return TRUE
/obj/item/onetankbomb/examine(mob/user)
bombtank.examine(user)
/obj/item/onetankbomb/update_icon()
+ cut_overlays()
if(bombtank)
icon = bombtank.icon
icon_state = bombtank.icon_state
@@ -30,29 +33,37 @@
if(istype(W, /obj/item/analyzer))
bombtank.attackby(W, user)
return
- if(istype(W, /obj/item/wrench) && !status) //This is basically bomb assembly code inverted. apparently it works.
-
- to_chat(user, "You disassemble [src]. ")
+ add_fingerprint(user)
+ ..()
+/obj/item/onetankbomb/wrench_act(mob/living/user, obj/item/I)
+ to_chat(user, "You disassemble [src]! ")
+ if(bombassembly)
bombassembly.forceMove(drop_location())
bombassembly.master = null
bombassembly = null
-
+ if(bombtank)
bombtank.forceMove(drop_location())
bombtank.master = null
bombtank = null
+ qdel(src)
+ return TRUE
- qdel(src)
+/obj/item/onetankbomb/welder_act(mob/living/user, obj/item/I)
+ . = FALSE
+ if(status)
+ to_chat(user, "[bombtank] already has a pressure hole! ")
return
- var/obj/item/weldingtool/WT = W
- if((istype(WT) && WT.welding))
- if(!status)
- status = TRUE
- GLOB.bombers += "[key_name(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]"
- message_admins("[key_name_admin(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]")
- to_chat(user, "A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited. ")
- add_fingerprint(user)
- ..()
+ if(!I.tool_start_check(user, amount=0))
+ return
+ if(I.use_tool(src, user, 0, volume=40))
+ status = TRUE
+ GLOB.bombers += "[key_name(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]"
+ message_admins("[key_name_admin(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]")
+ to_chat(user, "A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited. ")
+ add_fingerprint(user)
+ return TRUE
+
/obj/item/onetankbomb/attack_self(mob/user) //pressing the bomb accesses its assembly
bombassembly.attack_self(user, TRUE)
@@ -60,16 +71,20 @@
return
/obj/item/onetankbomb/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here.
- visible_message("[icon2html(src, viewers(src))] *beep* *beep*", "*beep* *beep*")
+ audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*")
+ playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
sleep(10)
- if(!src)
+ if(QDELETED(src))
return
if(status)
bombtank.ignite() //if its not a dud, boom (or not boom if you made shitty mix) the ignite proc is below, in this file
else
bombtank.release()
+//Assembly / attached device memes
+
/obj/item/onetankbomb/Crossed(atom/movable/AM as mob|obj) //for mousetraps
+ . = ..()
if(bombassembly)
bombassembly.Crossed(AM)
@@ -77,6 +92,26 @@
if(bombassembly)
bombassembly.on_found(finder)
+/obj/item/onetankbomb/attack_hand() //also for mousetraps
+ . = ..()
+ if(.)
+ return
+ if(bombassembly)
+ bombassembly.attack_hand()
+
+/obj/item/onetankbomb/Move()
+ . = ..()
+ if(bombassembly)
+ bombassembly.setDir(dir)
+ bombassembly.Move()
+
+/obj/item/onetankbomb/dropped()
+ . = ..()
+ if(bombassembly)
+ bombassembly.dropped()
+
+
+
// ---------- Procs below are for tanks that are used exclusively in 1-tank bombs ----------
diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm
index c3475b1839..f320872076 100644
--- a/code/modules/assembly/doorcontrol.dm
+++ b/code/modules/assembly/doorcontrol.dm
@@ -2,10 +2,10 @@
name = "blast door controller"
desc = "A small electronic device able to control a blast door remotely."
icon_state = "control"
- attachable = 1
+ attachable = TRUE
var/id = null
var/can_change_id = 0
- var/cooldown = 0//Door cooldowns
+ var/cooldown = FALSE //Door cooldowns
/obj/item/assembly/control/examine(mob/user)
..()
@@ -13,15 +13,14 @@
to_chat(user, "Its channel ID is '[id]'. ")
/obj/item/assembly/control/activate()
- cooldown = 1
+ cooldown = TRUE
var/openclose
for(var/obj/machinery/door/poddoor/M in GLOB.machines)
if(M.id == src.id)
if(openclose == null)
openclose = M.density
INVOKE_ASYNC(M, openclose ? /obj/machinery/door/poddoor.proc/open : /obj/machinery/door/poddoor.proc/close)
- sleep(10)
- cooldown = 0
+ addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10)
/obj/item/assembly/control/airlock
@@ -38,7 +37,7 @@
*/
/obj/item/assembly/control/airlock/activate()
- cooldown = 1
+ cooldown = TRUE
var/doors_need_closing = FALSE
var/list/obj/machinery/door/airlock/open_or_close = list()
for(var/obj/machinery/door/airlock/D in GLOB.airlocks)
@@ -66,8 +65,7 @@
for(var/D in open_or_close)
INVOKE_ASYNC(D, doors_need_closing ? /obj/machinery/door/airlock.proc/close : /obj/machinery/door/airlock.proc/open)
- sleep(10)
- cooldown = 0
+ addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10)
/obj/item/assembly/control/massdriver
@@ -75,7 +73,7 @@
desc = "A small electronic device able to control a mass driver."
/obj/item/assembly/control/massdriver/activate()
- cooldown = 1
+ cooldown = TRUE
for(var/obj/machinery/door/poddoor/M in GLOB.machines)
if (M.id == src.id)
INVOKE_ASYNC(M, /obj/machinery/door/poddoor.proc/open)
@@ -92,8 +90,7 @@
if (M.id == src.id)
INVOKE_ASYNC(M, /obj/machinery/door/poddoor.proc/close)
- sleep(10)
- cooldown = 0
+ addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10)
/obj/item/assembly/control/igniter
@@ -101,7 +98,7 @@
desc = "A remote controller for a mounted igniter."
/obj/item/assembly/control/igniter/activate()
- cooldown = 1
+ cooldown = TRUE
for(var/obj/machinery/sparker/M in GLOB.machines)
if (M.id == src.id)
INVOKE_ASYNC(M, /obj/machinery/sparker.proc/ignite)
@@ -112,22 +109,19 @@
M.on = !M.on
M.icon_state = "igniter[M.on]"
- sleep(30)
- cooldown = 0
-
+ addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 30)
/obj/item/assembly/control/flasher
name = "flasher controller"
desc = "A remote controller for a mounted flasher."
/obj/item/assembly/control/flasher/activate()
- cooldown = 1
+ cooldown = TRUE
for(var/obj/machinery/flasher/M in GLOB.machines)
if(M.id == src.id)
INVOKE_ASYNC(M, /obj/machinery/flasher.proc/flash)
- sleep(50)
- cooldown = 0
+ addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50)
/obj/item/assembly/control/crematorium
@@ -135,10 +129,9 @@
desc = "An evil-looking remote controller for a crematorium."
/obj/item/assembly/control/crematorium/activate()
- cooldown = 1
+ cooldown = TRUE
for (var/obj/structure/bodycontainer/crematorium/C in GLOB.crematoriums)
if (C.id == id)
C.cremate(usr)
- sleep(50)
- cooldown = 0
+ addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50)
diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm
index cbfdb860f9..dceda9ab9d 100644
--- a/code/modules/assembly/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -93,7 +93,7 @@
if(crit_fail || (world.time < last_trigger + cooldown))
return FALSE
last_trigger = world.time
- playsound(src, 'sound/weapons/flash.ogg', 100, 1)
+ playsound(src, 'sound/weapons/flash.ogg', 100, TRUE)
times_used++
flash_recharge()
update_icon(TRUE)
@@ -195,6 +195,8 @@
/obj/item/assembly/flash/cyborg/attackby(obj/item/W, mob/user, params)
return
+/obj/item/assembly/flash/cyborg/screwdriver_act(mob/living/user, obj/item/I)
+ return
/obj/item/assembly/flash/memorizer
name = "memorizer"
@@ -226,7 +228,7 @@
return FALSE
overheat = TRUE
addtimer(CALLBACK(src, .proc/cooldown), flashcd)
- playsound(src, 'sound/weapons/flash.ogg', 100, 1)
+ playsound(src, 'sound/weapons/flash.ogg', 100, TRUE)
update_icon(1)
return TRUE
@@ -242,7 +244,7 @@
item_state = "flashshield"
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
force = 10
throwforce = 5
throw_speed = 2
@@ -272,7 +274,7 @@
return
crit_fail = FALSE
times_used = 0
- playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
+ playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
update_icon()
flash.crit_fail = TRUE
flash.update_icon()
diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm
index 633db327bf..78d3f686ab 100644
--- a/code/modules/assembly/health.dm
+++ b/code/modules/assembly/health.dm
@@ -3,10 +3,10 @@
desc = "Used for scanning and monitoring health."
icon_state = "health"
materials = list(MAT_METAL=800, MAT_GLASS=200)
- attachable = 1
- secured = 0
+ attachable = TRUE
+ secured = FALSE
- var/scanning = 0
+ var/scanning = FALSE
var/health_scan
var/alarm_health = 0
@@ -16,31 +16,28 @@
/obj/item/assembly/health/activate()
if(!..())
- return 0//Cooldown check
+ return FALSE//Cooldown check
toggle_scan()
- return 0
+ return TRUE
/obj/item/assembly/health/toggle_secure()
secured = !secured
if(secured && scanning)
START_PROCESSING(SSobj, src)
else
- scanning = 0
+ scanning = FALSE
STOP_PROCESSING(SSobj, src)
update_icon()
return secured
-/obj/item/assembly/health/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W, /obj/item/multitool))
- if(alarm_health == 0)
- alarm_health = -90
- user.show_message("You toggle [src] to \"detect death\" mode.")
- else
- alarm_health = 0
- user.show_message("You toggle [src] to \"detect critical state\" mode.")
- return
+/obj/item/assembly/health/multitool_act(mob/living/user, obj/item/I)
+ if(alarm_health == 0)
+ alarm_health = -90
+ to_chat(user, "You toggle [src] to \"detect death\" mode. ")
else
- return ..()
+ alarm_health = 0
+ to_chat(user, "You toggle [src] to \"detect critical state\" mode. ")
+ return TRUE
/obj/item/assembly/health/process()
if(!scanning || !secured)
@@ -58,7 +55,8 @@
health_scan = M.health
if(health_scan <= alarm_health)
pulse()
- audible_message("[icon2html(src, hearers(src))] *beep* *beep*", "*beep* *beep*")
+ audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*")
+ playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
toggle_scan()
return
return
@@ -77,8 +75,9 @@
. = ..()
if(!secured)
user.show_message("The [name] is unsecured! ")
- return 0
- var/dat = "Health Sensor [scanning?"On":"Off"] "
+ return FALSE
+ var/dat = "Health Sensor "
+ dat += "[scanning?"On":"Off"] "
if(scanning && health_scan)
dat += " Health: [health_scan]"
user << browse(dat, "window=hscan")
diff --git a/code/modules/assembly/helpers.dm b/code/modules/assembly/helpers.dm
index cb7bd59bb5..f1dc93b446 100644
--- a/code/modules/assembly/helpers.dm
+++ b/code/modules/assembly/helpers.dm
@@ -1,16 +1,16 @@
-// See _DEFINES/is_helpers.dm for type helpers
-
-/*
-Name: IsSpecialAssembly
-Desc: If true is an object that can be attached to an assembly holder but is a special thing like a plasma can or door
-*/
-
-/obj/proc/IsSpecialAssembly()
- return 0
-
-/*
-Name: IsAssemblyHolder
-Desc: If true is an object that can hold an assemblyholder object
-*/
-/obj/proc/IsAssemblyHolder()
- return 0
\ No newline at end of file
+// See _DEFINES/is_helpers.dm for type helpers
+
+/*
+Name: IsSpecialAssembly
+Desc: If true is an object that can be attached to an assembly holder but is a special thing like a plasma can or door
+*/
+
+/obj/proc/IsSpecialAssembly()
+ return FALSE
+
+/*
+Name: IsAssemblyHolder
+Desc: If true is an object that can hold an assemblyholder object
+*/
+/obj/proc/IsAssemblyHolder()
+ return FALSE
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index c830935132..031ce866ba 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -15,7 +15,7 @@
var/obj/item/assembly/a_right = null
/obj/item/assembly_holder/IsAssemblyHolder()
- return 1
+ return TRUE
/obj/item/assembly_holder/proc/assemble(obj/item/assembly/A, obj/item/assembly/A2, mob/user)
@@ -37,6 +37,7 @@
a_left = A
else
a_right = A
+ A.holder_movement()
/obj/item/assembly_holder/update_icon()
cut_overlays()
@@ -46,11 +47,16 @@
add_overlay("[O]_l")
if(a_right)
- var/mutable_appearance/right = mutable_appearance(icon, "[a_right.icon_state]_left")
- right.transform = matrix(-1, 0, 0, 0, 1, 0)
- for(var/O in a_right.attached_overlays)
- right.add_overlay("[O]_l")
- add_overlay(right)
+ if(a_right.is_position_sensitive)
+ add_overlay("[a_right.icon_state]_right")
+ for(var/O in a_right.attached_overlays)
+ add_overlay("[O]_r")
+ else
+ var/mutable_appearance/right = mutable_appearance(icon, "[a_right.icon_state]_left")
+ right.transform = matrix(-1, 0, 0, 0, 1, 0)
+ for(var/O in a_right.attached_overlays)
+ right.add_overlay("[O]_l")
+ add_overlay(right)
if(master)
master.update_icon()
@@ -69,32 +75,37 @@
/obj/item/assembly_holder/Move()
. = ..()
- if(a_left && a_right)
+ if(a_left)
a_left.holder_movement()
+ if(a_right)
a_right.holder_movement()
+/obj/item/assembly_holder/dropped(mob/user)
+ . = ..()
+ if(a_left)
+ a_left.dropped()
+ if(a_right)
+ a_right.dropped()
+
/obj/item/assembly_holder/attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess
. = ..()
if(.)
return
- if(a_left && a_right)
- a_left.holder_movement()
- a_right.holder_movement()
+ if(a_left)
+ a_left.attack_hand()
+ if(a_right)
+ a_right.attack_hand()
-/obj/item/assembly_holder/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/screwdriver))
- var/turf/T = get_turf(src)
- if(!T)
- return 0
- if(a_left)
- a_left.holder = null
- a_left.forceMove(T)
- if(a_right)
- a_right.holder = null
- a_right.forceMove(T)
- qdel(src)
- else
- ..()
+/obj/item/assembly_holder/screwdriver_act(mob/user, obj/item/tool)
+ to_chat(user, "You disassemble [src]! ")
+ if(a_left)
+ a_left.on_detach()
+ a_left = null
+ if(a_right)
+ a_right.on_detach()
+ a_right = null
+ qdel(src)
+ return TRUE
/obj/item/assembly_holder/attack_self(mob/user)
src.add_fingerprint(user)
@@ -115,12 +126,12 @@
/obj/item/assembly_holder/proc/process_activation(obj/D, normal = 1, special = 1)
if(!D)
- return 0
+ return FALSE
if((normal) && (a_right) && (a_left))
if(a_right != D)
- a_right.pulsed(0)
+ a_right.pulsed(FALSE)
if(a_left != D)
- a_left.pulsed(0)
+ a_left.pulsed(FALSE)
if(master)
master.receive_signal()
- return 1
+ return TRUE
diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm
index ef0949481a..2aae7db5e2 100644
--- a/code/modules/assembly/igniter.dm
+++ b/code/modules/assembly/igniter.dm
@@ -23,12 +23,12 @@
/obj/item/assembly/igniter/activate()
if(!..())
- return 0//Cooldown check
+ return FALSE//Cooldown check
var/turf/location = get_turf(loc)
if(location)
location.hotspot_expose(1000,1000)
sparks.start()
- return 1
+ return TRUE
/obj/item/assembly/igniter/attack_self(mob/user)
activate()
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 374c7762d4..4a6c9d2db3 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -1,8 +1,9 @@
/obj/item/assembly/infra
name = "infrared emitter"
- desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted.\nAlt-click to rotate it clockwise. "
+ desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted."
icon_state = "infrared"
materials = list(MAT_METAL=1000, MAT_GLASS=500)
+ is_position_sensitive = TRUE
var/on = FALSE
var/visible = FALSE
@@ -10,30 +11,48 @@
var/list/obj/effect/beam/i_beam/beams
var/olddir = 0
var/datum/component/redirect/listener
+ var/hearing_range = 3
/obj/item/assembly/infra/Initialize()
. = ..()
beams = list()
START_PROCESSING(SSobj, src)
-/obj/item/assembly/infra/Destroy()
- QDEL_LIST(beams)
- return ..()
+/obj/item/assembly/infra/ComponentInitialize()
+ . = ..()
+ AddComponent(
+ /datum/component/simple_rotation,
+ ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS,
+ null,
+ null,
+ CALLBACK(src,.proc/after_rotation)
+ )
-/obj/item/assembly/infra/describe()
- return "The infrared trigger is [on?"on":"off"]."
+/obj/item/assembly/infra/proc/after_rotation()
+ refreshBeam()
+
+/obj/item/assembly/infra/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ QDEL_LIST(beams)
+ . = ..()
+
+/obj/item/assembly/infra/examine(mob/user)
+ ..()
+ to_chat(user, "The infrared trigger is [on?"on":"off"]. ")
/obj/item/assembly/infra/activate()
if(!..())
- return 0//Cooldown check
+ return FALSE//Cooldown check
on = !on
+ refreshBeam()
update_icon()
- return 1
+ return TRUE
/obj/item/assembly/infra/toggle_secure()
secured = !secured
if(secured)
START_PROCESSING(SSobj, src)
+ refreshBeam()
else
QDEL_LIST(beams)
STOP_PROCESSING(SSobj, src)
@@ -46,13 +65,20 @@
if(on)
add_overlay("infrared_on")
attached_overlays += "infrared_on"
+ if(visible && secured)
+ add_overlay("infrared_visible")
+ attached_overlays += "infrared_visible"
if(holder)
holder.update_icon()
return
/obj/item/assembly/infra/dropped()
- refreshBeam()
+ . = ..()
+ if(holder)
+ holder_movement() //sync the dir of the device as well if it's contained in a TTV or an assembly holder
+ else
+ refreshBeam()
/obj/item/assembly/infra/process()
if(!on || !secured)
@@ -61,7 +87,15 @@
/obj/item/assembly/infra/proc/refreshBeam()
QDEL_LIST(beams)
- if(throwing || !on || !secured || !(isturf(loc) || holder && isturf(holder.loc)))
+ if(throwing || !on || !secured)
+ return
+ if(holder)
+ if(holder.master) //incase the sensor is part of an assembly that's contained in another item, such as a single tank bomb
+ if(!holder.master.IsSpecialAssembly() || !isturf(holder.master.loc))
+ return
+ else if(!isturf(holder.loc)) //else just check where the holder is
+ return
+ else if(!isturf(loc)) //or just where the fuck we are in general
return
var/turf/T = get_turf(src)
var/_dir = dir
@@ -69,6 +103,11 @@
if(_T)
for(var/i in 1 to maxlength)
var/obj/effect/beam/i_beam/I = new(T)
+ if(istype(holder, /obj/item/assembly_holder))
+ var/obj/item/assembly_holder/assembly_holder = holder
+ I.icon_state = "[initial(I.icon_state)]_[(assembly_holder.a_left == src) ? "l":"r"]" //Sync the offset of the beam with the position of the sensor.
+ else if(istype(holder, /obj/item/transfer_valve))
+ I.icon_state = "[initial(I.icon_state)]_ttv"
I.density = TRUE
if(!I.Move(_T))
qdel(I)
@@ -83,6 +122,12 @@
_T = get_step(_T, _dir)
CHECK_TICK
+/obj/item/assembly/infra/on_detach()
+ . = ..()
+ if(!.)
+ return
+ refreshBeam()
+
/obj/item/assembly/infra/attack_hand()
. = ..()
refreshBeam()
@@ -103,19 +148,17 @@
setDir(olddir)
olddir = null
-/obj/item/assembly/infra/holder_movement()
- if(!holder)
- return 0
- refreshBeam()
- return 1
-
/obj/item/assembly/infra/proc/trigger_beam(atom/movable/AM, turf/location)
refreshBeam()
switchListener(location)
if(!secured || !on || next_activate > world.time)
return FALSE
- pulse(0)
- audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 3)
+ pulse(FALSE)
+ audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range)
+ for(var/CHM in get_hearers_in_view(hearing_range, src))
+ if(ismob(CHM))
+ var/mob/LM = CHM
+ LM.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
next_activate = world.time + 30
/obj/item/assembly/infra/proc/switchListener(turf/newloc)
@@ -131,7 +174,9 @@
. = ..()
if(is_secured(user))
user.set_machine(src)
- var/dat = "Infrared Laser \nStatus : [on ? "On " : "Off "] \nVisibility : [visible ? "Visible " : "Invisible "] \n "
+ var/dat = "Infrared Laser "
+ dat += "Status : [on ? "On " : "Off "]"
+ dat += "Visibility : [visible ? "Visible " : "Invisible "]"
dat += "Refresh "
dat += "Close "
user << browse(dat, "window=infra")
@@ -150,6 +195,7 @@
refreshBeam()
if(href_list["visible"])
visible = !(visible)
+ update_icon()
refreshBeam()
if(href_list["close"])
usr << browse(null, "window=infra")
@@ -157,23 +203,6 @@
if(usr)
attack_self(usr)
-/obj/item/assembly/infra/verb/rotate()//This could likely be better
- set name = "Rotate Infrared Laser"
- set category = "Object"
- set src in usr
-
- if(!usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
- return
-
- setDir(turn(dir, -90))
-
-/obj/item/assembly/infra/AltClick(mob/user)
- ..()
- if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
- return
- else
- rotate()
-
/obj/item/assembly/infra/setDir()
. = ..()
refreshBeam()
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index d0d27ebe11..58a3a5349a 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -2,17 +2,15 @@
name = "mousetrap"
desc = "A handy little spring-loaded trap for catching pesty rodents."
icon_state = "mousetrap"
+ item_state = "mousetrap"
materials = list(MAT_METAL=100)
- attachable = 1
- var/armed = 0
+ attachable = TRUE
+ var/armed = FALSE
/obj/item/assembly/mousetrap/examine(mob/user)
..()
- if(armed)
- to_chat(user, "The mousetrap is armed!")
- else
- to_chat(user, "The mousetrap is not armed.")
+ to_chat(user, "The pressure plate is [armed?"primed":"safe"]. ")
/obj/item/assembly/mousetrap/activate()
if(..())
@@ -22,13 +20,9 @@
var/mob/living/carbon/human/user = usr
if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50))
to_chat(user, "Your hand slips, setting off the trigger! ")
- pulse(0)
+ pulse(FALSE)
update_icon()
- if(usr)
- playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
-
-/obj/item/assembly/mousetrap/describe()
- return "The pressure switch is [armed?"primed":"safe"]."
+ playsound(src, 'sound/weapons/handcuffs.ogg', 30, TRUE, -3)
/obj/item/assembly/mousetrap/update_icon()
if(armed)
@@ -45,11 +39,11 @@
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(H.has_trait(TRAIT_PIERCEIMMUNE))
- playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
- armed = 0
+ playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
+ armed = FALSE
update_icon()
- pulse(0)
- return 0
+ pulse(FALSE)
+ return FALSE
switch(type)
if("feet")
if(!H.shoes)
@@ -66,10 +60,10 @@
var/mob/living/simple_animal/mouse/M = target
visible_message("SPLAT! ")
M.splat()
- playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
- armed = 0
+ playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
+ armed = FALSE
update_icon()
- pulse(0)
+ pulse(FALSE)
/obj/item/assembly/mousetrap/attack_self(mob/living/carbon/human/user)
@@ -87,7 +81,7 @@
to_chat(user, "You disarm [src]. ")
armed = !armed
update_icon()
- playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
+ playsound(src, 'sound/weapons/handcuffs.ogg', 30, TRUE, -3)
//ATTACK HAND IGNORING PARENT RETURN VALUE
@@ -124,11 +118,16 @@
/obj/item/assembly/mousetrap/on_found(mob/finder)
if(armed)
- finder.visible_message("[finder] accidentally sets off [src], breaking their fingers. ", \
+ if(finder)
+ finder.visible_message("[finder] accidentally sets off [src], breaking their fingers. ", \
"You accidentally trigger [src]! ")
- triggered(finder, (finder.active_hand_index % 2 == 0) ? BODY_ZONE_PRECISE_R_HAND : BODY_ZONE_PRECISE_L_HAND)
- return 1 //end the search!
- return 0
+ triggered(finder, (finder.active_hand_index % 2 == 0) ? BODY_ZONE_PRECISE_R_HAND : BODY_ZONE_PRECISE_L_HAND)
+ return TRUE //end the search!
+ else
+ visible_message("[src] snaps shut! ")
+ triggered(loc)
+ return FALSE
+ return FALSE
/obj/item/assembly/mousetrap/hitby(A as mob|obj)
@@ -140,4 +139,4 @@
/obj/item/assembly/mousetrap/armed
icon_state = "mousetraparmed"
- armed = 1
+ armed = TRUE
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index d79b4786c6..7f6a1fab12 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -3,34 +3,36 @@
desc = "Used for scanning and alerting when someone enters a certain proximity."
icon_state = "prox"
materials = list(MAT_METAL=800, MAT_GLASS=200)
- attachable = 1
+ attachable = TRUE
- var/scanning = 0
- var/timing = 0
+ var/scanning = FALSE
+ var/timing = FALSE
var/time = 10
var/sensitivity = 1
-
-/obj/item/assembly/prox_sensor/proc/toggle_scan()
-
-
-/obj/item/assembly/prox_sensor/proc/sense()
-
+ var/hearing_range = 3
/obj/item/assembly/prox_sensor/Initialize()
. = ..()
proximity_monitor = new(src, 0)
+ START_PROCESSING(SSobj, src)
-/obj/item/assembly/prox_sensor/describe()
- if(timing)
- return "The proximity sensor is arming. "
- return "The proximity sensor is [scanning?"armed":"disarmed"]."
+/obj/item/assembly/prox_sensor/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
+/obj/item/assembly/prox_sensor/examine(mob/user)
+ ..()
+ to_chat(user, "The proximity sensor is [timing ? "arming" : (scanning ? "armed" : "disarmed")]. ")
/obj/item/assembly/prox_sensor/activate()
if(!..())
- return 0//Cooldown check
- timing = !timing
+ return FALSE//Cooldown check
+ if(!scanning)
+ timing = !timing
+ else
+ scanning = FALSE
update_icon()
- return 1
+ return TRUE
/obj/item/assembly/prox_sensor/toggle_secure()
secured = !secured
@@ -38,8 +40,10 @@
if(scanning)
toggle_scan()
proximity_monitor.host = src
- timing = 0
+ timing = FALSE
+ STOP_PROCESSING(SSobj, src)
else
+ START_PROCESSING(SSobj, src)
proximity_monitor.host = loc
update_icon()
return secured
@@ -51,25 +55,31 @@
sense()
-/obj/item/assembly/prox_sensor/sense()
+/obj/item/assembly/prox_sensor/proc/sense()
if(!scanning || !secured || next_activate > world.time)
- return 0
- pulse(0)
- audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 3)
+ return FALSE
+ pulse(FALSE)
+ audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range)
+ for(var/CHM in get_hearers_in_view(hearing_range, src))
+ if(ismob(CHM))
+ var/mob/LM = CHM
+ LM.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
next_activate = world.time + 30
+ return TRUE
/obj/item/assembly/prox_sensor/process()
- if(timing)
- time--
- if(time <= 0)
- timing = 0
- toggle_scan(1)
- time = initial(time)
+ if(!timing)
+ return
+ time--
+ if(time <= 0)
+ timing = FALSE
+ toggle_scan(TRUE)
+ time = initial(time)
-/obj/item/assembly/prox_sensor/toggle_scan(scan)
+/obj/item/assembly/prox_sensor/proc/toggle_scan(scan)
if(!secured)
- return 0
+ return FALSE
scanning = scan
proximity_monitor.SetRange(scanning ? sensitivity : 0)
update_icon()
@@ -98,8 +108,11 @@
if(is_secured(user))
var/second = time % 60
var/minute = (time - second) / 60
- var/dat = "Proximity Sensor \n[(timing ? "Arming " : "Not Arming ")] [minute]:[second]\n- - + + \n "
- dat += "Armed":"1'>Unarmed"] (Movement sensor active when armed!)"
+ var/dat = "Proximity Sensor "
+ if(!scanning)
+ dat += " [(timing ? "Arming " : "Not Arming ")] [minute]:[second]"
+ dat += "- - + + "
+ dat += "Armed":"1'>Unarmed (Movement sensor active when armed!)"] "
dat += " Detection range: - [sensitivity] + "
dat += "Refresh "
dat += "Close "
diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm
index 38f2acb45f..8d9ba9880c 100644
--- a/code/modules/assembly/shock_kit.dm
+++ b/code/modules/assembly/shock_kit.dm
@@ -13,18 +13,18 @@
qdel(part2)
return ..()
-/obj/item/assembly/shock_kit/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/wrench))
+/obj/item/assembly/shock_kit/wrench_act(mob/living/user, obj/item/I)
+ to_chat(user, "You disassemble [src]. ")
+ if(part1)
part1.forceMove(drop_location())
- part2.forceMove(drop_location())
part1.master = null
- part2.master = null
part1 = null
+ if(part2)
+ part2.forceMove(drop_location())
+ part2.master = null
part2 = null
- qdel(src)
- return
- add_fingerprint(user)
- return
+ qdel(src)
+ return TRUE
/obj/item/assembly/shock_kit/attack_self(mob/user)
part1.attack_self(user)
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 4b44397713..c293439431 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -7,17 +7,18 @@
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
materials = list(MAT_METAL=400, MAT_GLASS=120)
wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE
- attachable = 1
+ attachable = TRUE
var/code = DEFAULT_SIGNALER_CODE
var/frequency = FREQ_SIGNALER
var/delay = 0
var/datum/radio_frequency/radio_connection
var/suicider = null
+ var/hearing_range = 1
/obj/item/assembly/signaler/suicide_act(mob/living/carbon/user)
user.visible_message("[user] eats \the [src]! If it is signaled, [user.p_they()] will die! ")
- playsound(src, 'sound/items/eatfood.ogg', 50, 1)
+ playsound(src, 'sound/items/eatfood.ogg', 50, TRUE)
user.transferItemToLoc(src, user, TRUE)
suicider = user
return MANUAL_SUICIDE
@@ -27,15 +28,14 @@
user.adjustOxyLoss(200)//it sends an electrical pulse to their heart, killing them. or something.
user.death(0)
-/obj/item/assembly/signaler/New()
- ..()
- spawn(40)
- set_frequency(frequency)
+/obj/item/assembly/signaler/Initialize()
+ . = ..()
+ set_frequency(frequency)
/obj/item/assembly/signaler/Destroy()
SSradio.remove_object(src,frequency)
- return ..()
+ . = ..()
/obj/item/assembly/signaler/activate()
if(!..())//cooldown processing
@@ -80,7 +80,7 @@ Code:
/obj/item/assembly/signaler/Topic(href, href_list)
..()
- if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
+ if(!usr.canUseTopic(src, BE_CLOSE))
usr << browse(null, "window=radio")
onclose(usr, "radio")
return
@@ -111,7 +111,7 @@ Code:
var/obj/item/assembly/signaler/signaler2 = W
if(secured && signaler2.secured)
code = signaler2.code
- frequency = signaler2.frequency
+ set_frequency(signaler2.frequency)
to_chat(user, "You transfer the frequency and code of \the [signaler2.name] to \the [name]")
..()
@@ -131,17 +131,22 @@ Code:
return
/obj/item/assembly/signaler/receive_signal(datum/signal/signal)
+ . = FALSE
if(!signal)
- return 0
+ return
if(signal.data["code"] != code)
- return 0
+ return
if(!(src.wires & WIRE_RADIO_RECEIVE))
- return 0
+ return
if(suicider)
manual_suicide(suicider)
- pulse(1)
- audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 1)
- return
+ pulse(TRUE)
+ audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range)
+ for(var/CHM in get_hearers_in_view(hearing_range, src))
+ if(ismob(CHM))
+ var/mob/LM = CHM
+ LM.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
+ return TRUE
/obj/item/assembly/signaler/proc/set_frequency(new_frequency)
@@ -161,10 +166,11 @@ Code:
/obj/item/assembly/signaler/reciever/activate()
toggle_safety()
- return 1
+ return TRUE
-/obj/item/assembly/signaler/reciever/describe()
- return "The radio receiver is [on?"on":"off"]."
+/obj/item/assembly/signaler/reciever/examine(mob/user)
+ ..()
+ to_chat(user, "The radio receiver is [on?"on":"off"]. ")
/obj/item/assembly/signaler/reciever/receive_signal(datum/signal/signal)
if(!on)
@@ -180,14 +186,16 @@ Code:
item_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ var/anomaly_type = /obj/effect/anomaly
/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
if(!signal)
- return 0
+ return FALSE
if(signal.data["code"] != code)
- return 0
+ return FALSE
for(var/obj/effect/anomaly/A in get_turf(src))
A.anomalyNeutralize()
+ return TRUE
/obj/item/assembly/signaler/anomaly/attack_self()
return
@@ -196,3 +204,5 @@ Code:
/obj/item/assembly/signaler/cyborg/attackby(obj/item/W, mob/user, params)
return
+/obj/item/assembly/signaler/cyborg/screwdriver_act(mob/living/user, obj/item/I)
+ return
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index 7c74c1ca77..993bf134e6 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -3,12 +3,13 @@
desc = "Used to time things. Works well with contraptions which has to count down. Tick tock."
icon_state = "timer"
materials = list(MAT_METAL=500, MAT_GLASS=50)
- attachable = 1
+ attachable = TRUE
- var/timing = 0
+ var/timing = FALSE
var/time = 5
var/saved_time = 5
- var/loop = 0
+ var/loop = FALSE
+ var/hearing_range = 3
/obj/item/assembly/timer/suicide_act(mob/living/user)
user.visible_message("[user] looks at the timer and decides [user.p_their()] fate! It looks like [user.p_theyre()] going to commit suicide! ")
@@ -21,22 +22,24 @@
user.adjustOxyLoss(200)
user.death(0)
-/obj/item/assembly/timer/New()
- ..()
+/obj/item/assembly/timer/Initialize()
+ . = ..()
START_PROCESSING(SSobj, src)
-/obj/item/assembly/timer/describe()
- if(timing)
- return "The timer is counting down from [time]!"
- return "The timer is set for [time] seconds."
+/obj/item/assembly/timer/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+/obj/item/assembly/timer/examine(mob/user)
+ ..()
+ to_chat(user, "The timer is [timing ? "counting down from [time]":"set for [time] seconds"]. ")
/obj/item/assembly/timer/activate()
if(!..())
- return 0//Cooldown check
+ return FALSE//Cooldown check
timing = !timing
update_icon()
- return 1
+ return TRUE
/obj/item/assembly/timer/toggle_secure()
@@ -44,7 +47,7 @@
if(secured)
START_PROCESSING(SSobj, src)
else
- timing = 0
+ timing = FALSE
STOP_PROCESSING(SSobj, src)
update_icon()
return secured
@@ -53,20 +56,25 @@
/obj/item/assembly/timer/proc/timer_end()
if(!secured || next_activate > world.time)
return FALSE
- pulse(0)
- audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 3)
+ pulse(FALSE)
+ audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range)
+ for(var/CHM in get_hearers_in_view(hearing_range, src))
+ if(ismob(CHM))
+ var/mob/LM = CHM
+ LM.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
if(loop)
- timing = 1
+ timing = TRUE
update_icon()
/obj/item/assembly/timer/process()
- if(timing)
- time--
- if(time <= 0)
- timing = 0
- timer_end()
- time = saved_time
+ if(!timing)
+ return
+ time--
+ if(time <= 0)
+ timing = FALSE
+ timer_end()
+ time = saved_time
/obj/item/assembly/timer/update_icon()
@@ -84,7 +92,9 @@
if(is_secured(user))
var/second = time % 60
var/minute = (time - second) / 60
- var/dat = "Timing Unit \n[(timing ? "Timing " : "Not Timing ")] [minute]:[second]\n- - + + \n "
+ var/dat = "Timing Unit "
+ dat += " [(timing ? "Timing " : "Not Timing ")] [minute]:[second]"
+ dat += "- - + + "
dat += "Stop repeating" : "1'>Set to repeat")] "
dat += "Refresh "
dat += "Close "
@@ -95,7 +105,7 @@
/obj/item/assembly/timer/Topic(href, href_list)
..()
- if(usr.incapacitated() || !in_range(loc, usr))
+ if(!usr.canUseTopic(src, BE_CLOSE))
usr << browse(null, "window=timer")
onclose(usr, "timer")
return
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 71f51aaaf9..ca97752d90 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -1,14 +1,19 @@
+#define INCLUSIVE_MODE 1
+#define EXCLUSIVE_MODE 2
+#define RECOGNIZER_MODE 3
+#define VOICE_SENSOR_MODE 4
+
/obj/item/assembly/voice
name = "voice analyzer"
desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated."
icon_state = "voice"
materials = list(MAT_METAL=500, MAT_GLASS=50)
flags_1 = HEAR_1
- attachable = 1
+ attachable = TRUE
verb_say = "beeps"
verb_ask = "beeps"
verb_exclaim = "beeps"
- var/listening = 0
+ var/listening = FALSE
var/recorded = "" //the activation message
var/mode = 1
var/static/list/modes = list("inclusive",
@@ -32,60 +37,64 @@
/obj/item/assembly/voice/proc/record_speech(atom/movable/speaker, raw_message, datum/language/message_language)
switch(mode)
- if(1)
+ if(INCLUSIVE_MODE)
recorded = raw_message
- listening = 0
+ listening = FALSE
say("Activation message is '[recorded]'.", message_language)
- if(2)
+ if(EXCLUSIVE_MODE)
recorded = raw_message
- listening = 0
+ listening = FALSE
say("Activation message is '[recorded]'.", message_language)
- if(3)
+ if(RECOGNIZER_MODE)
recorded = speaker.GetVoice()
- listening = 0
+ listening = FALSE
say("Your voice pattern is saved.", message_language)
- if(4)
+ if(VOICE_SENSOR_MODE)
if(length(raw_message))
addtimer(CALLBACK(src, .proc/pulse, 0), 10)
/obj/item/assembly/voice/proc/check_activation(atom/movable/speaker, raw_message)
- . = 0
+ . = FALSE
switch(mode)
- if(1)
+ if(INCLUSIVE_MODE)
if(findtext(raw_message, recorded))
- . = 1
- if(2)
+ . = TRUE
+ if(EXCLUSIVE_MODE)
if(raw_message == recorded)
- . = 1
- if(3)
+ . = TRUE
+ if(RECOGNIZER_MODE)
if(speaker.GetVoice() == recorded)
- . = 1
- if(4)
+ . = TRUE
+ if(VOICE_SENSOR_MODE)
if(length(raw_message))
- . = 1
+ . = TRUE
-/obj/item/assembly/voice/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/multitool))
- mode %= modes.len
- mode++
- to_chat(user, "You set [src] into a [modes[mode]] mode.")
- listening = 0
- recorded = ""
- else
- return ..()
+/obj/item/assembly/voice/multitool_act(mob/living/user, obj/item/I)
+ mode %= modes.len
+ mode++
+ to_chat(user, "You set [src] into [modes[mode]] mode. ")
+ listening = FALSE
+ recorded = ""
+ return TRUE
/obj/item/assembly/voice/activate()
- if(secured)
- if(!holder)
- listening = !listening
- say("[listening ? "Now" : "No longer"] recording input.")
+ if(!secured || holder)
+ return FALSE
+ listening = !listening
+ say("[listening ? "Now" : "No longer"] recording input.")
+ return TRUE
/obj/item/assembly/voice/attack_self(mob/user)
if(!user)
- return 0
+ return FALSE
activate()
- return 1
+ return TRUE
/obj/item/assembly/voice/toggle_secure()
. = ..()
- listening = 0
+ listening = FALSE
+
+#undef INCLUSIVE_MODE
+#undef EXCLUSIVE_MODE
+#undef RECOGNIZER_MODE
+#undef VOICE_SENSOR_MODE
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index c58d14f4d4..a3c9c68d55 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -94,7 +94,7 @@
for(var/A in location)
var/atom/AT = A
- if(AT && AT != src) // It's possible that the item is deleted in temperature_expose
+ if(!QDELETED(AT) && AT != src) // It's possible that the item is deleted in temperature_expose
AT.fire_act(temperature, volume)
return
diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
index 75b744e597..6e78256c87 100644
--- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
@@ -4,11 +4,11 @@ What are the archived variables for?
This prevents race conditions that arise based on the order of tile processing.
*/
#define MINIMUM_HEAT_CAPACITY 0.0003
+#define MINIMUM_MOLE_COUNT 0.01
#define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that
once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */
GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache())
-GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide))) // These gasses cannot react amongst themselves
/proc/init_gaslist_cache()
. = list()
diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm
index 0f1a21e1ce..12ad70a9e3 100644
--- a/code/modules/atmospherics/gasmixtures/gas_types.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_types.dm
@@ -1,4 +1,5 @@
GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma)) //the main four gases, which were at one time hardcoded
+GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/pluoxium, /datum/gas/stimulum, /datum/gas/nitryl))) //unable to react amongst themselves
/proc/meta_gas_list()
. = subtypesof(/datum/gas)
@@ -124,6 +125,7 @@ GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, /
specific_heat = 80
name = "Pluoxium"
fusion_power = 10
+
/obj/effect/overlay/gas
icon = 'icons/effects/tile_effects.dmi'
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index 689abbc388..dd953dcb11 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -1,10 +1,8 @@
//Plasma fire properties
#define OXYGEN_BURN_RATE_BASE 1.4
#define PLASMA_BURN_RATE_DELTA 9
-#define PLASMA_UPPER_TEMPERATURE (1370+T0C)
#define PLASMA_MINIMUM_OXYGEN_NEEDED 2
#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30
-#define PLASMA_OXYGEN_FULLBURN 10
#define FIRE_CARBON_ENERGY_RELEASED 100000 //Amount of heat released per mole of burnt carbon into the tile
#define FIRE_HYDROGEN_ENERGY_RELEASED 280000 // Amount of heat released per mole of burnt hydrogen and/or tritium(hydrogen isotope)
#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile
@@ -30,7 +28,6 @@
#define FUSION_PURITY_THRESHOLD 0.95
#define FUSION_HEAT_DROPOFF (20000+T0C)
#define NOBLIUM_FORMATION_ENERGY 2e9 //1 Mole of Noblium takes the planck energy to condense.
-/datum/controller/subsystem/air/var/list/gas_reactions //this is our singleton of all reactions
/proc/init_gas_reactions()
var/list/reaction_types = list()
@@ -49,7 +46,7 @@
/datum/gas_reaction
//regarding the requirements lists: the minimum or maximum requirements must be non-zero.
- //when in doubt, use MINIMUM_HEAT_CAPACITY.
+ //when in doubt, use MINIMUM_MOLE_COUNT.
var/list/min_requirements
var/list/max_requirements
var/exclude = FALSE //do it this way to allow for addition/removal of reactions midmatch in the future
@@ -61,6 +58,7 @@
init_reqs()
/datum/gas_reaction/proc/init_reqs()
+
/datum/gas_reaction/proc/react(datum/gas_mixture/air, atom/location)
return NO_REACTION
@@ -94,16 +92,20 @@
air.gases[/datum/gas/water_vapor][MOLES] -= MOLES_GAS_VISIBLE
. = REACTING
-//fire: combustion of plasma and volatile fuel (treated as hydrocarbons). creates hotspots. exothermic
-/datum/gas_reaction/fire
- priority = -1 //fire should ALWAYS be last
- name = "Hydrocarbon Combustion"
- id = "fire"
+//tritium combustion: combustion of oxygen and tritium (treated as hydrocarbons). creates hotspots. exothermic
+/datum/gas_reaction/tritfire
+ priority = -1 //fire should ALWAYS be last, but tritium fires happen before plasma fires
+ name = "Tritium Combustion"
+ id = "tritfire"
-/datum/gas_reaction/fire/init_reqs()
- min_requirements = list("TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST) //doesn't include plasma reqs b/c of other, rarer, burning gases.
+/datum/gas_reaction/tritfire/init_reqs()
+ min_requirements = list(
+ "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST,
+ /datum/gas/tritium = MINIMUM_MOLE_COUNT,
+ /datum/gas/oxygen = MINIMUM_MOLE_COUNT
+ )
-/datum/gas_reaction/fire/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/tritfire/react(datum/gas_mixture/air, datum/holder)
var/energy_released = 0
var/old_heat_capacity = air.heat_capacity()
var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow
@@ -112,65 +114,99 @@
cached_results[id] = 0
var/turf/open/location = isturf(holder) ? holder : null
- //General volatile gas burn
- if(cached_gases[/datum/gas/tritium] && cached_gases[/datum/gas/tritium][MOLES])
- var/burned_fuel
- if(!cached_gases[/datum/gas/oxygen])
- burned_fuel = 0
- else if(cached_gases[/datum/gas/oxygen][MOLES] < cached_gases[/datum/gas/tritium][MOLES])
- burned_fuel = cached_gases[/datum/gas/oxygen][MOLES]/TRITIUM_BURN_OXY_FACTOR
- cached_gases[/datum/gas/tritium][MOLES] -= burned_fuel
- else
- burned_fuel = cached_gases[/datum/gas/tritium][MOLES]*TRITIUM_BURN_TRIT_FACTOR
- cached_gases[/datum/gas/tritium][MOLES] -= cached_gases[/datum/gas/tritium][MOLES]/TRITIUM_BURN_TRIT_FACTOR
- cached_gases[/datum/gas/oxygen][MOLES] -= cached_gases[/datum/gas/tritium][MOLES]
+ var/burned_fuel = 0
+ if(cached_gases[/datum/gas/oxygen][MOLES] < cached_gases[/datum/gas/tritium][MOLES])
+ burned_fuel = cached_gases[/datum/gas/oxygen][MOLES]/TRITIUM_BURN_OXY_FACTOR
+ cached_gases[/datum/gas/tritium][MOLES] -= burned_fuel
+ else
+ burned_fuel = cached_gases[/datum/gas/tritium][MOLES]*TRITIUM_BURN_TRIT_FACTOR
+ cached_gases[/datum/gas/tritium][MOLES] -= cached_gases[/datum/gas/tritium][MOLES]/TRITIUM_BURN_TRIT_FACTOR
+ cached_gases[/datum/gas/oxygen][MOLES] -= cached_gases[/datum/gas/tritium][MOLES]
- if(burned_fuel)
- energy_released += FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel
- if(location && prob(10) && burned_fuel > TRITIUM_MINIMUM_RADIATION_ENERGY) //woah there let's not crash the server
- radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR)
+ if(burned_fuel)
+ energy_released += FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel
+ if(location && prob(10) && burned_fuel > TRITIUM_MINIMUM_RADIATION_ENERGY) //woah there let's not crash the server
+ radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR)
- ASSERT_GAS(/datum/gas/water_vapor, air) //oxygen+more-or-less hydrogen=H2O
- cached_gases[/datum/gas/water_vapor][MOLES] += burned_fuel/TRITIUM_BURN_OXY_FACTOR
+ ASSERT_GAS(/datum/gas/water_vapor, air) //oxygen+more-or-less hydrogen=H2O
+ cached_gases[/datum/gas/water_vapor][MOLES] += burned_fuel/TRITIUM_BURN_OXY_FACTOR
- cached_results[id] += burned_fuel
+ cached_results[id] += burned_fuel
+
+ if(energy_released > 0)
+ var/new_heat_capacity = air.heat_capacity()
+ if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
+ air.temperature = (temperature*old_heat_capacity + energy_released)/new_heat_capacity
+
+ //let the floor know a fire is happening
+ if(istype(location))
+ temperature = air.temperature
+ if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
+ location.hotspot_expose(temperature, CELL_VOLUME)
+ for(var/I in location)
+ var/atom/movable/item = I
+ item.temperature_expose(air, temperature, CELL_VOLUME)
+ location.temperature_expose(air, temperature, CELL_VOLUME)
+
+ return cached_results[id] ? REACTING : NO_REACTION
+
+//plasma combustion: combustion of oxygen and plasma (treated as hydrocarbons). creates hotspots. exothermic
+/datum/gas_reaction/plasmafire
+ priority = -2 //fire should ALWAYS be last, but plasma fires happen after tritium fires
+ name = "Plasma Combustion"
+ id = "plasmafire"
+
+/datum/gas_reaction/plasmafire/init_reqs()
+ min_requirements = list(
+ "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST,
+ /datum/gas/plasma = MINIMUM_MOLE_COUNT,
+ /datum/gas/oxygen = MINIMUM_MOLE_COUNT
+ )
+
+/datum/gas_reaction/plasmafire/react(datum/gas_mixture/air, datum/holder)
+ var/energy_released = 0
+ var/old_heat_capacity = air.heat_capacity()
+ var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow
+ var/temperature = air.temperature
+ var/list/cached_results = air.reaction_results
+ cached_results[id] = 0
+ var/turf/open/location = isturf(holder) ? holder : null
//Handle plasma burning
- if(cached_gases[/datum/gas/plasma] && cached_gases[/datum/gas/plasma][MOLES] > MINIMUM_HEAT_CAPACITY)
- var/plasma_burn_rate = 0
- var/oxygen_burn_rate = 0
- //more plasma released at higher temperatures
- var/temperature_scale
- var/super_saturation
- if(temperature > PLASMA_UPPER_TEMPERATURE)
- temperature_scale = 1
+ var/plasma_burn_rate = 0
+ var/oxygen_burn_rate = 0
+ //more plasma released at higher temperatures
+ var/temperature_scale = 0
+ //to make tritium
+ var/super_saturation = FALSE
+
+ if(temperature > PLASMA_UPPER_TEMPERATURE)
+ temperature_scale = 1
+ else
+ temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE)
+ if(temperature_scale > 0)
+ oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale
+ if(cached_gases[/datum/gas/oxygen][MOLES] / cached_gases[/datum/gas/plasma][MOLES] > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium.
+ super_saturation = TRUE
+ if(cached_gases[/datum/gas/oxygen][MOLES] > cached_gases[/datum/gas/plasma][MOLES]*PLASMA_OXYGEN_FULLBURN)
+ plasma_burn_rate = (cached_gases[/datum/gas/plasma][MOLES]*temperature_scale)/PLASMA_BURN_RATE_DELTA
else
- temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE)
- if(temperature_scale > 0)
- var/o2 = cached_gases[/datum/gas/oxygen] ? cached_gases[/datum/gas/oxygen][MOLES] : 0
- oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale
- if(o2 / cached_gases[/datum/gas/plasma][MOLES] > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium.
- super_saturation = TRUE
- if(o2 > cached_gases[/datum/gas/plasma][MOLES]*PLASMA_OXYGEN_FULLBURN)
- plasma_burn_rate = (cached_gases[/datum/gas/plasma][MOLES]*temperature_scale)/PLASMA_BURN_RATE_DELTA
+ plasma_burn_rate = (temperature_scale*(cached_gases[/datum/gas/oxygen][MOLES]/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA
+
+ if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY)
+ plasma_burn_rate = min(plasma_burn_rate,cached_gases[/datum/gas/plasma][MOLES],cached_gases[/datum/gas/oxygen][MOLES]/oxygen_burn_rate) //Ensures matter is conserved properly
+ cached_gases[/datum/gas/plasma][MOLES] = QUANTIZE(cached_gases[/datum/gas/plasma][MOLES] - plasma_burn_rate)
+ cached_gases[/datum/gas/oxygen][MOLES] = QUANTIZE(cached_gases[/datum/gas/oxygen][MOLES] - (plasma_burn_rate * oxygen_burn_rate))
+ if (super_saturation)
+ ASSERT_GAS(/datum/gas/tritium,air)
+ cached_gases[/datum/gas/tritium][MOLES] += plasma_burn_rate
else
- plasma_burn_rate = (temperature_scale*(o2/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA
+ ASSERT_GAS(/datum/gas/carbon_dioxide,air)
+ cached_gases[/datum/gas/carbon_dioxide][MOLES] += plasma_burn_rate
- if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY)
- ASSERT_GAS(/datum/gas/carbon_dioxide, air) //don't need to assert o2, since if it isn't present we'll never reach this point anyway
- plasma_burn_rate = min(plasma_burn_rate,cached_gases[/datum/gas/plasma][MOLES],cached_gases[/datum/gas/oxygen][MOLES]/oxygen_burn_rate) //Ensures matter is conserved properly
- cached_gases[/datum/gas/plasma][MOLES] = QUANTIZE(cached_gases[/datum/gas/plasma][MOLES] - plasma_burn_rate)
- cached_gases[/datum/gas/oxygen][MOLES] = QUANTIZE(cached_gases[/datum/gas/oxygen][MOLES] - (plasma_burn_rate * oxygen_burn_rate))
- if (super_saturation)
- ASSERT_GAS(/datum/gas/tritium,air)
- cached_gases[/datum/gas/tritium][MOLES] += plasma_burn_rate
- else
- ASSERT_GAS(/datum/gas/carbon_dioxide,air)
- cached_gases[/datum/gas/carbon_dioxide][MOLES] += plasma_burn_rate
+ energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate)
- energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate)
-
- cached_results[id] += (plasma_burn_rate)*(1+oxygen_burn_rate)
+ cached_results[id] += (plasma_burn_rate)*(1+oxygen_burn_rate)
if(energy_released > 0)
var/new_heat_capacity = air.heat_capacity()
@@ -191,12 +227,11 @@
//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again.
/datum/gas_reaction/fusion
- exclude = FALSE
+ exclude = TRUE
priority = 2
name = "Plasmic Fusion"
id = "fusion"
-
/datum/gas_reaction/fusion/init_reqs()
min_requirements = list(
"ENER" = PLASMA_BINDING_ENERGY * 1000,
@@ -361,7 +396,7 @@
air.temperature = max(((air.temperature*old_heat_capacity + stim_energy_change)/new_heat_capacity),TCMB)
return REACTING
-/datum/gas_reaction/nobliumformation //Hyper-Nobelium formation is extrememly endothermic, but requires high temperatures to start. Due to its high mass, hyper-nobelium uses large amounts of nitrogen and tritium. BZ can be used as a catalyst to make it less endothermic.
+/datum/gas_reaction/nobliumformation //Hyper-Noblium formation is extrememly endothermic, but requires high temperatures to start. Due to its high mass, hyper-nobelium uses large amounts of nitrogen and tritium. BZ can be used as a catalyst to make it less endothermic.
priority = 6
name = "Hyper-Noblium condensation"
id = "nobformation"
@@ -380,8 +415,8 @@
var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(cached_gases[/datum/gas/bz][MOLES],1)))
if ((cached_gases[/datum/gas/tritium][MOLES] - 10*nob_formed < 0) || (cached_gases[/datum/gas/nitrogen][MOLES] - 20*nob_formed < 0))
return NO_REACTION
- cached_gases[/datum/gas/tritium][MOLES] = max(cached_gases[/datum/gas/tritium][MOLES]- 10*nob_formed,0)
- cached_gases[/datum/gas/nitrogen][MOLES] = max(cached_gases[/datum/gas/nitrogen][MOLES]- 20*nob_formed,0)
+ cached_gases[/datum/gas/tritium][MOLES] -= 10*nob_formed
+ cached_gases[/datum/gas/nitrogen][MOLES] -= 20*nob_formed
cached_gases[/datum/gas/hypernoblium][MOLES]+= nob_formed
@@ -392,10 +427,8 @@
#undef OXYGEN_BURN_RATE_BASE
#undef PLASMA_BURN_RATE_DELTA
-#undef PLASMA_UPPER_TEMPERATURE
#undef PLASMA_MINIMUM_OXYGEN_NEEDED
#undef PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO
-#undef PLASMA_OXYGEN_FULLBURN
#undef FIRE_CARBON_ENERGY_RELEASED
#undef FIRE_PLASMA_ENERGY_RELEASED
#undef WATER_VAPOR_FREEZE
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 381eccb3d8..7bfacbee26 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -153,6 +153,9 @@
req_access = null
req_one_access = null
+/obj/machinery/airalarm/syndicate //general syndicate access
+ req_access = list(ACCESS_SYNDICATE)
+
//all air alarms in area are connected via magic
/area
var/list/air_vent_names = list()
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index 28148c0364..5dcf95f3cf 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -34,8 +34,10 @@ Iconnery
var/turf/T = loc
if(level == 2 || !T.intact)
showpipe = TRUE
+ plane = GAME_PLANE
else
showpipe = FALSE
+ plane = FLOOR_PLANE
if(!showpipe)
return //no need to update the pipes if they aren't showing
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 8e602577ac..cc6344cf06 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -496,10 +496,10 @@
W.update_label(W.registered_name, W.assignment)
// The shielded hardsuit is already NODROP_1
- no_drops += H.get_item_by_slot(slot_gloves)
- no_drops += H.get_item_by_slot(slot_shoes)
- no_drops += H.get_item_by_slot(slot_w_uniform)
- no_drops += H.get_item_by_slot(slot_ears)
+ no_drops += H.get_item_by_slot(SLOT_GLOVES)
+ no_drops += H.get_item_by_slot(SLOT_SHOES)
+ no_drops += H.get_item_by_slot(SLOT_W_UNIFORM)
+ no_drops += H.get_item_by_slot(SLOT_EARS)
for(var/i in no_drops)
var/obj/item/I = i
I.flags_1 |= NODROP_1
diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm
index 37afb31a6b..9eec36f53a 100644
--- a/code/modules/cargo/exports/large_objects.dm
+++ b/code/modules/cargo/exports/large_objects.dm
@@ -101,7 +101,7 @@
export_types = list(/obj/machinery/iv_drip)
/datum/export/large/barrier
- cost = 325
+ cost = 100
unit_name = "security barrier"
export_types = list(/obj/item/grenade/barrier, /obj/structure/barricade/security)
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index a961e87c48..2d3ed07505 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1649,8 +1649,9 @@
. = ..()
if(prob(50))
var/mob/living/simple_animal/pet/dog/corgi/D = locate() in .
- qdel(D)
- new /mob/living/simple_animal/pet/dog/corgi/Lisa(.)
+ if(D.gender == FEMALE)
+ qdel(D)
+ new /mob/living/simple_animal/pet/dog/corgi/Lisa(.)
/datum/supply_pack/critter/cow
name = "Cow Crate"
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index c821204993..28a3ec23b9 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -157,12 +157,14 @@ GLOBAL_LIST_EMPTY(asset_datums)
//get an assetdatum or make a new one
/proc/get_asset_datum(var/type)
- if (!(type in GLOB.asset_datums))
- return new type()
- return GLOB.asset_datums[type]
+ return GLOB.asset_datums[type] || new type()
+
+/datum/asset
+ var/_abstract = /datum/asset
/datum/asset/New()
GLOB.asset_datums[type] = src
+ register()
/datum/asset/proc/register()
return
@@ -170,20 +172,173 @@ GLOBAL_LIST_EMPTY(asset_datums)
/datum/asset/proc/send(client)
return
+
//If you don't need anything complicated.
/datum/asset/simple
+ _abstract = /datum/asset/simple
var/assets = list()
var/verify = FALSE
/datum/asset/simple/register()
for(var/asset_name in assets)
register_asset(asset_name, assets[asset_name])
+
/datum/asset/simple/send(client)
send_asset_list(client,assets,verify)
+// For registering or sending multiple others at once
+/datum/asset/group
+ _abstract = /datum/asset/group
+ var/list/children
+
+/datum/asset/group/register()
+ for(var/type in children)
+ get_asset_datum(type)
+
+/datum/asset/group/send(client/C)
+ for(var/type in children)
+ var/datum/asset/A = get_asset_datum(type)
+ A.send(C)
+
+
+// spritesheet implementation - coalesces various icons into a single .png file
+// and uses CSS to select icons out of that file - saves on transferring some
+// 1400-odd individual PNG files
+#define SPR_SIZE 1
+#define SPR_IDX 2
+#define SPRSZ_COUNT 1
+#define SPRSZ_ICON 2
+#define SPRSZ_STRIPPED 3
+
+/datum/asset/spritesheet
+ _abstract = /datum/asset/spritesheet
+ var/name
+ var/list/sizes = list() // "32x32" -> list(10, icon/normal, icon/stripped)
+ var/list/sprites = list() // "foo_bar" -> list("32x32", 5)
+ var/verify = FALSE
+
+/datum/asset/spritesheet/register()
+ if (!name)
+ CRASH("spritesheet [type] cannot register without a name")
+ ensure_stripped()
+
+ var/res_name = "spritesheet_[name].css"
+ var/fname = "data/spritesheets/[res_name]"
+ call("rust_g", "file_write")(generate_css(), fname)
+ register_asset(res_name, file(fname))
+
+ for(var/size_id in sizes)
+ var/size = sizes[size_id]
+ register_asset("[name]_[size_id].png", size[SPRSZ_STRIPPED])
+
+/datum/asset/spritesheet/send(client/C)
+ if (!name)
+ return
+ var/all = list("spritesheet_[name].css")
+ for(var/size_id in sizes)
+ all += "[name]_[size_id].png"
+ send_asset_list(C, all, verify)
+
+/datum/asset/spritesheet/proc/ensure_stripped(sizes_to_strip = sizes)
+ for(var/size_id in sizes_to_strip)
+ var/size = sizes[size_id]
+ if (size[SPRSZ_STRIPPED])
+ continue
+
+ // save flattened version
+ var/fname = "data/spritesheets/[name]_[size_id].png"
+ fcopy(size[SPRSZ_ICON], fname)
+ var/error = call("rust_g", "dmi_strip_metadata")(fname)
+ if(length(error))
+ stack_trace("Failed to strip [name]_[size_id].png: [error]")
+ size[SPRSZ_STRIPPED] = icon(fname)
+
+/datum/asset/spritesheet/proc/generate_css()
+ var/list/out = list()
+
+ for (var/size_id in sizes)
+ var/size = sizes[size_id]
+ var/icon/tiny = size[SPRSZ_ICON]
+ out += ".[name][size_id]{display:inline-block;width:[tiny.Width()]px;height:[tiny.Height()]px;background:url('[name]_[size_id].png') no-repeat;}"
+
+ for (var/sprite_id in sprites)
+ var/sprite = sprites[sprite_id]
+ var/size_id = sprite[SPR_SIZE]
+ var/idx = sprite[SPR_IDX]
+ var/size = sizes[size_id]
+
+ var/icon/tiny = size[SPRSZ_ICON]
+ var/icon/big = size[SPRSZ_STRIPPED]
+ var/per_line = big.Width() / tiny.Width()
+ var/x = (idx % per_line) * tiny.Width()
+ var/y = round(idx / per_line) * tiny.Height()
+
+ out += ".[name][size_id].[sprite_id]{background-position:-[x]px -[y]px;}"
+
+ return out.Join("\n")
+
+/datum/asset/spritesheet/proc/Insert(sprite_name, icon/I, icon_state="", dir=SOUTH, frame=1, moving=FALSE)
+ I = icon(I, icon_state=icon_state, dir=dir, frame=frame, moving=moving)
+ if (!I || !length(icon_states(I))) // that direction or state doesn't exist
+ return
+ var/size_id = "[I.Width()]x[I.Height()]"
+ var/size = sizes[size_id]
+
+ if (sprites[sprite_name])
+ CRASH("duplicate sprite \"[sprite_name]\" in sheet [name] ([type])")
+
+ if (size)
+ var/position = size[SPRSZ_COUNT]++
+ var/icon/sheet = size[SPRSZ_ICON]
+ size[SPRSZ_STRIPPED] = null
+ sheet.Insert(I, icon_state=sprite_name)
+ sprites[sprite_name] = list(size_id, position)
+ else
+ sizes[size_id] = size = list(1, I, null)
+ sprites[sprite_name] = list(size_id, 0)
+
+/datum/asset/spritesheet/proc/InsertAll(prefix, icon/I, list/directions)
+ if (length(prefix))
+ prefix = "[prefix]-"
+
+ if (!directions)
+ directions = list(SOUTH)
+
+ for (var/icon_state_name in icon_states(I))
+ for (var/direction in directions)
+ var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]-" : ""
+ Insert("[prefix][prefix2][icon_state_name]", I, icon_state=icon_state_name, dir=direction)
+
+/datum/asset/spritesheet/proc/css_tag()
+ return {" "}
+
+/datum/asset/spritesheet/proc/icon_tag(sprite_name)
+ var/sprite = sprites[sprite_name]
+ if (!sprite)
+ return null
+ var/size_id = sprite[SPR_SIZE]
+ return {" "}
+
+#undef SPR_SIZE
+#undef SPR_IDX
+#undef SPRSZ_COUNT
+#undef SPRSZ_ICON
+#undef SPRSZ_STRIPPED
+
+
+/datum/asset/spritesheet/simple
+ _abstract = /datum/asset/spritesheet/simple
+ var/list/assets
+
+/datum/asset/spritesheet/simple/register()
+ for (var/key in assets)
+ Insert(key, assets[key])
+ ..()
+
//Generates assets based on iconstates of a single icon
/datum/asset/simple/icon_states
+ _abstract = /datum/asset/simple/icon_states
var/icon
var/list/directions = list(SOUTH)
var/frame = 1
@@ -209,6 +364,7 @@ GLOBAL_LIST_EMPTY(asset_datums)
register_asset(asset_name, asset)
/datum/asset/simple/icon_states/multiple_icons
+ _abstract = /datum/asset/simple/icon_states/multiple_icons
var/list/icons
/datum/asset/simple/icon_states/multiple_icons/register()
@@ -260,56 +416,63 @@ GLOBAL_LIST_EMPTY(asset_datums)
"smmon_6.gif" = 'icons/program_icons/smmon_6.gif'
)
-/datum/asset/simple/pda
+/datum/asset/spritesheet/simple/pda
+ name = "pda"
assets = list(
- "pda_atmos.png" = 'icons/pda_icons/pda_atmos.png',
- "pda_back.png" = 'icons/pda_icons/pda_back.png',
- "pda_bell.png" = 'icons/pda_icons/pda_bell.png',
- "pda_blank.png" = 'icons/pda_icons/pda_blank.png',
- "pda_boom.png" = 'icons/pda_icons/pda_boom.png',
- "pda_bucket.png" = 'icons/pda_icons/pda_bucket.png',
- "pda_medbot.png" = 'icons/pda_icons/pda_medbot.png',
- "pda_floorbot.png" = 'icons/pda_icons/pda_floorbot.png',
- "pda_cleanbot.png" = 'icons/pda_icons/pda_cleanbot.png',
- "pda_crate.png" = 'icons/pda_icons/pda_crate.png',
- "pda_cuffs.png" = 'icons/pda_icons/pda_cuffs.png',
- "pda_eject.png" = 'icons/pda_icons/pda_eject.png',
- "pda_flashlight.png" = 'icons/pda_icons/pda_flashlight.png',
- "pda_honk.png" = 'icons/pda_icons/pda_honk.png',
- "pda_mail.png" = 'icons/pda_icons/pda_mail.png',
- "pda_medical.png" = 'icons/pda_icons/pda_medical.png',
- "pda_menu.png" = 'icons/pda_icons/pda_menu.png',
- "pda_mule.png" = 'icons/pda_icons/pda_mule.png',
- "pda_notes.png" = 'icons/pda_icons/pda_notes.png',
- "pda_power.png" = 'icons/pda_icons/pda_power.png',
- "pda_rdoor.png" = 'icons/pda_icons/pda_rdoor.png',
- "pda_reagent.png" = 'icons/pda_icons/pda_reagent.png',
- "pda_refresh.png" = 'icons/pda_icons/pda_refresh.png',
- "pda_scanner.png" = 'icons/pda_icons/pda_scanner.png',
- "pda_signaler.png" = 'icons/pda_icons/pda_signaler.png',
- "pda_status.png" = 'icons/pda_icons/pda_status.png',
- "pda_dronephone.png" = 'icons/pda_icons/pda_dronephone.png'
+ "atmos" = 'icons/pda_icons/pda_atmos.png',
+ "back" = 'icons/pda_icons/pda_back.png',
+ "bell" = 'icons/pda_icons/pda_bell.png',
+ "blank" = 'icons/pda_icons/pda_blank.png',
+ "boom" = 'icons/pda_icons/pda_boom.png',
+ "bucket" = 'icons/pda_icons/pda_bucket.png',
+ "medbot" = 'icons/pda_icons/pda_medbot.png',
+ "floorbot" = 'icons/pda_icons/pda_floorbot.png',
+ "cleanbot" = 'icons/pda_icons/pda_cleanbot.png',
+ "crate" = 'icons/pda_icons/pda_crate.png',
+ "cuffs" = 'icons/pda_icons/pda_cuffs.png',
+ "eject" = 'icons/pda_icons/pda_eject.png',
+ "flashlight" = 'icons/pda_icons/pda_flashlight.png',
+ "honk" = 'icons/pda_icons/pda_honk.png',
+ "mail" = 'icons/pda_icons/pda_mail.png',
+ "medical" = 'icons/pda_icons/pda_medical.png',
+ "menu" = 'icons/pda_icons/pda_menu.png',
+ "mule" = 'icons/pda_icons/pda_mule.png',
+ "notes" = 'icons/pda_icons/pda_notes.png',
+ "power" = 'icons/pda_icons/pda_power.png',
+ "rdoor" = 'icons/pda_icons/pda_rdoor.png',
+ "reagent" = 'icons/pda_icons/pda_reagent.png',
+ "refresh" = 'icons/pda_icons/pda_refresh.png',
+ "scanner" = 'icons/pda_icons/pda_scanner.png',
+ "signaler" = 'icons/pda_icons/pda_signaler.png',
+ "status" = 'icons/pda_icons/pda_status.png',
+ "dronephone" = 'icons/pda_icons/pda_dronephone.png'
)
-/datum/asset/simple/paper
+/datum/asset/spritesheet/simple/paper
+ name = "paper"
assets = list(
- "large_stamp-clown.png" = 'icons/stamp_icons/large_stamp-clown.png',
- "large_stamp-deny.png" = 'icons/stamp_icons/large_stamp-deny.png',
- "large_stamp-ok.png" = 'icons/stamp_icons/large_stamp-ok.png',
- "large_stamp-hop.png" = 'icons/stamp_icons/large_stamp-hop.png',
- "large_stamp-cmo.png" = 'icons/stamp_icons/large_stamp-cmo.png',
- "large_stamp-ce.png" = 'icons/stamp_icons/large_stamp-ce.png',
- "large_stamp-hos.png" = 'icons/stamp_icons/large_stamp-hos.png',
- "large_stamp-rd.png" = 'icons/stamp_icons/large_stamp-rd.png',
- "large_stamp-cap.png" = 'icons/stamp_icons/large_stamp-cap.png',
- "large_stamp-qm.png" = 'icons/stamp_icons/large_stamp-qm.png',
- "large_stamp-law.png" = 'icons/stamp_icons/large_stamp-law.png'
+ "stamp-clown" = 'icons/stamp_icons/large_stamp-clown.png',
+ "stamp-deny" = 'icons/stamp_icons/large_stamp-deny.png',
+ "stamp-ok" = 'icons/stamp_icons/large_stamp-ok.png',
+ "stamp-hop" = 'icons/stamp_icons/large_stamp-hop.png',
+ "stamp-cmo" = 'icons/stamp_icons/large_stamp-cmo.png',
+ "stamp-ce" = 'icons/stamp_icons/large_stamp-ce.png',
+ "stamp-hos" = 'icons/stamp_icons/large_stamp-hos.png',
+ "stamp-rd" = 'icons/stamp_icons/large_stamp-rd.png',
+ "stamp-cap" = 'icons/stamp_icons/large_stamp-cap.png',
+ "stamp-qm" = 'icons/stamp_icons/large_stamp-qm.png',
+ "stamp-law" = 'icons/stamp_icons/large_stamp-law.png'
)
/datum/asset/simple/IRV
assets = list(
"jquery-ui.custom-core-widgit-mouse-sortable-min.js" = 'html/IRV/jquery-ui.custom-core-widgit-mouse-sortable-min.js',
- "jquery-1.10.2.min.js" = 'html/IRV/jquery-1.10.2.min.js'
+ )
+
+/datum/asset/group/IRV
+ children = list(
+ /datum/asset/simple/jquery,
+ /datum/asset/simple/IRV
)
/datum/asset/simple/changelog
@@ -335,10 +498,22 @@ GLOBAL_LIST_EMPTY(asset_datums)
"changelog.css" = 'html/changelog.css'
)
-/datum/asset/simple/goonchat
+/datum/asset/group/goonchat
+ children = list(
+ /datum/asset/simple/jquery,
+ /datum/asset/simple/goonchat,
+ /datum/asset/spritesheet/goonchat
+ )
+
+/datum/asset/simple/jquery
verify = FALSE
assets = list(
"jquery.min.js" = 'code/modules/goonchat/browserassets/js/jquery.min.js',
+ )
+
+/datum/asset/simple/goonchat
+ verify = FALSE
+ assets = list(
"json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js',
"errorHandler.js" = 'code/modules/goonchat/browserassets/js/errorHandler.js',
"browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js',
@@ -350,6 +525,24 @@ GLOBAL_LIST_EMPTY(asset_datums)
"browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css',
)
+/datum/asset/spritesheet/goonchat
+ name = "chat"
+
+/datum/asset/spritesheet/goonchat/register()
+ InsertAll("emoji", 'icons/emoji.dmi')
+
+ // pre-loading all lanugage icons also helps to avoid meta
+ InsertAll("language", 'icons/misc/language.dmi')
+ // catch languages which are pulling icons from another file
+ for(var/path in typesof(/datum/language))
+ var/datum/language/L = path
+ var/icon = initial(L.icon)
+ if (icon != 'icons/misc/language.dmi')
+ var/icon_state = initial(L.icon_state)
+ Insert("language-[icon_state]", icon, icon_state=icon_state)
+
+ ..()
+
/datum/asset/simple/permissions
assets = list(
"padlock.png" = 'html/padlock.png'
@@ -362,26 +555,19 @@ GLOBAL_LIST_EMPTY(asset_datums)
var/datum/language/L = new path ()
L.get_icon()
-/datum/asset/simple/icon_states/emojis
- icon = 'icons/emoji.dmi'
- generic_icon_names = TRUE
+/datum/asset/spritesheet/pipes
+ name = "pipes"
-/datum/asset/simple/icon_states/multiple_icons/pipes
- icons = list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi')
- prefix = "pipe"
-
-/datum/asset/simple/icon_states/multiple_icons/pipes/New()
- directions = GLOB.alldirs
+/datum/asset/spritesheet/pipes/register()
+ for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi'))
+ InsertAll("", each, GLOB.alldirs)
..()
-/datum/asset/simple/icon_states/multiple_icons/pipes/register()
- ..()
- var/meter = icon('icons/obj/atmospherics/pipes/simple.dmi', "meterX", SOUTH, frame, movement_states)
- if(meter)
- register_asset(sanitize_filename("[prefix].south.meterX.png"), fcopy_rsc(meter))
-
// Representative icons for each research design
-/datum/asset/simple/research_designs/register()
+/datum/asset/spritesheet/research_designs
+ name = "design"
+
+/datum/asset/spritesheet/research_designs/register()
for (var/path in subtypesof(/datum/design))
var/datum/design/D = path
@@ -401,7 +587,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
if (machine)
item = machine
var/icon_file = initial(item.icon)
- var/all_states = icon_states(icon_file)
var/icon/I = icon(icon_file, initial(item.icon_state), SOUTH)
// computers (and snowflakes) get their screen and keyboard sprites
@@ -409,10 +594,11 @@ GLOBAL_LIST_EMPTY(asset_datums)
var/obj/machinery/computer/C = item
var/screen = initial(C.icon_screen)
var/keyboard = initial(C.icon_keyboard)
+ var/all_states = icon_states(icon_file)
if (screen && (screen in all_states))
I.Blend(icon(icon_file, screen, SOUTH), ICON_OVERLAY)
if (keyboard && (keyboard in all_states))
I.Blend(icon(icon_file, keyboard, SOUTH), ICON_OVERLAY)
- assets["design_[initial(D.id)].png"] = I
+ Insert(initial(D.id), I)
return ..()
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 49d6c4b04a..dfecc6f633 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -92,7 +92,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
if (citadel_client_procs(href_list))
return
// CITADEL End
-
+
switch(href_list["_src_"])
if("holder")
hsrc = holder
@@ -115,16 +115,16 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
switch(href_list["action"])
if("openLink")
src << link(href_list["link"])
-
- var/datum/real_src = hsrc
- if(QDELETED(real_src))
- return
+ if (hsrc)
+ var/datum/real_src = hsrc
+ if(QDELETED(real_src))
+ return
..() //redirect to hsrc.Topic()
/client/proc/is_content_unlocked()
if(!prefs.unlock_content)
- to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Only 10 bucks for 3 months! Click Here to find out more .")
+ to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Only 10 bucks for 3 months! Click Here to find out more .")
return 0
return 1
@@ -165,6 +165,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
return var_name != NAMEOF(src, holder) && ..()
/client/New(TopicData)
+ world.SetConfig("APP/admin", ckey, "role=admin") //CITADEL EDIT - Allows admins to reboot in OOM situations
var/tdata = TopicData //save this for later use
chatOutput = new /datum/chatOutput(src)
TopicData = null //Prevent calls to client.Topic from connect
@@ -179,10 +180,15 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
var/connecting_admin = FALSE //because de-admined admins connecting should be treated like admins.
//Admin Authorisation
holder = GLOB.admin_datums[ckey]
+ var/debug_tools_allowed = FALSE //CITADEL EDIT
if(holder)
GLOB.admins |= src
holder.owner = src
connecting_admin = TRUE
+ //CITADEL EDIT
+ if(check_rights_for(src, R_DEBUG))
+ debug_tools_allowed = TRUE
+ //END CITADEL EDIT
else if(GLOB.deadmins[ckey])
verbs += /client/proc/readmin
connecting_admin = TRUE
@@ -197,6 +203,12 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
to_chat(world, "Autoadmin rank not found")
else
new /datum/admins(autorank, ckey)
+ //CITADEL EDIT
+ if(check_rights_for(src, R_DEBUG)) //check if autoadmin gave us it
+ debug_tools_allowed = TRUE
+ if(!debug_tools_allowed)
+ world.SetConfig("APP/admin", ckey, null)
+ //END CITADEL EDIT
if(CONFIG_GET(flag/enable_localhost_rank) && !connecting_admin)
var/localhost_addresses = list("127.0.0.1", "::1")
if(isnull(address) || (address in localhost_addresses))
@@ -211,6 +223,9 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
prefs.last_id = computer_id //these are gonna be used for banning
fps = prefs.clientfps
+ if(fexists(roundend_report_file()))
+ verbs += /client/proc/show_previous_roundend_report
+
log_access("Login: [key_name(src)] from [address ? address : "localhost"]-[computer_id] || BYOND v[byond_version]")
var/alert_mob_dupe_login = FALSE
if(CONFIG_GET(flag/log_access))
@@ -255,7 +270,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
log_access("Failed login: [key] - blacklisted byond version")
to_chat(src, "Your version of byond is blacklisted. ")
to_chat(src, "Byond build [byond_build] ([byond_version].[byond_build]) has been blacklisted for the following reason: [GLOB.blacklisted_builds[num2text(byond_build)]]. ")
- to_chat(src, "Please download a new version of byond. if [byond_build] is the latest, you can go to http://www.byond.com/download/build/ to download other versions. ")
+ to_chat(src, "Please download a new version of byond. If [byond_build] is the latest, you can go to BYOND's website to download other versions. ")
if(connecting_admin)
to_chat(src, "As an admin, you are being allowed to continue using this version, but please consider changing byond versions")
else
@@ -278,11 +293,11 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
var/cev = CONFIG_GET(number/client_error_version)
var/cwv = CONFIG_GET(number/client_warn_version)
if (byond_version < cev) //Out of date client.
- to_chat(src, "Your version of byond is too old: ")
+ to_chat(src, "Your version of BYOND is too old: ")
to_chat(src, CONFIG_GET(string/client_error_message))
to_chat(src, "Your version: [byond_version]")
to_chat(src, "Required version: [cev] or later")
- to_chat(src, "Visit http://www.byond.com/download/ to get the latest version of byond.")
+ to_chat(src, "Visit BYOND's website to get the latest version of BYOND.")
if (connecting_admin)
to_chat(src, "Because you are an admin, you are being allowed to walk past this limitation, But it is still STRONGLY suggested you upgrade")
else
@@ -294,14 +309,14 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
msg += CONFIG_GET(string/client_warn_message) + " "
msg += "Your version: [byond_version] "
msg += "Required version to remove this message: [cwv] or later "
- msg += "Visit http://www.byond.com/download/ to get the latest version of byond. "
+ msg += "Visit BYOND's website to get the latest version of BYOND. "
src << browse(msg, "window=warning_popup")
else
to_chat(src, "Your version of byond may be getting out of date: ")
to_chat(src, CONFIG_GET(string/client_warn_message))
to_chat(src, "Your version: [byond_version]")
to_chat(src, "Required version to remove this message: [cwv] or later")
- to_chat(src, "Visit http://www.byond.com/download/ to get the latest version of byond.")
+ to_chat(src, "Visit BYOND's website to get the latest version of BYOND.")
if (connection == "web" && !connecting_admin)
if (!CONFIG_GET(flag/allow_webclient))
@@ -381,7 +396,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
winset(src, "[topmenu.type]", "parent=menu;name=[url_encode(topmenuname)]")
var/list/entries = topmenu.Generate_list(src)
for (var/child in entries)
- winset(src, "[url_encode(child)]", "[entries[child]]")
+ winset(src, "[child]", "[entries[child]]")
if (!ispath(child, /datum/verbs/menu))
var/atom/verb/verbpath = child
if (copytext(verbpath.name,1,2) != "@")
@@ -391,9 +406,9 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
var/datum/verbs/menu/menuitem = GLOB.menulist[thing]
if (menuitem)
menuitem.Load_checked(src)
-
+
hook_vr("client_new",list(src)) // CIT CHANGE - hook for client/New() changes
-
+
Master.UpdateTickRate()
//////////////
@@ -472,7 +487,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
if (CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey])
log_access("Failed Login: [key] - New account attempting to connect during panic bunker")
message_admins("Failed Login: [key] - New account attempting to connect during panic bunker ")
- to_chat(src, "Sorry but the server is currently not accepting connections from never before seen players.")
+ to_chat(src, "You must first join the Discord to verify your account before joining this server. Please ping an admin once you've joined and read the rules. https://discord.gg/E6SQuhz") //CIT CHANGE - makes the panic bunker disconnect message point to the discord
var/list/connectiontopic_a = params2list(connectiontopic)
var/list/panic_addr = CONFIG_GET(string/panic_server_address)
if(panic_addr && !connectiontopic_a["redirect"])
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 7558380a36..7eb1c25455 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -83,12 +83,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//Mob preview
var/icon/preview_icon = null
- //Trait list
- var/list/positive_traits = list()
- var/list/negative_traits = list()
- var/list/neutral_traits = list()
- var/list/all_traits = list()
- var/list/character_traits = list()
+ //Quirk list
+ var/list/positive_quirks = list()
+ var/list/negative_quirks = list()
+ var/list/neutral_quirks = list()
+ var/list/all_quirks = list()
+ var/list/character_quirks = list()
//Jobs, uses bitflags
var/job_civilian_high = 0
@@ -120,6 +120,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/parallax
+ var/ambientocclusion = TRUE
+
var/uplink_spawn_loc = UPLINK_PDA
var/list/exp = list()
@@ -193,9 +195,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Occupation Choices "
dat += "Set Occupation Preferences "
if(CONFIG_GET(flag/roundstart_traits))
- dat += "Trait Setup "
- dat += "Configure Traits "
- dat += "Current traits: [all_traits.len ? all_traits.Join(", ") : "None"] "
+ dat += "Quirk Setup "
+ dat += "Configure Quirks "
+ dat += "Current Quirks: [all_quirks.len ? all_quirks.Join(", ") : "None"] "
dat += "Identity "
dat += ""
if(jobban_isbanned(user, "appearance"))
@@ -490,6 +492,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "High"
dat += " "
+ dat += "Ambient Occlusion: [ambientocclusion ? "Enabled" : "Disabled"] "
+
dat += " "
dat += "Special Role Settings "
@@ -855,72 +859,72 @@ GLOBAL_LIST_EMPTY(preferences_datums)
return job_engsec_low
return 0
-/datum/preferences/proc/SetTraits(mob/user)
- if(!SStraits)
- to_chat(user, "The trait subsystem is still initializing! Try again in a minute. ")
+/datum/preferences/proc/SetQuirks(mob/user)
+ if(!SSquirks)
+ to_chat(user, "The quirk subsystem is still initializing! Try again in a minute. ")
return
var/list/dat = list()
- if(!SStraits.traits.len)
- dat += "The trait subsystem hasn't finished initializing, please hold..."
+ if(!SSquirks.quirks.len)
+ dat += "The quirk subsystem hasn't finished initializing, please hold..."
dat += "Done "
else
- dat += "Choose trait setup "
- dat += "Left-click to add or remove traits. You need one negative trait for every positive trait. \
- Traits are applied at roundstart and cannot normally be removed.
"
+ dat += "Choose quirk setup "
+ dat += "Left-click to add or remove quirks. You need negative quirks to have positive ones. \
+ Quirks are applied at roundstart and cannot normally be removed.
"
dat += "Done "
dat += " "
- dat += "Current traits: [all_traits.len ? all_traits.Join(", ") : "None"] "
- dat += "[all_traits.len] / [MAX_TRAITS] max traits \
- Trait balance remaining: [GetTraitBalance()] "
- for(var/V in SStraits.traits)
- var/datum/trait/T = SStraits.traits[V]
- var/trait_name = initial(T.name)
- var/has_trait
- var/trait_cost = initial(T.value) * -1
+ dat += "Current quirks: [all_quirks.len ? all_quirks.Join(", ") : "None"] "
+ dat += "[positive_quirks.len] / [MAX_QUIRKS] max positive quirks \
+ Quirk balance remaining: [GetQuirkBalance()] "
+ for(var/V in SSquirks.quirks)
+ var/datum/quirk/T = SSquirks.quirks[V]
+ var/quirk_name = initial(T.name)
+ var/has_quirk
+ var/quirk_cost = initial(T.value) * -1
var/lock_reason = "This trait is unavailable."
- var/trait_conflict = FALSE
- for(var/_V in all_traits)
- if(_V == trait_name)
- has_trait = TRUE
- if(initial(T.mood_trait) && CONFIG_GET(flag/disable_human_mood))
+ var/quirk_conflict = FALSE
+ for(var/_V in all_quirks)
+ if(_V == quirk_name)
+ has_quirk = TRUE
+ if(initial(T.mood_quirk) && CONFIG_GET(flag/disable_human_mood))
lock_reason = "Mood is disabled."
- trait_conflict = TRUE
- if(has_trait)
- if(trait_conflict)
- all_traits -= trait_name
- has_trait = FALSE
+ quirk_conflict = TRUE
+ if(has_quirk)
+ if(quirk_conflict)
+ all_quirks -= quirk_name
+ has_quirk = FALSE
else
- trait_cost *= -1 //invert it back, since we'd be regaining this amount
- if(trait_cost > 0)
- trait_cost = "+[trait_cost]"
+ quirk_cost *= -1 //invert it back, since we'd be regaining this amount
+ if(quirk_cost > 0)
+ quirk_cost = "+[quirk_cost]"
var/font_color = "#AAAAFF"
if(initial(T.value) != 0)
font_color = initial(T.value) > 0 ? "#AAFFAA" : "#FFAAAA"
- if(trait_conflict)
- dat += "[trait_name] - [initial(T.desc)] \
+ if(quirk_conflict)
+ dat += "[quirk_name] - [initial(T.desc)] \
LOCKED: [lock_reason] "
else
- if(has_trait)
- dat += "[trait_name] - [initial(T.desc)] \
- [has_trait ? "Lose" : "Take"] ([trait_cost] pts.) "
+ if(has_quirk)
+ dat += "[quirk_name] - [initial(T.desc)] \
+ [has_quirk ? "Lose" : "Take"] ([quirk_cost] pts.) "
else
- dat += "[trait_name] - [initial(T.desc)] \
- [has_trait ? "Lose" : "Take"] ([trait_cost] pts.) "
+ dat += "[quirk_name] - [initial(T.desc)] \
+ [has_quirk ? "Lose" : "Take"] ([quirk_cost] pts.) "
dat += "Reset Traits "
user << browse(null, "window=preferences")
- var/datum/browser/popup = new(user, "mob_occupation", "Trait Preferences
", 900, 600) //no reason not to reuse the occupation window, as it's cleaner that way
+ var/datum/browser/popup = new(user, "mob_occupation", "Quirk Preferences
", 900, 600) //no reason not to reuse the occupation window, as it's cleaner that way
popup.set_window_options("can_close=0")
popup.set_content(dat.Join())
popup.open(0)
return
-/datum/preferences/proc/GetTraitBalance()
+/datum/preferences/proc/GetQuirkBalance()
var/bal = 0
- for(var/V in all_traits)
- var/datum/trait/T = SStraits.traits[V]
+ for(var/V in all_quirks)
+ var/datum/quirk/T = SSquirks.quirks[V]
bal -= initial(T.value)
return bal
@@ -977,55 +981,49 @@ GLOBAL_LIST_EMPTY(preferences_datums)
user << browse(null, "window=mob_occupation")
ShowChoices(user)
if("update")
- var/trait = href_list["trait"]
- if(!SStraits.traits[trait])
+ var/quirk = href_list["trait"]
+ if(!SSquirks.quirks[quirk])
return
- var/value = SStraits.trait_points[trait]
+ var/value = SSquirks.quirk_points[quirk]
if(value == 0)
- if(trait in neutral_traits)
- neutral_traits -= trait
- all_traits -= trait
+ if(quirk in neutral_quirks)
+ neutral_quirks -= quirk
+ all_quirks -= quirk
else
- if(all_traits.len >= MAX_TRAITS)
- to_chat(user, "You can't have more than [MAX_TRAITS] traits! ")
- return
- neutral_traits += trait
- all_traits += trait
+ neutral_quirks += quirk
+ all_quirks += quirk
else
- var/balance = GetTraitBalance()
- if(trait in positive_traits)
- positive_traits -= trait
- all_traits -= trait
- else if(trait in negative_traits)
+ var/balance = GetQuirkBalance()
+ if(quirk in positive_quirks)
+ positive_quirks -= quirk
+ all_quirks -= quirk
+ else if(quirk in negative_quirks)
if(balance + value < 0)
to_chat(user, "Refunding this would cause you to go below your balance! ")
return
- negative_traits -= trait
- all_traits -= trait
+ negative_quirks -= quirk
+ all_quirks -= quirk
else if(value > 0)
- if(all_traits.len >= MAX_TRAITS)
- to_chat(user, "You can't have more than [MAX_TRAITS] traits! ")
+ if(positive_quirks.len >= MAX_QUIRKS)
+ to_chat(user, "You can't have more than [MAX_QUIRKS] positive quirks! ")
return
if(balance - value < 0)
- to_chat(user, "You don't have enough balance to gain this trait! ")
+ to_chat(user, "You don't have enough balance to gain this quirk! ")
return
- positive_traits += trait
- all_traits += trait
+ positive_quirks += quirk
+ all_quirks += quirk
else
- if(all_traits.len >= MAX_TRAITS)
- to_chat(user, "You can't have more than [MAX_TRAITS] traits! ")
- return
- negative_traits += trait
- all_traits += trait
- SetTraits(user)
+ negative_quirks += quirk
+ all_quirks += quirk
+ SetQuirks(user)
if("reset")
- all_traits = list()
- positive_traits = list()
- negative_traits = list()
- neutral_traits = list()
- SetTraits(user)
+ all_quirks = list()
+ positive_quirks = list()
+ negative_quirks = list()
+ neutral_quirks = list()
+ SetQuirks(user)
else
- SetTraits(user)
+ SetQuirks(user)
return TRUE
switch(href_list["task"])
@@ -1535,6 +1533,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
cit_toggles ^= DIGESTION_NOISES
//END CITADEL EDIT
+ if("ambientocclusion")
+ ambientocclusion = !ambientocclusion
+ 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.backdrop(parent.mob)
+
if("save")
save_preferences()
save_character()
@@ -1642,4 +1646,4 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(icon_updates)
character.update_body()
character.update_hair()
- character.update_body_parts()
\ No newline at end of file
+ character.update_body_parts()
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index d2efc477c6..f17ddf8b7c 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -130,6 +130,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["uses_glasses_colour"]>> uses_glasses_colour
S["clientfps"] >> clientfps
S["parallax"] >> parallax
+ S["ambientocclusion"] >> ambientocclusion
S["menuoptions"] >> menuoptions
S["enable_tips"] >> enable_tips
S["tip_delay"] >> tip_delay
@@ -160,6 +161,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
toggles = sanitize_integer(toggles, 0, 65535, initial(toggles))
clientfps = sanitize_integer(clientfps, 0, 1000, 0)
parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null)
+ ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion))
ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form))
ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit))
ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION)
@@ -210,6 +212,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["uses_glasses_colour"], uses_glasses_colour)
WRITE_FILE(S["clientfps"], clientfps)
WRITE_FILE(S["parallax"], parallax)
+ WRITE_FILE(S["ambientocclusion"], ambientocclusion)
WRITE_FILE(S["menuoptions"], menuoptions)
WRITE_FILE(S["enable_tips"], enable_tips)
WRITE_FILE(S["tip_delay"], tip_delay)
@@ -310,11 +313,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["job_engsec_med"] >> job_engsec_med
S["job_engsec_low"] >> job_engsec_low
- //Traits
- S["all_traits"] >> all_traits
- S["positive_traits"] >> positive_traits
- S["negative_traits"] >> negative_traits
- S["neutral_traits"] >> neutral_traits
+ //Quirks
+ S["all_quirks"] >> all_quirks
+ S["positive_quirks"] >> positive_quirks
+ S["negative_quirks"] >> negative_quirks
+ S["neutral_quirks"] >> neutral_quirks
//Citadel code
S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"]
@@ -421,10 +424,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med))
job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low))
- all_traits = SANITIZE_LIST(all_traits)
- positive_traits = SANITIZE_LIST(positive_traits)
- negative_traits = SANITIZE_LIST(negative_traits)
- neutral_traits = SANITIZE_LIST(neutral_traits)
+ all_quirks = SANITIZE_LIST(all_quirks)
+ positive_quirks = SANITIZE_LIST(positive_quirks)
+ negative_quirks = SANITIZE_LIST(negative_quirks)
+ neutral_quirks = SANITIZE_LIST(neutral_quirks)
cit_character_pref_load(S)
@@ -491,11 +494,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["job_engsec_med"] , job_engsec_med)
WRITE_FILE(S["job_engsec_low"] , job_engsec_low)
- //Traits
- WRITE_FILE(S["all_traits"] , all_traits)
- WRITE_FILE(S["positive_traits"] , positive_traits)
- WRITE_FILE(S["negative_traits"] , negative_traits)
- WRITE_FILE(S["neutral_traits"] , neutral_traits)
+ //Quirks
+ WRITE_FILE(S["all_quirks"] , all_quirks)
+ WRITE_FILE(S["positive_quirks"] , positive_quirks)
+ WRITE_FILE(S["negative_quirks"] , negative_quirks)
+ WRITE_FILE(S["neutral_quirks"] , neutral_quirks)
cit_character_pref_save(S)
diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
index e9c4c29a5e..ccf99b5b7e 100644
--- a/code/modules/client/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -294,3 +294,10 @@ GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR)
to_chat(src, "You can't ignore yourself.")
return
ignore_key(selection)
+
+/client/proc/show_previous_roundend_report()
+ set name = "Your Last Round"
+ set category = "OOC"
+ set desc = "View the last round end report you've seen"
+
+ SSticker.show_roundend_report(src, TRUE)
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index 80562a5c80..4be9df8298 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -63,8 +63,8 @@
// it's NODROP_1
D.dropItemToGround(target, TRUE)
qdel(old_headgear)
- // where is `slot_head` defined? WHO KNOWS
- D.equip_to_slot(new_headgear, slot_head)
+ // where is `SLOT_HEAD` defined? WHO KNOWS
+ D.equip_to_slot(new_headgear, SLOT_HEAD)
return 1
@@ -331,8 +331,7 @@
item_state = "gas_alt"
resistance_flags = NONE
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
-
- flags_1 = BLOCK_GAS_SMOKE_EFFECT_1 | MASKINTERNALS_1
+ clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
@@ -408,7 +407,7 @@
icon_state = "black"
item_color = "black"
desc = "A pair of black shoes."
- flags_1 = NOSLIP_1
+ clothing_flags = NOSLIP
/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize()
. = ..()
@@ -637,4 +636,3 @@
/obj/item/pda/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
-
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index b15109bcb1..e303e3c1c2 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -24,9 +24,11 @@
var/can_flashlight = 0
var/scan_reagents = 0 //Can the wearer see reagents while it's equipped?
+ var/clothing_flags = NONE
+
//Var modification - PLEASE be careful with this I know who you are and where you live
- var/list/user_vars_to_edit = list() //VARNAME = VARVALUE eg: "name" = "butts"
- var/list/user_vars_remembered = list() //Auto built by the above + dropped() + equipped()
+ var/list/user_vars_to_edit //VARNAME = VARVALUE eg: "name" = "butts"
+ var/list/user_vars_remembered //Auto built by the above + dropped() + equipped()
var/pocket_storage_component_path
@@ -72,21 +74,23 @@
..()
if(!istype(user))
return
- if(user_vars_remembered && user_vars_remembered.len)
+ if(LAZYLEN(user_vars_remembered))
for(var/variable in user_vars_remembered)
if(variable in user.vars)
if(user.vars[variable] == user_vars_to_edit[variable]) //Is it still what we set it to? (if not we best not change it)
user.vars[variable] = user_vars_remembered[variable]
- user_vars_remembered = list()
+ user_vars_remembered = initial(user_vars_remembered) // Effectively this sets it to null.
/obj/item/clothing/equipped(mob/user, slot)
..()
-
+ if (!istype(user))
+ return
if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item?
- for(var/variable in user_vars_to_edit)
- if(variable in user.vars)
- user_vars_remembered[variable] = user.vars[variable]
- user.vars[variable] = user_vars_to_edit[variable]
+ if (LAZYLEN(user_vars_to_edit))
+ for(var/variable in user_vars_to_edit)
+ if(variable in user.vars)
+ LAZYSET(user_vars_remembered, variable, user.vars[variable])
+ user.vars[variable] = user_vars_to_edit[variable]
/obj/item/clothing/examine(mob/user)
..()
@@ -260,7 +264,7 @@ BLIND // can't see anything
/obj/item/clothing/proc/visor_toggling() //handles all the actual toggling of flags
up = !up
- flags_1 ^= visor_flags
+ clothing_flags ^= visor_flags
flags_inv ^= visor_flags_inv
flags_cover ^= initial(flags_cover)
icon_state = "[initial(icon_state)][up ? "up" : ""]"
@@ -285,4 +289,4 @@ BLIND // can't see anything
Shreds.desc = "The sad remains of what used to be [name]."
deconstruct(FALSE)
else
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm
index 0ff1bdefe3..3a1e246d04 100644
--- a/code/modules/clothing/ears/_ears.dm
+++ b/code/modules/clothing/ears/_ears.dm
@@ -1,46 +1,46 @@
+//Ears: currently only used for headsets and earmuffs
+
/obj/item/clothing/ears
+
name = "ears"
+
w_class = WEIGHT_CLASS_TINY
+
throwforce = 0
+
slot_flags = ITEM_SLOT_EARS
+
resistance_flags = NONE
-//Ears: currently only used for headsets and earmuffs
-/obj/item/clothing/ears
- name = "ears"
- w_class = WEIGHT_CLASS_TINY
- throwforce = 0
- slot_flags = SLOT_EARS
- resistance_flags = NONE
+
/obj/item/clothing/ears/earmuffs
+
name = "earmuffs"
+
desc = "Protects your hearing from loud noises, and quiet ones as well."
+
icon_state = "earmuffs"
+
item_state = "earmuffs"
+
strip_delay = 15
+
equip_delay_other = 25
+
resistance_flags = FLAMMABLE
+
flags_2 = BANG_PROTECT_2|HEALS_EARS_2
-/obj/item/clothing/ears/earmuffs
- name = "earmuffs"
- desc = "Protects your hearing from loud noises, and quiet ones as well."
- icon_state = "earmuffs"
- item_state = "earmuffs"
- strip_delay = 15
- equip_delay_other = 25
- resistance_flags = FLAMMABLE
- flags_2 = BANG_PROTECT_2|HEALS_EARS_2
+
/obj/item/clothing/ears/headphones
+
name = "headphones"
+
desc = "Unce unce unce unce. Boop!"
+
icon = 'icons/obj/clothing/accessories.dmi'
+
icon_state = "headphones"
+
item_state = "headphones"
+
slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD | ITEM_SLOT_NECK //Fluff item, put it whereever you want!
+
actions_types = list(/datum/action/item_action/toggle_headphones)
+
var/headphones_on = FALSE
-/obj/item/clothing/ears/headphones
- name = "headphones"
- desc = "Unce unce unce unce. Boop!"
- icon = 'icons/obj/clothing/accessories.dmi'
- icon_state = "headphones"
- item_state = "headphones"
- slot_flags = SLOT_EARS | SLOT_HEAD | SLOT_NECK //Fluff item, put it whereever you want!
- actions_types = list(/datum/action/item_action/toggle_headphones)
- var/headphones_on = FALSE
+
/obj/item/clothing/ears/headphones/Initialize()
+
. = ..()
+
update_icon()
-/obj/item/clothing/ears/headphones/Initialize()
- . = ..()
- update_icon()
+
/obj/item/clothing/ears/headphones/update_icon()
+
icon_state = "[initial(icon_state)]_[headphones_on? "on" : "off"]"
+
item_state = "[initial(item_state)]_[headphones_on? "on" : "off"]"
-/obj/item/clothing/ears/headphones/update_icon()
- icon_state = "[initial(icon_state)]_[headphones_on? "on" : "off"]"
- item_state = "[initial(item_state)]_[headphones_on? "on" : "off"]"
-
-/obj/item/clothing/ears/headphones/proc/toggle(owner)
- headphones_on = !headphones_on
- update_icon()
- var/mob/living/carbon/human/H = owner
- if(istype(H))
- H.update_inv_ears()
- H.update_inv_neck()
- H.update_inv_head()
- to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."] ")
+
/obj/item/clothing/ears/headphones/proc/toggle(owner)
+
headphones_on = !headphones_on
+
update_icon()
+
var/mob/living/carbon/human/H = owner
+
if(istype(H))
+
H.update_inv_ears()
+
H.update_inv_neck()
+
H.update_inv_head()
+
to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."] ")
+
\ No newline at end of file
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index eaeedee36c..44bba64d2f 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/clothing/glasses.dmi'
w_class = WEIGHT_CLASS_SMALL
flags_cover = GLASSESCOVERSEYES
- slot_flags = SLOT_EYES
+ slot_flags = ITEM_SLOT_EYES
strip_delay = 20
equip_delay_other = 25
resistance_flags = NONE
@@ -100,7 +100,7 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
/obj/item/clothing/glasses/science/item_action_slot_check(slot)
- if(slot == slot_glasses)
+ if(slot == SLOT_GLASSES)
return 1
/obj/item/clothing/glasses/night
@@ -263,7 +263,7 @@
/obj/item/clothing/glasses/sunglasses/blindfold/equipped(mob/living/carbon/human/user, slot)
. = ..()
- if(slot == slot_glasses)
+ if(slot == SLOT_GLASSES)
user.become_blind("blindfold_[REF(src)]")
/obj/item/clothing/glasses/sunglasses/blindfold/dropped(mob/living/carbon/human/user)
@@ -365,6 +365,7 @@
scan_reagents = 1
flags_1 = NODROP_1
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF
/obj/item/clothing/glasses/godeye/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, src) && W != src && W.loc == user)
diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm
index 439197f285..336881106e 100644
--- a/code/modules/clothing/glasses/engine_goggles.dm
+++ b/code/modules/clothing/glasses/engine_goggles.dm
@@ -93,7 +93,7 @@
MA.alpha = 180
MA.maptext = "[strength]k"
MA.color = "#64C864"
- MA.layer = AREA_LAYER
+ MA.layer = FLY_LAYER
pic.appearance = MA
flick_overlay(pic, list(user.client), 8)
@@ -123,7 +123,7 @@
item_state = icon_state
if(isliving(loc))
var/mob/living/user = loc
- if(user.get_item_by_slot(slot_glasses) == src)
+ if(user.get_item_by_slot(SLOT_GLASSES) == src)
user.update_inv_glasses()
else
user.update_inv_hands()
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 626bf4f542..6364826942 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -6,7 +6,7 @@
/obj/item/clothing/glasses/hud/equipped(mob/living/carbon/human/user, slot)
..()
- if(hud_type && slot == slot_glasses)
+ if(hud_type && slot == SLOT_GLASSES)
var/datum/atom_hud/H = GLOB.huds[hud_type]
H.add_hud_to(user)
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index ca534f5a58..0e9be23aed 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -5,7 +5,7 @@
icon = 'icons/obj/clothing/gloves.dmi'
siemens_coefficient = 0.5
body_parts_covered = HANDS
- slot_flags = SLOT_GLOVES
+ slot_flags = ITEM_SLOT_GLOVES
attack_verb = list("challenged")
var/transfer_prints = FALSE
strip_delay = 20
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 09f5993cb4..1b20501f21 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -209,7 +209,7 @@
var/obj/item/clothing/gloves/color/selected = pick(gloves)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
- H.equip_to_slot_or_del(new selected(H), slot_gloves)
+ H.equip_to_slot_or_del(new selected(H), SLOT_GLOVES)
else
new selected(loc)
return INITIALIZE_HINT_QDEL
diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm
index d3dfa189d8..6a3082b558 100644
--- a/code/modules/clothing/head/_head.dm
+++ b/code/modules/clothing/head/_head.dm
@@ -4,7 +4,7 @@
icon_state = "top_hat"
item_state = "that"
body_parts_covered = HEAD
- slot_flags = SLOT_HEAD
+ slot_flags = ITEM_SLOT_HEAD
var/blockTracking = 0 //For AI tracking
var/can_toggle = null
dynamic_hair_suffix = "+generic"
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index db3dda1dd2..ae4d80a0e4 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -46,7 +46,7 @@
item_color = "red"
dog_fashion = null
name = "firefighter helmet"
- flags_1 = STOPSPRESSUREDMAGE_1
+ clothing_flags = STOPSPRESSUREDAMAGE
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
cold_protection = HEAD
@@ -56,7 +56,7 @@
icon_state = "hardhat0_white"
item_state = "hardhat0_white"
item_color = "white"
- flags_1 = STOPSPRESSUREDMAGE_1
+ clothing_flags = STOPSPRESSUREDAMAGE
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
cold_protection = HEAD
@@ -76,7 +76,7 @@
dog_fashion = null
name = "atmospheric technician's firefighting helmet"
desc = "A firefighter's helmet, able to keep the user cool in any situation."
- flags_1 = STOPSPRESSUREDMAGE_1 | THICKMATERIAL_1
+ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 2e9b7f83f2..4aea3d8056 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -122,7 +122,7 @@
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
- flags_1 = STOPSPRESSUREDMAGE_1
+ clothing_flags = STOPSPRESSUREDAMAGE
strip_delay = 80
dog_fashion = null
@@ -158,12 +158,20 @@
strip_delay = 100
dog_fashion = null
+/obj/item/clothing/head/helmet/roman/fake
+ desc = "An ancient helmet made of plastic and leather."
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+
/obj/item/clothing/head/helmet/roman/legionaire
name = "roman legionaire helmet"
desc = "An ancient helmet made of bronze and leather. Has a red crest on top of it."
icon_state = "roman_c"
item_state = "roman_c"
+/obj/item/clothing/head/helmet/roman/legionaire/fake
+ desc = "An ancient helmet made of plastic and leather. Has a red crest on top of it."
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+
/obj/item/clothing/head/helmet/gladiator
name = "gladiator helmet"
desc = "Ave, Imperator, morituri te salutant."
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 74d8a43347..2c03997a4a 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -321,4 +321,27 @@
name = "headress of Nemes"
desc = "Lavish space tomb not included."
icon_state = "nemes_headdress"
- icon_state = "nemes_headdress"
\ No newline at end of file
+ icon_state = "nemes_headdress"
+
+/obj/item/clothing/head/frenchberet
+ name = "french beret"
+ desc = "A quality beret, infused with the aroma of chain-smoking, wine-swilling Parisians. You feel less inclined to engage military conflict, for some reason."
+ icon_state = "beretblack"
+
+/obj/item/clothing/head/frenchberet/speechModification(M)
+ if(copytext(M, 1, 2) != "*")
+ M = " [M]"
+ var/list/french_words = strings("french_replacement.json", "french")
+
+ for(var/key in french_words)
+ var/value = french_words[key]
+ if(islist(value))
+ value = pick(value)
+
+ M = replacetextEx(M, " [uppertext(key)]", " [uppertext(value)]")
+ M = replacetextEx(M, " [capitalize(key)]", " [capitalize(value)]")
+ M = replacetextEx(M, " [key]", " [value]")
+
+ if(prob(3))
+ M += pick(" Honh honh honh!"," Honh!"," Zut Alors!")
+ return trim(M)
\ No newline at end of file
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index b58c9fc414..86763e060b 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -131,7 +131,7 @@
dog_fashion = /datum/dog_fashion/head/kitty
/obj/item/clothing/head/kitty/equipped(mob/living/carbon/human/user, slot)
- if(ishuman(user) && slot == slot_head)
+ if(ishuman(user) && slot == SLOT_HEAD)
update_icon(user)
user.update_inv_head() //Color might have been changed by update_icon.
..()
@@ -169,7 +169,7 @@
/obj/item/clothing/head/cardborg/equipped(mob/living/user, slot)
..()
- if(ishuman(user) && slot == slot_head)
+ if(ishuman(user) && slot == SLOT_HEAD)
var/mob/living/carbon/human/H = user
if(istype(H.wear_suit, /obj/item/clothing/suit/cardborg))
var/obj/item/clothing/suit/cardborg/CB = H.wear_suit
@@ -240,7 +240,7 @@
/obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot)
..()
- if(slot == slot_head)
+ if(slot == SLOT_HEAD)
if(paranoia)
QDEL_NULL(paranoia)
paranoia = new()
diff --git a/code/modules/clothing/head/vg_hats.dm b/code/modules/clothing/head/vg_hats.dm
index 56844193c6..be57619a7a 100644
--- a/code/modules/clothing/head/vg_hats.dm
+++ b/code/modules/clothing/head/vg_hats.dm
@@ -10,7 +10,6 @@
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
- flags_1 = STOPSPRESSUREDMAGE_1
strip_delay = 80
dog_fashion = null
icon_override = 'modular_citadel/icons/mob/citadel/head.dmi'
diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm
index 562375e897..da3e114edd 100644
--- a/code/modules/clothing/masks/_masks.dm
+++ b/code/modules/clothing/masks/_masks.dm
@@ -2,7 +2,7 @@
name = "mask"
icon = 'icons/obj/clothing/masks.dmi'
body_parts_covered = HEAD
- slot_flags = SLOT_MASK
+ slot_flags = ITEM_SLOT_MASK
strip_delay = 40
equip_delay_other = 40
var/mask_adjusted = 0
@@ -33,7 +33,7 @@
src.icon_state = initial(icon_state)
gas_transfer_coefficient = initial(gas_transfer_coefficient)
permeability_coefficient = initial(permeability_coefficient)
- flags_1 |= visor_flags
+ clothing_flags |= visor_flags
flags_inv |= visor_flags_inv
flags_cover |= visor_flags_cover
to_chat(user, "You push \the [src] back into place. ")
@@ -43,11 +43,11 @@
to_chat(user, "You push \the [src] out of the way. ")
gas_transfer_coefficient = null
permeability_coefficient = null
- flags_1 &= ~visor_flags
+ clothing_flags &= ~visor_flags
flags_inv &= ~visor_flags_inv
flags_cover &= ~visor_flags_cover
if(adjusted_flags)
slot_flags = adjusted_flags
if(user)
user.wear_mask_update(src, toggle_off = mask_adjusted)
- user.update_action_buttons_icon() //when mask is adjusted out, we update all buttons icon so the user's potential internal tank correctly shows as off.
\ No newline at end of file
+ user.update_action_buttons_icon() //when mask is adjusted out, we update all buttons icon so the user's potential internal tank correctly shows as off.
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index f7c99a24d3..29aab0c1a2 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -4,8 +4,8 @@
icon_state = "breath"
item_state = "m_mask"
body_parts_covered = 0
- flags_1 = MASKINTERNALS_1
- visor_flags = MASKINTERNALS_1
+ clothing_flags = MASKINTERNALS
+ visor_flags = MASKINTERNALS
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.1
permeability_coefficient = 0.5
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 694c290f4b..726670762e 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -2,7 +2,7 @@
name = "gas mask"
desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate
icon_state = "gas_alt"
- flags_1 = BLOCK_GAS_SMOKE_EFFECT_1 | MASKINTERNALS_1
+ clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
w_class = WEIGHT_CLASS_NORMAL
item_state = "gas_alt"
@@ -51,7 +51,7 @@
/obj/item/clothing/mask/gas/clown_hat
name = "clown wig and mask"
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
- flags_1 = MASKINTERNALS_1
+ clothing_flags = MASKINTERNALS
icon_state = "clown"
item_state = "clown_hat"
flags_cover = MASKCOVERSEYES
@@ -83,7 +83,7 @@
/obj/item/clothing/mask/gas/sexyclown
name = "sexy-clown wig and mask"
desc = "A feminine clown mask for the dabbling crossdressers or female entertainers."
- flags_1 = MASKINTERNALS_1
+ clothing_flags = MASKINTERNALS
icon_state = "sexyclown"
item_state = "sexyclown"
flags_cover = MASKCOVERSEYES
@@ -92,7 +92,7 @@
/obj/item/clothing/mask/gas/mime
name = "mime mask"
desc = "The traditional mime's mask. It has an eerie facial posture."
- flags_1 = MASKINTERNALS_1
+ clothing_flags = MASKINTERNALS
icon_state = "mime"
item_state = "mime"
flags_cover = MASKCOVERSEYES
@@ -124,7 +124,7 @@
/obj/item/clothing/mask/gas/monkeymask
name = "monkey mask"
desc = "A mask used when acting as a monkey."
- flags_1 = MASKINTERNALS_1
+ clothing_flags = MASKINTERNALS
icon_state = "monkeymask"
item_state = "monkeymask"
flags_cover = MASKCOVERSEYES
@@ -133,7 +133,7 @@
/obj/item/clothing/mask/gas/sexymime
name = "sexy mime mask"
desc = "A traditional female mime's mask."
- flags_1 = MASKINTERNALS_1
+ clothing_flags = MASKINTERNALS
icon_state = "sexymime"
item_state = "sexymime"
flags_cover = MASKCOVERSEYES
@@ -154,7 +154,7 @@
name = "owl mask"
desc = "Twoooo!"
icon_state = "owl"
- flags_1 = MASKINTERNALS_1
+ clothing_flags = MASKINTERNALS
flags_cover = MASKCOVERSEYES
resistance_flags = FLAMMABLE
diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm
index 51caf8335e..0d78e11874 100644
--- a/code/modules/clothing/masks/hailer.dm
+++ b/code/modules/clothing/masks/hailer.dm
@@ -7,10 +7,10 @@
actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust)
icon_state = "sechailer"
item_state = "sechailer"
- flags_1 = BLOCK_GAS_SMOKE_EFFECT_1 | MASKINTERNALS_1
+ clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
flags_inv = HIDEFACIALHAIR|HIDEFACE
w_class = WEIGHT_CLASS_SMALL
- visor_flags = BLOCK_GAS_SMOKE_EFFECT_1 | MASKINTERNALS_1
+ visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
visor_flags_inv = HIDEFACE
flags_cover = MASKCOVERSMOUTH
visor_flags_cover = MASKCOVERSMOUTH
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 53bd5f32a4..ad77f1d350 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -47,7 +47,7 @@
/obj/item/clothing/mask/fakemoustache/italian/speechModification(M)
if(copytext(M, 1, 2) != "*")
M = " [M]"
- var/list/italian_words = strings("word_replacement.json", "italian")
+ var/list/italian_words = strings("italian_replacement.json", "italian")
for(var/key in italian_words)
var/value = italian_words[key]
@@ -222,8 +222,8 @@ obj/item/clothing/mask/frog/cursed
flags_inv = HIDEFACE|HIDEFACIALHAIR
visor_flags_inv = HIDEFACE|HIDEFACIALHAIR
visor_flags_cover = MASKCOVERSMOUTH
- slot_flags = SLOT_MASK
- adjusted_flags = SLOT_HEAD
+ slot_flags = ITEM_SLOT_MASK
+ adjusted_flags = ITEM_SLOT_HEAD
icon_state = "bandbotany"
/obj/item/clothing/mask/bandana/attack_self(mob/user)
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 1d92ab6e62..cb797c34d4 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -2,7 +2,7 @@
name = "necklace"
icon = 'icons/obj/clothing/neck.dmi'
body_parts_covered = NECK
- slot_flags = SLOT_NECK
+ slot_flags = ITEM_SLOT_NECK
strip_delay = 40
equip_delay_other = 40
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 0758013698..e3c32cd26c 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -6,7 +6,7 @@
var/chained = 0
body_parts_covered = FEET
- slot_flags = SLOT_FEET
+ slot_flags = ITEM_SLOT_FEET
permeability_coefficient = 0.5
slowdown = SHOES_SLOWDOWN
diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm
index 7ffd9c1f40..3dc80e0ded 100644
--- a/code/modules/clothing/shoes/bananashoes.dm
+++ b/code/modules/clothing/shoes/bananashoes.dm
@@ -10,10 +10,10 @@
/obj/item/clothing/shoes/clown_shoes/banana_shoes/Initialize()
. = ..()
- AddComponent(/datum/component/material_container, list(MAT_BANANIUM), 200000, TRUE)
+ AddComponent(/datum/component/material_container, list(MAT_BANANIUM), 200000, TRUE, list(/obj/item/stack))
AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 75)
if(always_noslip)
- flags_1 |= NOSLIP_1
+ clothing_flags |= NOSLIP
/obj/item/clothing/shoes/clown_shoes/banana_shoes/step_action()
. = ..()
@@ -22,7 +22,7 @@
if(bananium.amount(MAT_BANANIUM) < 100)
on = !on
if(!always_noslip)
- flags_1 &= ~NOSLIP_1
+ clothing_flags &= ~NOSLIP
update_icon()
to_chat(loc, "You ran out of bananium! ")
else
@@ -49,9 +49,9 @@
to_chat(user, "You [on ? "activate" : "deactivate"] the prototype shoes. ")
if(!always_noslip)
if(on)
- flags_1 |= NOSLIP_1
+ clothing_flags |= NOSLIP
else
- flags_1 &= ~NOSLIP_1
+ clothing_flags &= ~NOSLIP
else
to_chat(user, "You need bananium to turn the prototype shoes on! ")
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index e669ce3826..0f5b381326 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -21,12 +21,12 @@
/obj/item/clothing/shoes/magboots/attack_self(mob/user)
- if(src.magpulse)
- src.flags_1 &= ~NOSLIP_1
- src.slowdown = SHOES_SLOWDOWN
+ if(magpulse)
+ clothing_flags &= ~NOSLIP
+ slowdown = SHOES_SLOWDOWN
else
- src.flags_1 |= NOSLIP_1
- src.slowdown = slowdown_active
+ clothing_flags |= NOSLIP
+ slowdown = slowdown_active
magpulse = !magpulse
icon_state = "[magboot_state][magpulse]"
to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system. ")
@@ -37,7 +37,7 @@
A.UpdateButtonIcon()
/obj/item/clothing/shoes/magboots/negates_gravity()
- return flags_1 & NOSLIP_1
+ return clothing_flags & NOSLIP
/obj/item/clothing/shoes/magboots/examine(mob/user)
..()
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 3dad0d464e..9f0d8358ac 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -23,7 +23,7 @@
name = "\improper SWAT boots"
desc = "High speed, no drag combat boots."
permeability_coefficient = 0.01
- flags_1 = NOSLIP_1
+ clothing_flags = NOSLIP
armor = list("melee" = 40, "bullet" = 30, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 90, "acid" = 50)
/obj/item/clothing/shoes/sandal
@@ -50,7 +50,7 @@
name = "galoshes"
icon_state = "galoshes"
permeability_coefficient = 0.01
- flags_1 = NOSLIP_1
+ clothing_flags = NOSLIP
slowdown = SHOES_SLOWDOWN+1
strip_delay = 50
equip_delay_other = 50
@@ -264,7 +264,7 @@
/obj/item/clothing/shoes/wheelys/ui_action_click(mob/user, action)
if(!isliving(user))
return
- if(!istype(user.get_item_by_slot(slot_shoes), /obj/item/clothing/shoes/wheelys))
+ if(!istype(user.get_item_by_slot(SLOT_SHOES), /obj/item/clothing/shoes/wheelys))
to_chat(user, "You must be wearing the wheely-heels to use them! ")
return
if(!(W.is_occupant(user)))
@@ -311,4 +311,4 @@
else
set_light(0)
lightCycle = 0
- active = FALSE
\ No newline at end of file
+ active = FALSE
diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm
index 8630d9a3bc..6224e2a3d9 100644
--- a/code/modules/clothing/spacesuits/_spacesuits.dm
+++ b/code/modules/clothing/spacesuits/_spacesuits.dm
@@ -4,7 +4,7 @@
name = "space helmet"
icon_state = "spaceold"
desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays."
- flags_1 = STOPSPRESSUREDMAGE_1 | THICKMATERIAL_1
+ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
item_state = "spaceold"
permeability_coefficient = 0.01
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70)
@@ -30,7 +30,7 @@
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
- flags_1 = STOPSPRESSUREDMAGE_1 | THICKMATERIAL_1
+ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
slowdown = 1
@@ -42,4 +42,4 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
strip_delay = 80
equip_delay_other = 80
- resistance_flags = NONE
\ No newline at end of file
+ resistance_flags = NONE
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 94553b3964..3040af756e 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -115,7 +115,7 @@
teleport_now.UpdateButtonIcon()
- var/list/nonsafe_slots = list(slot_belt, slot_back)
+ var/list/nonsafe_slots = list(SLOT_BELT, SLOT_BACK)
var/list/exposed = list()
for(var/slot in nonsafe_slots)
var/obj/item/slot_item = user.get_item_by_slot(slot)
diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm
index 01a95506b4..170b1e98f0 100644
--- a/code/modules/clothing/spacesuits/flightsuit.dm
+++ b/code/modules/clothing/spacesuits/flightsuit.dm
@@ -22,7 +22,7 @@
actions_types = list(/datum/action/item_action/flightpack/toggle_flight, /datum/action/item_action/flightpack/engage_boosters, /datum/action/item_action/flightpack/toggle_stabilizers, /datum/action/item_action/flightpack/change_power, /datum/action/item_action/flightpack/toggle_airbrake)
armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 30, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75)
w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
resistance_flags = FIRE_PROOF
var/processing_mode = FLIGHTSUIT_PROCESSING_FULL
@@ -546,7 +546,7 @@
..()
/obj/item/flightpack/item_action_slot_check(slot)
- if(slot == SLOT_BACK)
+ if(slot == ITEM_SLOT_BACK)
return TRUE
/obj/item/flightpack/equipped(mob/user, slot)
@@ -573,7 +573,7 @@
momentum_speed = max(momentum_speed_x, momentum_speed_y)
/obj/item/flightpack/item_action_slot_check(slot)
- return slot == slot_back
+ return slot == SLOT_BACK
/obj/item/flightpack/proc/enable_stabilizers()
if(requires_suit && suit && !suit.deployedshoes)
@@ -724,12 +724,12 @@
if(suit)
active = toggle
if(active)
- src.flags_1 |= NOSLIP_1
+ clothing_flags |= NOSLIP
if(!active)
- src.flags_1 &= ~NOSLIP_1
+ clothing_flags &= ~NOSLIP
/obj/item/clothing/shoes/flightshoes/item_action_slot_check(slot)
- return slot == slot_shoes
+ return slot == SLOT_SHOES
/obj/item/clothing/shoes/flightshoes/proc/delink_suit()
if(suit)
@@ -894,7 +894,7 @@
if(user.back)
usermessage("You're already wearing something on your back!", "boldwarning")
return FALSE
- user.equip_to_slot_if_possible(pack,slot_back,0,0,1)
+ user.equip_to_slot_if_possible(pack,SLOT_BACK,0,0,1)
pack.flags_1 |= NODROP_1
resync()
user.visible_message("A [pack.name] extends from [user]'s [name] and clamps to their back! ")
@@ -932,7 +932,7 @@
if(user.shoes)
usermessage("You're already wearing something on your feet!", "boldwarning")
return FALSE
- user.equip_to_slot_if_possible(shoes,slot_shoes,0,0,1)
+ user.equip_to_slot_if_possible(shoes,SLOT_SHOES,0,0,1)
shoes.flags_1 |= NODROP_1
user.visible_message("[user]'s [name] extends a pair of [shoes.name] over their feet! ")
user.update_inv_wear_suit()
@@ -963,7 +963,7 @@
/obj/item/clothing/suit/space/hardsuit/flightsuit/equipped(mob/M, slot)
if(ishuman(M))
user = M
- if(slot != slot_wear_suit)
+ if(slot != SLOT_WEAR_SUIT)
if(deployedpack)
retract_flightpack(TRUE)
if(deployedshoes)
@@ -998,7 +998,7 @@
/obj/item/clothing/suit/space/hardsuit/flightsuit/attackby(obj/item/I, mob/wearer, params)
user = wearer
- if(src == user.get_item_by_slot(slot_wear_suit))
+ if(src == user.get_item_by_slot(SLOT_WEAR_SUIT))
usermessage("You can not perform any service without taking the suit off!", "boldwarning")
return FALSE
else if(locked)
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 68d7073612..4a8e368208 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -48,12 +48,12 @@
soundloop.stop(user)
/obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot)
- if(slot == slot_head)
+ if(slot == SLOT_HEAD)
return 1
/obj/item/clothing/head/helmet/space/hardsuit/equipped(mob/user, slot)
..()
- if(slot != slot_head)
+ if(slot != SLOT_HEAD)
if(suit)
suit.RemoveHelmet()
soundloop.stop(user)
@@ -119,19 +119,19 @@
if(jetpack)
to_chat(user, "[src] already has a jetpack installed. ")
return
- if(src == user.get_item_by_slot(slot_wear_suit)) //Make sure the player is not wearing the suit before applying the upgrade.
+ if(src == user.get_item_by_slot(SLOT_WEAR_SUIT)) //Make sure the player is not wearing the suit before applying the upgrade.
to_chat(user, "You cannot install the upgrade to [src] while wearing it. ")
return
if(user.transferItemToLoc(I, src))
jetpack = I
to_chat(user, "You successfully install the jetpack into [src]. ")
-
+ return
else if(istype(I, /obj/item/screwdriver))
if(!jetpack)
to_chat(user, "[src] has no jetpack installed. ")
return
- if(src == user.get_item_by_slot(slot_wear_suit))
+ if(src == user.get_item_by_slot(SLOT_WEAR_SUIT))
to_chat(user, "You cannot remove the jetpack from [src] while wearing it. ")
return
@@ -139,12 +139,14 @@
jetpack.forceMove(drop_location())
jetpack = null
to_chat(user, "You successfully remove the jetpack from [src]. ")
+ return
+ return ..()
/obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot)
..()
if(jetpack)
- if(slot == slot_wear_suit)
+ if(slot == SLOT_WEAR_SUIT)
for(var/X in jetpack.actions)
var/datum/action/A = X
A.Grant(user)
@@ -157,7 +159,7 @@
A.Remove(user)
/obj/item/clothing/suit/space/hardsuit/item_action_slot_check(slot)
- if(slot == slot_wear_suit) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit.
+ if(slot == SLOT_WEAR_SUIT) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit.
return 1
//Engineering
@@ -237,6 +239,9 @@
brightness_on = 7
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator)
+/obj/item/clothing/head/helmet/space/hardsuit/mining/Initialize()
+ . = ..()
+ AddComponent(/datum/component/armor_plate)
/obj/item/clothing/suit/space/hardsuit/mining
icon_state = "hardsuit-mining"
@@ -250,6 +255,10 @@
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
+/obj/item/clothing/suit/space/hardsuit/mining/Initialize()
+ . = ..()
+ AddComponent(/datum/component/armor_plate)
+
//Syndicate hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/syndi
name = "blood-red hardsuit helmet"
@@ -263,7 +272,7 @@
var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null
actions_types = list(/datum/action/item_action/toggle_helmet_mode)
visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
- visor_flags = STOPSPRESSUREDMAGE_1
+ visor_flags = STOPSPRESSUREDAMAGE
/obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon()
icon_state = "hardsuit[on]-[item_color]"
@@ -283,7 +292,7 @@
name = initial(name)
desc = initial(desc)
set_light(brightness_on)
- flags_1 |= visor_flags
+ clothing_flags |= visor_flags
flags_cover |= HEADCOVERSEYES | HEADCOVERSMOUTH
flags_inv |= visor_flags_inv
cold_protection |= HEAD
@@ -292,7 +301,7 @@
name += " (combat)"
desc = alt_desc
set_light(0)
- flags_1 &= ~visor_flags
+ clothing_flags &= ~visor_flags
flags_cover &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH)
flags_inv &= ~visor_flags_inv
cold_protection &= ~HEAD
@@ -313,13 +322,13 @@
linkedsuit.name = initial(linkedsuit.name)
linkedsuit.desc = initial(linkedsuit.desc)
linkedsuit.slowdown = 1
- linkedsuit.flags_1 |= STOPSPRESSUREDMAGE_1
+ linkedsuit.clothing_flags |= STOPSPRESSUREDAMAGE
linkedsuit.cold_protection |= CHEST | GROIN | LEGS | FEET | ARMS | HANDS
else
linkedsuit.name += " (combat)"
linkedsuit.desc = linkedsuit.alt_desc
linkedsuit.slowdown = 0
- linkedsuit.flags_1 &= ~(STOPSPRESSUREDMAGE_1)
+ linkedsuit.clothing_flags &= ~STOPSPRESSUREDAMAGE
linkedsuit.cold_protection &= ~(CHEST | GROIN | LEGS | FEET | ARMS | HANDS)
linkedsuit.icon_state = "hardsuit[on]-[item_color]"
@@ -460,7 +469,7 @@
/obj/item/clothing/head/helmet/space/hardsuit/rd/equipped(mob/living/carbon/human/user, slot)
..()
- if (slot == slot_head)
+ if (slot == SLOT_HEAD)
var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_DIAGNOSTIC_BASIC]
DHUD.add_hud_to(user)
@@ -615,7 +624,7 @@
/obj/item/clothing/suit/space/hardsuit/ancient/equipped(mob/user, slot)
. = ..()
- if (slot == slot_wear_suit)
+ if (slot == SLOT_WEAR_SUIT)
if (mobhook && mobhook.parent != user)
QDEL_NULL(mobhook)
if (!mobhook)
@@ -704,7 +713,7 @@
icon_state = "ert_medical"
item_state = "ert_medical"
item_color = "ert_medical"
- flags_1 = STOPSPRESSUREDMAGE_1 | THICKMATERIAL_1 | NODROP_1 //Dont want people changing into the other teams gear
+ flags_1 = NODROP_1 //Dont want people changing into the other teams gear
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf
armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95)
slowdown = 0
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index c2dad1a8f3..f3975d1f81 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -59,7 +59,6 @@ Contains:
icon_state = "beret_badge"
dynamic_hair_suffix = "+generic"
dynamic_fhair_suffix = "+generic"
- flags_1 = STOPSPRESSUREDMAGE_1
flags_inv = 0
armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
strip_delay = 130
@@ -114,7 +113,6 @@ Contains:
name = "Santa's hat"
desc = "Ho ho ho. Merrry X-mas!"
icon_state = "santahat"
- flags_1 = STOPSPRESSUREDMAGE_1
flags_cover = HEADCOVERSEYES
dog_fashion = /datum/dog_fashion/head/santa
@@ -125,7 +123,6 @@ Contains:
icon_state = "santa"
item_state = "santa"
slowdown = 0
- flags_1 = STOPSPRESSUREDMAGE_1
allowed = list(/obj/item) //for stuffing exta special presents
@@ -136,7 +133,6 @@ Contains:
icon_state = "pirate"
item_state = "pirate"
armor = list("melee" = 30, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 60, "acid" = 75)
- flags_1 = STOPSPRESSUREDMAGE_1
flags_inv = HIDEHAIR
strip_delay = 40
equip_delay_other = 20
@@ -169,7 +165,7 @@ Contains:
item_color = "ert_commander"
armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
strip_delay = 130
- flags_1 = STOPSPRESSUREDMAGE_1 | THICKMATERIAL_1 | NODROP_1
+ flags_1 = NODROP_1
brightness_on = 7
/obj/item/clothing/suit/space/hardsuit/ert
@@ -269,7 +265,7 @@ Contains:
armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75) //As whimpy as a space carp
brightness_on = 0 //luminosity when on
actions_types = list()
- flags_1 = STOPSPRESSUREDMAGE_1 | THICKMATERIAL_1 | NODROP_1
+ flags_1 = NODROP_1
/obj/item/clothing/suit/space/hardsuit/carp
@@ -351,11 +347,9 @@ Contains:
/obj/item/clothing/suit/space/fragile/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(!torn && prob(50))
to_chat(owner, "[src] tears from the damage, breaking the air-tight seal! ")
- src.flags_1 &= ~STOPSPRESSUREDMAGE_1
- src.name = "torn [src]."
- src.desc = "A bulky suit meant to protect the user during emergency situations, at least until someone tore a hole in the suit."
- src.torn = TRUE
+ clothing_flags &= ~STOPSPRESSUREDAMAGE
+ name = "torn [src]."
+ desc = "A bulky suit meant to protect the user during emergency situations, at least until someone tore a hole in the suit."
+ torn = TRUE
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1)
playsound(loc, 'sound/effects/refill.ogg', 50, 1)
-
-
diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm
index 1cf1d4640d..6aabee0c81 100644
--- a/code/modules/clothing/suits/_suits.dm
+++ b/code/modules/clothing/suits/_suits.dm
@@ -4,7 +4,7 @@
var/fire_resist = T0C+100
allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- slot_flags = SLOT_OCLOTHING
+ slot_flags = ITEM_SLOT_OCLOTHING
var/blood_overlay_type = "suit"
var/togglename = null
var/suittoggled = FALSE
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 37d48b484e..49b4fb7766 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -165,186 +165,6 @@
. = ..()
allowed = GLOB.detective_vest_allowed
-//Reactive armor
-/obj/item/clothing/suit/armor/reactive
- name = "reactive armor"
- desc = "Doesn't seem to do much for some reason."
- var/active = 0
- var/reactivearmor_cooldown_duration = 0 //cooldown specific to reactive armor
- var/reactivearmor_cooldown = 0
- icon_state = "reactiveoff"
- item_state = "reactiveoff"
- blood_overlay_type = "armor"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
- actions_types = list(/datum/action/item_action/toggle)
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- hit_reaction_chance = 50
-
-
-/obj/item/clothing/suit/armor/reactive/attack_self(mob/user)
- src.active = !( src.active )
- if (src.active)
- to_chat(user, "[src] is now active. ")
- src.icon_state = "reactive"
- src.item_state = "reactive"
- else
- to_chat(user, "[src] is now inactive. ")
- src.icon_state = "reactiveoff"
- src.item_state = "reactiveoff"
- src.add_fingerprint(user)
- return
-
-/obj/item/clothing/suit/armor/reactive/emp_act(severity)
- active = 0
- src.icon_state = "reactiveoff"
- src.item_state = "reactiveoff"
- reactivearmor_cooldown = world.time + 200
- ..()
-
-//When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!)
-/obj/item/clothing/suit/armor/reactive/teleport
- name = "reactive teleport armor"
- desc = "Someone separated our Research Director from his own head!"
- var/tele_range = 6
- var/rad_amount= 15
- reactivearmor_cooldown_duration = 100
-
-/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(!active)
- return 0
- if(prob(hit_reaction_chance))
- var/mob/living/carbon/human/H = owner
- if(world.time < reactivearmor_cooldown)
- owner.visible_message("The reactive teleport system is still recharging! It fails to teleport [H]! ")
- return
- owner.visible_message("The reactive teleport system flings [H] clear of [attack_text], shutting itself off in the process! ")
- var/list/turfs = new/list()
- for(var/turf/T in orange(tele_range, H))
- if(T.density)
- continue
- if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.yThe reactive incendiary armor on [owner] activates, but fails to send out flames as it is still recharging its flame jets!")
- return
- owner.visible_message("[src] blocks [attack_text], sending out jets of flame! ")
- for(var/mob/living/carbon/C in range(6, owner))
- if(C != owner)
- C.fire_stacks += 8
- C.IgniteMob()
- owner.fire_stacks = -20
- reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
- return 1
- return 0
-
-
-/obj/item/clothing/suit/armor/reactive/stealth
- name = "reactive stealth armor"
- desc = "An experimental suit of armor that renders the wearer invisible on detection of imminent harm, and creates a decoy that runs away from the owner. You can't fight what you can't see."
-
-/obj/item/clothing/suit/armor/reactive/stealth/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(!active)
- return 0
- if(prob(hit_reaction_chance))
- if(world.time < reactivearmor_cooldown)
- owner.visible_message("The reactive stealth system on [owner] activates, but is still recharging its holographic emitters! ")
- return
- var/mob/living/simple_animal/hostile/illusion/escape/E = new(owner.loc)
- E.Copy_Parent(owner, 50)
- E.GiveTarget(owner) //so it starts running right away
- E.Goto(owner, E.move_to_delay, E.minimum_distance)
- owner.alpha = 0
- owner.visible_message("[owner] is hit by [attack_text] in the chest! ") //We pretend to be hit, since blocking it would stop the message otherwise
- spawn(40)
- owner.alpha = initial(owner.alpha)
- reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
- return 1
-
-/obj/item/clothing/suit/armor/reactive/tesla
- name = "reactive tesla armor"
- desc = "An experimental suit of armor with sensitive detectors hooked up to a huge capacitor grid, with emitters strutting out of it. Zap."
- siemens_coefficient = -1
- var/tesla_power = 25000
- var/tesla_range = 20
- var/tesla_boom = FALSE
- var/tesla_stun = FALSE
-
-/obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(!active)
- return 0
- if(prob(hit_reaction_chance))
- if(world.time < reactivearmor_cooldown)
- var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
- sparks.set_up(1, 1, src)
- sparks.start()
- owner.visible_message("The tesla capacitors on [owner]'s reactive tesla armor are still recharging! The armor merely emits some sparks. ")
- return
- owner.visible_message("[src] blocks [attack_text], sending out arcs of lightning! ")
- tesla_zap(owner,tesla_range,tesla_power,tesla_boom, tesla_stun)
- reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
- return 1
-
-/obj/item/clothing/suit/armor/reactive/table
- name = "reactive table armor"
- desc = "If you can't beat the memes, embrace them."
- var/tele_range = 10
-
-/obj/item/clothing/suit/armor/reactive/table/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(!active)
- return 0
- if(prob(hit_reaction_chance))
- var/mob/living/carbon/human/H = owner
- if(world.time < reactivearmor_cooldown)
- owner.visible_message("The reactive table armor's fabricators are still on cooldown! ")
- return
- owner.visible_message("The reactive teleport system flings [H] clear of [attack_text] and slams them into a fabricated table! ")
- owner.visible_message("[H] GOES ON THE TABLE!!! ")
- owner.Knockdown(40)
- var/list/turfs = new/list()
- for(var/turf/T in orange(tele_range, H))
- if(T.density)
- continue
- if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.y[src] is now active.")
+ icon_state = "reactive"
+ item_state = "reactive"
+ else
+ to_chat(user, "[src] is now inactive. ")
+ icon_state = "reactiveoff"
+ item_state = "reactiveoff"
+ add_fingerprint(user)
+ return
+
+/obj/item/clothing/suit/armor/reactive/emp_act(severity)
+ active = 0
+ icon_state = "reactiveoff"
+ item_state = "reactiveoff"
+ reactivearmor_cooldown = world.time + 200
+ ..()
+
+//When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!)
+/obj/item/clothing/suit/armor/reactive/teleport
+ name = "reactive teleport armor"
+ desc = "Someone separated our Research Director from his own head!"
+ var/tele_range = 6
+ var/rad_amount= 15
+ reactivearmor_cooldown_duration = 100
+
+/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(!active)
+ return 0
+ if(prob(hit_reaction_chance))
+ var/mob/living/carbon/human/H = owner
+ if(world.time < reactivearmor_cooldown)
+ owner.visible_message("The reactive teleport system is still recharging! It fails to teleport [H]! ")
+ return
+ owner.visible_message("The reactive teleport system flings [H] clear of [attack_text], shutting itself off in the process! ")
+ var/list/turfs = new/list()
+ for(var/turf/T in orange(tele_range, H))
+ if(T.density)
+ continue
+ if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.yThe reactive incendiary armor on [owner] activates, but fails to send out flames as it is still recharging its flame jets!")
+ return
+ owner.visible_message("[src] blocks [attack_text], sending out jets of flame! ")
+ for(var/mob/living/carbon/C in range(6, owner))
+ if(C != owner)
+ C.fire_stacks += 8
+ C.IgniteMob()
+ owner.fire_stacks = -20
+ reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
+ return 1
+ return 0
+
+//Stealth
+
+/obj/item/clothing/suit/armor/reactive/stealth
+ name = "reactive stealth armor"
+ desc = "An experimental suit of armor that renders the wearer invisible on detection of imminent harm, and creates a decoy that runs away from the owner. You can't fight what you can't see."
+
+/obj/item/clothing/suit/armor/reactive/stealth/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(!active)
+ return 0
+ if(prob(hit_reaction_chance))
+ if(world.time < reactivearmor_cooldown)
+ owner.visible_message("The reactive stealth system on [owner] activates, but is still recharging its holographic emitters! ")
+ return
+ var/mob/living/simple_animal/hostile/illusion/escape/E = new(owner.loc)
+ E.Copy_Parent(owner, 50)
+ E.GiveTarget(owner) //so it starts running right away
+ E.Goto(owner, E.move_to_delay, E.minimum_distance)
+ owner.alpha = 0
+ owner.visible_message("[owner] is hit by [attack_text] in the chest! ") //We pretend to be hit, since blocking it would stop the message otherwise
+ spawn(40)
+ owner.alpha = initial(owner.alpha)
+ reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
+ return 1
+
+//Tesla
+
+/obj/item/clothing/suit/armor/reactive/tesla
+ name = "reactive tesla armor"
+ desc = "An experimental suit of armor with sensitive detectors hooked up to a huge capacitor grid, with emitters strutting out of it. Zap."
+ siemens_coefficient = -1
+ var/tesla_power = 25000
+ var/tesla_range = 20
+ var/tesla_boom = FALSE
+ var/tesla_stun = FALSE
+
+/obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(!active)
+ return 0
+ if(prob(hit_reaction_chance))
+ if(world.time < reactivearmor_cooldown)
+ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
+ sparks.set_up(1, 1, src)
+ sparks.start()
+ owner.visible_message("The tesla capacitors on [owner]'s reactive tesla armor are still recharging! The armor merely emits some sparks. ")
+ return
+ owner.visible_message("[src] blocks [attack_text], sending out arcs of lightning! ")
+ tesla_zap(owner,tesla_range,tesla_power,tesla_boom, tesla_stun)
+ reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
+ return 1
+
+
+//Repulse
+
+/obj/item/clothing/suit/armor/reactive/repulse
+ name = "reactive repulse armor"
+ desc = "An experimental suit of armor that violently throws back attackers."
+
+/obj/item/clothing/suit/armor/reactive/repulse/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(!active)
+ return 0
+ if(prob(hit_reaction_chance))
+ if(world.time < reactivearmor_cooldown)
+ owner.visible_message("The repulse generator is still recharging! ")
+ return 0
+ owner.visible_message("[src] blocks [attack_text], converting the attack into a wave of force! ")
+ var/turf/T = get_turf(owner)
+ var/list/thrown_items = list()
+ for(var/atom/movable/A in range(T, 7))
+ if(A == owner || A.anchored || thrown_items[A])
+ continue
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src)))
+ A.throw_at(throwtarget,10,1)
+ thrown_items[A] = A
+
+ reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
+ return 1
+
+/obj/item/clothing/suit/armor/reactive/table
+ name = "reactive table armor"
+ desc = "If you can't beat the memes, embrace them."
+ var/tele_range = 10
+
+/obj/item/clothing/suit/armor/reactive/table/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(!active)
+ return 0
+ if(prob(hit_reaction_chance))
+ var/mob/living/carbon/human/H = owner
+ if(world.time < reactivearmor_cooldown)
+ owner.visible_message("The reactive table armor's fabricators are still on cooldown! ")
+ return
+ owner.visible_message("The reactive teleport system flings [H] clear of [attack_text] and slams them into a fabricated table! ")
+ owner.visible_message("[H] GOES ON THE TABLE!!! ")
+ owner.Knockdown(40)
+ var/list/turfs = new/list()
+ for(var/turf/T in orange(tele_range, H))
+ if(T.density)
+ continue
+ if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.yYou're already wearing something on your head!")
return
- else if(H.equip_to_slot_if_possible(hood,slot_head,0,0,1))
+ else if(H.equip_to_slot_if_possible(hood,SLOT_HEAD,0,0,1))
suittoggled = TRUE
src.icon_state = "[initial(icon_state)]_t"
H.update_inv_wear_suit()
@@ -83,7 +83,7 @@
/obj/item/clothing/head/hooded/equipped(mob/user, slot)
..()
- if(slot != slot_head)
+ if(slot != SLOT_HEAD)
if(suit)
suit.RemoveHood()
else
@@ -155,7 +155,7 @@
/obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot)
if(!helmettype)
return
- if(slot != slot_wear_suit)
+ if(slot != SLOT_WEAR_SUIT)
RemoveHelmet()
..()
@@ -192,7 +192,7 @@
if(H.head)
to_chat(H, "You're already wearing something on your head! ")
return
- else if(H.equip_to_slot_if_possible(helmet,slot_head,0,0,1))
+ else if(H.equip_to_slot_if_possible(helmet,SLOT_HEAD,0,0,1))
to_chat(H, "You engage the helmet on the hardsuit. ")
suittoggled = TRUE
H.update_inv_wear_suit()
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 28b82a1c43..3a9a72a543 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -21,7 +21,7 @@
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/extinguisher, /obj/item/crowbar)
slowdown = 1
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
- flags_1 = STOPSPRESSUREDMAGE_1 | THICKMATERIAL_1
+ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -56,7 +56,7 @@
name = "bomb hood"
desc = "Use in case of bomb."
icon_state = "bombsuit"
- flags_1 = THICKMATERIAL_1
+ clothing_flags = THICKMATERIAL
armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50)
flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
dynamic_hair_suffix = ""
@@ -79,7 +79,7 @@
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
- flags_1 = THICKMATERIAL_1
+ clothing_flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
slowdown = 2
armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50)
@@ -119,7 +119,7 @@
name = "radiation hood"
icon_state = "rad"
desc = "A hood with radiation protective properties. The label reads, 'Made with lead. Please do not consume insulation.'"
- flags_1 = THICKMATERIAL_1
+ clothing_flags = THICKMATERIAL
flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30)
strip_delay = 60
@@ -139,7 +139,7 @@
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.9
permeability_coefficient = 0.5
- flags_1 = THICKMATERIAL_1
+ clothing_flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/geiger_counter)
slowdown = 1.5
@@ -153,4 +153,4 @@
. = ..()
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION, TRUE, FALSE)
// Just don't want things to be irradiated inside this
- // Except things on the mob aren't even inside the suit so ehhhhhh
\ No newline at end of file
+ // Except things on the mob aren't even inside the suit so ehhhhhh
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index dd290fdaa2..4d037d652b 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -3,7 +3,7 @@
name = "under"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
permeability_coefficient = 0.9
- slot_flags = SLOT_ICLOTHING
+ slot_flags = ITEM_SLOT_ICLOTHING
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women
var/has_sensor = HAS_SENSORS // For the crew computer
@@ -65,7 +65,7 @@
adjusted = DIGITIGRADE_STYLE
H.update_inv_w_uniform()
- if(attached_accessory && slot != slot_hands && ishuman(user))
+ if(attached_accessory && slot != SLOT_HANDS && ishuman(user))
var/mob/living/carbon/human/H = user
attached_accessory.on_uniform_equip(src, user)
if(attached_accessory.above_suit)
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 3a12f00a05..afb9bff1c1 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -9,7 +9,7 @@
var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/glorf - /obj/item/clothing/under/color/black/ghost)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
- H.equip_to_slot_or_del(new C(H), slot_w_uniform) //or else you end up with naked assistants running around everywhere...
+ H.equip_to_slot_or_del(new C(H), SLOT_W_UNIFORM) //or else you end up with naked assistants running around everywhere...
else
new C(loc)
return INITIALIZE_HINT_QDEL
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index be8a113f22..e2be42e014 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -28,6 +28,14 @@
item_state = "gy_suit"
item_color = "security"
+/obj/item/clothing/under/rank/security/skirt
+ name = "security jumpskirt"
+ desc = "A \"tactical\" security jumpsuit with the legs replaced by a skirt."
+ icon_state = "secskirt"
+ item_state = "r_suit"
+ item_color = "secskirt"
+ can_adjust = FALSE //you know now that i think of it if you adjust the skirt and the sprite disappears isn't that just like flashing everyone
+
/obj/item/clothing/under/rank/warden
name = "security suit"
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
index 5623b082a4..c323f1edf2 100644
--- a/code/modules/detectivework/scanner.dm
+++ b/code/modules/detectivework/scanner.dm
@@ -12,7 +12,7 @@
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags_1 = CONDUCT_1 | NOBLUDGEON_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
var/scanning = 0
var/list/log = list()
var/range = 8
diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm
index 7d1953738f..2f4a84c646 100644
--- a/code/modules/emoji/emoji_parse.dm
+++ b/code/modules/emoji/emoji_parse.dm
@@ -15,8 +15,10 @@
search = findtext(text, ":", pos+1)
if(search)
emoji = lowertext(copytext(text, pos+1, search))
- if(emoji in emojis)
- parsed += icon2html('icons/emoji.dmi', world, emoji)
+ var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/goonchat)
+ var/tag = sheet.icon_tag("emoji-[emoji]")
+ if(tag)
+ parsed += tag
pos = search + 1
else
parsed += copytext(text, pos, search)
diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm
index 33b9462e40..2b0c16ebfc 100644
--- a/code/modules/events/mass_hallucination.dm
+++ b/code/modules/events/mass_hallucination.dm
@@ -11,22 +11,27 @@
/datum/round_event/mass_hallucination/start()
switch(rand(1,4))
if(1) //same sound for everyone
- var/sound = pick("explosion","far_explosion","phone","alarm","hallelujah","creepy","ratvar","shuttle_dock",
- "wall_decon","door_hack","blob_alert","tesla","malf_ai","meteors")
+ var/sound = pick("airlock","airlock_pry","console","explosion","far_explosion","mech","glass","alarm","beepsky","mech","wall_decon","door_hack","tesla")
for(var/mob/living/carbon/C in GLOB.alive_mob_list)
new /datum/hallucination/sounds(C, TRUE, sound)
- if(2 to 4)
+ if(2)
+ var/weirdsound = pick("phone","hallelujah","highlander","hyperspace","game_over","creepy","tesla")
+ for(var/mob/living/carbon/C in GLOB.alive_mob_list)
+ new /datum/hallucination/weird_sounds(C, TRUE, weirdsound)
+ if(3)
+ var/stationmessage = pick("ratvar","shuttle_dock","blob_alert","malf_ai","meteors","supermatter")
+ for(var/mob/living/carbon/C in GLOB.alive_mob_list)
+ new /datum/hallucination/stationmessage(C, TRUE, stationmessage)
+ if(4 to 6)
var/picked_hallucination = pick( /datum/hallucination/bolts,
- /datum/hallucination/whispers,
+ /datum/hallucination/chat,
/datum/hallucination/message,
/datum/hallucination/bolts,
/datum/hallucination/fake_flood,
/datum/hallucination/battle,
/datum/hallucination/fire,
/datum/hallucination/self_delusion,
- /datum/hallucination/fakeattacker,
/datum/hallucination/death,
- /datum/hallucination/xeno_attack,
/datum/hallucination/delusion,
/datum/hallucination/oh_yeah)
for(var/mob/living/carbon/C in GLOB.alive_mob_list)
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index ae4c5cbd4a..ba7b87150b 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -14,8 +14,9 @@
var/randomProbability = 1
var/reagentsAmount = 100
var/list/saferChems = list("water","carbon","flour","cleaner","nutriment","condensedcapsaicin","mushroomhallucinogen","lube","pink_glitter",
- "plantbgone","blood","charcoal","space_drugs","morphine","holywater","ethanol","hot_coco","sacid","mindbreaker","rotatium","skewium",
- "pax","laughter","concentrated_barbers_aid","colorful_reagent","dizzysolution","tiresolution","salt","beer","hair_dye","sugar","white_glitter","growthserum")
+ "plantbgone","blood","charcoal","space_drugs","morphine","holywater","ethanol","hot_coco","sacid","mindbreaker","rotatium",
+ "pax","laughter","concentrated_barbers_aid","colorful_reagent","dizzysolution","tiresolution","sodiumchloride","beer","hair_dye","sugar","white_glitter","growthserum")
+ //needs to be chemid unit checked at some point
/datum/round_event/vent_clog/announce()
priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert")
diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm
index 9de5a93292..180589b4f1 100644
--- a/code/modules/events/wizard/curseditems.dm
+++ b/code/modules/events/wizard/curseditems.dm
@@ -11,29 +11,29 @@
/datum/round_event/wizard/cursed_items/start()
var/item_set = pick("wizardmimic", "swords", "bigfatdoobie", "boxing", "voicemodulators", "catgirls2015")
- var/list/loadout[slots_amt]
+ var/list/loadout[SLOTS_AMT]
var/ruins_spaceworthiness
var/ruins_wizard_loadout
switch(item_set)
if("wizardmimic")
- loadout[slot_wear_suit] = /obj/item/clothing/suit/wizrobe
- loadout[slot_shoes] = /obj/item/clothing/shoes/sandal/magic
- loadout[slot_head] = /obj/item/clothing/head/wizard
+ loadout[SLOT_WEAR_SUIT] = /obj/item/clothing/suit/wizrobe
+ loadout[SLOT_SHOES] = /obj/item/clothing/shoes/sandal/magic
+ loadout[SLOT_HEAD] = /obj/item/clothing/head/wizard
ruins_spaceworthiness = 1
if("swords")
- loadout[slot_hands] = /obj/item/katana/cursed
+ loadout[SLOT_HANDS] = /obj/item/katana/cursed
if("bigfatdoobie")
- loadout[slot_wear_mask] = /obj/item/clothing/mask/cigarette/rollie/trippy
+ loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/cigarette/rollie/trippy
ruins_spaceworthiness = 1
if("boxing")
- loadout[slot_wear_mask] = /obj/item/clothing/mask/luchador
- loadout[slot_gloves] = /obj/item/clothing/gloves/boxing
+ loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/luchador
+ loadout[SLOT_GLOVES] = /obj/item/clothing/gloves/boxing
ruins_spaceworthiness = 1
if("voicemodulators")
- loadout[slot_wear_mask] = /obj/item/clothing/mask/chameleon
+ loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/chameleon
if("catgirls2015")
- loadout[slot_head] = /obj/item/clothing/head/kitty
+ loadout[SLOT_HEAD] = /obj/item/clothing/head/kitty
ruins_spaceworthiness = 1
ruins_wizard_loadout = 1
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 4006bb50b7..1ade5070a7 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -1,84 +1,83 @@
-/*
-Ideas for the subtle effects of hallucination:
-
-Light up oxygen/plasma indicators (done)
-Cause health to look critical/dead, even when standing (done)
-Characters silently watching you
-Brief flashes of fire/space/bombs/c4/dangerous shit (done)
-Items that are rare/traitorous/don't exist appearing in your inventory slots (done)
-Strange audio (should be rare) (done)
-Gunshots/explosions/opening doors/less rare audio (done)
-
-*/
-
#define HAL_LINES_FILE "hallucination.json"
-GLOBAL_LIST_INIT(hallucinations_minor, list(
- /datum/hallucination/sounds,
- /datum/hallucination/bolts,
- /datum/hallucination/whispers,
- /datum/hallucination/message,
- /datum/hallucination/hudscrew))
+GLOBAL_LIST_INIT(hallucination_list, list(
+ /datum/hallucination/chat = 100,
+ /datum/hallucination/message = 60,
+ /datum/hallucination/sounds = 50,
+ /datum/hallucination/battle = 20,
+ /datum/hallucination/dangerflash = 15,
+ /datum/hallucination/hudscrew = 12,
+ /datum/hallucination/fake_alert = 12,
+ /datum/hallucination/weird_sounds = 8,
+ /datum/hallucination/stationmessage = 7,
+ /datum/hallucination/fake_flood = 7,
+ /datum/hallucination/stray_bullet = 7,
+ /datum/hallucination/bolts = 7,
+ /datum/hallucination/items_other = 7,
+ /datum/hallucination/husks = 7,
+ /datum/hallucination/items = 4,
+ /datum/hallucination/fire = 3,
+ /datum/hallucination/self_delusion = 2,
+ /datum/hallucination/delusion = 2,
+ /datum/hallucination/shock = 1,
+ /datum/hallucination/death = 1,
+ /datum/hallucination/oh_yeah = 1
+ ))
-GLOBAL_LIST_INIT(hallucinations_medium, list(
- /datum/hallucination/fake_alert,
- /datum/hallucination/items,
- /datum/hallucination/items_other,
- /datum/hallucination/dangerflash,
- /datum/hallucination/bolts,
- /datum/hallucination/fake_flood,
- /datum/hallucination/husks,
- /datum/hallucination/battle,
- /datum/hallucination/fire,
- /datum/hallucination/self_delusion,
- /datum/hallucination/stray_bullet))
-
-GLOBAL_LIST_INIT(hallucinations_major, list(
- /datum/hallucination/fakeattacker,
- /datum/hallucination/death,
- /datum/hallucination/xeno_attack,
- /datum/hallucination/singularity_scare,
- /datum/hallucination/delusion,
- /datum/hallucination/oh_yeah))
/mob/living/carbon/proc/handle_hallucinations()
+ if(!hallucination)
+ return
+
+ hallucination--
+
if(world.time < next_hallucination)
return
- if(hallucination)
- var/list/current = GLOB.hallucinations_minor
- if(prob(25) && hallucination > 100)
- current = GLOB.hallucinations_medium
- else if(prob(10) && hallucination > 200)
- current = GLOB.hallucinations_major
- var/halpick = pick(current)
- new halpick(src, FALSE)
+ var/halpick = pickweight(GLOB.hallucination_list)
+ new halpick(src, FALSE)
+
+ next_hallucination = world.time + rand(100, 600)
/mob/living/carbon/proc/set_screwyhud(hud_type)
hal_screwyhud = hud_type
update_health_hud()
/datum/hallucination
+ var/natural = TRUE
var/mob/living/carbon/target
- var/cost = 5 //affects the amount of hallucination reduced, and cooldown until the next hallucination
var/feedback_details //extra info for investigate
-/datum/hallucination/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
- target = T
- if(!forced)
- target.hallucination = max(0, target.hallucination - cost)
- target.next_hallucination = world.time + (rand(cost * 0.5, cost * 3) * 10)
+ target = C
+ natural = !forced
/datum/hallucination/proc/wake_and_restore()
target.set_screwyhud(SCREWYHUD_NONE)
target.SetSleeping(0)
/datum/hallucination/Destroy()
- target.investigate_log("was afflicted with a hallucination of type [type]. [feedback_details]", INVESTIGATE_HALLUCINATIONS)
+ target.investigate_log("was afflicted with a hallucination of type [type] by [natural?"hallucination status":"an external source"]. [feedback_details]", INVESTIGATE_HALLUCINATIONS)
target = null
return ..()
+//Returns a random turf in a ring around the target mob, useful for sound hallucinations
+/datum/hallucination/proc/random_far_turf()
+ var/x_based = prob(50)
+ var/first_offset = pick(-8,-7,-6,-5,5,6,7,8)
+ var/second_offset = rand(-8,8)
+ var/x_off
+ var/y_off
+ if(x_based)
+ x_off = first_offset
+ y_off = second_offset
+ else
+ y_off = first_offset
+ x_off = second_offset
+ var/turf/T = locate(target.x + x_off, target.y + y_off, target.z)
+ return T
+
/obj/effect/hallucination
invisibility = INVISIBILITY_OBSERVER
anchored = TRUE
@@ -155,9 +154,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
var/image_state = "plasma"
var/radius = 0
var/next_expand = 0
- cost = 25
-/datum/hallucination/fake_flood/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/fake_flood/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target))
@@ -225,9 +223,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
//Xeno crawls from nearby vent,jumps at you, and goes back in
var/obj/machinery/atmospherics/components/unary/vent_pump/pump = null
var/obj/effect/hallucination/simple/xeno/xeno = null
- cost = 25
-/datum/hallucination/xeno_attack/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/xeno_attack/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target))
@@ -273,9 +270,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
var/obj/effect/hallucination/simple/bubblegum/bubblegum
var/image/fakebroken
var/image/fakerune
- cost = 75
-/datum/hallucination/oh_yeah/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/oh_yeah/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
. = ..()
var/turf/closed/wall/wall
@@ -325,151 +321,192 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
QDEL_NULL(bubblegum)
return ..()
-/datum/hallucination/singularity_scare
- //Singularity moving towards you.
- //todo Hide where it moved with fake space images
- var/obj/effect/hallucination/simple/singularity/s = null
- cost = 75
-
-/datum/hallucination/singularity_scare/New(mob/living/carbon/T, forced = TRUE)
- set waitfor = FALSE
- ..()
- var/turf/start = get_turf(T)
- var/screen_border = pick(SOUTH,EAST,WEST,NORTH)
- for(var/i in 1 to 13)
- start = get_step(start,screen_border)
- feedback_details += "Source: [start.x],[start.y],[start.z]"
- s = new(start,target)
- s.parent = src
- for(var/i in 1 to 13)
- sleep(10)
- s.forceMove(get_step(get_turf(s),get_dir(s,target)))
- s.Show()
- s.Eat()
- qdel(s)
-
-/obj/effect/hallucination/simple/singularity
- image_icon = 'icons/effects/224x224.dmi'
- image_state = "singularity_s7"
- image_layer = MASSIVE_OBJ_LAYER
- px = -96
- py = -96
- var/datum/hallucination/singularity_scare/parent
-
-/obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir)
- var/target_dist = get_dist(src,target)
- if(target_dist<=3) //"Eaten"
- target.set_screwyhud(SCREWYHUD_DEAD)
- target.SetUnconscious(160)
- addtimer(CALLBACK(parent, /datum/hallucination/.proc/wake_and_restore), rand(30, 50))
-
/datum/hallucination/battle
- cost = 15
-/datum/hallucination/battle/New(mob/living/carbon/T, forced = TRUE, battle_type)
+/datum/hallucination/battle/New(mob/living/carbon/C, forced = TRUE, battle_type)
set waitfor = FALSE
..()
- var/hits = rand(3,6)
+ var/turf/source = random_far_turf()
if(!battle_type)
- battle_type = pick("laser","esword","gun","stunprod","bomb")
+ battle_type = pick("laser","disabler","esword","gun","stunprod","harmbaton","bomb")
feedback_details += "Type: [battle_type]"
switch(battle_type)
- if("laser") //Laser fight
- for(var/i in 1 to hits)
- target.playsound_local(null, 'sound/weapons/laser.ogg', 25, 1)
+ if("laser")
+ var/hits = 0
+ for(var/i in 1 to rand(5, 10))
+ target.playsound_local(source, 'sound/weapons/laser.ogg', 25, 1)
if(prob(50))
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/sear.ogg', 25, 1), rand(10,20))
+ addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/sear.ogg', 25, 1), rand(5,10))
+ hits++
else
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(10,20))
- sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8))
- target.playsound_local(null, get_sfx("bodyfall"), 25, 1)
- if("esword") //Esword fight
- target.playsound_local(null, 'sound/weapons/saberon.ogg',15, 1)
- for(var/i=0,i= 4 && prob(70))
+ target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
+ break
+ if("disabler")
+ var/hits = 0
+ for(var/i in 1 to rand(5, 10))
+ target.playsound_local(source, 'sound/weapons/taser2.ogg', 25, 1)
+ if(prob(50))
+ addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/tap.ogg', 25, 1), rand(5,10))
+ hits++
+ else
+ addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(5,10))
+ sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 6))
+ if(hits >= 3 && prob(70))
+ target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
+ break
+ if("esword")
+ target.playsound_local(source, 'sound/weapons/saberon.ogg',15, 1)
+ for(var/i in 1 to rand(4, 8))
+ target.playsound_local(source, 'sound/weapons/blade1.ogg', 50, 1)
+ if(i == 4)
+ target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
+ sleep(rand(CLICK_CD_MELEE, CLICK_CD_MELEE + 6))
+ target.playsound_local(source, 'sound/weapons/saberoff.ogg', 15, 1)
+ if("gun")
+ var/hits = 0
+ for(var/i in 1 to rand(3, 6))
+ target.playsound_local(source, get_sfx("gunshot"), 25)
if(prob(60))
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/pierce.ogg', 25, 1), rand(10,20))
+ addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/pierce.ogg', 25, 1), rand(5,10))
+ hits++
else
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, "ricochet", 25, 1), rand(10,20))
- sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8))
- target.playsound_local(null, get_sfx("bodyfall"), 25, 1)
+ addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, "ricochet", 25, 1), rand(5,10))
+ sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 6))
+ if(hits >= 2 && prob(80))
+ target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
+ break
if("stunprod") //Stunprod + cablecuff
- target.playsound_local(null, 'sound/weapons/egloves.ogg', 40, 1)
- target.playsound_local(null, get_sfx("bodyfall"), 25, 1)
+ target.playsound_local(source, 'sound/weapons/egloves.ogg', 40, 1)
+ target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
sleep(20)
- target.playsound_local(null, 'sound/weapons/cablecuff.ogg', 15, 1)
+ target.playsound_local(source, 'sound/weapons/cablecuff.ogg', 15, 1)
+ if("harmbaton") //zap n slap
+ target.playsound_local(source, 'sound/weapons/egloves.ogg', 40, 1)
+ target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
+ sleep(20)
+ for(var/i in 1 to rand(5, 12))
+ target.playsound_local(source, "swing_hit", 50, 1)
+ sleep(rand(CLICK_CD_MELEE, CLICK_CD_MELEE + 4))
if("bomb") // Tick Tock
- for(var/i in 1 to hits)
- target.playsound_local(null, 'sound/items/timer.ogg', 25, 0)
+ for(var/i in 1 to rand(3, 11))
+ target.playsound_local(source, 'sound/items/timer.ogg', 25, 0)
sleep(15)
qdel(src)
/datum/hallucination/items_other
- cost = 10
-/datum/hallucination/items_other/New(mob/living/carbon/T, forced = TRUE, item_type)
+/datum/hallucination/items_other/New(mob/living/carbon/C, forced = TRUE, item_type)
set waitfor = FALSE
..()
var/item
if(!item_type)
- item = pick(list("esword","dual_esword","stunpaper","clockspear","ttv","flash","armblade"))
+ item = pick(list("esword","taser","ebow","baton","dual_esword","clockspear","ttv","flash","armblade"))
else
item = item_type
feedback_details += "Item: [item]"
+ var/side
var/image_file
var/image/A = null
- for(var/mob/living/carbon/human/H in view(7,target))
- if(H != target)
- var/free_hand = H.get_empty_held_index_for_side(side = "left")
- if(free_hand)
- image_file = 'icons/mob/inhands/items_lefthand.dmi'
- else
- free_hand = H.get_empty_held_index_for_side(side = "right")
- if(free_hand)
- image_file = 'icons/mob/inhands/items_righthand.dmi'
- if(image_file)
- switch(item)
- if("esword")
- target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1)
- A = image(image_file,H,"swordred", layer=ABOVE_MOB_LAYER)
- if("dual_esword")
- target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1)
- A = image(image_file,H,"dualsaberred1", layer=ABOVE_MOB_LAYER)
- if("stunpaper")
- A = image(image_file,H,"paper", layer=ABOVE_MOB_LAYER)
- A.color = rgb(255,0,0)
- if("clockspear")
- A = image(image_file,H,"ratvarian_spear", layer=ABOVE_MOB_LAYER)
- if("ttv")
- A = image(image_file,H,"ttv", layer=ABOVE_MOB_LAYER)
- if("flash")
- A = image(image_file,H,"flashtool", layer=ABOVE_MOB_LAYER)
- if("armblade")
- A = image(image_file,H,"arm_blade", layer=ABOVE_MOB_LAYER)
- if(target.client)
- target.client.images |= A
- sleep(rand(150,250))
- if(item == "esword" || item == "dual_esword")
- target.playsound_local(H, 'sound/weapons/saberoff.ogg',35,1)
- target.client.images.Remove(A)
- break
+ var/list/mob_pool = list()
+
+ for(var/mob/living/carbon/human/M in view(7,target))
+ if(M != target)
+ mob_pool += M
+ if(!mob_pool.len)
+ return
+
+ var/mob/living/carbon/human/H = pick(mob_pool)
+ feedback_details += " Mob: [H.real_name]"
+
+ var/free_hand = H.get_empty_held_index_for_side(side = "left")
+ if(free_hand)
+ side = "left"
+ else
+ free_hand = H.get_empty_held_index_for_side(side = "right")
+ if(free_hand)
+ side = "right"
+
+ if(side)
+ switch(item)
+ if("esword")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1)
+ A = image(image_file,H,"swordred", layer=ABOVE_MOB_LAYER)
+ if("dual_esword")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1)
+ A = image(image_file,H,"dualsaberred1", layer=ABOVE_MOB_LAYER)
+ if("taser")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ A = image(image_file,H,"advtaserstun4", layer=ABOVE_MOB_LAYER)
+ if("ebow")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ A = image(image_file,H,"crossbow", layer=ABOVE_MOB_LAYER)
+ if("baton")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ target.playsound_local(H, "sparks",75,1,-1)
+ A = image(image_file,H,"baton", layer=ABOVE_MOB_LAYER)
+ if("clockspear")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'
+ A = image(image_file,H,"ratvarian_spear", layer=ABOVE_MOB_LAYER)
+ if("ttv")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi'
+ A = image(image_file,H,"ttv", layer=ABOVE_MOB_LAYER)
+ if("flash")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ A = image(image_file,H,"flashtool", layer=ABOVE_MOB_LAYER)
+ if("armblade")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
+ target.playsound_local(H, 'sound/effects/blobattack.ogg',30,1)
+ A = image(image_file,H,"arm_blade", layer=ABOVE_MOB_LAYER)
+ if(target.client)
+ target.client.images |= A
+ sleep(rand(150,250))
+ if(item == "esword" || item == "dual_esword")
+ target.playsound_local(H, 'sound/weapons/saberoff.ogg',35,1)
+ if(item == "armblade")
+ target.playsound_local(H, 'sound/effects/blobattack.ogg',30,1)
+ target.client.images.Remove(A)
qdel(src)
/datum/hallucination/delusion
var/list/image/delusions = list()
- cost = 50
-/datum/hallucination/delusion/New(mob/living/carbon/T, forced, force_kind = null , duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null, custom_name = null)
+/datum/hallucination/delusion/New(mob/living/carbon/C, forced, force_kind = null , duration = 300,skip_nearby = TRUE, custom_icon = null, custom_icon_file = null, custom_name = null)
set waitfor = FALSE
. = ..()
var/image/A = null
- var/kind = force_kind ? force_kind : pick("monkey","corgi","carp","skeleton","demon","zombie")
+ var/kind = force_kind ? force_kind : pick("nothing","monkey","corgi","carp","skeleton","demon","zombie")
feedback_details += "Type: [kind]"
var/list/nearby
if(skip_nearby)
@@ -480,6 +517,9 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
if(skip_nearby && (H in nearby))
continue
switch(kind)
+ if("nothing")
+ A = image('icons/effects/effects.dmi',H,"nothing")
+ A.name = "..."
if("monkey")//Monkey
A = image('icons/mob/monkey.dmi',H,"monkey1")
A.name = "Monkey ([rand(1,999)])"
@@ -516,9 +556,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
/datum/hallucination/self_delusion
var/image/delusion
- cost = 40
-/datum/hallucination/self_delusion/New(mob/living/carbon/T, forced, force_kind = null , duration = 300, custom_icon = null, custom_icon_file = null, wabbajack = TRUE) //set wabbajack to false if you want to use another fake source
+/datum/hallucination/self_delusion/New(mob/living/carbon/C, forced, force_kind = null , duration = 300, custom_icon = null, custom_icon_file = null, wabbajack = TRUE) //set wabbajack to false if you want to use another fake source
set waitfor = FALSE
..()
var/image/A = null
@@ -556,176 +595,14 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
target.client.images.Remove(delusion)
return ..()
-/datum/hallucination/fakeattacker/New(mob/living/carbon/T, forced = TRUE)
- set waitfor = FALSE
- ..()
- var/mob/living/carbon/human/clone = null
- var/clone_weapon = null
-
- for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
- if(H.stat || H.lying)
- continue
- clone = H
- feedback_details += "Clone of: [H.real_name]"
- break
-
- if(!clone)
- return
-
- var/static/list/non_fakeattack_weapons = list(/obj/item/gun/ballistic, /obj/item/ammo_box/a357,\
- /obj/item/gun/energy/kinetic_accelerator/crossbow, /obj/item/melee/transforming/energy/sword/saber,\
- /obj/item/storage/box/syndicate, /obj/item/storage/box/emps,\
- /obj/item/cartridge/virus/syndicate, /obj/item/clothing/under/chameleon,\
- /obj/item/clothing/shoes/chameleon/noslip, /obj/item/card/id/syndicate,\
- /obj/item/clothing/mask/chameleon, /obj/item/clothing/glasses/thermal,\
- /obj/item/chameleon, /obj/item/card/emag, /obj/item/grenade/plastic/x4,\
- /obj/item/storage/toolbox/syndicate, /obj/item/aiModule,\
- /obj/item/radio/headset/syndicate, /obj/item/grenade/plastic/c4,\
- /obj/item/powersink, /obj/item/storage/box/syndie_kit,\
- /obj/item/toy/syndicateballoon, /obj/item/gun/energy/laser/captain,\
- /obj/item/hand_tele, /obj/item/construction/rcd, /obj/item/tank/jetpack,\
- /obj/item/clothing/under/rank/captain, /obj/item/aicard,\
- /obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/disk/nuclear,\
- /obj/item/clothing/suit/space/nasavoid, /obj/item/tank)
-
- var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(get_turf(target),target)
-
- for(var/obj/item/I in clone.held_items)
- if(!(locate(I) in non_fakeattack_weapons))
- clone_weapon = I.name
- F.weap = I
-
- F.name = clone.name
- F.my_target = target
- F.weapon_name = clone_weapon
-
- F.left = image(clone,dir = WEST)
- F.right = image(clone,dir = EAST)
- F.up = image(clone,dir = NORTH)
- F.down = image(clone,dir = SOUTH)
-
- F.updateimage()
- qdel(src)
-
-/obj/effect/fake_attacker
- icon = null
- icon_state = null
- name = ""
- desc = ""
- density = FALSE
- anchored = TRUE
- opacity = 0
- var/mob/living/carbon/human/my_target = null
- var/weapon_name = null
- var/obj/item/weap = null
- var/image/stand_icon = null
- var/image/currentimage = null
- var/icon/base = null
- var/skin_tone
- var/mob/living/clone = null
- var/image/left
- var/image/right
- var/image/up
- var/collapse
- var/image/down
-
- max_integrity = 100
-
-/obj/effect/fake_attacker/attackby(obj/item/P, mob/living/user, params)
- step_away(src,my_target,2)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- my_target.playsound_local(src, P.hitsound, 1)
- my_target.visible_message("[my_target] flails around wildly. ", \
- "[my_target] has attacked [src]! ")
-
- obj_integrity -= P.force
-
-/obj/effect/fake_attacker/Crossed(mob/M, somenumber)
- if(M == my_target)
- step_away(src,my_target,2)
- if(prob(30))
- for(var/mob/O in oviewers(world.view , my_target))
- to_chat(O, "[my_target] stumbles around. ")
-
-/obj/effect/fake_attacker/Initialize(mapload, mob/living/carbon/T)
- ..()
- my_target = T
- QDEL_IN(src, 300)
- step_away(src,my_target,2)
- INVOKE_ASYNC(src, .proc/attack_loop)
-
-
-/obj/effect/fake_attacker/proc/updateimage()
-// del src.currentimage
- if(src.dir == NORTH)
- del src.currentimage
- src.currentimage = new /image(up,src)
- else if(src.dir == SOUTH)
- del src.currentimage
- src.currentimage = new /image(down,src)
- else if(src.dir == EAST)
- del src.currentimage
- src.currentimage = new /image(right,src)
- else if(src.dir == WEST)
- del src.currentimage
- src.currentimage = new /image(left,src)
- SEND_IMAGE(my_target, currentimage)
-
-
-/obj/effect/fake_attacker/proc/attack_loop()
- while(1)
- sleep(rand(5,10))
- if(obj_integrity < 0 || my_target.stat)
- collapse()
- continue
- if(get_dist(src,my_target) > 1)
- src.setDir(get_dir(src,my_target))
- step_towards(src,my_target)
- updateimage()
- else
- if(prob(15))
- if(weapon_name)
- my_target.playsound_local(my_target, weap.hitsound, weap.get_clamped_volume(), 1)
- my_target.show_message("[src.name] has attacked [my_target] with [weapon_name]! ", 1)
- my_target.staminaloss += 30
- if(prob(20))
- my_target.blur_eyes(3)
- if(prob(33))
- if(!locate(/obj/effect/overlay) in my_target.loc)
- fake_blood(my_target)
- else
- my_target.playsound_local(my_target, pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'), 25, 1)
- my_target.show_message("[src.name] has punched [my_target]! ", 1)
- my_target.staminaloss += 30
- if(prob(33))
- if(!locate(/obj/effect/overlay) in my_target.loc)
- fake_blood(my_target)
-
- if(prob(15))
- step_away(src,my_target,2)
-
-/obj/effect/fake_attacker/proc/collapse()
- collapse = 1
- updateimage()
- qdel(src)
-
-/obj/effect/fake_attacker/proc/fake_blood(mob/target)
- var/obj/effect/overlay/O = new/obj/effect/overlay(target.loc)
- O.name = "blood"
- var/image/I = image('icons/effects/blood.dmi',O,"floor[rand(1,7)]",O.dir,1)
- SEND_IMAGE(target, I)
- QDEL_IN(O, 300)
-
-
/datum/hallucination/bolts
- var/list/doors = list()
- cost = 25
+ var/list/locks = list()
-/datum/hallucination/bolts/New(mob/living/carbon/T, forced, door_number=-1) //-1 for severe, 1-2 for subtle
+/datum/hallucination/bolts/New(mob/living/carbon/C, forced, door_number)
set waitfor = FALSE
..()
- var/image/I = null
+ if(!door_number)
+ door_number = rand(0,4) //if 0 bolts all visible doors
var/count = 0
feedback_details += "Door amount: [door_number]"
for(var/obj/machinery/door/airlock/A in range(7, target))
@@ -734,46 +611,65 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
if(!A.density)
continue
count++
- I = image(A.overlays_file, get_turf(A), "lights_bolts",layer=A.layer+0.1)
- doors += I
- if(target.client)
- target.client.images |= I
- target.playsound_local(get_turf(A), 'sound/machines/boltsdown.ogg',30,0,3)
- sleep(rand(6,12))
+ var/obj/effect/hallucination/fake_door_lock/lock = new(get_turf(A))
+ lock.target = target
+ lock.airlock = A
+ locks += lock
+ lock.lock()
+ sleep(rand(4,12))
sleep(100)
- for(var/image/B in doors)
- if(target.client)
- target.client.images.Remove(B)
- target.playsound_local(get_turf(B), 'sound/machines/boltsup.ogg',30,0,3)
- sleep(rand(6,12))
+ for(var/obj/effect/hallucination/fake_door_lock/lock in locks)
+ locks -= lock
+ lock.unlock()
+ sleep(rand(4,12))
qdel(src)
-/datum/hallucination/whispers
- cost = 15
+/obj/effect/hallucination/fake_door_lock
+ layer = CLOSED_DOOR_LAYER + 1 //for Collide priority
+ var/image/bolt_light
+ var/obj/machinery/door/airlock/airlock
-/datum/hallucination/whispers/New(mob/living/carbon/T, forced = TRUE)
+/obj/effect/hallucination/fake_door_lock/proc/lock()
+ bolt_light = image(airlock.overlays_file, get_turf(airlock), "lights_bolts",layer=airlock.layer+0.1)
+ if(target.client)
+ target.client.images |= bolt_light
+ target.playsound_local(get_turf(airlock), 'sound/machines/boltsdown.ogg',30,0,3)
+
+/obj/effect/hallucination/fake_door_lock/proc/unlock()
+ if(target.client)
+ target.client.images.Remove(bolt_light)
+ target.playsound_local(get_turf(airlock), 'sound/machines/boltsup.ogg',30,0,3)
+ qdel(src)
+
+/obj/effect/hallucination/fake_door_lock/CanPass(atom/movable/mover, turf/_target)
+ if(mover == target && airlock.density)
+ return FALSE
+ return TRUE
+
+/datum/hallucination/chat
+
+/datum/hallucination/chat/New(mob/living/carbon/C, forced = TRUE, force_radio, specific_message)
set waitfor = FALSE
..()
var/target_name = target.first_name()
var/speak_messages = list("[pick_list_replacements(HAL_LINES_FILE, "suspicion")]",\
- "[pick_list_replacements(HAL_LINES_FILE, "greetings")][target.first_name()]!",\
- "[pick_list_replacements(HAL_LINES_FILE, "getout")]",\
- "[pick_list_replacements(HAL_LINES_FILE, "weird")]",\
- "[pick_list_replacements(HAL_LINES_FILE, "didyouhearthat")]",\
- "[pick_list_replacements(HAL_LINES_FILE, "imatraitor")]",\
- "[pick_list_replacements(HAL_LINES_FILE, "doubt")]",\
- "[pick_list_replacements(HAL_LINES_FILE, "aggressive")]",\
- "[pick_list_replacements(HAL_LINES_FILE, "help")]!!",\
- "[pick_list_replacements(HAL_LINES_FILE, "escape")]",\
- "I'm infected, [pick_list_replacements(HAL_LINES_FILE, "infection_advice")]!")
+ "[pick_list_replacements(HAL_LINES_FILE, "conversation")]",\
+ "[pick_list_replacements(HAL_LINES_FILE, "greetings")][target.first_name()]!",\
+ "[pick_list_replacements(HAL_LINES_FILE, "getout")]",\
+ "[pick_list_replacements(HAL_LINES_FILE, "weird")]",\
+ "[pick_list_replacements(HAL_LINES_FILE, "didyouhearthat")]",\
+ "[pick_list_replacements(HAL_LINES_FILE, "doubt")]",\
+ "[pick_list_replacements(HAL_LINES_FILE, "aggressive")]",\
+ "[pick_list_replacements(HAL_LINES_FILE, "help")]!!",\
+ "[pick_list_replacements(HAL_LINES_FILE, "escape")]",\
+ "I'm infected, [pick_list_replacements(HAL_LINES_FILE, "infection_advice")]!")
- var/radio_messages = list("Set [target.first_name()] to arrest!",\
- "[pick_list_replacements(HAL_LINES_FILE, "people")] is [pick_list_replacements(HAL_LINES_FILE, "accusations")]!",\
- "Help!",\
- "[pick_list_replacements(HAL_LINES_FILE, "threat")] in [pick_list_replacements(HAL_LINES_FILE, "location")][prob(50)?"!":"!!"]",\
- "Where's [target.first_name()]?"\
- ,"[pick("C","Ai, c","Someone c","Rec")]all the shuttle!"\
- ,"AI [pick("rogue", "is dead")]!!")
+ var/radio_messages = list("[pick_list_replacements(HAL_LINES_FILE, "people")] is [pick_list_replacements(HAL_LINES_FILE, "accusations")]!",\
+ "Help!",\
+ "[pick_list_replacements(HAL_LINES_FILE, "threat")] in [pick_list_replacements(HAL_LINES_FILE, "location")][prob(50)?"!":"!!"]",\
+ "[pick("Where's [target.first_name()]?", "Set [target.first_name()] to arrest!")]",\
+ "[pick("C","Ai, c","Someone c","Rec")]all the shuttle!",\
+ "AI [pick("rogue", "is dead")]!!")
var/list/mob/living/carbon/people = list()
var/list/mob/living/carbon/person = null
@@ -787,8 +683,10 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
if(get_dist(target,H)The light burns you!", \
- "You don't feel like yourself. ", \
- "You hear something squeezing through the ducts... ", \
- "You hear a distant scream. ", \
- "You feel invincible, nothing can hurt you! ", \
- "You feel a tiny prick! ", \
- "[target] sneezes.", \
- //The truth, revealed
- "You're hallucinating. ", \
- //Direct advice
- "[pick_list_replacements(HAL_LINES_FILE, "advice")]")
+ var/list/mobpool = list()
+ var/mob/living/carbon/human/other
+ var/close_other = FALSE
+ for(var/mob/living/carbon/human/H in oview(target, 7))
+ if(get_dist(H, target) <= 1)
+ other = H
+ close_other = TRUE
+ break
+ mobpool += H
+ if(!other && mobpool.len)
+ other = pick(mobpool)
+
+ var/list/message_pool = list()
+ if(other)
+ if(close_other) //increase the odds
+ for(var/i in 1 to 5)
+ message_pool.Add("You feel a tiny prick! ")
+ var/obj/item/storage/equipped_backpack = other.get_item_by_slot(SLOT_BACK)
+ if(istype(equipped_backpack))
+ for(var/i in 1 to 5) //increase the odds
+ message_pool.Add("[other] puts the [pick(\
+ "revolver","energy sword","cryptographic sequencer","power sink","energy bow",\
+ "hybrid taser","stun baton","flash","syringe gun","circular saw","tank transfer valve",\
+ "ritual dagger","clockwork slab","spellbook",\
+ "pulse rifle","captain's spare ID","hand teleporter","hypospray","antique laser gun","X-01 MultiPhase Energy Gun","station's blueprints"\
+ )] into [equipped_backpack]. ")
+
+ message_pool.Add("[other] [pick("sneezes","coughs")].")
+
+ message_pool.Add("You hear something squeezing through the ducts... ", \
+ "Your [pick("arm", "leg", "back", "head")] itches. ",\
+ "You feel [pick("hot","cold","dry","wet","woozy","faint")]. ",
+ "Your stomach rumbles. ",
+ "Your head hurts. ",
+ "You hear a faint buzz in your head. ",
+ "[target] sneezes.")
+ if(prob(10))
+ message_pool.Add("Behind you. ",\
+ "You hear a faint laughter. ",
+ "You see something move. ",
+ "You hear skittering on the ceiling. ",
+ "You see an inhumanly tall silhouette moving in the distance. ")
+ if(prob(10))
+ message_pool.Add("[pick_list_replacements(HAL_LINES_FILE, "advice")]")
+ var/chosen = pick(message_pool)
feedback_details += "Message: [chosen]"
to_chat(target, chosen)
qdel(src)
/datum/hallucination/sounds
- cost = 15
-/datum/hallucination/sounds/New(mob/living/carbon/T, forced = TRUE, sound_type)
+/datum/hallucination/sounds/New(mob/living/carbon/C, forced = TRUE, sound_type)
set waitfor = FALSE
..()
+ var/turf/source = random_far_turf()
if(!sound_type)
- sound_type = pick("airlock","explosion","far_explosion","glass","phone","summon_guns","alarm","beepsky","hallelujah","creepy","ratvar","shuttle_dock",
- "wall_decon","door_hack","esword","blob_alert","tesla","malf_ai","meteors")
+ sound_type = pick("airlock","airlock_pry","console","explosion","far_explosion","mech","glass","alarm","beepsky","mech","wall_decon","door_hack","tesla")
feedback_details += "Type: [sound_type]"
//Strange audio
switch(sound_type)
if("airlock")
- target.playsound_local(null,'sound/machines/airlock.ogg', 15, 1)
+ target.playsound_local(source,'sound/machines/airlock.ogg', 30, 1)
+ if("airlock_pry")
+ target.playsound_local(source,'sound/machines/airlock_alien_prying.ogg', 100, 1)
+ sleep(50)
+ target.playsound_local(source, 'sound/machines/airlockforced.ogg', 30, 1)
+ if("console")
+ target.playsound_local(source,'sound/machines/terminal_prompt.ogg', 25, 1)
if("explosion")
if(prob(50))
- target.playsound_local(null,'sound/effects/explosion1.ogg', 50, 1)
+ target.playsound_local(source,'sound/effects/explosion1.ogg', 50, 1)
else
- target.playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1)
+ target.playsound_local(source, 'sound/effects/explosion2.ogg', 50, 1)
if("far_explosion")
- target.playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1)
+ target.playsound_local(source, 'sound/effects/explosionfar.ogg', 50, 1)
if("glass")
- target.playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1)
- if("phone")
- target.playsound_local(null, 'sound/weapons/ring.ogg', 15)
- sleep(25)
- target.playsound_local(null, 'sound/weapons/ring.ogg', 25)
- sleep(25)
- target.playsound_local(null, 'sound/weapons/ring.ogg', 35)
- sleep(25)
- target.playsound_local(null, 'sound/weapons/ring.ogg', 45)
- if("summon_guns")
- target.playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1)
+ target.playsound_local(source, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1)
if("alarm")
- target.playsound_local(null, 'sound/machines/alarm.ogg', 100, 0)
+ target.playsound_local(source, 'sound/machines/alarm.ogg', 100, 0)
if("beepsky")
- target.playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0)
- if("hallelujah")
- target.playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50)
- //Rare audio
- if("creepy")
- //These sounds are (mostly) taken from Hidden: Source
- target.playsound_local(null, pick(CREEPY_SOUNDS), 50, 1)
- if("ratvar")
- target.playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100)
- sleep(150)
- target.playsound_local(null, 'sound/effects/ratvar_reveal.ogg', 100)
- if("shuttle_dock")
- to_chat(target, "Priority Announcement ")
- to_chat(target, "The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle. ")
- target.playsound_local(null, 'sound/ai/shuttledock.ogg', 100)
+ target.playsound_local(source, 'sound/voice/bfreeze.ogg', 35, 0)
+ if("mech")
+ var/mech_dir = pick(GLOB.cardinals)
+ for(var/i in 1 to rand(4,9))
+ if(prob(75))
+ target.playsound_local(source, 'sound/mecha/mechstep.ogg', 40, 1)
+ source = get_step(source, mech_dir)
+ else
+ target.playsound_local(source, 'sound/mecha/mechturn.ogg', 40, 1)
+ mech_dir = pick(GLOB.cardinals)
+ sleep(10)
//Deconstructing a wall
if("wall_decon")
- target.playsound_local(null, 'sound/items/welder.ogg', 15, 1)
+ target.playsound_local(source, 'sound/items/welder.ogg', 50, 1)
sleep(105)
- target.playsound_local(null, 'sound/items/welder2.ogg', 15, 1)
+ target.playsound_local(source, 'sound/items/welder2.ogg', 50, 1)
sleep(15)
- target.playsound_local(null, 'sound/items/ratchet.ogg', 15, 1)
+ target.playsound_local(source, 'sound/items/ratchet.ogg', 50, 1)
//Hacking a door
if("door_hack")
- target.playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1)
- sleep(rand(10,30))
- for(var/i = rand(1,3), i>0, i--)
- target.playsound_local(null, 'sound/weapons/empty.ogg', 15, 1)
- sleep(rand(10,30))
- target.playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1)
- if("esword")
- target.playsound_local(null, 'sound/weapons/saberon.ogg',35,1)
+ target.playsound_local(source, 'sound/items/screwdriver.ogg', 50, 1)
+ sleep(rand(40,80))
+ target.playsound_local(source, 'sound/machines/airlockforced.ogg', 30, 1)
+ qdel(src)
+
+/datum/hallucination/weird_sounds
+
+/datum/hallucination/weird_sounds/New(mob/living/carbon/C, forced = TRUE, sound_type)
+ set waitfor = FALSE
+ ..()
+ var/turf/source = random_far_turf()
+ if(!sound_type)
+ sound_type = pick("phone","hallelujah","highlander","hyperspace","game_over","creepy","tesla")
+ feedback_details += "Type: [sound_type]"
+ //Strange audio
+ switch(sound_type)
+ if("phone")
+ target.playsound_local(source, 'sound/weapons/ring.ogg', 15)
+ sleep(25)
+ target.playsound_local(source, 'sound/weapons/ring.ogg', 15)
+ sleep(25)
+ target.playsound_local(source, 'sound/weapons/ring.ogg', 15)
+ sleep(25)
+ target.playsound_local(source, 'sound/weapons/ring.ogg', 15)
+ if("hyperspace")
+ target.playsound_local(null, 'sound/effects/hyperspace_begin.ogg', 50)
+ if("hallelujah")
+ target.playsound_local(source, 'sound/effects/pray_chaplain.ogg', 50)
+ if("highlander")
+ target.playsound_local(null, 'sound/misc/highlander.ogg', 50)
+ if("game_over")
+ target.playsound_local(source, 'sound/misc/compiler-failure.ogg', 50)
+ if("laughter")
+ if(prob(50))
+ target.playsound_local(source, 'sound/voice/human/womanlaugh.ogg', 50, 1)
+ else
+ target.playsound_local(source, pick('sound/voice/human/manlaugh1.ogg', 'sound/voice/human/manlaugh2.ogg'), 50, 1)
+ if("creepy")
+ //These sounds are (mostly) taken from Hidden: Source
+ target.playsound_local(source, pick(CREEPY_SOUNDS), 50, 1)
+ if("tesla") //Tesla loose!
+ target.playsound_local(source, 'sound/magic/lightningbolt.ogg', 35, 1)
+ sleep(30)
+ target.playsound_local(source, 'sound/magic/lightningbolt.ogg', 65, 1)
+ sleep(30)
+ target.playsound_local(source, 'sound/magic/lightningbolt.ogg', 100, 1)
+
+ qdel(src)
+
+/datum/hallucination/stationmessage
+
+/datum/hallucination/stationmessage/New(mob/living/carbon/C, forced = TRUE, message)
+ set waitfor = FALSE
+ ..()
+ if(!message)
+ message = pick("ratvar","shuttle_dock","blob_alert","malf_ai","meteors","supermatter")
+ feedback_details += "Type: [message]"
+ switch(message)
if("blob_alert")
to_chat(target, "Biohazard Alert ")
to_chat(target, "Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak. ")
- target.playsound_local(null, 'sound/ai/outbreak5.ogg', 100, 0)
- if("tesla") //Tesla loose!
- target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1)
- sleep(30)
- target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1)
- sleep(30)
- target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1)
+ SEND_SOUND(target, 'sound/ai/outbreak5.ogg')
+ if("ratvar")
+ target.playsound_local(target, 'sound/machines/clockcult/ark_deathrattle.ogg', 50, FALSE, pressure_affected = FALSE)
+ target.playsound_local(target, 'sound/effects/clockcult_gateway_disrupted.ogg', 50, FALSE, pressure_affected = FALSE)
+ sleep(27)
+ target.playsound_local(target, 'sound/effects/explosion_distant.ogg', 50, FALSE, pressure_affected = FALSE)
+ if("shuttle_dock")
+ to_chat(target, "Priority Announcement ")
+ to_chat(target, "The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle. ")
+ SEND_SOUND(target, 'sound/ai/shuttledock.ogg')
if("malf_ai") //AI is doomsdaying!
to_chat(target, "Anomaly Alert ")
to_chat(target, "Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core. ")
- target.playsound_local(null, 'sound/ai/aimalf.ogg', 100, 0)
+ SEND_SOUND(target, 'sound/ai/aimalf.ogg')
if("meteors") //Meteors inbound!
to_chat(target, "Meteor Alert ")
to_chat(target, "Meteors have been detected on collision course with the station. ")
- target.playsound_local(null, 'sound/ai/meteors.ogg', 100, 0)
- qdel(src)
+ SEND_SOUND(target, 'sound/ai/meteors.ogg')
+ if("supermatter")
+ SEND_SOUND(target, 'sound/magic/charge.ogg')
+ to_chat(target, "You feel reality distort for a moment... ")
/datum/hallucination/hudscrew
- cost = 10
-/datum/hallucination/hudscrew/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/hudscrew/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
//Screwy HUD
@@ -933,9 +911,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
qdel(src)
/datum/hallucination/fake_alert
- cost = 15
-/datum/hallucination/fake_alert/New(mob/living/carbon/T, forced = TRUE, specific, duration = 150)
+/datum/hallucination/fake_alert/New(mob/living/carbon/C, forced = TRUE, specific, duration = 150)
set waitfor = FALSE
..()
var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temphot","tempcold","pressure")
@@ -983,15 +960,14 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
if("hacked")
target.throw_alert(alert_type, /obj/screen/alert/hacked, override = TRUE)
if("charge")
- target.throw_alert(alert_type,/obj/screen/alert/emptycell, override = TRUE)
+ target.throw_alert(alert_type, /obj/screen/alert/emptycell, override = TRUE)
sleep(duration)
target.clear_alert(alert_type, clear_override = TRUE)
qdel(src)
/datum/hallucination/items
- cost = 15
-/datum/hallucination/items/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/items/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
//Strange items
@@ -1052,9 +1028,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
qdel(src)
/datum/hallucination/dangerflash
- cost = 15
-/datum/hallucination/dangerflash/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/dangerflash/New(mob/living/carbon/C, forced = TRUE, danger_type)
set waitfor = FALSE
..()
//Flashes of danger
@@ -1064,32 +1039,92 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
possible_points += F
if(possible_points.len)
var/turf/open/floor/danger_point = pick(possible_points)
-
- switch(rand(1,5))
- if(1)
- target.halimage = image('icons/turf/space.dmi',danger_point,"[rand(1,25)]",TURF_LAYER)
- if(2)
- target.halimage = image('icons/turf/floors/lava.dmi',danger_point,"smooth",TURF_LAYER)
- if(3)
- target.halimage = image('icons/turf/floors/Chasms.dmi',danger_point,"smooth",TURF_LAYER)
- if(4)
- target.halimage = image('icons/effects/effects.dmi',danger_point,"anom",OBJ_LAYER+0.01)
- if(5)
- target.halimage = image('icons/effects/effects.dmi',danger_point,"electricity2",OBJ_LAYER+0.01)
-
-
- if(target.client)
- target.client.images += target.halimage
- sleep(rand(200,450))
- if(target.client)
- target.client.images -= target.halimage
- QDEL_NULL(target.halimage)
+ if(!danger_type)
+ danger_type = pick("lava","chasm","anomaly")
+ switch(danger_type)
+ if("lava")
+ new /obj/effect/hallucination/danger/lava(danger_point, target)
+ if("chasm")
+ new /obj/effect/hallucination/danger/chasm(danger_point, target)
+ if("anomaly")
+ new /obj/effect/hallucination/danger/anomaly(danger_point, target)
qdel(src)
-/datum/hallucination/death
- cost = 40
+/obj/effect/hallucination/danger
+ var/image/image
-/datum/hallucination/death/New(mob/living/carbon/T, forced = TRUE)
+/obj/effect/hallucination/danger/proc/show_icon()
+ return
+
+/obj/effect/hallucination/danger/proc/clear_icon()
+ if(image && target.client)
+ target.client.images -= image
+
+/obj/effect/hallucination/danger/Initialize(mapload, _target)
+ . = ..()
+ target = _target
+ show_icon()
+ QDEL_IN(src, rand(200, 450))
+
+/obj/effect/hallucination/danger/Destroy()
+ clear_icon()
+ . = ..()
+
+/obj/effect/hallucination/danger/lava
+ name = "lava"
+
+/obj/effect/hallucination/danger/lava/show_icon()
+ image = image('icons/turf/floors/lava.dmi',src,"smooth",TURF_LAYER)
+ if(target.client)
+ target.client.images += image
+
+/obj/effect/hallucination/danger/lava/Crossed(atom/movable/AM)
+ if(AM == target)
+ target.adjustStaminaLoss(20)
+ new /datum/hallucination/fire(target)
+
+/obj/effect/hallucination/danger/chasm
+ name = "chasm"
+
+/obj/effect/hallucination/danger/chasm/show_icon()
+ image = image('icons/turf/floors/Chasms.dmi',src,"smooth",TURF_LAYER)
+ if(target.client)
+ target.client.images += image
+
+/obj/effect/hallucination/danger/chasm/Crossed(atom/movable/AM)
+ if(AM == target)
+ to_chat(target, "You fall into the chasm! ")
+ target.Knockdown(40)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, target, "It's surprisingly shallow. "), 15)
+ QDEL_IN(src, 30)
+
+/obj/effect/hallucination/danger/anomaly
+ name = "flux wave anomaly"
+
+/obj/effect/hallucination/danger/anomaly/Initialize()
+ . = ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/effect/hallucination/danger/anomaly/process()
+ if(prob(70))
+ step(src,pick(GLOB.alldirs))
+
+/obj/effect/hallucination/danger/anomaly/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/effect/hallucination/danger/anomaly/show_icon()
+ image = image('icons/effects/effects.dmi',src,"electricity2",OBJ_LAYER+0.01)
+ if(target.client)
+ target.client.images += image
+
+/obj/effect/hallucination/danger/anomaly/Crossed(atom/movable/AM)
+ if(AM == target)
+ new /datum/hallucination/shock(target)
+
+/datum/hallucination/death
+
+/datum/hallucination/death/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
target.set_screwyhud(SCREWYHUD_DEAD)
@@ -1107,8 +1142,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
fakemob = target //ever been so lonely you had to haunt yourself?
if(fakemob)
sleep(rand(20, 50))
- to_chat(target, "DEAD: [fakemob.name] says, \"[pick("rip","hey [target.first_name()]","you too?","is the AI rogue?",\
- "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\" ")
+ to_chat(target, "DEAD: [fakemob.name] says, \"[pick("rip","why did i just drop dead?","hey [target.first_name()]","git gud","you too?","is the AI rogue?",\
+ "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "this round","this","myself","admins","you")]")]\" ")
sleep(rand(70,90))
target.set_screwyhud(SCREWYHUD_NONE)
target.SetKnockdown(0)
@@ -1116,38 +1151,93 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
qdel(src)
/datum/hallucination/fire
- cost = 25
+ var/active = TRUE
+ var/stage = 0
+ var/image/fire_overlay
-/datum/hallucination/fire/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/fire/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
- var/image/fire_overlay = image('icons/mob/OnFire.dmi', target, "Standing", ABOVE_MOB_LAYER)
+ target.fire_stacks = max(target.fire_stacks, 0.1) //Placebo flammability
+ fire_overlay = image('icons/mob/OnFire.dmi', target, "Standing", ABOVE_MOB_LAYER)
if(target.client)
target.client.images += fire_overlay
to_chat(target, "You're set on fire! ")
target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE)
sleep(20)
- target.throw_alert("temp", /obj/screen/alert/hot, 1, override = TRUE)
- sleep(30)
- target.clear_alert("temp", clear_override = TRUE)
- target.throw_alert("temp", /obj/screen/alert/hot, 2, override = TRUE)
- sleep(30)
- target.clear_alert("temp", clear_override = TRUE)
- target.throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE)
+ for(var/i in 1 to 3)
+ if(target.fire_stacks <= 0)
+ clear_fire()
+ return
+ stage++
+ update_temp()
+ sleep(30)
for(var/i in 1 to rand(5, 10))
+ if(target.fire_stacks <= 0)
+ clear_fire()
+ return
target.adjustStaminaLoss(15)
- sleep(25)
+ sleep(20)
+ clear_fire()
+
+/datum/hallucination/fire/proc/update_temp()
+ if(stage <= 0)
+ target.clear_alert("temp", clear_override = TRUE)
+ else
+ target.clear_alert("temp", clear_override = TRUE)
+ target.throw_alert("temp", /obj/screen/alert/hot, stage, override = TRUE)
+
+/datum/hallucination/fire/proc/clear_fire()
+ if(!active)
+ return
+ active = FALSE
target.clear_alert("fire", clear_override = TRUE)
- target.clear_alert("temp", clear_override = TRUE)
if(target.client)
target.client.images -= fire_overlay
QDEL_NULL(fire_overlay)
+ while(stage > 0)
+ stage--
+ update_temp()
+ sleep(30)
qdel(src)
-/datum/hallucination/husks
- cost = 20
+/datum/hallucination/shock
+ var/image/shock_image
+ var/image/electrocution_skeleton_anim
-/datum/hallucination/husks/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/shock/New(mob/living/carbon/C, forced = TRUE)
+ set waitfor = FALSE
+ ..()
+ shock_image = image(target, target, dir = target.dir)
+ shock_image.appearance_flags |= KEEP_APART
+ shock_image.color = rgb(0,0,0)
+ shock_image.override = TRUE
+ electrocution_skeleton_anim = image('icons/mob/human.dmi', target, icon_state = "electrocuted_base", layer=ABOVE_MOB_LAYER)
+ electrocution_skeleton_anim.appearance_flags |= RESET_COLOR|KEEP_APART
+ to_chat(target, "You feel a powerful shock course through your body! ")
+ if(target.client)
+ target.client.images |= shock_image
+ target.client.images |= electrocution_skeleton_anim
+ addtimer(CALLBACK(src, .proc/reset_shock_animation), 40)
+ target.playsound_local(get_turf(src), "sparks", 100, 1)
+ target.staminaloss += 50
+ target.Stun(40)
+ target.jitteriness += 1000
+ target.do_jitter_animation(target.jitteriness)
+ addtimer(CALLBACK(src, .proc/shock_drop), 20)
+
+/datum/hallucination/shock/proc/reset_shock_animation()
+ if(target.client)
+ target.client.images.Remove(shock_image)
+ target.client.images.Remove(electrocution_skeleton_anim)
+
+/datum/hallucination/shock/proc/shock_drop()
+ target.jitteriness = max(target.jitteriness - 990, 10) //Still jittery, but vastly less
+ target.Knockdown(60)
+
+/datum/hallucination/husks
+
+/datum/hallucination/husks/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
if(!target.halbody)
@@ -1178,7 +1268,6 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
//hallucination projectile code in code/modules/projectiles/projectile/special.dm
/datum/hallucination/stray_bullet
- cost = 15
/datum/hallucination/stray_bullet/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
@@ -1194,29 +1283,4 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
H.hal_target = target
H.preparePixelProjectile(target, start)
H.fire()
- qdel(src)
-
-//Reality Dissociation Syndrome hallucinations only trigger in special cases and have no cost
-/datum/hallucination/rds
- cost = 0
-
-/datum/hallucination/rds/fourth_wall/New(mob/living/carbon/C, forced = TRUE)
- ..()
- to_chat(C, "[pick("Leave the server" , "Close the game window")] [pick("immediately", "right now")]. ")
-
-/datum/hallucination/rds/supermatter/New(mob/living/carbon/C, forced = TRUE)
- ..()
- SEND_SOUND(C, 'sound/magic/charge.ogg')
- to_chat(C, "You feel reality distort for a moment... ")
-
-/datum/hallucination/rds/narsie/New(mob/living/carbon/C, forced = TRUE)
- C.playsound_local(C, 'sound/creatures/narsie_rises.ogg', 50, FALSE, pressure_affected = FALSE)
- to_chat(C, "NAR-SIE HAS RISEN ")
-
-/datum/hallucination/rds/ark/New(mob/living/carbon/C, forced = TRUE)
- set waitfor = FALSE
- ..()
- C.playsound_local(C, 'sound/machines/clockcult/ark_deathrattle.ogg', 50, FALSE, pressure_affected = FALSE)
- C.playsound_local(C, 'sound/effects/clockcult_gateway_disrupted.ogg', 50, FALSE, pressure_affected = FALSE)
- sleep(27)
- C.playsound_local(C, 'sound/effects/explosion_distant.ogg', 50, FALSE, pressure_affected = FALSE)
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index ee5dc7e328..8972ceba12 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -298,6 +298,29 @@
icon_state = "grappabottle"
list_reagents = list("grappa" = 100)
+/obj/item/reagent_containers/food/drinks/bottle/sake
+ name = "Ryo's traditional sake"
+ desc = "Sweet as can be, and burns like fire going down."
+ icon_state = "sakebottle"
+ list_reagents = list("sake" = 100)
+
+/obj/item/reagent_containers/food/drinks/bottle/sake/Initialize()
+ . = ..()
+ if(prob(10))
+ name = "Fluffy Tail Sake"
+ desc += " On the bottle is a picture of a kitsune with nine touchable tails."
+ icon_state = "sakebottle_k"
+ else if(prob(10))
+ name = "Inubashiri's Home Brew"
+ desc += " Awoo."
+ icon_state = "sakebottle_i"
+
+/obj/item/reagent_containers/food/drinks/bottle/fernet
+ name = "Fernet Bronca"
+ desc = "A bottle of pure Fernet Bronca, produced in Cordoba Space Station"
+ icon_state = "fernetbottle"
+ list_reagents = list("fernet" = 100)
+
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/orangejuice
@@ -344,6 +367,15 @@
list_reagents = list("limejuice" = 100)
foodtype = FRUIT
+/obj/item/reagent_containers/food/drinks/bottle/menthol
+ name = "menthol"
+ desc = "Tastes naturally minty, and imparts a very mild numbing sensation."
+ icon_state = "mentholbox"
+ item_state = "carton"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+ isGlass = FALSE
+ list_reagents = list("menthol" = 100)
////////////////////////// MOLOTOV ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/molotov
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index 353bfc6538..3df4ca4bd0 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -158,7 +158,7 @@
desc = "A timeless classic."
ingredients_placement = INGREDIENTS_STACKPLUSTOP
icon = 'icons/obj/food/burgerbread.dmi'
- icon_state = "bun"
+ icon_state = "custburg"
foodtype = GRAIN
diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm
index 2e2759913b..4282015eb5 100644
--- a/code/modules/food_and_drinks/food/snacks_bread.dm
+++ b/code/modules/food_and_drinks/food/snacks_bread.dm
@@ -13,7 +13,7 @@
custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/sandwich
filling_color = "#FFA500"
list_reagents = list("nutriment" = 2)
- slot_flags = SLOT_HEAD
+ slot_flags = ITEM_SLOT_HEAD
customfoodfilling = 0 //to avoid infinite bread-ception
foodtype = GRAIN
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 2522ec9cf2..edc2305261 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -299,8 +299,7 @@
qdel(S)
return TRUE
for(var/obj/item/stack/sheet/wetleather/WL in src)
- var/obj/item/stack/sheet/leather/L = new(drop_location())
- L.amount = WL.amount
+ new /obj/item/stack/sheet/leather(drop_location(), WL.amount)
qdel(WL)
return TRUE
return FALSE
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index 43b3ba07ab..0ee01ae9e2 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -139,7 +139,7 @@
required_reagents = list("tequila" = 2, "kahlua" = 1)
/datum/chemical_reaction/tequila_sunrise
- name = "tequila Sunrise"
+ name = "Tequila Sunrise"
id = "tequilasunrise"
results = list("tequilasunrise" = 3)
required_reagents = list("tequila" = 2, "orangejuice" = 1)
@@ -623,4 +623,61 @@
id = "crevice_spike"
results = list("crevice_spike" = 6)
required_reagents = list("limejuice" = 2, "capsaicin" = 4) //2 powdered delta (sour), 4 flanergide (spicy)
- mix_message = "The mixture stings your eyes as it settles."
\ No newline at end of file
+ mix_message = "The mixture stings your eyes as it settles."
+
+/datum/chemical_reaction/sake
+ name = "sake"
+ id = "sake"
+ results = list("sake" = 10)
+ required_reagents = list("rice" = 10)
+ required_catalysts = list("enzyme" = 5)
+ mix_message = "The rice grains ferment into a clear, sweet-smelling liquid."
+
+/datum/chemical_reaction/alexander
+ name = "Alexander"
+ id = "alexander"
+ results = list("alexander" = 3)
+ required_reagents = list("cognac" = 1, "creme_de_cacao" = 1, "cream" = 1)
+
+/datum/chemical_reaction/sidecar
+ name = "Sidecar"
+ id = "sidecar"
+ results = list("sidecar" = 4)
+ required_reagents = list("cognac" = 2, "triple_sec" = 1, "lemonjuice" = 1)
+
+/datum/chemical_reaction/between_the_sheets
+ name = "Between the Sheets"
+ id = "between_the_sheets"
+ results = list("between_the_sheets" = 5)
+ required_reagents = list("rum" = 1, "sidecar" = 4)
+
+/datum/chemical_reaction/kamikaze
+ name = "Kamikaze"
+ id = "kamikaze"
+ results = list("kamikaze" = 3)
+ required_reagents = list("vodka" = 1, "triple_sec" = 1, "limejuice" = 1)
+
+/datum/chemical_reaction/mojito
+ name = "Mojito"
+ id = "mojito"
+ results = list("mojito" = 5)
+ required_reagents = list("rum" = 1, "sugar" = 1, "limejuice" = 1, "sodawater" = 1, "menthol" = 1)
+
+/datum/chemical_reaction/fernet_cola
+ name = "Fernet Cola"
+ id = "fernet_cola"
+ results = list("fernet_cola" = 2)
+ required_reagents = list("fernet" = 1, "cola" = 1)
+
+
+/datum/chemical_reaction/fanciulli
+ name = "Fanciulli"
+ id = "fanciulli"
+ results = list("fanciulli" = 2)
+ required_reagents = list("manhattan" = 1, "fernet" = 1)
+
+/datum/chemical_reaction/branca_menta
+ name = "Branca Menta"
+ id = "branca_menta"
+ results = list("branca_menta" = 3)
+ required_reagents = list("fernet" = 1, "creme_de_menthe" = 1, "ice" = 1)
diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm
index 401e55c9e5..be06f99d61 100644
--- a/code/modules/goonchat/browserOutput.dm
+++ b/code/modules/goonchat/browserOutput.dm
@@ -46,8 +46,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic
if(!owner)
return
- var/datum/asset/stuff = get_asset_datum(/datum/asset/simple/goonchat)
- stuff.register()
+ var/datum/asset/stuff = get_asset_datum(/datum/asset/group/goonchat)
stuff.send(owner)
owner << browse(file('code/modules/goonchat/browserassets/html/browserOutput.html'), "window=browseroutput")
@@ -106,19 +105,10 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic
//do not convert to to_chat()
SEND_TEXT(owner, "Failed to load fancy chat, reverting to old chat. Certain features won't work. ")
- pingLoop()
-
/datum/chatOutput/proc/showChat()
winset(owner, "output", "is-visible=false")
winset(owner, "browseroutput", "is-disabled=false;is-visible=true")
-/datum/chatOutput/proc/pingLoop()
- set waitfor = FALSE
-
- while (owner)
- ehjax_send(data = owner.is_afk(29) ? "softPang" : "pang") // SoftPang isn't handled anywhere but it'll always reset the opts.lastPang.
- sleep(30)
-
/datum/chatOutput/proc/ehjax_send(client/C = owner, window = "browseroutput", data)
if(islist(data))
data = json_encode(data)
diff --git a/code/modules/goonchat/browserassets/html/browserOutput.html b/code/modules/goonchat/browserassets/html/browserOutput.html
index d40fd75f39..fe3be9486c 100644
--- a/code/modules/goonchat/browserassets/html/browserOutput.html
+++ b/code/modules/goonchat/browserassets/html/browserOutput.html
@@ -6,6 +6,7 @@
+
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
index 4f740f4e61..701167c853 100644
--- a/code/modules/holiday/holidays.dm
+++ b/code/modules/holiday/holidays.dm
@@ -70,6 +70,7 @@
begin_month = DECEMBER
end_day = 2
end_month = JANUARY
+ drone_hat = /obj/item/clothing/head/festive
/datum/holiday/new_year/getStationPrefix()
return pick("Party","New","Hangover","Resolution")
@@ -78,6 +79,7 @@
name = "Groundhog Day"
begin_day = 2
begin_month = FEBRUARY
+ drone_hat = /obj/item/clothing/head/helmet/space/chronos
/datum/holiday/valentines
name = VALENTINES
@@ -92,6 +94,7 @@
name = "Birthday of Space Station 13"
begin_day = 16
begin_month = FEBRUARY
+ drone_hat = /obj/item/clothing/head/festive
/datum/holiday/birthday/greet()
var/game_age = text2num(time2text(world.timeofday, "YY")) - 3
@@ -202,6 +205,7 @@
name = "UFO Day"
begin_day = 2
begin_month = JULY
+ drone_hat = /obj/item/clothing/mask/facehugger/dead
/datum/holiday/UFO/getStationPrefix() //Is such a thing even possible?
return pick("Ayy","Truth","Tsoukalos","Mulder") //Yes it is!
@@ -272,11 +276,13 @@
name = "Smiling Day"
begin_day = 7
begin_month = OCTOBER
+ drone_hat = /obj/item/clothing/head/papersack/smiley
/datum/holiday/boss
name = "Boss' Day"
begin_day = 16
begin_month = OCTOBER
+ drone_hat = /obj/item/clothing/head/that
/datum/holiday/halloween
name = HALLOWEEN
@@ -305,6 +311,7 @@
name = "Flowers Day"
begin_day = 19
begin_month = NOVEMBER
+ drone_hat = /obj/item/reagent_containers/food/snacks/grown/moonflower
/datum/holiday/hello
name = "Saying-'Hello' Day"
@@ -312,7 +319,7 @@
begin_month = NOVEMBER
/datum/holiday/hello/greet()
- return "[pick(list("Aloha", "Bonjour", "Hello", "Hi", "Greetings", "Salutations", "Bienvenidos", "Hola", "Howdy"))]! " + ..()
+ return "[pick(list("Aloha", "Bonjour", "Hello", "Hi", "Greetings", "Salutations", "Bienvenidos", "Hola", "Howdy", "Ni hao", "Guten Tag", "Konnichiwa", "G'day cunt"))]! " + ..()
/datum/holiday/human_rights
name = "Human-Rights Day"
@@ -323,6 +330,7 @@
name = "Monkey Day"
begin_day = 14
begin_month = DECEMBER
+ drone_hat = /obj/item/clothing/mask/gas/monkeymask
/datum/holiday/thanksgiving
name = "Thanksgiving in the United States"
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index 7075b8502e..5a35597a34 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -18,8 +18,11 @@
/mob/living/carbon/human/bee_friendly()
if(dna && dna.species && dna.species.id == "pod") //bees pollinate plants, duh.
return 1
- if((wear_suit && (wear_suit.flags_1 & THICKMATERIAL_1)) && (head && (head.flags_1 & THICKMATERIAL_1)))
- return 1
+ if (wear_suit && head && is_type_in_typecache(wear_suit, GLOB.typecache_clothing) && is_type_in_typecache(wear_suit, GLOB.typecache_clothing))
+ var/obj/item/clothing/CS = wear_suit
+ var/obj/item/clothing/CH = head
+ if (CS.clothing_flags & CH.clothing_flags & THICKMATERIAL)
+ return 1
return 0
diff --git a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm
index b871951b0f..7fa1a0dd2c 100644
--- a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm
+++ b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm
@@ -4,7 +4,7 @@
desc = "Keeps the lil buzzing buggers out of your eyes."
icon_state = "beekeeper"
item_state = "beekeeper"
- flags_1 = THICKMATERIAL_1
+ clothing_flags = THICKMATERIAL
/obj/item/clothing/suit/beekeeper_suit
@@ -12,5 +12,4 @@
desc = "Keeps the lil buzzing buggers away from your squishy bits."
icon_state = "beekeeper"
item_state = "beekeeper"
- flags_1 = THICKMATERIAL_1
-
+ clothing_flags = THICKMATERIAL
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 624394f878..6da117da88 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -262,8 +262,7 @@
if(!check_cost(D.materials, amount))
return FALSE
- var/obj/item/stack/product = new D.build_path(loc)
- product.amount = amount
+ new D.build_path(drop_location(), amount)
for(var/R in D.make_reagents)
beaker.reagents.add_reagent(R, D.make_reagents[R]*amount)
else
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index dd1d1777d8..f0c7bba885 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -85,14 +85,15 @@
interact(user)
return
else if(istype(I, /obj/item/disk/plantgene))
- if(disk)
- to_chat(user, "A data disk is already loaded into the machine! ")
- else
- if(!user.transferItemToLoc(I, src))
- return
- disk = I
- to_chat(user, "You add [I] to the machine. ")
- interact(user)
+ if (operation)
+ to_chat(user, "Please complete current operation. ")
+ return
+ eject_disk()
+ if(!user.transferItemToLoc(I, src))
+ return
+ disk = I
+ to_chat(user, "You add [I] to the machine. ")
+ interact(user)
else
..()
@@ -266,18 +267,13 @@
to_chat(usr, "You add [I] to the machine. ")
update_icon()
else if(href_list["eject_disk"] && !operation)
- if (disk)
- disk.forceMove(drop_location())
- disk.verb_pickup()
- disk = null
- update_genes()
- else
- var/obj/item/I = usr.get_active_held_item()
- if(istype(I, /obj/item/disk/plantgene))
- if(!usr.transferItemToLoc(I, src))
- return
- disk = I
- to_chat(usr, "You add [I] to the machine. ")
+ var/obj/item/I = usr.get_active_held_item()
+ eject_disk()
+ if(istype(I, /obj/item/disk/plantgene))
+ if(!usr.transferItemToLoc(I, src))
+ return
+ disk = I
+ to_chat(usr, "You add [I] to the machine. ")
else if(href_list["op"] == "insert" && disk && disk.gene && seed)
if(!operation) // Wait for confirmation
operation = "insert"
@@ -365,6 +361,16 @@
update_genes()
update_icon()
+/obj/machinery/plantgenes/proc/eject_disk()
+ if (disk && !operation)
+ if(Adjacent(usr) && !issilicon(usr))
+ if (!usr.put_in_hands(disk))
+ disk.forceMove(drop_location())
+ else
+ disk.forceMove(drop_location())
+ disk = null
+ update_genes()
+
/obj/machinery/plantgenes/proc/update_genes()
core_genes = list()
reagent_genes = list()
diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm
index 05cd54a9f0..5883b4dd64 100644
--- a/code/modules/hydroponics/grown/ambrosia.dm
+++ b/code/modules/hydroponics/grown/ambrosia.dm
@@ -4,7 +4,7 @@
name = "ambrosia branch"
desc = "This is a plant."
icon_state = "ambrosiavulgaris"
- slot_flags = SLOT_HEAD
+ slot_flags = ITEM_SLOT_HEAD
filling_color = "#008000"
bitesize_mod = 2
foodtype = VEGETABLES
diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm
index 18eae2f4fd..8455df887e 100644
--- a/code/modules/hydroponics/grown/flowers.dm
+++ b/code/modules/hydroponics/grown/flowers.dm
@@ -22,7 +22,7 @@
name = "poppy"
desc = "Long-used as a symbol of rest, peace, and death."
icon_state = "poppy"
- slot_flags = SLOT_HEAD
+ slot_flags = ITEM_SLOT_HEAD
filling_color = "#FF6347"
bitesize_mod = 3
foodtype = VEGETABLES | GROSS
@@ -86,7 +86,7 @@
name = "harebell"
desc = "\"I'll sweeten thy sad grave: thou shalt not lack the flower that's like thy face, pale primrose, nor the azured hare-bell, like thy veins; no, nor the leaf of eglantine, whom not to slander, out-sweeten'd not thy breath.\""
icon_state = "harebell"
- slot_flags = SLOT_HEAD
+ slot_flags = ITEM_SLOT_HEAD
filling_color = "#E6E6FA"
bitesize_mod = 3
@@ -118,7 +118,7 @@
righthand_file = 'icons/mob/inhands/weapons/plants_righthand.dmi'
damtype = "fire"
force = 0
- slot_flags = SLOT_HEAD
+ slot_flags = ITEM_SLOT_HEAD
throwforce = 0
w_class = WEIGHT_CLASS_TINY
throw_speed = 1
@@ -149,7 +149,7 @@
name = "moonflower"
desc = "Store in a location at least 50 yards away from werewolves."
icon_state = "moonflower"
- slot_flags = SLOT_HEAD
+ slot_flags = ITEM_SLOT_HEAD
filling_color = "#E6E6FA"
bitesize_mod = 2
@@ -176,7 +176,7 @@
righthand_file = 'icons/mob/inhands/weapons/plants_righthand.dmi'
damtype = "fire"
force = 0
- slot_flags = SLOT_HEAD
+ slot_flags = ITEM_SLOT_HEAD
throwforce = 0
w_class = WEIGHT_CLASS_TINY
throw_speed = 1
diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm
index 630c072edb..8e55f8a15d 100644
--- a/code/modules/hydroponics/grown/grass_carpet.dm
+++ b/code/modules/hydroponics/grown/grass_carpet.dm
@@ -36,19 +36,8 @@
continue
grassAmt += 1 + round(G.seed.potency * tile_coefficient)
qdel(G)
- var/obj/item/stack/tile/GT = new stacktype(user.loc)
- while(grassAmt > GT.max_amount)
- GT.amount = GT.max_amount
- grassAmt -= GT.max_amount
- GT = new stacktype(user.loc)
- GT.amount = grassAmt
- for(var/obj/item/stack/tile/T in user.loc)
- if((T.type == stacktype) && (T.amount < T.max_amount))
- GT.merge(T)
- if(GT.amount <= 0)
- break
+ new stacktype(user.drop_location(), grassAmt)
qdel(src)
- return
// Carpet
/obj/item/seeds/grass/carpet
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index 9eaa8747b9..55c0da91f2 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -22,7 +22,7 @@
var/blood_type = null
var/list/features = null
var/factions = null
- var/list/traits = null
+ var/list/quirks = null
var/contains_sample = 0
/obj/item/seeds/replicapod/Initialize()
@@ -42,7 +42,7 @@
blood_type = B.data["blood_type"]
features = B.data["features"]
factions = B.data["factions"]
- factions = B.data["traits"]
+ factions = B.data["quirks"]
contains_sample = TRUE
visible_message("The [src] is injected with a fresh blood sample. ")
else
@@ -114,7 +114,7 @@
podman.faction |= factions
if(!features["mcolor"])
features["mcolor"] = "#59CE00"
- for(var/V in traits)
+ for(var/V in quirks)
new V(podman)
podman.hardset_dna(null,null,podman.real_name,blood_type, new /datum/species/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
podman.set_cloned_appearance()
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index 31e888fdad..591fdfd535 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -8,7 +8,7 @@
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
materials = list(MAT_METAL=30, MAT_GLASS=20)
// *************************************
@@ -112,7 +112,7 @@
w_class = WEIGHT_CLASS_BULKY
flags_1 = CONDUCT_1
armour_penetration = 20
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
attack_verb = list("chopped", "sliced", "cut", "reaped")
hitsound = 'sound/weapons/bladeslice.ogg'
var/swiping = FALSE
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 3890c8e317..fb6915aef9 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -56,22 +56,19 @@
return ..()
/obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/user, params)
- if(default_deconstruction_screwdriver(user, "hydrotray3", "hydrotray3", I))
- return
-
- if(default_pry_open(I))
- return
-
- if(default_unfasten_wrench(user, I))
- return
-
- if(istype(I, /obj/item/crowbar))
- if(using_irrigation)
- to_chat(user, "Disconnect the hoses first! ")
- else if(default_deconstruction_crowbar(I, 1))
+ if (user.a_intent != INTENT_HARM)
+ // handle opening the panel
+ if(default_deconstruction_screwdriver(user, icon_state, icon_state, I))
return
- else
- return ..()
+
+ // handle deconstructing the machine, if permissible
+ if (I.tool_behaviour == TOOL_CROWBAR && using_irrigation)
+ to_chat(user, "Disconnect the hoses first! ")
+ return
+ else if(default_deconstruction_crowbar(I))
+ return
+
+ return ..()
/obj/machinery/hydroponics/proc/FindConnected()
var/list/connected = list()
@@ -787,31 +784,13 @@
for(var/obj/item/reagent_containers/food/snacks/grown/G in locate(user.x,user.y,user.z))
O.SendSignal(COMSIG_TRY_STORAGE_INSERT, G, user, TRUE)
- else if(istype(O, /obj/item/wrench) && unwrenchable)
- if(using_irrigation)
- to_chat(user, "Disconnect the hoses first! ")
- return
-
- if(!anchored && !isinspace())
- user.visible_message("[user] begins to wrench [src] into place.", \
- "You begin to wrench [src] in place... ")
- if (O.use_tool(src, user, 20, volume=50))
- if(anchored)
- return
- anchored = TRUE
- user.visible_message("[user] wrenches [src] into place.", \
- "You wrench [src] in place. ")
- else if(anchored)
- user.visible_message("[user] begins to unwrench [src].", \
- "You begin to unwrench [src]... ")
- if (O.use_tool(src, user, 20, volume=50))
- if(!anchored)
- return
- anchored = FALSE
- user.visible_message("[user] unwrenches [src].", \
- "You unwrench [src]. ")
+ else if(default_unfasten_wrench(user, O))
+ return
else if(istype(O, /obj/item/wirecutters) && unwrenchable)
+ if (!anchored)
+ to_chat(user, "Anchor the tray first! ")
+ return
using_irrigation = !using_irrigation
O.play_tool_sound(src)
user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses. ", \
@@ -840,6 +819,17 @@
else
return ..()
+/obj/machinery/hydroponics/can_be_unfasten_wrench(mob/user, silent)
+ if (!unwrenchable) // case also covered by NODECONSTRUCT checks in default_unfasten_wrench
+ return CANT_UNFASTEN
+
+ if (using_irrigation)
+ if (!silent)
+ to_chat(user, "Disconnect the hoses first! ")
+ return FAILED_UNFASTEN
+
+ return ..()
+
/obj/machinery/hydroponics/attack_hand(mob/user)
. = ..()
if(.)
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index d44682991a..72c34b90cc 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -3,7 +3,7 @@
/obj/item/electronic_assembly
name = "electronic assembly"
- obj_flags = CAN_BE_HIT
+ obj_flags = CAN_BE_HIT | UNIQUE_RENAME
desc = "It's a case, for building small electronics with."
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/assemblies/electronic_setups.dmi'
@@ -17,6 +17,7 @@
var/obj/item/stock_parts/cell/battery // Internal cell which most circuits need to work.
var/cell_type = /obj/item/stock_parts/cell
var/can_charge = TRUE //Can it be charged in a recharger?
+ var/can_fire_equipped = FALSE //Can it fire/throw weapons when the assembly is being held?
var/charge_sections = 4
var/charge_tick = FALSE
var/charge_delay = 4
@@ -603,7 +604,11 @@
/obj/item/electronic_assembly/medium/gun
name = "type-e electronic mechanism"
icon_state = "setup_medium_gun"
- desc = "It's a case, for building medium-sized electronics with. This one resembles a gun, or some type of tool, if you're feeling optimistic."
+ item_state = "circuitgun"
+ desc = "It's a case, for building medium-sized electronics with. This one resembles a gun, or some type of tool, if you're feeling optimistic. It can fire guns and throw items while the user is holding it."
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+ can_fire_equipped = TRUE
/obj/item/electronic_assembly/medium/radio
name = "type-f electronic mechanism"
diff --git a/code/modules/integrated_electronics/core/saved_circuits.dm b/code/modules/integrated_electronics/core/saved_circuits.dm
index b389b0d2d9..f58378cf6d 100644
--- a/code/modules/integrated_electronics/core/saved_circuits.dm
+++ b/code/modules/integrated_electronics/core/saved_circuits.dm
@@ -124,6 +124,10 @@
// Save modified name
if(initial(name) != name)
assembly_params["name"] = name
+
+ // Save modified description
+ if(initial(desc) != desc)
+ assembly_params["desc"] = desc
// Save panel status
if(opened)
@@ -142,6 +146,8 @@
// Validate name and color
if(assembly_params["name"] && !reject_bad_name(assembly_params["name"], TRUE))
return "Bad assembly name."
+ if(assembly_params["desc"] && !reject_bad_text(assembly_params["desc"]))
+ return "Bad assembly description."
if(assembly_params["detail_color"] && !(assembly_params["detail_color"] in color_whitelist))
return "Bad assembly color."
@@ -151,6 +157,10 @@
// Load modified name, if any.
if(assembly_params["name"])
name = assembly_params["name"]
+
+ // Load modified description, if any.
+ if(assembly_params["desc"])
+ desc = assembly_params["desc"]
// Load panel status
if(assembly_params["opened"])
diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm
index 859c8910f3..244b4cb71b 100644
--- a/code/modules/integrated_electronics/passive/power.dm
+++ b/code/modules/integrated_electronics/passive/power.dm
@@ -73,7 +73,7 @@
// For really fat machines.
/obj/item/integrated_circuit/passive/power/relay/large
name = "large tesla power relay"
- desc = "A seemingly enigmatic device which connects to nearby APCs wirelessly and draws power from them, now in industiral size!"
+ desc = "A seemingly enigmatic device which connects to nearby APCs wirelessly and draws power from them, now in industrial size!"
w_class = WEIGHT_CLASS_BULKY
extended_desc = "The siphon drains 2 kW of power from an APC in the same room as it as long as it has charge remaining. It will always drain \
from the 'equipment' power channel."
@@ -89,7 +89,7 @@
desc = "Produces electricity from chemicals."
icon_state = "chemical_cell"
extended_desc = "This is effectively an internal beaker. It will consume and produce power from plasma, slime jelly, welding fuel, carbon,\
- ethanol, nutriments, and blood in order of decreasing efficiency. It will consume fuel only if the battery can take more energy."
+ ethanol, nutriment, and blood in order of decreasing efficiency. It will consume fuel only if the battery can take more energy."
container_type = OPENCONTAINER
complexity = 4
inputs = list()
diff --git a/code/modules/integrated_electronics/subtypes/access.dm b/code/modules/integrated_electronics/subtypes/access.dm
index 63b258d782..bf710be0e2 100644
--- a/code/modules/integrated_electronics/subtypes/access.dm
+++ b/code/modules/integrated_electronics/subtypes/access.dm
@@ -1,6 +1,6 @@
/obj/item/integrated_circuit/input/card_reader
name = "card reader"
- desc = "A circuit that can read registred name, assignment and a PassKey string from an ID card."
+ desc = "A circuit that can read the registred name, assignment, and PassKey string from an ID card."
icon_state = "card_reader"
complexity = 4
diff --git a/code/modules/integrated_electronics/subtypes/arithmetic.dm b/code/modules/integrated_electronics/subtypes/arithmetic.dm
index 3a28c7b051..d4b854268b 100644
--- a/code/modules/integrated_electronics/subtypes/arithmetic.dm
+++ b/code/modules/integrated_electronics/subtypes/arithmetic.dm
@@ -94,7 +94,7 @@
/obj/item/integrated_circuit/arithmetic/division
name = "division circuit"
- desc = "This circuit can divide numbers, just don't think about trying to divide by zero!"
+ desc = "This circuit can divide numbers. Don't even think about trying to divide by zero!"
extended_desc = "The order that the calculation goes is; \
result = ((((A / B) / C) / D) ... ) and so on, until all pins have been divided. \
Null pins, and pins containing 0, are ignored. Pin A must be a number or the circuit will not function."
@@ -142,8 +142,8 @@
/obj/item/integrated_circuit/arithmetic/sign
name = "sign circuit"
- desc = "This will say if a number is positive, negative, or zero."
- extended_desc = "Will output 1, -1, or 0, depending on if A is a postive number, a negative number, or zero, respectively."
+ desc = "This circuit can tell if a number is positive, negative, or zero."
+ extended_desc = "Will output 1, -1, or 0, depending on if A is a positive number, a negative number, or zero, respectively."
icon_state = "sign"
inputs = list("A" = IC_PINTYPE_NUMBER)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
@@ -212,8 +212,8 @@
/obj/item/integrated_circuit/arithmetic/average
name = "average circuit"
- desc = "This circuit is of average quality, however it will compute the average for numbers you give it."
- extended_desc = "Note that null pins are ignored, where as a pin containing 0 is included in the averaging calculation."
+ desc = "This circuit is of average quality. It will compute the average of the numbers you give it."
+ extended_desc = "Note that null pins are ignored, whereas a pin containing 0 is included in the averaging calculation."
icon_state = "average"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
@@ -240,7 +240,7 @@
icon_state = "pi"
inputs = list()
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
-
+
/obj/item/integrated_circuit/arithmetic/pi/Initialize()
. = ..()
desc = "Not recommended for cooking. Outputs '[PI]' when it receives a pulse."
@@ -276,7 +276,7 @@
/obj/item/integrated_circuit/arithmetic/square_root
name = "square root circuit"
- desc = "This outputs the square root of a number you input."
+ desc = "This outputs the square root of the number you input."
icon_state = "square_root"
inputs = list("A" = IC_PINTYPE_NUMBER)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm
index 5f7dd24ad9..9382f70066 100644
--- a/code/modules/integrated_electronics/subtypes/converters.dm
+++ b/code/modules/integrated_electronics/subtypes/converters.dm
@@ -69,7 +69,7 @@
/obj/item/integrated_circuit/converter/refcode
name = "reference encoder"
- desc = "This circuit can encode a reference into a string, which can then be read by an EPV2 circuit."
+ desc = "This circuit can encode a reference into a string, which can then be read by a reference decoder circuit."
icon_state = "ref-string"
inputs = list("input" = IC_PINTYPE_REF)
outputs = list("output" = IC_PINTYPE_STRING)
@@ -88,7 +88,7 @@
/obj/item/integrated_circuit/converter/refdecode
name = "reference decoder"
- desc = "This circuit can convert an encoded reference to actual reference."
+ desc = "This circuit can convert an encoded reference to an actual reference."
icon_state = "ref-string"
inputs = list("input" = IC_PINTYPE_STRING)
outputs = list("output" = IC_PINTYPE_REF)
@@ -142,21 +142,18 @@
/obj/item/integrated_circuit/converter/concatenator
name = "concatenator"
- desc = "This joins many strings together to get one big string."
+ desc = "This can join up to 8 strings together to get one big string."
complexity = 4
- inputs = list(
- "A" = IC_PINTYPE_STRING,
- "B" = IC_PINTYPE_STRING,
- "C" = IC_PINTYPE_STRING,
- "D" = IC_PINTYPE_STRING,
- "E" = IC_PINTYPE_STRING,
- "F" = IC_PINTYPE_STRING,
- "G" = IC_PINTYPE_STRING,
- "H" = IC_PINTYPE_STRING
- )
+ inputs = list()
outputs = list("result" = IC_PINTYPE_STRING)
activators = list("concatenate" = IC_PINTYPE_PULSE_IN, "on concatenated" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ var/number_of_pins = 8
+
+/obj/item/integrated_circuit/converter/concatenator/Initialize()
+ for(var/i = 1 to number_of_pins)
+ inputs["input [i]"] = IC_PINTYPE_STRING
+ . = ..()
/obj/item/integrated_circuit/converter/concatenator/do_work()
var/result = null
@@ -169,10 +166,22 @@
push_data()
activate_pin(2)
+/obj/item/integrated_circuit/converter/concatenator/small
+ name = "small concatenator"
+ desc = "This can join up to 4 strings together to get one big string."
+ complexity = 2
+ number_of_pins = 4
+
+/obj/item/integrated_circuit/converter/concatenator/large
+ name = "large concatenator"
+ desc = "This can join up to 16 strings together to get one very big string."
+ complexity = 6
+ number_of_pins = 16
+
/obj/item/integrated_circuit/converter/separator
name = "separator"
- desc = "This splits as single string into two at the relative split point."
- extended_desc = "This circuits splits a given string into two, based on the string, and the index value. \
+ desc = "This splits a single string into two at the relative split point."
+ extended_desc = "This circuit splits a given string into two, based on the string and the index value. \
The index splits the string after the given index, including spaces. So 'a person' with an index of '3' \
will split into 'a p' and 'erson'."
icon_state = "split"
@@ -203,11 +212,38 @@
activate_pin(2)
+/obj/item/integrated_circuit/converter/indexer
+ name = "indexer"
+ desc = "This circuit takes a string and an index value, then returns the character found at in the string at the given index."
+ extended_desc = "Make sure the index is not longer or shorter than the string length. If you don't, the circuit will return empty."
+ icon_state = "split"
+ complexity = 4
+ inputs = list(
+ "string to index" = IC_PINTYPE_STRING,
+ "index" = IC_PINTYPE_NUMBER,
+ )
+ outputs = list(
+ "found character" = IC_PINTYPE_STRING
+ )
+ activators = list("index" = IC_PINTYPE_PULSE_IN, "on indexed" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+/obj/item/integrated_circuit/converter/indexer/do_work()
+ var/strin = get_pin_data(IC_INPUT, 1)
+ var/ind = get_pin_data(IC_INPUT, 2)
+ if(ind > 0 && ind <= length(strin))
+ set_pin_data(IC_OUTPUT, 1, strin[ind])
+ else
+ set_pin_data(IC_OUTPUT, 1, "")
+ push_data()
+ activate_pin(2)
+
/obj/item/integrated_circuit/converter/findstring
name = "find text"
- desc = "This gives position of sample in the string. Or returns 0."
+ desc = "This outputs the position of the sample in the string, or returns 0."
extended_desc = "The first pin is the string to be examined. The second pin is the sample to be found. \
- For example, 'eat this burger' will give you position 4. This circuit isn't case sensitive."
+ For example, inputting 'my wife has caught on fire' with 'has' as the sample will give you position 9. \
+ This circuit isn't case sensitive, and it does not ignore spaces."
complexity = 4
inputs = list(
"string" = IC_PINTYPE_STRING,
@@ -216,14 +252,38 @@
outputs = list(
"position" = IC_PINTYPE_NUMBER
)
- activators = list("search" = IC_PINTYPE_PULSE_IN, "after search" = IC_PINTYPE_PULSE_OUT)
+ activators = list("search" = IC_PINTYPE_PULSE_IN, "after search" = IC_PINTYPE_PULSE_OUT, "found" = IC_PINTYPE_PULSE_OUT, "not found" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/converter/findstring/do_work()
+ var/position = findtext(get_pin_data(IC_INPUT, 1),get_pin_data(IC_INPUT, 2))
- set_pin_data(IC_OUTPUT, 1, findtext(get_pin_data(IC_INPUT, 1),get_pin_data(IC_INPUT, 2)) )
+ set_pin_data(IC_OUTPUT, 1, position)
+ push_data()
+
+ activate_pin(2)
+ if(position)
+ activate_pin(3)
+ else
+ activate_pin(4)
+
+/obj/item/integrated_circuit/converter/stringlength
+ name = "get length"
+ desc = "This circuit will return the number of characters in a string."
+ complexity = 1
+ inputs = list(
+ "string" = IC_PINTYPE_STRING
+ )
+ outputs = list(
+ "length" = IC_PINTYPE_NUMBER
+ )
+ activators = list("get length" = IC_PINTYPE_PULSE_IN, "on acquisition" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+/obj/item/integrated_circuit/converter/stringlength/do_work()
+ set_pin_data(IC_OUTPUT, 1, length(get_pin_data(IC_INPUT, 1)))
push_data()
activate_pin(2)
@@ -232,7 +292,8 @@
name = "string exploder"
desc = "This splits a single string into a list of strings."
extended_desc = "This circuit splits a given string into a list of strings based on the string and given delimiter. \
- For example, 'eat this burger' will be converted to list('eat','this','burger')."
+ For example, 'eat this burger' will be converted to list('eat','this','burger'). Leave the delimiter null to get a list \
+ of every individual character."
icon_state = "split"
complexity = 4
inputs = list(
@@ -248,7 +309,10 @@
/obj/item/integrated_circuit/converter/exploders/do_work()
var/strin = get_pin_data(IC_INPUT, 1)
var/delimiter = get_pin_data(IC_INPUT, 2)
- set_pin_data(IC_OUTPUT, 1, splittext(strin, delimiter))
+ if(delimiter == null)
+ set_pin_data(IC_OUTPUT, 1, string2charlist(strin))
+ else
+ set_pin_data(IC_OUTPUT, 1, splittext(strin, delimiter))
push_data()
activate_pin(2)
@@ -350,7 +414,7 @@
/obj/item/integrated_circuit/converter/rgb2hex
name = "rgb to hexadecimal"
desc = "This circuit can convert a RGB (Red, Green, Blue) color to a Hexadecimal RGB color."
- extended_desc = "The first pin controls red amount, the second pin controls green amount, and the third controls blue amount. All go from 0-255."
+ extended_desc = "The first pin controls red amount, the second pin controls green amount, and the third controls blue amount. They all go from 0-255."
icon_state = "rgb-hex"
inputs = list(
"red" = IC_PINTYPE_NUMBER,
diff --git a/code/modules/integrated_electronics/subtypes/data_transfer.dm b/code/modules/integrated_electronics/subtypes/data_transfer.dm
index 481360f6cf..682d982373 100644
--- a/code/modules/integrated_electronics/subtypes/data_transfer.dm
+++ b/code/modules/integrated_electronics/subtypes/data_transfer.dm
@@ -4,7 +4,7 @@
/obj/item/integrated_circuit/transfer/multiplexer
name = "two multiplexer"
- desc = "This is what those in the business tend to refer to as a 'mux' or data selector. It moves data from one of the selected inputs to the output."
+ desc = "This is what those in the business tend to refer to as a 'mux', or data selector. It moves data from one of the selected inputs to the output."
extended_desc = "The first input pin is used to select which of the other input pins which has its data moved to the output. \
If the input selection is outside the valid range then no output is given."
complexity = 2
@@ -147,7 +147,7 @@
/obj/item/integrated_circuit/transfer/wire_node
name = "wire node"
- desc = "Just wire node to make wiring more easy.Transfer pulse from in to out."
+ desc = "Just a wire node to make wiring easier. Transfers the pulse from in to out."
icon_state = "wire_node"
activators = list("pulse in" = IC_PINTYPE_PULSE_IN, "pulse out" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index 042d6a3616..70e3bed5a7 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -150,7 +150,7 @@
/obj/item/integrated_circuit/input/slime_scanner
name = "slime_scanner"
- desc = "A very small version of the xenobio analyser. This allows the machine to know every needed properties of slime. Output mutation list is non associative."
+ desc = "A very small version of the xenobio analyser. This allows the machine to know every needed properties of slime. Output mutation list is non-associative."
icon_state = "medscan_adv"
complexity = 12
inputs = list("target" = IC_PINTYPE_REF)
@@ -193,8 +193,8 @@
/obj/item/integrated_circuit/input/plant_scanner
name = "integrated plant analyzer"
- desc = "A very small version of the plant analyser. This allows the machine to know all valuable params of plants in trays. \
- It cannot scan seeds nor fruits, only plants."
+ desc = "A very small version of the plant analyser. This allows the machine to know all valuable parameters of plants in trays. \
+ It can only scan plants, not seeds or fruits."
icon_state = "medscan_adv"
complexity = 12
inputs = list("target" = IC_PINTYPE_REF)
@@ -259,9 +259,9 @@
/obj/item/integrated_circuit/input/gene_scanner
name = "gene scanner"
- desc = "This circuit will scan plant for traits and reagent genes. Output is non-associative."
+ desc = "This circuit will scan the target plant for traits and reagent genes. Output is non-associative."
extended_desc = "This allows the machine to scan plants in trays for reagent and trait genes. \
- It cannot scan seeds nor fruits, only plants."
+ It can only scan plants, not seeds or fruits."
inputs = list(
"target" = IC_PINTYPE_REF
)
@@ -358,9 +358,9 @@
/obj/item/integrated_circuit/input/turfpoint
name = "Tile pointer"
- desc = "This circuit will get tile ref with given absolute coordinates."
+ desc = "This circuit will get a tile ref with the provided absolute coordinates."
extended_desc = "If the machine cannot see the target, it will not be able to calculate the correct direction.\
- This circuit works only inside an assembly."
+ This circuit only works while inside an assembly."
icon_state = "numberpad"
complexity = 5
inputs = list("X" = IC_PINTYPE_NUMBER,"Y" = IC_PINTYPE_NUMBER)
@@ -461,7 +461,7 @@
/obj/item/integrated_circuit/input/adjacent_locator
name = "adjacent locator"
desc = "This is needed for certain devices that demand a reference for a target to act upon. This type only locates something \
- that is standing a meter away from the machine."
+ that is standing up to a meter away from the machine."
extended_desc = "The first pin requires a ref to the kind of object that you want the locator to acquire. This means that it will \
give refs to nearby objects that are similar. If more than one valid object is found nearby, it will choose one of them at \
random."
@@ -500,9 +500,9 @@
/obj/item/integrated_circuit/input/advanced_locator_list
complexity = 6
name = "list advanced locator"
- desc = "This is needed for certain devices that demand list of names for a targets to act upon. This type locates something \
- that is standing in given radius up to 8 meters. Output is non-associative. Input will only consider keys if associative."
- extended_desc = "The first pin requires a list of kinds of objects that you want the locator to acquire. It will locate nearby objects by name and description, \
+ desc = "This is needed for certain devices that demand list of names for a target to act upon. This type locates something \
+ that is standing in given radius of up to 8 meters. Output is non-associative. Input will only consider keys if associative."
+ extended_desc = "The first pin requires a list of the kinds of objects that you want the locator to acquire. It will locate nearby objects by name and description, \
and will then provide a list of all found objects which are similar. \
The second pin is a radius."
inputs = list("desired type ref" = IC_PINTYPE_LIST, "radius" = IC_PINTYPE_NUMBER)
@@ -564,10 +564,10 @@
complexity = 6
name = "advanced locator"
desc = "This is needed for certain devices that demand a reference for a target to act upon. This type locates something \
- that is standing in given radius up to 8 meters"
- extended_desc = "The first pin requires a ref to a kind of object that you want the locator to acquire. This means that it will \
- give refs to nearby objects which are similar. If this pin is string, this locator will search for an \
- item by matching desired text in it's name and description. If more than one valid object is found nearby, it will choose one of them at \
+ that is standing in given radius of up to 8 meters"
+ extended_desc = "The first pin requires a ref to the kind of object that you want the locator to acquire. This means that it will \
+ give refs to nearby objects which are similar. If this pin is a string, the locator will search for an \
+ item matching the desired text in its name and description. If more than one valid object is found nearby, it will choose one of them at \
random. The second pin is a radius."
inputs = list("desired type" = IC_PINTYPE_ANY, "radius" = IC_PINTYPE_NUMBER)
outputs = list("located ref" = IC_PINTYPE_REF)
@@ -617,7 +617,7 @@
/obj/item/integrated_circuit/input/signaler
name = "integrated signaler"
- desc = "Signals from a signaler can be received with this, allowing for remote control. Additionally, it can send signals as well."
+ desc = "Signals from a signaler can be received with this, allowing for remote control. It can also send signals."
extended_desc = "When a signal is received from another signaler, the 'on signal received' activator pin will be pulsed. \
The two input pins are to configure the integrated signaler's settings. Note that the frequency should not have a decimal in it, \
meaning the default frequency is expressed as 1457, not 145.7. To send a signal, pulse the 'send signal' activator pin."
@@ -637,6 +637,7 @@
var/frequency = FREQ_SIGNALER
var/code = DEFAULT_SIGNALER_CODE
var/datum/radio_frequency/radio_connection
+ var/hearing_range = 1
/obj/item/integrated_circuit/input/signaler/Initialize()
. = ..()
@@ -690,15 +691,19 @@
return 0
activate_pin(3)
- audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 1)
+ audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range)
+ for(var/CHM in get_hearers_in_view(hearing_range, src))
+ if(ismob(CHM))
+ var/mob/LM = CHM
+ LM.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
/obj/item/integrated_circuit/input/ntnet_packet
name = "NTNet networking circuit"
- desc = "Enables the sending and receiving of messages on NTNet via packet data protocol."
- extended_desc = "Data can be send or received using the second pin on each side, \
+ desc = "Enables the sending and receiving of messages over NTNet via packet data protocol."
+ extended_desc = "Data can be sent or received using the second pin on each side, \
with additonal data reserved for the third pin. When a message is received, the second activation pin \
- will pulse whatever's connected to it. Pulsing the first activation pin will send a message. Message \
- can be send to multiple recepients. Addresses must be separated with ; symbol."
+ will pulse whatever is connected to it. Pulsing the first activation pin will send a message. Messages \
+ can be sent to multiple recepients. Addresses must be separated with a semicolon, like this: Address1;Address2;Etc."
icon_state = "signal"
complexity = 2
cooldown_per_use = 1
@@ -751,11 +756,11 @@
/obj/item/integrated_circuit/input/ntnet_advanced
name = "Low level NTNet transreciever"
- desc = "Enables the sending and receiving of messages on NTNet via packet data protocol. Allows advanced control of message contents and signalling. Must use associative lists. Outputs associative list. Has a slower transmission rate than normal NTNet circuits, due to increased data processing complexity.."
- extended_desc = "Data can be send or received using the second pin on each side, \
+ desc = "Enables the sending and receiving of messages over NTNet via packet data protocol. Allows advanced control of message contents and signalling. Must use associative lists. Outputs associative list. Has a slower transmission rate than normal NTNet circuits, due to increased data processing complexity."
+ extended_desc = "Data can be sent or received using the second pin on each side, \
with additonal data reserved for the third pin. When a message is received, the second activation pin \
- will pulse whatever's connected to it. Pulsing the first activation pin will send a message. Message \
- can be send to multiple recepients. Addresses must be separated with ; symbol."
+ will pulse whatever is connected to it. Pulsing the first activation pin will send a message. Messages \
+ can be sent to multiple recepients. Addresses must be separated with a semicolon, like this: Address1;Address2;Etc."
icon_state = "signal"
complexity = 4
cooldown_per_use = 10
@@ -797,7 +802,7 @@
/obj/item/integrated_circuit/input/gps
name = "global positioning system"
desc = "This allows you to easily know the position of a machine containing this device."
- extended_desc = "The GPS's coordinates it gives is absolute, not relative."
+ extended_desc = "The coordinates that the GPS outputs are absolute, not relative."
icon_state = "gps"
complexity = 4
inputs = list()
@@ -824,7 +829,7 @@
/obj/item/integrated_circuit/input/microphone
name = "microphone"
- desc = "Useful for spying on people or for voice activated machines."
+ desc = "Useful for spying on people, or for voice-activated machines."
extended_desc = "This will automatically translate most languages it hears to Galactic Common. \
The first activation pin is always pulsed when the circuit hears someone talk, while the second one \
is only triggered if it hears someone speaking a language other than Galactic Common."
@@ -916,7 +921,7 @@
/obj/item/integrated_circuit/input/obj_scanner
name = "scanner"
desc = "Scans and obtains a reference for any objects you use on the assembly."
- extended_desc = "If the 'put down' pin is set to true, the assembly will take the scanned object from your hands to it's location. \
+ extended_desc = "If the 'put down' pin is set to true, the assembly will take the scanned object from your hands to its location. \
Useful for interaction with the grabber. The scanner only works using the help intent."
icon_state = "recorder"
complexity = 4
@@ -943,7 +948,7 @@
name = "internal battery monitor"
desc = "This monitors the charge level of an internal battery."
icon_state = "internalbm"
- extended_desc = "This circuit will give you values of charge, max charge, and percentage of the internal battery on demand."
+ extended_desc = "This circuit will give you the values of charge, max charge, and the current percentage of the internal battery on demand."
w_class = WEIGHT_CLASS_TINY
complexity = 1
inputs = list()
@@ -976,9 +981,9 @@
/obj/item/integrated_circuit/input/externalbm
name = "external battery monitor"
- desc = "This can help to watch battery state of any device in view"
+ desc = "This can read the battery state of any device in view."
icon_state = "externalbm"
- extended_desc = "This circuit will give you values of charge, max charge, and percentage of any device or battery in view"
+ extended_desc = "This circuit will give you the charge, max charge, and the current percentage values of any device or battery in view."
w_class = WEIGHT_CLASS_TINY
complexity = 2
inputs = list("target" = IC_PINTYPE_REF)
@@ -1011,7 +1016,7 @@
/obj/item/integrated_circuit/input/ntnetsc
name = "NTNet scanner"
- desc = "This can return NTNet IDs of a component inside the given object, if there are any."
+ desc = "This can return the NTNet IDs of a component inside the given object, if there are any."
icon_state = "signalsc"
w_class = WEIGHT_CLASS_TINY
complexity = 2
diff --git a/code/modules/integrated_electronics/subtypes/lists.dm b/code/modules/integrated_electronics/subtypes/lists.dm
index c9744cc41c..a5c482c7de 100644
--- a/code/modules/integrated_electronics/subtypes/lists.dm
+++ b/code/modules/integrated_electronics/subtypes/lists.dm
@@ -17,8 +17,8 @@
/obj/item/integrated_circuit/lists/pick
name = "pick circuit"
- desc = "This circuit will pick a random element from the input list, and output said element."
- extended_desc = "Input list is unmodified."
+ desc = "This circuit will pick a random element from the input list, and output that element."
+ extended_desc = "The input list is not modified."
icon_state = "addition"
outputs = list(
"result" = IC_PINTYPE_ANY
@@ -70,7 +70,7 @@
/obj/item/integrated_circuit/lists/search
name = "search circuit"
desc = "This circuit will get the index location of the desired element in a list."
- extended_desc = "Search will start at 1 position and will return first matching position."
+ extended_desc = "Search will start at position 1 and will return the first matching position."
inputs = list(
"list" = IC_PINTYPE_LIST,
"item" = IC_PINTYPE_ANY
@@ -104,8 +104,8 @@
/obj/item/integrated_circuit/lists/filter
name = "filter circuit"
desc = "This circuit will search through a list for anything matching the desired element(s) and outputs two lists: \
- one containing just matching elements, and one with matching elements filtered out."
- extended_desc = "Sample accepts lists. If no match is found, original list is sent to output 1."
+ one containing only the matching elements, and one with the matching elements filtered out."
+ extended_desc = "Sample accepts lists. If no match is found, the original list is sent to output 1."
inputs = list(
"input list" = IC_PINTYPE_LIST,
"sample" = IC_PINTYPE_ANY
@@ -168,7 +168,7 @@
/obj/item/integrated_circuit/lists/listset
name = "list set circuit"
desc = "This circuit will remove any duplicate entries from a list."
- extended_desc = "If there are no duplicate entries, result list will be unchanged."
+ extended_desc = "If there are no duplicate entries, the output list will be unchanged."
inputs = list(
"list" = IC_PINTYPE_LIST
)
@@ -189,7 +189,7 @@
/obj/item/integrated_circuit/lists/at
name = "at circuit"
desc = "This circuit will pick an element from a list by the input index."
- extended_desc = "If there is no element with such index, result will be null."
+ extended_desc = "If there is no element at the given index, the result will be null."
inputs = list(
"list" = IC_PINTYPE_LIST,
"index" = IC_PINTYPE_INDEX
@@ -225,7 +225,7 @@
/obj/item/integrated_circuit/lists/delete
name = "delete circuit"
desc = "This circuit will remove an element from a list by the index."
- extended_desc = "If there is no element with such index, result list will be unchanged."
+ extended_desc = "If there is no element at the given index, the result list will be unchanged."
inputs = list(
"list" = IC_PINTYPE_LIST,
"index" = IC_PINTYPE_INDEX
@@ -254,7 +254,7 @@
/obj/item/integrated_circuit/lists/write
name = "write circuit"
desc = "This circuit will write an element to a list at the given index location."
- extended_desc = "If there is no element with such index, it will give the same list as before."
+ extended_desc = "If there is no element at the given index, it will output the same list as before."
inputs = list(
"list" = IC_PINTYPE_LIST,
"index" = IC_PINTYPE_INDEX,
@@ -313,7 +313,7 @@
/obj/item/integrated_circuit/lists/jointext
name = "join text circuit"
- desc = "This circuit will combine two lists into one and output it as a string."
+ desc = "This circuit will combine two lists into one, and output it as a string."
extended_desc = "Default settings will encode the entire list into a string."
icon_state = "join"
inputs = list(
@@ -351,7 +351,7 @@
/obj/item/integrated_circuit/lists/constructor
name = "large list constructor"
- desc = "This circuit will build a list out of sixteen input values."
+ desc = "This circuit will build a list out of up to sixteen input values."
icon_state = "constr8"
inputs = list()
outputs = list(
@@ -383,20 +383,20 @@
/obj/item/integrated_circuit/lists/constructor/small
name = "list constructor"
- desc = "This circuit will build a list out of four input values."
+ desc = "This circuit will build a list out of up to four input values."
icon_state = "constr"
number_of_pins = 4
/obj/item/integrated_circuit/lists/constructor/medium
name = "medium list constructor"
- desc = "This circuit will build a list out of eight input values."
+ desc = "This circuit will build a list out of up to eight input values."
icon_state = "constr8"
number_of_pins = 8
/obj/item/integrated_circuit/lists/deconstructor
name = "large list deconstructor"
- desc = "This circuit will write first sixteen entries of input list, starting with index, into the output values."
+ desc = "This circuit will write the first sixteen entries of its input list, starting with the index, into the output values."
icon_state = "deconstr8"
inputs = list(
"input" = IC_PINTYPE_LIST,
@@ -428,11 +428,11 @@
/obj/item/integrated_circuit/lists/deconstructor/small
name = "list deconstructor"
- desc = "This circuit will write first four entries of input list, starting with index, into the output values."
+ desc = "This circuit will write the first four entries of its input list, starting with the index, into the output values."
icon_state = "deconstr"
number_of_pins = 4
/obj/item/integrated_circuit/lists/deconstructor/medium
name = "medium list deconstructor"
- desc = "This circuit will write first eight entries of input list, starting with index, into the output values."
+ desc = "This circuit will write the first eight entries of its input list, starting with the index, into the output values."
number_of_pins = 8
diff --git a/code/modules/integrated_electronics/subtypes/logic.dm b/code/modules/integrated_electronics/subtypes/logic.dm
index 41917f2a44..e9dca8c330 100644
--- a/code/modules/integrated_electronics/subtypes/logic.dm
+++ b/code/modules/integrated_electronics/subtypes/logic.dm
@@ -89,7 +89,7 @@
/obj/item/integrated_circuit/logic/binary/rslatch
name = "RS latch"
- desc = "This gate is a synchronized RS latch. If both R and S are true, state will not change."
+ desc = "This gate is a synchronized RS latch. If both R and S are true, its state will not change."
icon_state = "sr_nor"
inputs = list("S" = IC_PINTYPE_ANY,"R" = IC_PINTYPE_ANY)
outputs = list("Q" = IC_PINTYPE_BOOLEAN,"!Q" = IC_PINTYPE_BOOLEAN)
diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm
index 1744a468f5..f4cc363afb 100644
--- a/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -6,8 +6,9 @@
desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
extended_desc = "The firing mechanism can slot in any energy weapon. \
The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \
- The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode is switch between \
- lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon."
+ The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \
+ lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \
+ hand, you will need to use an assembly that is a gun."
complexity = 20
w_class = WEIGHT_CLASS_SMALL
size = 3
@@ -80,7 +81,7 @@
/obj/item/integrated_circuit/manipulation/weapon_firing/do_work()
if(!installed_gun || !installed_gun.handle_pins())
return
- if(!isturf(assembly.loc))
+ if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc)))
return
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
push_data()
@@ -99,6 +100,7 @@
var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
+ assembly.visible_message("[assembly] fires [installed_gun]! ")
shootAt(locate(target_x, target_y, T.z))
/obj/item/integrated_circuit/manipulation/weapon_firing/proc/shootAt(turf/target)
@@ -134,8 +136,8 @@
desc = "This allows a machine to move in a given direction."
icon_state = "locomotion"
extended_desc = "The circuit accepts a 'dir' number as a direction to move towards. \
- Pulsing the 'step towards dir' activator pin will cause the machine to move a meter in that direction, assuming it is not \
- being held, or anchored in some way. It should be noted that the ability to move is dependant on the type of assembly that this circuit inhabits."
+ Pulsing the 'step towards dir' activator pin will cause the machine to move one step in that direction, assuming it is not \
+ being held, or anchored in some way. It should be noted that the ability to move is dependant on the type of assembly that this circuit inhabits; only drone assemblies can move."
w_class = WEIGHT_CLASS_SMALL
complexity = 10
cooldown_per_use = 1
@@ -169,9 +171,9 @@
/obj/item/integrated_circuit/manipulation/grenade
name = "grenade primer"
desc = "This circuit comes with the ability to attach most types of grenades and prime them at will."
- extended_desc = "Time between priming and detonation is limited to between 1 to 12 seconds but is optional. \
- If unset, not a number, or a number less than 1 then the grenade's built-in timing will be used. \
- Beware: Once primed there is no aborting the process!"
+ extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \
+ If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \
+ Beware: Once primed, there is no aborting the process!"
icon_state = "grenade"
complexity = 30
cooldown_per_use = 10
@@ -243,9 +245,9 @@
name = "plant manipulation module"
desc = "Used to uproot weeds and harvest/plant trays."
icon_state = "plant_m"
- extended_desc = "The circuit accepts a reference to a hydroponic tray or an item in an adjacent tile. \
- Mode input(0-harvest, 1-uproot weeds, 2-uproot plant, 3-plant seed) determines action. \
- Harvesting returns a list of the harvested plants."
+ extended_desc = "The circuit accepts a reference to a hydroponic tray or an item on an adjacent tile. \
+ Mode input (0-harvest, 1-uproot weeds, 2-uproot plant, 3-plant seed) determines action. \
+ Harvesting outputs a list of the harvested plants."
w_class = WEIGHT_CLASS_TINY
complexity = 10
inputs = list("tray" = IC_PINTYPE_REF,"mode" = IC_PINTYPE_NUMBER,"item" = IC_PINTYPE_REF)
@@ -345,9 +347,9 @@
/obj/item/integrated_circuit/manipulation/grabber
name = "grabber"
- desc = "A circuit with it's own inventory for items, used to grab and store things."
+ desc = "A circuit with its own inventory for items. Used to grab and store things."
icon_state = "grabber"
- extended_desc = "The circuit accepts a reference to an object to be grabbed and can store up to 10 objects. Modes: 1 to grab, 0 to eject the first object, and -1 to eject all objects."
+ extended_desc = "This circuit accepts a reference to an object to be grabbed, and can store up to 10 objects. Modes: 1 to grab, 0 to eject the first object, and -1 to eject all objects. If you throw something from a grabber's inventory with a thrower, the grabber will update its outputs accordingly."
w_class = WEIGHT_CLASS_SMALL
size = 3
cooldown_per_use = 5
@@ -384,6 +386,10 @@
var/obj/item/U
for(U in contents)
U.forceMove(T)
+ update_outputs()
+ activate_pin(2)
+
+/obj/item/integrated_circuit/manipulation/grabber/proc/update_outputs()
if(contents.len)
set_pin_data(IC_OUTPUT, 1, WEAKREF(contents[1]))
set_pin_data(IC_OUTPUT, 2, WEAKREF(contents[contents.len]))
@@ -393,7 +399,6 @@
set_pin_data(IC_OUTPUT, 3, contents.len)
set_pin_data(IC_OUTPUT, 4, contents)
push_data()
- activate_pin(2)
/obj/item/integrated_circuit/manipulation/grabber/attack_self(var/mob/user)
if(contents.len)
@@ -401,16 +406,14 @@
var/obj/item/U
for(U in contents)
U.forceMove(T)
- set_pin_data(IC_OUTPUT, 1, null)
- set_pin_data(IC_OUTPUT, 2, null)
- set_pin_data(IC_OUTPUT, 3, contents.len)
+ update_outputs()
push_data()
/obj/item/integrated_circuit/manipulation/claw
name = "pulling claw"
desc = "Circuit which can pull things.."
icon_state = "pull_claw"
- extended_desc = "The circuit accepts a reference to thing to be pulled. Modes: 0 for release. 1 for pull."
+ extended_desc = "This circuit accepts a reference to a thing to be pulled. Modes: 0 for release. 1 for pull."
w_class = WEIGHT_CLASS_SMALL
size = 3
cooldown_per_use = 5
@@ -464,9 +467,10 @@
/obj/item/integrated_circuit/manipulation/thrower
name = "thrower"
desc = "A compact launcher to throw things from inside or nearby tiles."
- extended_desc = "The first and second inputs need to be numbers which correspond to coordinates to throw objects at relative to the machine itself. \
+ extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \
The 'fire' activator will cause the mechanism to attempt to throw objects at the coordinates, if possible. Note that the \
- projectile need to be inside the machine, or to be on an adjacent tile, and must be medium sized or smaller."
+ projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \
+ must also be a gun if you wish to throw something while the assembly is in hand."
complexity = 25
w_class = WEIGHT_CLASS_SMALL
size = 2
@@ -497,6 +501,9 @@
if(max_w_class && (A.w_class > max_w_class))
return
+ if(!assembly.can_fire_equipped && ishuman(assembly.loc))
+ return
+
// Is the target inside the assembly or close to it?
if(!check_target(A, exclude_components = TRUE))
return
@@ -511,13 +518,21 @@
if(!M.temporarilyRemoveItemFromInventory(A))
return
+ // If the item is in a grabber circuit we'll update the grabber's outputs after we've thrown it.
+ var/obj/item/integrated_circuit/manipulation/grabber/G = A.loc
+
var/x_abs = CLAMP(T.x + target_x_rel, 0, world.maxx)
var/y_abs = CLAMP(T.y + target_y_rel, 0, world.maxy)
var/range = round(CLAMP(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1)
+ assembly.visible_message("[assembly] has thrown [A]! ")
A.forceMove(drop_location())
A.throw_at(locate(x_abs, y_abs, T.z), range, 3)
+ // If the item came from a grabber now we can update the outputs since we've thrown it.
+ if(G)
+ G.update_outputs()
+
/obj/item/integrated_circuit/manipulation/matman
name = "material manager"
desc = "This circuit is designed for automatic storage and distribution of materials."
@@ -573,7 +588,7 @@
/obj/item/integrated_circuit/manipulation/matman/Initialize()
var/datum/component/material_container/materials = AddComponent(/datum/component/material_container,
list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0,
- FALSE, list(/obj/item/stack, /obj/item/stack/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
+ FALSE, list(/obj/item/stack), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
materials.max_amount =100000
materials.precise_insertion = TRUE
.=..()
diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm
index b54c433d35..fe74657532 100644
--- a/code/modules/integrated_electronics/subtypes/memory.dm
+++ b/code/modules/integrated_electronics/subtypes/memory.dm
@@ -56,14 +56,14 @@
/obj/item/integrated_circuit/memory/large
name = "large memory circuit"
- desc = "This big circuit can hold eight pieces of data."
+ desc = "This big circuit can store eight pieces of data."
icon_state = "memory8"
power_draw_per_use = 4
number_of_pins = 8
/obj/item/integrated_circuit/memory/huge
name = "large memory stick"
- desc = "This stick of memory can hold up up to sixteen pieces of data."
+ desc = "This stick of memory can store up up to sixteen pieces of data."
icon_state = "memory16"
w_class = WEIGHT_CLASS_SMALL
spawn_flags = IC_SPAWN_RESEARCH
@@ -79,6 +79,7 @@
activators = list("push data" = IC_PINTYPE_PULSE_IN)
var/accepting_refs = FALSE
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ number_of_pins = 0
/obj/item/integrated_circuit/memory/constant/do_work()
var/datum/integrated_io/O = outputs[1]
diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm
index 6f7fd6eef5..2d820b016e 100644
--- a/code/modules/integrated_electronics/subtypes/output.dm
+++ b/code/modules/integrated_electronics/subtypes/output.dm
@@ -92,7 +92,7 @@
/obj/item/integrated_circuit/output/light/advanced
name = "advanced light"
- desc = "A light that takes a hexadecimal color value and a brightness value, and can be toggled on/off with a pulse."
+ desc = "A light that takes a hexadecimal color value and a brightness value, and can be toggled on/off by pulsing it."
icon_state = "light_adv"
complexity = 8
inputs = list(
diff --git a/code/modules/integrated_electronics/subtypes/power.dm b/code/modules/integrated_electronics/subtypes/power.dm
index 018cd71006..e760b21f72 100644
--- a/code/modules/integrated_electronics/subtypes/power.dm
+++ b/code/modules/integrated_electronics/subtypes/power.dm
@@ -28,8 +28,8 @@
extended_desc = "This circuit transmits 20 kJ of electricity every time the activator pin is pulsed. The input pin must be \
a reference to a machine to send electricity to. This can be a battery, or anything containing a battery. The machine can exist \
inside the assembly, or adjacent to it. The power is sourced from the assembly's power cell. If the target is outside of the assembly, \
- some power is lost due to ineffiency.Warning!Don't stack more than 1 power transmittors.it becomes less efficient for every other \
- transmission circuit in its own assembly and other nearby ones. "
+ some power is lost due to ineffiency. Warning! Don't stack more than 1 power transmitter, as it becomes less efficient for every other \
+ transmission circuit in its own assembly and other nearby ones."
w_class = WEIGHT_CLASS_BULKY
complexity = 32
power_draw_per_use = 2000
diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm
index 9f57dd6f43..73d162ff3a 100644
--- a/code/modules/integrated_electronics/subtypes/reagents.dm
+++ b/code/modules/integrated_electronics/subtypes/reagents.dm
@@ -21,7 +21,7 @@
desc = "Unlike most electronics, creating smoke is completely intentional."
icon_state = "smoke"
extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \
- into the smoke clouds when activated. The reagents are consumed when smoke is made."
+ into the smoke clouds when activated. The reagents are consumed when the smoke is made."
ext_cooldown = 1
container_type = OPENCONTAINER
volume = 100
@@ -99,10 +99,10 @@
/obj/item/integrated_circuit/reagent/injector
name = "integrated hypo-injector"
- desc = "This scary looking thing is able to pump liquids into whatever it's pointed at."
+ desc = "This scary looking thing is able to pump liquids into, or suck liquids out of, whatever it's pointed at."
icon_state = "injector"
- extended_desc = "This autoinjector can push reagents into another container or someone else outside of the machine. The target \
- must be adjacent to the machine, and if it is a person, they cannot be wearing thick clothing. Negative given amount makes injector suck out reagents."
+ extended_desc = "This autoinjector can push up to 30 units of reagents into another container or someone else outside of the machine. The target \
+ must be adjacent to the machine, and if it is a person, they cannot be wearing thick clothing. Negative given amounts makes the injector suck out reagents instead."
container_type = OPENCONTAINER
volume = 30
@@ -252,7 +252,7 @@
icon_state = "reagent_pump"
extended_desc = "This is a pump which will move liquids from the source ref to the target ref. The third pin determines \
how much liquid is moved per pulse, between 0 and 50. The pump can move reagents to any open container inside the machine, or \
- outside the machine if it is next to the machine."
+ outside the machine if it is adjacent to the machine."
complexity = 8
inputs = list("source" = IC_PINTYPE_REF, "target" = IC_PINTYPE_REF, "injection amount" = IC_PINTYPE_NUMBER)
@@ -346,7 +346,7 @@
/obj/item/integrated_circuit/reagent/storage/cryo
name = "cryo reagent storage"
- desc = "Stores liquid inside the device away from electrical components. It can store up to 60u. This will also suppress reactions."
+ desc = "Stores liquid inside the device away from electrical components. It can store up to 60u. This will also prevent reactions."
icon_state = "reagent_storage_cryo"
extended_desc = "This is effectively an internal cryo beaker."
@@ -359,7 +359,7 @@
/obj/item/integrated_circuit/reagent/storage/grinder
name = "reagent grinder"
- desc = "This is reagent grinder. It accepts a ref to something and refines it into reagents. It can store up to 100u."
+ desc = "This is a reagent grinder. It accepts a ref to something, and refines it into reagents. It can store up to 100u."
icon_state = "blender"
extended_desc = ""
inputs = list(
@@ -406,7 +406,7 @@
obj/item/integrated_circuit/reagent/storage/juicer
name = "reagent juicer"
- desc = "This is reagent juicer. It accepts a ref to something and refines it into reagents. It can store up to 100u."
+ desc = "This is a reagent juicer. It accepts a ref to something and refines it into reagents. It can store up to 100u."
icon_state = "blender"
extended_desc = ""
inputs = list(
@@ -454,7 +454,7 @@ obj/item/integrated_circuit/reagent/storage/juicer
name = "reagent scanner"
desc = "Stores liquid inside the device away from electrical components. It can store up to 60u. On pulse this beaker will send list of contained reagents."
icon_state = "reagent_scan"
- extended_desc = "Mostly useful for reagent filter."
+ extended_desc = "Mostly useful for filtering reagents."
complexity = 8
outputs = list(
@@ -482,12 +482,12 @@ obj/item/integrated_circuit/reagent/storage/juicer
/obj/item/integrated_circuit/reagent/filter
name = "reagent filter"
- desc = "Filtering liquids by list of desired or unwanted reagents."
+ desc = "Filters liquids by list of desired or unwanted reagents."
icon_state = "reagent_filter"
- extended_desc = "This is a filter which will move liquids from the source to the target. \
- It will move all reagents, except those in the unwanted list, given the fourth pin if amount value is positive, \
- or it will move only desired reagents if amount is negative. The third pin determines \
- how much reagent is moved per pulse, between 0 and 50. Amount is given for each separate reagent."
+ extended_desc = "This is a filter which will move liquids from the source to its target. \
+ If the amount in the fourth pin is positive, it will move all reagents except those in the unwanted list. \
+ If the amount in the fourth pin is negative, it will only move the reagents in the wanted list. \
+ The third pin determines how many reagents are moved per pulse, between 0 and 50. Amount is given for each separate reagent."
complexity = 8
inputs = list(
diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm
index e0775f1a23..4445c1e1f3 100644
--- a/code/modules/integrated_electronics/subtypes/smart.dm
+++ b/code/modules/integrated_electronics/subtypes/smart.dm
@@ -37,10 +37,11 @@
activate_pin(2)
/obj/item/integrated_circuit/smart/coord_basic_pathfinder
- name = "coordinte pathfinder"
+ name = "coordinate pathfinder"
desc = "This complex circuit is able to determine what direction a given target is."
- extended_desc = "This circuit uses absolute coordintes to determine where the target is. If the machine \
- cannot see the target, it will not be able to calculate the correct direction.This circuit is working only in assembly."
+ extended_desc = "This circuit uses absolute coordinates to determine where the target is. If the machine \
+ cannot see the target, it will not be able to calculate the correct direction. \
+ This circuit will only work while inside an assembly."
icon_state = "numberpad"
complexity = 5
inputs = list("X" = IC_PINTYPE_NUMBER,"Y" = IC_PINTYPE_NUMBER,"ignore obstacles" = IC_PINTYPE_BOOLEAN)
@@ -74,8 +75,8 @@
/obj/item/integrated_circuit/smart/advanced_pathfinder
name = "advanced pathfinder"
desc = "This circuit uses a complex processor for long-range pathfinding."
- extended_desc = "This circuit uses absolute coordinates for target. A path will be generated taking obstacle input into account, \
- pathing around any instances of said input. The passkey provided from a card reader is used to create a valid path through doorways."
+ extended_desc = "This circuit uses absolute coordinates to find its target. A path will be generated to the target, taking obstacles into account, \
+ and pathing around any instances of said input. The passkey provided from a card reader is used to calculate a valid path through airlocks."
icon_state = "numberpad"
complexity = 40
cooldown_per_use = 50
@@ -117,4 +118,4 @@
set_pin_data(IC_OUTPUT, 1, Xn)
set_pin_data(IC_OUTPUT, 2, Yn)
push_data()
- activate_pin(2)
\ No newline at end of file
+ activate_pin(2)
diff --git a/code/modules/integrated_electronics/subtypes/time.dm b/code/modules/integrated_electronics/subtypes/time.dm
index 26bd1fc1d6..f72f5dbd74 100644
--- a/code/modules/integrated_electronics/subtypes/time.dm
+++ b/code/modules/integrated_electronics/subtypes/time.dm
@@ -53,8 +53,10 @@
/obj/item/integrated_circuit/time/delay/custom
name = "custom delay circuit"
- desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
- This circuit's delay can be customized, between 1/10th of a second to one hour. The delay is updated upon receiving a pulse."
+ desc = "This sends a pulse signal out after a delay defined in tenths of a second, critical for ensuring proper control \
+ flow in a complex machine. This circuit's delay can be customized, between 1/10th of a second to one hour. \
+ The delay is updated upon receiving a pulse."
+ extended_desc = "The delay is defined in tenths of a second. For instance, 4 will be a delay of 0.4 seconds, or 15 for 1.5 seconds."
icon_state = "delay"
inputs = list("delay time" = IC_PINTYPE_NUMBER)
spawn_flags = IC_SPAWN_RESEARCH
@@ -104,7 +106,9 @@
/obj/item/integrated_circuit/time/ticker/custom
name = "custom ticker"
- desc = "This advanced circuit sends an automatic pulse every given interval."
+ desc = "This advanced circuit sends an automatic pulse every given interval, defined in tenths of a second."
+ extended_desc ="This advanced circuit sends an automatic pulse every given interval, defined in tenths of a second. \
+ For example, setting the time pin to 4 will send a pulse every 0.4 seconds, or 15 for every 1.5 seconds."
icon_state = "tick-f"
complexity = 8
delay = 2 SECONDS
@@ -115,7 +119,7 @@
/obj/item/integrated_circuit/time/ticker/custom/on_data_written()
var/delay_input = get_pin_data(IC_INPUT, 2)
if(delay_input && isnum(delay_input) )
- var/new_delay = CLAMP(delay_input ,1 ,1 HOURS)
+ var/new_delay = CLAMP(delay_input ,1 ,1 HOURS)
delay = new_delay
..()
diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm
index 3aad52e596..b4679ae479 100644
--- a/code/modules/jobs/job_exp.dm
+++ b/code/modules/jobs/job_exp.dm
@@ -226,9 +226,14 @@ GLOBAL_PROTECT(exp_to_update)
if(!rolefound)
play_records["Unknown"] += minutes
else
- play_records[EXP_TYPE_GHOST] += minutes
- if(announce_changes)
- to_chat(src,"You got: [minutes] Ghost EXP! ")
+ if(holder && !holder.deadmined)
+ play_records[EXP_TYPE_ADMIN] += minutes
+ if(announce_changes)
+ to_chat(src,"You got: [minutes] Admin EXP! ")
+ else
+ play_records[EXP_TYPE_GHOST] += minutes
+ if(announce_changes)
+ to_chat(src,"You got: [minutes] Ghost EXP! ")
else if(isobserver(mob))
play_records[EXP_TYPE_GHOST] += minutes
if(announce_changes)
diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm
index 479230e5be..1351d2beeb 100644
--- a/code/modules/jobs/job_types/cargo_service.dm
+++ b/code/modules/jobs/job_types/cargo_service.dm
@@ -111,7 +111,7 @@ Shaft Miner
mask = /obj/item/clothing/mask/gas/explorer
glasses = /obj/item/clothing/glasses/meson
suit_store = /obj/item/tank/internals/oxygen
- internals_slot = slot_s_store
+ internals_slot = SLOT_S_STORE
backpack_contents = list(
/obj/item/storage/bag/ore=1,
/obj/item/kitchen/knife/combat/survival=1,
@@ -220,7 +220,7 @@ Cook
var/list/possible_boxes = subtypesof(/obj/item/storage/box/ingredients)
var/chosen_box = pick(possible_boxes)
var/obj/item/storage/box/I = new chosen_box(src)
- H.equip_to_slot_or_del(I,slot_in_backpack)
+ H.equip_to_slot_or_del(I,SLOT_IN_BACKPACK)
var/datum/martial_art/cqc/under_siege/justacook = new
justacook.teach(H)
diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm
index 3c36247c6d..e0202db132 100644
--- a/code/modules/jobs/job_types/civilian.dm
+++ b/code/modules/jobs/job_types/civilian.dm
@@ -91,7 +91,7 @@ Mime
uniform = /obj/item/clothing/under/rank/mime
mask = /obj/item/clothing/mask/gas/mime
gloves = /obj/item/clothing/gloves/color/white
- head = /obj/item/clothing/head/beret
+ head = /obj/item/clothing/head/frenchberet
suit = /obj/item/clothing/suit/suspenders
backpack_contents = list(/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing=1)
diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm
index 09eb9f34e9..1ef6be2e60 100644
--- a/code/modules/jobs/job_types/civilian_chaplain.dm
+++ b/code/modules/jobs/job_types/civilian_chaplain.dm
@@ -31,7 +31,7 @@ Chaplain
B.icon_state = SSreligion.bible_icon_state
B.item_state = SSreligion.bible_item_state
to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [SSreligion.deity]. Defer to the Chaplain.")
- H.equip_to_slot_or_del(B, slot_in_backpack)
+ H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK)
var/nrt = SSreligion.holy_weapon_type || /obj/item/nullrod
var/obj/item/nullrod/N = new nrt(H)
H.put_in_hands(N)
@@ -79,7 +79,7 @@ Chaplain
SSreligion.bible_name = B.name
SSreligion.deity = B.deity_name
- H.equip_to_slot_or_del(B, slot_in_backpack)
+ H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK)
SSblackbox.record_feedback("text", "religion_name", 1, "[new_religion]", 1)
SSblackbox.record_feedback("text", "religion_deity", 1, "[new_deity]", 1)
diff --git a/code/modules/jobs/job_types/engineering.dm b/code/modules/jobs/job_types/engineering.dm
index 9717062770..d7f23f48c9 100644
--- a/code/modules/jobs/job_types/engineering.dm
+++ b/code/modules/jobs/job_types/engineering.dm
@@ -48,7 +48,7 @@ Chief Engineer
satchel = /obj/item/storage/backpack/satchel/eng
duffelbag = /obj/item/storage/backpack/duffelbag/engineering
box = /obj/item/storage/box/engineer
- pda_slot = slot_l_store
+ pda_slot = SLOT_L_STORE
/datum/outfit/job/ce/rig
name = "Chief Engineer (Hardsuit)"
@@ -59,7 +59,7 @@ Chief Engineer
suit_store = /obj/item/tank/internals/oxygen
gloves = /obj/item/clothing/gloves/color/yellow
head = null
- internals_slot = slot_s_store
+ internals_slot = SLOT_S_STORE
/*
@@ -102,7 +102,7 @@ Station Engineer
satchel = /obj/item/storage/backpack/satchel/eng
duffelbag = /obj/item/storage/backpack/duffelbag/engineering
box = /obj/item/storage/box/engineer
- pda_slot = slot_l_store
+ pda_slot = SLOT_L_STORE
backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
/datum/outfit/job/engineer/gloved
@@ -116,7 +116,7 @@ Station Engineer
suit = /obj/item/clothing/suit/space/hardsuit/engine
suit_store = /obj/item/tank/internals/oxygen
head = null
- internals_slot = slot_s_store
+ internals_slot = SLOT_S_STORE
/*
@@ -156,7 +156,7 @@ Atmospheric Technician
satchel = /obj/item/storage/backpack/satchel/eng
duffelbag = /obj/item/storage/backpack/duffelbag/engineering
box = /obj/item/storage/box/engineer
- pda_slot = slot_l_store
+ pda_slot = SLOT_L_STORE
backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
/datum/outfit/job/atmos/rig
@@ -165,4 +165,4 @@ Atmospheric Technician
mask = /obj/item/clothing/mask/gas
suit = /obj/item/clothing/suit/space/hardsuit/engine/atmos
suit_store = /obj/item/tank/internals/oxygen
- internals_slot = slot_s_store
+ internals_slot = SLOT_S_STORE
diff --git a/code/modules/jobs/job_types/job.dm b/code/modules/jobs/job_types/job.dm
index 65ac5ea0d8..156e975a65 100644
--- a/code/modules/jobs/job_types/job.dm
+++ b/code/modules/jobs/job_types/job.dm
@@ -151,7 +151,7 @@
var/duffelbag = /obj/item/storage/backpack/duffelbag
var/box = /obj/item/storage/box/survival
- var/pda_slot = slot_belt
+ var/pda_slot = SLOT_BELT
/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
switch(H.backbag)
diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm
index d2f77319fc..b82a5d85d2 100644
--- a/code/modules/jobs/job_types/science.dm
+++ b/code/modules/jobs/job_types/science.dm
@@ -56,7 +56,7 @@ Research Director
mask = /obj/item/clothing/mask/breath
suit = /obj/item/clothing/suit/space/hardsuit/rd
suit_store = /obj/item/tank/internals/oxygen
- internals_slot = slot_s_store
+ internals_slot = SLOT_S_STORE
/*
Scientist
@@ -128,4 +128,4 @@ Roboticist
backpack = /obj/item/storage/backpack/science
satchel = /obj/item/storage/backpack/satchel/tox
- pda_slot = slot_l_store
+ pda_slot = SLOT_L_STORE
diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm
index cc842d8e59..6295e9964e 100644
--- a/code/modules/jobs/job_types/security.dm
+++ b/code/modules/jobs/job_types/security.dm
@@ -244,7 +244,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S
if(ears)
if(H.ears)
qdel(H.ears)
- H.equip_to_slot_or_del(new ears(H),slot_ears)
+ H.equip_to_slot_or_del(new ears(H),SLOT_EARS)
var/obj/item/card/id/W = H.wear_id
W.access |= dep_access
diff --git a/code/modules/keybindings/bindings_human.dm b/code/modules/keybindings/bindings_human.dm
index 7c52917386..14890cc7e2 100644
--- a/code/modules/keybindings/bindings_human.dm
+++ b/code/modules/keybindings/bindings_human.dm
@@ -3,12 +3,12 @@
switch(_key)
if("E") // Put held thing in belt or take out most recent thing from belt
var/obj/item/thing = get_active_held_item()
- var/obj/item/storage/equipped_belt = get_item_by_slot(slot_belt)
+ var/obj/item/storage/equipped_belt = get_item_by_slot(SLOT_BELT)
if(!equipped_belt) // We also let you equip a belt like this
if(!thing)
to_chat(user, "You have no belt to take something out of. ")
return
- equip_to_slot_if_possible(thing, slot_belt)
+ equip_to_slot_if_possible(thing, SLOT_BELT)
return
if(!istype(equipped_belt)) // not a storage item
if(!thing)
@@ -31,12 +31,12 @@
if("B") // Put held thing in backpack or take out most recent thing from backpack
var/obj/item/thing = get_active_held_item()
- var/obj/item/storage/equipped_backpack = get_item_by_slot(slot_back)
+ var/obj/item/storage/equipped_backpack = get_item_by_slot(SLOT_BACK)
if(!equipped_backpack) // We also let you equip a backpack like this
if(!thing)
to_chat(user, "You have no backpack to take something out of. ")
return
- equip_to_slot_if_possible(thing, slot_back)
+ equip_to_slot_if_possible(thing, SLOT_BACK)
return
if(!istype(equipped_backpack)) // not a storage item
if(!thing)
diff --git a/code/modules/keybindings/readme.md b/code/modules/keybindings/readme.md
index 1170804436..6c0369d7c7 100644
--- a/code/modules/keybindings/readme.md
+++ b/code/modules/keybindings/readme.md
@@ -1,7 +1,7 @@
# In-code keypress handling system
This whole system is heavily based off of forum_account's keyboard library.
-Thanks to forum_account for saving the day, the library can be found [here](http://www.byond.com/developer/Forum_account/Keyboard)!
+Thanks to forum_account for saving the day, the library can be found [here](https://secure.byond.com/developer/Forum_account/Keyboard)!
.dmf macros have some very serious shortcomings. For example, they do not allow reusing parts
of one macro in another, so giving cyborgs their own shortcuts to swap active module couldn't
diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm
index 5f2e9963e7..8b9cc09dff 100644
--- a/code/modules/language/language.dm
+++ b/code/modules/language/language.dm
@@ -35,7 +35,8 @@
return TRUE
/datum/language/proc/get_icon()
- return "[icon2html(icon, world, icon_state)]"
+ var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/goonchat)
+ return sheet.icon_tag("language-[icon_state]")
/datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4, syllable_divisor=2)
if(!syllables || !syllables.len)
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 0bfb0b5f6d..61d439667d 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -25,11 +25,19 @@
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
resistance_flags = FIRE_PROOF
+/obj/item/clothing/suit/hooded/explorer/Initialize()
+ . = ..()
+ AddComponent(/datum/component/armor_plate)
+
+/obj/item/clothing/head/hooded/explorer/Initialize()
+ . = ..()
+ AddComponent(/datum/component/armor_plate)
+
/obj/item/clothing/mask/gas/explorer
name = "explorer gas mask"
desc = "A military-grade gas mask that can be connected to an air supply."
icon_state = "gas_mining"
- visor_flags = BLOCK_GAS_SMOKE_EFFECT_1 | MASKINTERNALS_1
+ visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
visor_flags_inv = HIDEFACIALHAIR
visor_flags_cover = MASKCOVERSMOUTH
actions_types = list(/datum/action/item_action/adjust)
@@ -52,7 +60,7 @@
desc = "Hostile Environment Cross-Kinetic Suit: A suit designed to withstand the wide variety of hazards from Lavaland. It wasn't enough for its last owner."
icon_state = "hostile_env"
item_state = "hostile_env"
- flags_1 = THICKMATERIAL_1 //not spaceproof
+ clothing_flags = THICKMATERIAL //not spaceproof
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | LAVA_PROOF
slowdown = 0
@@ -84,7 +92,7 @@
item_state = "hostile_env"
w_class = WEIGHT_CLASS_NORMAL
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
- flags_1 = THICKMATERIAL_1 // no space protection
+ clothing_flags = THICKMATERIAL // no space protection
armor = list("melee" = 70, "bullet" = 40, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | LAVA_PROOF
@@ -106,4 +114,3 @@
var/mutable_appearance/M = mutable_appearance('icons/mob/head.dmi', "hostile_env_glass")
M.appearance_flags = RESET_COLOR
. += M
-
diff --git a/code/modules/mining/equipment/goliath_hide.dm b/code/modules/mining/equipment/goliath_hide.dm
index b266b92584..85feaecf73 100644
--- a/code/modules/mining/equipment/goliath_hide.dm
+++ b/code/modules/mining/equipment/goliath_hide.dm
@@ -9,38 +9,4 @@
novariants = FALSE
flags_1 = NOBLUDGEON_1
w_class = WEIGHT_CLASS_NORMAL
- layer = MOB_LAYER
- var/static/list/goliath_platable_armor_typecache = typecacheof(list(
- /obj/item/clothing/head/helmet/space/hardsuit/mining,
- /obj/item/clothing/suit/space/hardsuit/mining,
- /obj/item/clothing/head/hooded/explorer,
- /obj/item/clothing/suit/hooded/explorer))
-
-/obj/item/stack/sheet/animalhide/goliath_hide/afterattack(atom/target, mob/user, proximity_flag)
- if(!proximity_flag)
- return
- if(is_type_in_typecache(target, goliath_platable_armor_typecache))
- var/obj/item/clothing/C = target
- if(C.armor.melee < 60)
- C.armor = C.armor.setRating(melee = min(C.armor.melee + 10, 60))
- to_chat(user, "You strengthen [target], improving its resistance against melee attacks. ")
- use(1)
- else
- to_chat(user, "You can't improve [C] any further! ")
- else if(istype(target, /obj/mecha/working/ripley))
- var/obj/mecha/working/ripley/D = target
- if(D.hides < 3)
- D.hides++
- D.armor = D.armor.setRating(\
- melee = min(D.armor.melee + 10, 70),\
- bullet = min(D.armor.bullet + 5, 50),\
- laser = min(D.armor.laser + 5, 50))
- to_chat(user, "You strengthen [target], improving its resistance against melee attacks. ")
- D.update_icon()
- if(D.hides == 3)
- D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - its pilot must be an experienced monster hunter."
- else
- D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
- use(1)
- else
- to_chat(user, "You can't improve [D] any further! ")
+ layer = MOB_LAYER
\ No newline at end of file
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index 5b86a2d340..558147af23 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -10,7 +10,7 @@
While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna."
force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times
w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
force_unwielded = 20 //It's never not wielded so these are the same
force_wielded = 20
throwforce = 5
diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm
index 7327b0c314..d7cdba8f7b 100644
--- a/code/modules/mining/equipment/mineral_scanner.dm
+++ b/code/modules/mining/equipment/mineral_scanner.dm
@@ -8,7 +8,7 @@
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
var/cooldown = 35
var/current_cooldown = 0
@@ -37,7 +37,7 @@
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
var/cooldown = 35
var/current_cooldown = 0
var/range = 7
diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm
index e73349198b..cbd8717869 100644
--- a/code/modules/mining/equipment/mining_tools.dm
+++ b/code/modules/mining/equipment/mining_tools.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/mining.dmi'
icon_state = "pickaxe"
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT | SLOT_BACK
+ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
force = 15
throwforce = 10
item_state = "pickaxe"
@@ -30,7 +30,7 @@
icon_state = "minipick"
force = 10
throwforce = 7
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=1000)
@@ -54,7 +54,7 @@
name = "mining drill"
icon_state = "handdrill"
item_state = "jackhammer"
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
toolspeed = 0.6 //available from roundstart, faster than a pickaxe.
usesound = 'sound/weapons/drill.ogg'
hitsound = 'sound/weapons/drill.ogg'
@@ -93,7 +93,7 @@
lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi'
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
force = 8
tool_behaviour = TOOL_SHOVEL
toolspeed = 1
diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm
index 0737612211..b8ae25a87a 100644
--- a/code/modules/mining/equipment/wormhole_jaunter.dm
+++ b/code/modules/mining/equipment/wormhole_jaunter.dm
@@ -11,7 +11,7 @@
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 5
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
/obj/item/wormhole_jaunter/attack_self(mob/user)
user.visible_message("[user.name] activates the [src.name]! ")
@@ -53,7 +53,7 @@
/obj/item/wormhole_jaunter/emp_act(power)
var/triggered = FALSE
- if(usr.get_item_by_slot(slot_belt) == src)
+ if(usr.get_item_by_slot(SLOT_BELT) == src)
if(power == 1)
triggered = TRUE
else if(power == 2 && prob(50))
@@ -65,8 +65,8 @@
activate(usr)
/obj/item/wormhole_jaunter/proc/chasm_react(mob/user)
- if(user.get_item_by_slot(slot_belt) == src)
- to_chat(user, "Your [src] activates, saving you from the chasm!")
+ if(user.get_item_by_slot(SLOT_BELT) == src)
+ to_chat(user, "Your [name] activates, saving you from the chasm!")
SSblackbox.record_feedback("tally", "jaunter", 1, "Chasm") // chasm automatic activation
activate(user, FALSE)
else
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 27cc6c7450..272a66766e 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -438,7 +438,7 @@
desc = "Somehow, it's in two places at once."
icon = 'icons/obj/storage.dmi'
icon_state = "cultpack"
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
resistance_flags = INDESTRUCTIBLE
/obj/item/shared_storage/red
@@ -558,7 +558,7 @@
inhand_y_dimension = 64
icon_state = "cleaving_saw"
icon_state_on = "cleaving_saw_open"
- slot_flags = SLOT_BELT
+ slot_flags = ITEM_SLOT_BELT
attack_verb_off = list("attacked", "sawed", "sliced", "torn", "ripped", "diced", "cut")
attack_verb_on = list("cleaved", "swiped", "slashed", "chopped")
hitsound = 'sound/weapons/bladeslice.ogg'
@@ -816,7 +816,7 @@
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
icon = 'icons/obj/guns/magic.dmi'
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
w_class = WEIGHT_CLASS_BULKY
force = 25
damtype = BURN
@@ -993,7 +993,7 @@
righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
inhand_x_dimension = 64
inhand_y_dimension = 64
- slot_flags = SLOT_BACK
+ slot_flags = ITEM_SLOT_BACK
w_class = WEIGHT_CLASS_BULKY
force = 15
attack_verb = list("clubbed", "beat", "pummeled")
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index bb5347a152..c7ba9ad6f4 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -84,7 +84,7 @@
/obj/machinery/mineral/processing_unit/Initialize()
. = ..()
proximity_monitor = new(src, 1)
- AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), INFINITY)
+ AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, FALSE, list(/obj/item/stack))
stored_research = new /datum/techweb/specialized/autounlocking/smelter
/obj/machinery/mineral/processing_unit/Destroy()
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index 63e00f5a38..d4735d1c75 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -28,7 +28,7 @@
/obj/machinery/mineral/ore_redemption/Initialize()
. = ..()
- AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY)
+ AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY, FALSE, list(/obj/item/stack))
stored_research = new /datum/techweb/specialized/autounlocking/smelter
/obj/machinery/mineral/ore_redemption/Destroy()
@@ -303,13 +303,12 @@
desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
var/amount = round(min(desired,50,smelt_amount))
materials.use_amount(alloy.materials, amount)
- var/output = new alloy.build_path(src)
- if(istype(output, /obj/item/stack/sheet))
- var/obj/item/stack/sheet/produced_alloy = output
- produced_alloy.amount = amount
- unload_mineral(produced_alloy)
+ var/output
+ if(ispath(alloy.build_path, /obj/item/stack/sheet))
+ output = new alloy.build_path(src, amount)
else
- unload_mineral(output)
+ output = new alloy.build_path(src)
+ unload_mineral(output)
else
to_chat(usr, "Required access not found. ")
return TRUE
diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm
index e658f69395..0f84d11082 100644
--- a/code/modules/mining/machine_stacking.dm
+++ b/code/modules/mining/machine_stacking.dm
@@ -7,20 +7,23 @@
desc = "Controls a stacking machine... in theory."
density = FALSE
anchored = TRUE
- var/obj/machinery/mineral/stacking_machine/machine = null
+ circuit = /obj/item/circuitboard/machine/stacking_unit_console
+ var/obj/machinery/mineral/stacking_machine/machine
var/machinedir = SOUTHEAST
- speed_process = TRUE
/obj/machinery/mineral/stacking_unit_console/Initialize()
. = ..()
machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir))
if (machine)
machine.CONSOLE = src
- else
- qdel(src)
/obj/machinery/mineral/stacking_unit_console/ui_interact(mob/user)
. = ..()
+
+ if(!machine)
+ to_chat(user, "[src] is not linked to a machine! ")
+ return
+
var/obj/item/stack/sheet/s
var/dat
@@ -35,6 +38,13 @@
user << browse(dat, "window=console_stacking_machine")
+/obj/machinery/mineral/stacking_unit_console/multitool_act(mob/living/user, obj/item/I)
+ if(istype(I, /obj/item/multitool))
+ var/obj/item/multitool/M = I
+ M.buffer = src
+ to_chat(user, "You store linkage information in [I]'s buffer. ")
+ return TRUE
+
/obj/machinery/mineral/stacking_unit_console/Topic(href, href_list)
if(..())
return
@@ -44,8 +54,7 @@
if(!(text2path(href_list["release"]) in machine.stack_list))
return //someone tried to spawn materials by spoofing hrefs
var/obj/item/stack/sheet/inp = machine.stack_list[text2path(href_list["release"])]
- var/obj/item/stack/sheet/out = new inp.type()
- out.amount = inp.amount
+ var/obj/item/stack/sheet/out = new inp.type(null, inp.amount)
inp.amount = 0
machine.unload_mineral(out)
@@ -63,6 +72,7 @@
desc = "A machine that automatically stacks acquired materials. Controlled by a nearby console."
density = TRUE
anchored = TRUE
+ circuit = /obj/item/circuitboard/machine/stacking_machine
var/obj/machinery/mineral/stacking_unit_console/CONSOLE
var/stk_types = list()
var/stk_amt = list()
@@ -79,16 +89,26 @@
if(istype(AM, /obj/item/stack/sheet) && AM.loc == get_step(src, input_dir))
process_sheet(AM)
+/obj/machinery/mineral/stacking_machine/multitool_act(mob/living/user, obj/item/I)
+ if(istype(I, /obj/item/multitool))
+ var/obj/item/multitool/M = I
+ if(!istype(M.buffer, /obj/machinery/mineral/stacking_unit_console))
+ to_chat(user, "The [I] has no linkage data in its buffer. ")
+ return FALSE
+ else
+ CONSOLE = M.buffer
+ CONSOLE.machine = src
+ to_chat(user, "You link [src] to the console in [I]'s buffer. ")
+ return TRUE
+
/obj/machinery/mineral/stacking_machine/proc/process_sheet(obj/item/stack/sheet/inp)
if(!(inp.type in stack_list)) //It's the first of this sheet added
- var/obj/item/stack/sheet/s = new inp.type(src,0)
- s.amount = 0
+ var/obj/item/stack/sheet/s = new inp.type(src, 0)
stack_list[inp.type] = s
var/obj/item/stack/sheet/storage = stack_list[inp.type]
storage.amount += inp.amount //Stack the sheets
qdel(inp) //Let the old sheet garbage collect
while(storage.amount > stack_amt) //Get rid of excessive stackage
- var/obj/item/stack/sheet/out = new inp.type()
- out.amount = stack_amt
+ var/obj/item/stack/sheet/out = new inp.type(null, stack_amt)
unload_mineral(out)
storage.amount -= stack_amt
diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm
index ec4c9bd714..b7cc0db43f 100644
--- a/code/modules/mining/mint.dm
+++ b/code/modules/mining/mint.dm
@@ -16,7 +16,7 @@
/obj/machinery/mineral/mint/Initialize()
. = ..()
- AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_DIAMOND, MAT_BANANIUM), MINERAL_MATERIAL_AMOUNT * 50)
+ AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_DIAMOND, MAT_BANANIUM), MINERAL_MATERIAL_AMOUNT * 50, FALSE, list(/obj/item/stack))
/obj/machinery/mineral/mint/process()
var/turf/T = get_step(src, input_dir)
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 01ac36c57a..9de78d307d 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -234,6 +234,7 @@
if(POLLTYPE_IRV)
if (!href_list["IRVdata"])
to_chat(src, "No ordering data found. Please try again or contact an administrator. ")
+ return
var/list/votelist = splittext(href_list["IRVdata"], ",")
if (!vote_on_irv_poll(pollid, votelist))
to_chat(src, "Vote failed, please try again or contact an administrator. ")
@@ -400,7 +401,7 @@
SSticker.mode.make_antag_chance(humanc)
if(humanc && CONFIG_GET(flag/roundstart_traits))
- SStraits.AssignTraits(humanc, humanc.client, TRUE)
+ SSquirks.AssignQuirks(humanc, humanc.client, TRUE)
log_manifest(character.mind.key,character.mind,character,latejoin = TRUE)
diff --git a/code/modules/mob/dead/new_player/poll.dm b/code/modules/mob/dead/new_player/poll.dm
index d10e32a887..ce710e5186 100644
--- a/code/modules/mob/dead/new_player/poll.dm
+++ b/code/modules/mob/dead/new_player/poll.dm
@@ -211,7 +211,7 @@
src << browse(null ,"window=playerpolllist")
src << browse(output,"window=playerpoll;size=500x250")
if(POLLTYPE_IRV)
- var/datum/asset/irv_assets = get_asset_datum(/datum/asset/simple/IRV)
+ var/datum/asset/irv_assets = get_asset_datum(/datum/asset/group/IRV)
irv_assets.send(src)
var/datum/DBQuery/query_irv_get_votes = SSdbcore.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
@@ -267,7 +267,7 @@
-
+