diff --git a/.travis.yml b/.travis.yml
index c0a45df72d..ba11b40c97 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,5 +1,6 @@
language: generic
sudo: false
+dist: precise
env:
global:
diff --git a/SQL/database_changelog.txt.rej b/SQL/database_changelog.txt.rej
new file mode 100644
index 0000000000..1b201ec4aa
--- /dev/null
+++ b/SQL/database_changelog.txt.rej
@@ -0,0 +1,15 @@
+diff a/SQL/database_changelog.txt b/SQL/database_changelog.txt (rejected hunks)
+@@ -1,10 +1,10 @@
+ Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255.
+
+-The latest database version is 3.1; The query to update the schema revision table is:
++The latest database version is 3.0; The query to update the schema revision table is:
+
+-UPDATE `schema_revision` SET major = 3, minor = 1 LIMIT 1;
++INSERT INTO `schema_revision` (`major`, `minor`) VALUES (3, 0);
+ or
+-UPDATE `SS13_schema_revision` SET major = 3, minor = 1 LIMIT 1;
++INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (3, 0);
+
+ ----------------------------------------------------
+
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
index 937890e100..de78fed108 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
@@ -145,10 +145,7 @@
dir = 1;
pixel_y = -27
},
-/obj/item/weapon/paper{
- info = "Nothing of interest to report.";
- name = "Important Notice - Mrs. Henderson"
- },
+/obj/item/weapon/paper/fluff/stations/lavaland/surface/henderson_report,
/turf/open/floor/plasteel/cmo,
/area/ruin/powered/animal_hospital)
"aA" = (
@@ -474,7 +471,7 @@
"bD" = (
/obj/structure/table/glass,
/obj/item/weapon/reagent_containers/glass/bottle/cyanide{
- desc = "A cocktail of chemotherpy drugs intended to treat bladder cancer.";
+ desc = "A cocktail of chemotherapy drugs intended to treat bladder cancer.";
name = "MVAC regimen"
},
/obj/item/weapon/reagent_containers/syringe,
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index 7537f91f09..aed9b30686 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -1,4 +1,4 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"aa" = (
/turf/template_noop,
/area/template_noop)
@@ -6,13 +6,13 @@
/obj/structure/stone_tile/surrounding_tile{
dir = 4
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"ac" = (
/obj/structure/stone_tile/block{
dir = 1
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"ad" = (
/obj/structure/stone_tile/block{
@@ -21,13 +21,13 @@
/obj/structure/stone_tile/cracked{
dir = 8
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"ae" = (
/obj/structure/stone_tile/block/cracked{
dir = 1
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"af" = (
/obj/structure/stone_tile/block{
@@ -36,26 +36,26 @@
/obj/structure/stone_tile{
dir = 8
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"ag" = (
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 1
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"ah" = (
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"ai" = (
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 4
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"aj" = (
/obj/structure/stone_tile/slab,
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"ak" = (
/turf/closed/indestructible/riveted/boss,
@@ -64,7 +64,7 @@
/obj/structure/stone_tile/surrounding_tile{
dir = 1
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"am" = (
/obj/structure/stone_tile{
@@ -95,7 +95,10 @@
/obj/structure/stone_tile/block/cracked{
dir = 8
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
+ },
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"ar" = (
/obj/structure/stone_tile/block/cracked{
@@ -104,7 +107,7 @@
/obj/structure/stone_tile{
dir = 4
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"as" = (
/turf/closed/wall/mineral/wood,
@@ -113,10 +116,10 @@
/obj/structure/stone_tile/block{
dir = 8
},
-/obj/structure/stone_tile{
- dir = 1
+/obj/structure/stone_tile/block{
+ dir = 4
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"au" = (
/obj/structure/stone_tile,
@@ -181,7 +184,7 @@
/obj/structure/stone_tile/block{
dir = 4
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"aA" = (
/obj/structure/stone_tile/cracked{
@@ -222,10 +225,7 @@
/obj/structure/stone_tile/block{
dir = 8
},
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"aG" = (
/obj/structure/stone_tile/block/cracked{
@@ -297,7 +297,10 @@
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"aO" = (
-/obj/item/weapon/storage/box/rxglasses,
+/obj/structure/stone_tile/surrounding/cracked{
+ icon_state = "cracked_surrounding1";
+ dir = 1
+ },
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"aP" = (
@@ -316,8 +319,10 @@
/obj/structure/stone_tile/block{
dir = 8
},
-/obj/structure/stone_tile,
-/turf/closed/mineral/volcanic/lava_land_surface,
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"aS" = (
/obj/structure/stone_tile/block{
@@ -465,13 +470,13 @@
/obj/structure/stone_tile{
dir = 8
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"bi" = (
-/obj/structure/stone_tile/cracked{
- dir = 4
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"bj" = (
/obj/structure/stone_tile/block/cracked{
@@ -677,7 +682,7 @@
/obj/structure/stone_tile/block/cracked{
dir = 4
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"bD" = (
/obj/structure/stone_tile/block{
@@ -713,11 +718,11 @@
/area/ruin/unpowered/ash_walkers)
"bI" = (
/obj/structure/stone_tile/slab/cracked,
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"bJ" = (
/obj/structure/stone_tile/surrounding_tile,
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"bK" = (
/obj/structure/stone_tile{
@@ -908,10 +913,16 @@
"cj" = (
/obj/effect/mob_spawn/human/corpse/damaged,
/obj/effect/decal/cleanable/blood,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"ck" = (
/obj/item/weapon/twohanded/spear,
+/obj/structure/stone_tile{
+ dir = 4
+ },
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"cl" = (
@@ -931,19 +942,25 @@
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"cn" = (
-/obj/structure/bonfire/dense,
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"co" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile/cracked{
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile/block{
dir = 1
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"cp" = (
/obj/structure/stone_tile/cracked,
-/turf/closed/mineral/volcanic/lava_land_surface,
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"cq" = (
/obj/structure/stone_tile/cracked{
@@ -1021,6 +1038,10 @@
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"cA" = (
+/obj/structure/stone_tile/slab/cracked{
+ icon_state = "cracked_slab1";
+ dir = 4
+ },
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"cB" = (
@@ -1048,6 +1069,11 @@
/obj/item/device/flashlight/lantern,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
+"cE" = (
+/obj/structure/stone_tile/surrounding/cracked,
+/obj/effect/baseturf_helper,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
"cF" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -1070,18 +1096,26 @@
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"cI" = (
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
/obj/structure/stone_tile/cracked{
dir = 1
},
-/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"cJ" = (
/obj/item/weapon/shovel,
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"cK" = (
-/obj/item/weapon/pickaxe,
+/obj/machinery/hydroponics/soil,
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"cL" = (
@@ -1132,21 +1166,19 @@
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 8
},
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"cP" = (
/obj/structure/stone_tile/block,
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"cQ" = (
-/obj/structure/stone_tile{
- dir = 8
- },
-/turf/closed/mineral/volcanic/lava_land_surface,
+/obj/structure/stone_tile/block/cracked,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"cR" = (
/obj/structure/stone_tile/surrounding_tile/cracked,
-/turf/closed/mineral/volcanic/lava_land_surface,
+/turf/closed/mineral/volcanic,
/area/lavaland/surface/outdoors)
"cS" = (
/obj/effect/decal/cleanable/blood,
@@ -1156,14 +1188,293 @@
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"cT" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
"cU" = (
-/obj/effect/baseturf_helper,
-/turf/closed/indestructible/riveted/boss,
-/area/ruin/unpowered/ash_walkers)
-"kB" = (
-/obj/structure/stone_tile/surrounding/cracked,
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
+"cV" = (
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
+"cW" = (
+/obj/structure/table/optable,
+/obj/structure/stone_tile{
+ dir = 1
+ },
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
+"cX" = (
+/obj/item/weapon/storage/box/rxglasses,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"cY" = (
+/obj/item/seeds/glowshroom,
+/obj/item/seeds/glowshroom,
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"cZ" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"da" = (
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 8
+ },
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
+"db" = (
+/obj/structure/stone_tile/block,
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
+"dc" = (
+/obj/structure/stone_tile/block,
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
+"dd" = (
+/obj/structure/stone_tile/surrounding_tile/cracked,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"de" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"df" = (
+/obj/effect/decal/cleanable/blood,
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dg" = (
+/obj/structure/bonfire/dense,
+/obj/structure/stone_tile/center,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dh" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"di" = (
+/obj/effect/decal/cleanable/blood,
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dj" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dk" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/block,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dl" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dm" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dn" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"do" = (
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dp" = (
+/obj/item/weapon/pickaxe,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dq" = (
+/obj/item/stack/sheet/mineral/wood,
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dr" = (
+/obj/structure/stone_tile/surrounding_tile/cracked,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/center,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"ds" = (
+/obj/structure/stone_tile/block,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dt" = (
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/surrounding_tile/cracked,
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/center,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"du" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
+"dv" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/effect/mob_spawn/human/corpse/damaged,
+/obj/effect/decal/cleanable/blood,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dw" = (
+/obj/item/weapon/reagent_containers/glass/bucket,
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dx" = (
+/obj/item/device/flashlight/lantern,
+/obj/structure/stone_tile/center,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dy" = (
+/obj/machinery/hydroponics/soil,
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dz" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/cracked,
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
+"dA" = (
+/obj/machinery/hydroponics/soil,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/center,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"dB" = (
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/center/cracked,
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
+"dC" = (
+/obj/structure/stone_tile,
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
+"dD" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
+"dE" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
+"dF" = (
+/obj/structure/stone_tile,
+/turf/closed/mineral/volcanic,
+/area/lavaland/surface/outdoors)
(1,1,1) = {"
aa
@@ -1190,15 +1501,15 @@ aa
(2,1,1) = {"
aa
ah
+ab
+cU
+cV
ah
ah
-ah
-aL
-ah
bi
-bu
-am
ah
+bi
+da
ah
ah
ah
@@ -1213,7 +1524,6 @@ aa
aa
aa
ah
-am
as
as
as
@@ -1221,12 +1531,13 @@ as
ak
as
as
+db
+ah
+ah
+bN
+bY
+dp
ah
-cp
-bX
-bL
-bM
-cC
ah
ah
aa
@@ -1235,29 +1546,28 @@ aa
aa
aa
ah
-an
ak
aA
aM
-aX
+cY
bj
bv
ak
-bK
-bM
-bM
+db
bN
-bM
-bY
-cG
+cg
+cl
+cq
+cq
+dv
+ah
ah
aa
"}
(5,1,1) = {"
aa
aa
-ah
-ah
+ac
as
aB
aN
@@ -1265,56 +1575,57 @@ aY
bk
bw
ak
-bX
-cS
-bM
-bM
-cw
-bM
+cb
+bZ
+ch
+cm
+cr
+bY
bL
+cb
ah
ah
"}
(6,1,1) = {"
aa
aa
-ah
-ao
+cT
ak
aC
+cX
aO
-aM
bl
bx
bD
+bS
+de
+bV
+dg
+cs
+cy
bY
-cg
-bM
-bO
-cx
-cw
-cH
+cq
ah
ah
"}
(7,1,1) = {"
aa
aa
-ah
-ap
+ae
as
-aD
+cW
aP
aZ
bm
by
ak
+bV
+cb
+ci
+bA
+ct
bN
-cg
-cl
-cq
-bM
-cw
+bL
cI
ah
ah
@@ -1322,8 +1633,7 @@ ah
(8,1,1) = {"
aa
aa
-ah
-ah
+ae
as
aE
aQ
@@ -1331,12 +1641,13 @@ ba
bn
bz
ak
+cb
+df
+bX
+dh
+bO
+dq
bZ
-ch
-cm
-cr
-bY
-bM
cJ
ah
ah
@@ -1345,7 +1656,6 @@ ah
aa
ah
ah
-ah
as
ak
as
@@ -1353,14 +1663,15 @@ as
as
ak
ak
-ca
-bV
+cg
+cb
+cg
cn
-cs
-cy
-cq
-bM
-ah
+bL
+dr
+dw
+dA
+dD
ah
"}
(10,1,1) = {"
@@ -1368,21 +1679,21 @@ aa
ai
aq
at
-aF
+cU
+aR
aR
-bb
bo
bA
-bE
-bO
+cZ
+dd
+cg
cb
-ci
-bA
-ct
-bN
-bM
+di
+dn
+ds
+dx
cK
-ah
+dE
ah
"}
(11,1,1) = {"
@@ -1397,14 +1708,14 @@ ak
ak
bF
bE
-cc
-bX
-co
-bO
-bM
-cg
-ah
-ah
+cb
+bL
+dh
+cb
+dt
+dy
+dB
+dC
aa
"}
(12,1,1) = {"
@@ -1416,16 +1727,16 @@ ak
ak
ak
ak
-cU
+ak
ak
bP
bL
bX
-bM
-bY
-bM
-ah
-ah
+dh
+do
+du
+dz
+dC
ah
aa
"}
@@ -1443,7 +1754,7 @@ ak
bQ
bM
cj
-bL
+dj
ah
ah
ah
@@ -1464,14 +1775,14 @@ ak
bG
bR
cd
-bM
-bM
+cg
+dk
cu
ah
-ah
-aq
-ah
-cO
+bi
+bi
+bi
+da
"}
(15,1,1) = {"
ac
@@ -1486,8 +1797,8 @@ bB
bH
bS
ce
-bM
-bN
+dn
+dl
ak
ak
as
@@ -1508,14 +1819,14 @@ ak
bG
bT
cd
-bM
-bY
+bX
+dj
as
cz
cD
cL
as
-cp
+ah
"}
(17,1,1) = {"
af
@@ -1529,12 +1840,12 @@ bt
ak
ak
bU
-bM
+cg
ck
-cb
+bS
cv
cA
-kB
+cE
cM
as
ah
@@ -1551,7 +1862,7 @@ ak
ak
ak
bV
-bM
+bX
bN
ah
as
@@ -1559,7 +1870,7 @@ cB
cF
cN
ak
-cP
+db
"}
(19,1,1) = {"
ag
@@ -1599,9 +1910,9 @@ ah
ah
al
ah
-an
+ah
bC
-cp
+ah
ah
cR
"}
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm
index a8514a4647..89a8b50c39 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm
@@ -6,10 +6,7 @@
/turf/open/lava/smooth/lava_land_surface,
/area/ruin/unpowered)
"c" = (
-/obj/item/weapon/paper{
- desc = "have not gotten around to finishing my cursed item yet sorry - sloth";
- name = "note from sloth"
- },
+/obj/item/weapon/paper/fluff/stations/lavaland/sloth/note,
/turf/open/floor/sepia{
blocks_air = 0;
slowdown = 10
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
index 61e158adca..be96830ca4 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
@@ -70,7 +70,6 @@
"ak" = (
/obj/structure/dresser,
/obj/structure/mirror{
- desc = "Mirror mirror on the wall, who is the most robust of them all?";
pixel_x = -26
},
/turf/open/floor/plasteel/vault,
@@ -298,7 +297,6 @@
"aP" = (
/obj/structure/dresser,
/obj/structure/mirror{
- desc = "Mirror mirror on the wall, who is the most robust of them all?";
pixel_x = 26
},
/turf/open/floor/plasteel/vault{
@@ -312,9 +310,7 @@
},
/area/ruin/powered/syndicate_lava_base)
"aR" = (
-/obj/structure/closet/emcloset{
- anchored = 1
- },
+/obj/structure/closet/emcloset/anchored,
/obj/item/weapon/tank/internals/emergency_oxygen/engi,
/obj/item/device/flashlight/seclite,
/obj/item/clothing/mask/gas,
@@ -372,7 +368,6 @@
/area/ruin/powered/syndicate_lava_base)
"aX" = (
/obj/structure/mirror{
- desc = "Mirror mirror on the wall, who is the most robust of them all?";
pixel_x = 28
},
/obj/structure/sink{
@@ -394,9 +389,7 @@
},
/area/ruin/powered/syndicate_lava_base)
"ba" = (
-/obj/structure/closet/emcloset{
- anchored = 1
- },
+/obj/structure/closet/emcloset/anchored,
/obj/item/weapon/tank/internals/emergency_oxygen/engi,
/obj/item/device/flashlight/seclite,
/obj/item/clothing/mask/gas,
@@ -555,8 +548,7 @@
/obj/structure/table/reinforced,
/obj/item/device/healthanalyzer,
/obj/item/stack/sheet/mineral/plasma{
- amount = 5;
- layer = 3.1
+ amount = 5
},
/turf/open/floor/plasteel/podhatch,
/area/ruin/powered/syndicate_lava_base)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm
index 6c18feaff8..22d341c7df 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm
@@ -132,7 +132,7 @@
/area/ruin/unpowered)
"w" = (
/obj/item/weapon/retractor/alien,
-/obj/item/weapon/paper/abductor,
+/obj/item/weapon/paper/guides/antag/abductor,
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=16;n2=23;TEMP=300"
},
diff --git a/_maps/RandomRuins/SpaceRuins/DJstation.dmm b/_maps/RandomRuins/SpaceRuins/DJstation.dmm
index 3a1279237c..515878e931 100644
--- a/_maps/RandomRuins/SpaceRuins/DJstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/DJstation.dmm
@@ -249,7 +249,7 @@
/area/djstation)
"aR" = (
/obj/structure/table,
-/obj/item/weapon/paper/djstation,
+/obj/item/weapon/paper/fluff/ruins/djstation,
/turf/open/floor/plasteel/cafeteria,
/area/djstation)
"aS" = (
diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm
index 52b8dcab89..95f886314c 100644
--- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm
+++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm
@@ -1212,10 +1212,7 @@
dir = 8
},
/obj/structure/table,
-/obj/item/weapon/paper{
- info = "If the equipment breaks there should be enough spare parts in our engineering storage near the north east solar array.";
- name = "Equipment Inventory"
- },
+/obj/item/weapon/paper/fluff/ruins/thederelict/equipment,
/turf/open/floor/plasteel/airless,
/area/derelict/gravity_generator)
"dt" = (
@@ -1509,8 +1506,7 @@
/area/derelict/singularity_engine)
"en" = (
/obj/machinery/power/emitter{
- dir = 1;
- icon_state = "emitter"
+ dir = 1
},
/turf/open/floor/plating/airless,
/area/derelict/singularity_engine)
@@ -1683,10 +1679,7 @@
/turf/open/floor/plasteel,
/area/derelict/bridge)
"eN" = (
-/obj/item/weapon/paper{
- info = "Objective #1: Destroy the station with a nuclear device.";
- name = "Objectives of a Nuclear Operative"
- },
+/obj/item/weapon/paper/fluff/ruins/thederelict/nukie_objectives,
/turf/open/floor/plasteel/airless{
icon_state = "damaged2"
},
@@ -3745,11 +3738,11 @@
"kS" = (
/obj/machinery/door/window,
/turf/open/floor/plasteel/airless,
-/area/hallway/primary/port)
+/area/derelict/hallway/primary/port)
"kT" = (
/obj/machinery/vending/hydroseeds,
/turf/open/floor/plasteel/airless,
-/area/hallway/primary/port)
+/area/derelict/hallway/primary/port)
"kU" = (
/obj/item/weapon/cigbutt,
/turf/template_noop,
@@ -4785,11 +4778,7 @@
/turf/open/floor/plating/airless,
/area/derelict/se_solar)
"oa" = (
-/obj/item/weapon/paper{
- desc = "";
- info = "The Syndicate have cunningly disguised a Syndicate Uplink as your PDA. Simply enter the code \"678 Bravo\" into the ringtone select to unlock its hidden features.
Objective #1. Kill the God damn AI in a fire blast that it rocks the station. Success! Objective #2. Escape alive. Failed.";
- name = "Mission Objectives"
- },
+/obj/item/weapon/paper/fluff/ruins/thederelict/syndie_mission,
/turf/open/floor/plasteel/airless{
icon_state = "damaged2"
},
diff --git a/_maps/RandomRuins/SpaceRuins/asteroid4.dmm b/_maps/RandomRuins/SpaceRuins/asteroid4.dmm
index 03ecac3738..bbbd529e8a 100644
--- a/_maps/RandomRuins/SpaceRuins/asteroid4.dmm
+++ b/_maps/RandomRuins/SpaceRuins/asteroid4.dmm
@@ -49,9 +49,7 @@
brute_damage = 120;
oxy_damage = 75
},
-/obj/item/weapon/paper{
- info = "Extraction was successful! The disguise was perfect, the clowns never knew what hit 'em! Once I get back to base with the bananium samples I'll be rich, I tell you! RICH!"
- },
+/obj/item/weapon/paper/fluff/ruins/asteroid4/extraction,
/obj/item/stack/sheet/mineral/bananium{
amount = 15
},
diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
index 40efc634aa..a9232ea33a 100644
--- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
+++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
@@ -259,7 +259,7 @@
name = "critter crate - mr.tiggles";
opened = 1
},
-/obj/item/weapon/paper/crumpled/snowdin{
+/obj/item/weapon/paper/crumpled/ruins/snowdin{
info = "A crumpled piece of manifest paper, out of the barely legible pen writing, you can see something about a warning involving whatever was originally in the crate."
},
/obj/structure/alien/weeds{
@@ -455,7 +455,7 @@
name = "Tradeport Officer";
random = 1
},
-/obj/item/weapon/paper/crumpled/snowdin{
+/obj/item/weapon/paper/crumpled/ruins/snowdin{
icon_state = "scrap_bloodied";
info = "If anyone finds this, please, don't let my kids know I died a coward.."
},
diff --git a/_maps/RandomRuins/SpaceRuins/crashedclownship.dmm b/_maps/RandomRuins/SpaceRuins/crashedclownship.dmm
index 4f9ce74170..618366df7c 100644
--- a/_maps/RandomRuins/SpaceRuins/crashedclownship.dmm
+++ b/_maps/RandomRuins/SpaceRuins/crashedclownship.dmm
@@ -103,9 +103,7 @@
/turf/open/floor/mineral/bananium/airless,
/area/ruin/unpowered)
"s" = (
-/obj/item/weapon/paper{
- info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"
- },
+/obj/item/weapon/paper/fluff/ruins/crashedclownship/true_nation,
/turf/open/floor/mineral/bananium/airless,
/area/ruin/unpowered)
"t" = (
diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm
index 6dcae3923e..ecc3332dde 100644
--- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm
+++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm
@@ -653,10 +653,7 @@
/obj/structure/table,
/obj/item/weapon/screwdriver,
/obj/item/weapon/screwdriver,
-/obj/item/weapon/paper{
- info = "The next person who takes one of my screwdrivers gets stabbed with one. They are MINE. - Love, Madsen";
- name = "scribbled note"
- },
+/obj/item/weapon/paper/fluff/ruins/crashedship/scribbled,
/obj/item/weapon/screwdriver,
/turf/open/floor/plasteel/bar,
/area/awaymission/BMPship/Midship)
@@ -954,10 +951,7 @@
/area/awaymission/BMPship/Aft)
"cY" = (
/obj/structure/table,
-/obj/item/weapon/paper{
- info = "I'm no scientist, but judging from the design and components, it seems to be some kind of teleporter. This thing is gonna be worth a lot of cash to the right man. The boys are excited, as they have every right to be, and I've let them crack into that case of beer we got. I normally wouldn't allow such a thing, but this is a time for celebration! It's not like a couple drinks will hurt anything.";
- name = "Captain's log entry"
- },
+/obj/item/weapon/paper/fluff/ruins/crashedship/captains_log,
/turf/open/floor/carpet,
/area/awaymission/BMPship/Fore)
"cZ" = (
@@ -2167,10 +2161,7 @@
/area/awaymission/BMPship/Aft)
"gh" = (
/obj/structure/table,
-/obj/item/weapon/paper{
- info = "DEAR DAIRY: So we was doing our typpical route when the captain says we've been picking up weird signals on some backwatter planet. Madsen wanted to stay on course but he ain't the captain, so we went out of the way to check it out. There was lots of rocks on the way, but we got to the planet fine. Found a big fancy camp with nobody around and this big metal donut thing with NT stamps all over it right in the middle. Case of beer too. Captain reckons we can pass it off to some buyer in the Syndicate. Ingram says it's bad luck and that someone is going to come look for it but it sounds like better money than selling bad meat to jerky companies.";
- name = "Old Diary"
- },
+/obj/item/weapon/paper/fluff/ruins/crashedship/old_diary,
/turf/open/floor/plasteel,
/area/awaymission/BMPship/Aft)
"gi" = (
diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm
index 803f078057..46c2dee271 100644
--- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm
+++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm
@@ -1129,18 +1129,9 @@
/obj/structure/noticeboard{
pixel_y = 32
},
-/obj/item/weapon/paper{
- info = "To whoever keeps it up with the long, hot showers: you're going on the next ice-mining trip. If you feel the need to use up all the damn water during your 'relaxation' time, you sure as hell are gonna work for all that water!";
- name = "water concerns"
- },
-/obj/item/weapon/paper{
- info = "Hydroponics is our life and blood here, if it dies then so do we. Keep the damn plants watered!";
- name = "hydroponics notice"
- },
-/obj/item/weapon/paper{
- info = "Please make sure to throw all excess waste into the crusher in the back! It's amazing what you can get out of what others consider 'garbage' if you run it through a giant crusher enough times.";
- name = "recycling notice"
- },
+/obj/item/weapon/paper/fluff/ruins/deepstorage/water_concern,
+/obj/item/weapon/paper/fluff/ruins/deepstorage/hydro_notice,
+/obj/item/weapon/paper/fluff/ruins/deepstorage/recycling_notice,
/turf/open/floor/plasteel/floorgrime{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -1152,6 +1143,9 @@
/obj/structure/sign/barsign{
pixel_y = 32
},
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
/turf/open/floor/plasteel/bar{
baseturf = /turf/open/floor/plating/asteroid/airless
},
diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm
index 4c351f0593..52b25cdffd 100644
--- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm
@@ -69,10 +69,7 @@
/area/awaymission/listeningpost)
"o" = (
/obj/structure/table,
-/obj/item/weapon/paper{
- info = "Nothing of interest to report.";
- name = "november report"
- },
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/november,
/obj/item/weapon/pen,
/turf/open/floor/plasteel,
/area/awaymission/listeningpost)
@@ -98,10 +95,7 @@
"r" = (
/obj/machinery/door/airlock,
/obj/structure/safe/floor,
-/obj/item/weapon/paper{
- info = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilised your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear it's ugly head again. -Donk Co. Operative #451";
- name = "odd report"
- },
+/obj/item/weapon/paper/fluff/ruins/listeningstation/odd_report,
/obj/item/weapon/gun/ballistic/automatic/pistol,
/turf/open/floor/plasteel,
/area/awaymission/listeningpost)
@@ -156,46 +150,19 @@
/area/awaymission/listeningpost)
"B" = (
/obj/structure/filingcabinet,
-/obj/item/weapon/paper{
- info = "A good start to the operation: intercepted Nanotrasen military communications. A convoy is scheduled to transfer nuclear warheads to a new military base. This is as good a chance as any to get our hands on some heavy weaponry, I suggest we take it.";
- name = "april report"
- },
-/obj/item/weapon/paper{
- info = "Nothing of real interest to report this month. I have intercepted faint transmissions from what appears to be some sort of pirate radio station. They do not appear to be relevant to my assignment.";
- name = "may report"
- },
-/obj/item/weapon/paper{
- info = "Nanotrasen communications have been noticably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it.";
- name = "june report"
- },
-/obj/item/weapon/paper{
- info = "Nothing of interest to report.";
- name = "july report"
- },
-/obj/item/weapon/paper{
- info = "Nothing of interest to report.";
- name = "august report"
- },
-/obj/item/weapon/paper{
- info = "Nothing of interest to report.";
- name = "september report"
- },
-/obj/item/weapon/paper{
- info = "Nothing of interest to report.";
- name = "october report"
- },
-/obj/item/weapon/paper{
- info = "1 x Stechtkin pistol - $600 1 x silencer - $200 shipping charge - $4360 total - $5160";
- name = "receipt"
- },
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/april,
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/may,
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/june,
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/july,
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/august,
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/september,
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/october,
+/obj/item/weapon/paper/fluff/ruins/listeningstation/receipt,
/turf/open/floor/plasteel,
/area/awaymission/listeningpost)
"C" = (
/obj/structure/table,
-/obj/item/weapon/paper{
- info = "Mission Details: You have been assigned to a newly constructed listening post constructed within an asteroid in Nanotrasen space to monitor their plasma mining operations. Accurate intel is crucial to the success of our operatives onboard, do not fail us.";
- name = "mission briefing"
- },
+/obj/item/weapon/paper/fluff/ruins/listeningstation/briefing,
/turf/open/floor/plasteel,
/area/awaymission/listeningpost)
"D" = (
diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
index 0fb12dbec8..02cba3e76d 100644
--- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
@@ -136,7 +136,7 @@
desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages.";
name = "Broken Computer"
},
-/obj/item/weapon/paper/oldstat/damagereport,
+/obj/item/weapon/paper/fluff/ruins/oldstation/damagereport,
/turf/open/floor/plasteel/floorgrime,
/area/ruin/ancientstation/comm)
"aw" = (
@@ -145,7 +145,7 @@
desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages.";
name = "Broken Computer"
},
-/obj/item/weapon/paper/oldstat/report,
+/obj/item/weapon/paper/fluff/ruins/oldstation/report,
/turf/open/floor/plasteel/floorgrime,
/area/ruin/ancientstation/comm)
"ax" = (
@@ -3501,7 +3501,7 @@
/obj/machinery/power/solar_control{
name = "Station Solar Control Computer"
},
-/obj/item/weapon/paper/solar,
+/obj/item/weapon/paper/guides/jobs/engi/solars,
/obj/structure/cable,
/turf/open/floor/plasteel/yellow/side{
dir = 10
@@ -4542,7 +4542,7 @@
dir = 8
},
/obj/structure/table/reinforced,
-/obj/item/weapon/paper/oldstat/protosuit,
+/obj/item/weapon/paper/fluff/ruins/oldstation/protosuit,
/turf/open/floor/plasteel/white,
/area/ruin/ancientstation/proto)
"ku" = (
@@ -4587,7 +4587,7 @@
dir = 4
},
/obj/structure/table/reinforced,
-/obj/item/weapon/paper/oldstat/protosing,
+/obj/item/weapon/paper/fluff/ruins/oldstation/protosing,
/turf/open/floor/plasteel/white,
/area/ruin/ancientstation/proto)
"kA" = (
@@ -4724,7 +4724,7 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/item/weapon/paper/oldstat,
+/obj/item/weapon/paper/fluff/ruins/oldstation,
/turf/open/floor/plasteel/floorgrime,
/area/ruin/ancientstation)
"kR" = (
@@ -4732,7 +4732,7 @@
dir = 8
},
/obj/structure/table/reinforced,
-/obj/item/weapon/paper/oldstat/protohealth,
+/obj/item/weapon/paper/fluff/ruins/oldstation/protohealth,
/turf/open/floor/plasteel/white,
/area/ruin/ancientstation/proto)
"kS" = (
@@ -4750,7 +4750,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
-/obj/item/weapon/paper/oldstat/protoinv,
+/obj/item/weapon/paper/fluff/ruins/oldstation/protoinv,
/turf/open/floor/plasteel/white,
/area/ruin/ancientstation/proto)
"kU" = (
@@ -4758,7 +4758,7 @@
dir = 4
},
/obj/structure/table/reinforced,
-/obj/item/weapon/paper/oldstat/protogun,
+/obj/item/weapon/paper/fluff/ruins/oldstation/protogun,
/turf/open/floor/plasteel/white,
/area/ruin/ancientstation/proto)
"kV" = (
diff --git a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm
index 5401836144..6388f49c50 100644
--- a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm
+++ b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm
@@ -106,9 +106,7 @@
/turf/open/indestructible/paper,
/area/ruin/powered)
"as" = (
-/obj/item/weapon/paper/crumpled{
- desc = "Various scrawled out drawings and sketches reside on the paper, apparently he didn't much care for these drawings."
- },
+/obj/item/weapon/paper/crumpled/ruins/originalcontent,
/turf/open/indestructible/paper,
/area/ruin/powered)
"at" = (
@@ -598,15 +596,9 @@
dir = 9
},
/obj/structure/closet/crate/bin,
-/obj/item/weapon/paper/crumpled{
- desc = "Various scrawled out drawings and sketches reside on the paper, apparently he didn't much care for these drawings."
- },
-/obj/item/weapon/paper/crumpled{
- desc = "Various scrawled out drawings and sketches reside on the paper, apparently he didn't much care for these drawings."
- },
-/obj/item/weapon/paper/crumpled{
- desc = "Various scrawled out drawings and sketches reside on the paper, apparently he didn't much care for these drawings."
- },
+/obj/item/weapon/paper/crumpled/ruins/originalcontent,
+/obj/item/weapon/paper/crumpled/ruins/originalcontent,
+/obj/item/weapon/paper/crumpled/ruins/originalcontent,
/obj/item/device/gps{
gpstag = "Pulpy Signal"
},
@@ -802,9 +794,7 @@
/area/ruin/powered)
"ch" = (
/obj/structure/fluff/paper,
-/obj/item/weapon/paper/crumpled{
- desc = "Various scrawled out drawings and sketches reside on the paper, apparently he didn't much care for these drawings."
- },
+/obj/item/weapon/paper/crumpled/ruins/originalcontent,
/turf/open/indestructible/paper,
/area/ruin/powered)
"ci" = (
diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
index d87ee0b65d..a99838b8fd 100644
--- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
@@ -2585,10 +2585,7 @@
/obj/structure/noticeboard{
pixel_y = 32
},
-/obj/item/weapon/paper{
- info = "!NOTICE!
We are expecting arriving guests soon from a nearby station! Stay sharp and make sure guests enjoy their time spent here. Don't think you can sneak off while they're here, either.
";
- name = "!NOTICE!"
- },
+/obj/item/weapon/paper/fluff/ruins/spacehotel/notice,
/turf/open/floor/plasteel/black,
/area/ruin/hotel/workroom)
"gJ" = (
@@ -2705,26 +2702,11 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/weapon/paper/pamphlet{
- info = "
The Twin Nexus Hotel
A place of Sanctuary
Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff stride to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more infomation.
";
- name = "hotel pamphlet"
- },
-/obj/item/weapon/paper/pamphlet{
- info = "
The Twin Nexus Hotel
A place of Sanctuary
Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff stride to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more infomation.
";
- name = "hotel pamphlet"
- },
-/obj/item/weapon/paper/pamphlet{
- info = "
The Twin Nexus Hotel
A place of Sanctuary
Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff stride to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more infomation.
";
- name = "hotel pamphlet"
- },
-/obj/item/weapon/paper/pamphlet{
- info = "
The Twin Nexus Hotel
A place of Sanctuary
Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff stride to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more infomation.
";
- name = "hotel pamphlet"
- },
-/obj/item/weapon/paper/pamphlet{
- info = "
The Twin Nexus Hotel
A place of Sanctuary
Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff stride to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more infomation.
";
- name = "hotel pamphlet"
- },
+/obj/item/weapon/paper/pamphlet/ruin/spacehotel,
+/obj/item/weapon/paper/pamphlet/ruin/spacehotel,
+/obj/item/weapon/paper/pamphlet/ruin/spacehotel,
+/obj/item/weapon/paper/pamphlet/ruin/spacehotel,
+/obj/item/weapon/paper/pamphlet/ruin/spacehotel,
/turf/open/floor/plasteel/grimy,
/area/ruin/hotel/dock)
"hd" = (
diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm
index 41b3223131..0fe71c9faf 100644
--- a/_maps/RandomZLevels/Academy.dmm
+++ b/_maps/RandomZLevels/Academy.dmm
@@ -108,10 +108,7 @@
/area/awaymission/academy/headmaster)
"ar" = (
/obj/structure/table/reinforced,
-/obj/item/weapon/paper{
- info = "We're upgrading to the latest mainframes for our consoles, the shipment should be in before spring break is over!";
- name = "Console Maintenance"
- },
+/obj/item/weapon/paper/fluff/awaymissions/academy/console_maint,
/turf/open/floor/carpet,
/area/awaymission/academy/headmaster)
"as" = (
@@ -1287,9 +1284,7 @@
/obj/structure/noticeboard{
pixel_y = 32
},
-/obj/item/weapon/paper{
- name = "Automotive Repair 101"
- },
+/obj/item/weapon/paper/fluff/awaymissions/academy/class/automotive,
/turf/open/floor/plasteel/grimy,
/area/awaymission/academy/classrooms)
"eh" = (
@@ -1302,9 +1297,7 @@
/obj/structure/noticeboard{
pixel_y = 32
},
-/obj/item/weapon/paper{
- name = "Pyromancy 250"
- },
+/obj/item/weapon/paper/fluff/awaymissions/academy/class/pyromancy,
/turf/open/floor/plasteel/grimy,
/area/awaymission/academy/classrooms)
"ej" = (
@@ -1779,9 +1772,7 @@
/obj/structure/noticeboard{
pixel_y = -32
},
-/obj/item/weapon/paper{
- name = "Biology Lab"
- },
+/obj/item/weapon/paper/fluff/awaymissions/academy/class/biology,
/turf/open/floor/plasteel/grimy,
/area/awaymission/academy/classrooms)
"fz" = (
@@ -2205,10 +2196,7 @@
/area/awaymission/academy/academyaft)
"gH" = (
/obj/structure/table,
-/obj/item/weapon/paper{
- info = "Grade: A+ Educator's Notes: Excellent form.";
- name = "Summoning Midterm Exam"
- },
+/obj/item/weapon/paper/fluff/awaymissions/academy/grade/aplus,
/obj/item/weapon/gun/ballistic/shotgun/automatic/combat,
/turf/open/floor/plasteel/vault{
dir = 5
@@ -2217,10 +2205,7 @@
"gI" = (
/obj/structure/table,
/obj/item/weapon/gun/ballistic/revolver/russian,
-/obj/item/weapon/paper{
- info = "Grade: B- Educator's Notes: Keep applying yourself, you're showing improvement.";
- name = "Summoning Midterm Exam"
- },
+/obj/item/weapon/paper/fluff/awaymissions/academy/grade/bminus,
/turf/open/floor/plasteel/vault{
dir = 5
},
@@ -2319,10 +2304,7 @@
"gW" = (
/obj/structure/table,
/obj/item/weapon/gun/energy/floragun,
-/obj/item/weapon/paper{
- info = "Grade: D- Educator's Notes: SEE ME AFTER CLASS.";
- name = "Summoning Midterm Exam"
- },
+/obj/item/weapon/paper/fluff/awaymissions/academy/grade/dminus,
/turf/open/floor/plasteel/vault{
dir = 5
},
@@ -2772,10 +2754,7 @@
/obj/structure/closet,
/obj/item/weapon/storage/box/snappops,
/obj/item/weapon/storage/backpack,
-/obj/item/weapon/paper{
- info = "Current Grade: F. Educator's Notes: No improvement shown despite multiple private lessons. Suggest additional tutilage.";
- name = "Pyromancy Evaluation"
- },
+/obj/item/weapon/paper/fluff/awaymissions/academy/grade/failure,
/turf/open/floor/plasteel,
/area/awaymission/academy/academyaft)
"id" = (
diff --git a/_maps/RandomZLevels/Cabin.dmm b/_maps/RandomZLevels/Cabin.dmm
index 33f514c051..a03b3b148e 100644
--- a/_maps/RandomZLevels/Cabin.dmm
+++ b/_maps/RandomZLevels/Cabin.dmm
@@ -250,7 +250,7 @@
/area/awaymission/cabin)
"aQ" = (
/obj/machinery/door/airlock/wood{
- name = "maintence"
+ name = "maintenance"
},
/turf/open/floor/plating,
/area/awaymission/cabin)
diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm
index 57740d7fba..c1df4a8090 100644
--- a/_maps/RandomZLevels/caves.dmm
+++ b/_maps/RandomZLevels/caves.dmm
@@ -942,9 +942,7 @@
})
"bX" = (
/obj/structure/table,
-/obj/item/weapon/paper/crumpled{
- info = "
WARNING
Majority of this area is consitered 'unsafe' past this point. Theres an outpost directly south of here where you can get your bearing and travel further down if needed. Traveling in groups is HIGHLY advised, the shit out there can be extremely deadly if you're alone.
Subject appears unresponsive to most interactions, refusing to move away from the corners or face any scientists. Subject appears to move between the two back corners every observation. A strange humming can be heard from inside the cell, appears to be originating from the subject itself, further testing is necessary to confirm or deny this.
Mining is hell down here, you can feel the heat of the magma no matter how thick the suit is. Conditions are barely managble as is, restless nights and horrid work conditions. The ore maybe rich down here, but we've already lost a few men to the faults shifting, god knows how much longer till it all just collapses down and consumes everyone with it.
The caves are an unforgiving place, the only thing you'll have to traverse is the supplies in your locker and your own wit. Travel in packs when mining and try to shut down the monster dens before they overwhelm you. The job is dangerous but the haul is good, so remember this infomation and hopefully we'll all go home alive.
We were suppose to get a shipment of these special laser rifles and a couple 'nades to help combat the wildlife down here, but its been weeks since we last heard from the caravan carrying the shit down here. At this point we can only assume they fell victim to one of the monster nests or the dumbasses managed to trip into the lava. So much for that shipment, I guess.
";
- name = "shipment notice"
- },
-/obj/item/weapon/paper{
- info = "
Some of the miners have gone to laying some mine traps among the lower levels of the mine to keep the monsters at bay. This probably isn't the smartest idea in a cavern like this but the boys seem to get a chuckle out of every distant blast they hear go off, so I guess it works
Although you may seem indestructible in a mech, remember, THIS SHIT ISN'T LAVA PROOF!! The boys have already had to deal with loosing the last two to salvage because the dumbass thought he could just wade through the lower lakes like it was nothing. The fact he even managed to get back without being fused with what was left of the mech is a miracle in itself. They're built to be resistant against extreme heat, not heat PROOF!
Your station has been selected to carry out the Gateway Project.
The equipment will be shipped to you at the start of the next quarter. You are to prepare a secure location to house the equipment as outlined in the attached documents.
--Nanotrasen Blue Space Research";
- name = "Confidential Correspondence, Pg 1"
- },
+/obj/item/weapon/paper/fluff/gateway,
/obj/item/weapon/folder/blue,
/turf/open/floor/carpet,
/area/awaymission/challenge/end)
@@ -1193,7 +1046,7 @@
/area/awaymission/challenge/end)
"df" = (
/obj/structure/table,
-/obj/item/weapon/paper/pamphlet,
+/obj/item/weapon/paper/pamphlet/gateway,
/turf/open/floor/plasteel/black,
/area/awaymission/challenge/end)
"dg" = (
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index c6805c74e0..71b778c7d6 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -974,10 +974,7 @@
pixel_y = 9
},
/obj/item/weapon/pen,
-/obj/item/weapon/paper{
- info = "Log 1: We got our promised supply drop today. We were only meant to get it, what, a week ago? This bloody gateway keeps desyncing itself, and that means subsisting off recycled water and carb packs. No clue where the damn thing connects to on its off days, and HQ say we are 'not to touch it if it isn't linking to command.' We dumped off the assload of crates Jim filled, got our boxes of oxygen, food and drink, and closed the portal.
Log 2: Damn thing is acting up again. Three days no contact this time. I thought I heard clanking noises from it yesterday. Jim is going on about the NT base or some shit. We've been over this before - They don't know we're here, that engineer was too drunk to recognise his suit, especially since I had it painted orange. He's starting to get annoying. We're safe.
Log 3: Gateway synced itself up automatically today. I opened it for an instant to spy through it, got a glimpse of the inside of a transport container. Either HQ's redecorating or something, or there's more than two of these things.";
- name = "Personal Log"
- },
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/log/personal,
/obj/effect/turf_decal/stripes/line{
dir = 6
},
@@ -1585,10 +1582,7 @@
dir = 8
},
/obj/item/weapon/stock_parts/cell/high,
-/obj/item/weapon/paper{
- info = "Alright, listen up. If you're reading this, I'm either taking a shit or I've been recalled back to Command. Either way, you'll need to know how to restore power. We've stolen this stuff from Nanotrasen, so all the equipment is jury-rigged. We have generators that work on both plasma and uranium, about 50 sheets should power the outpost for quite a while. If the generators aren't working, which is very likely, take the power cell on the desk and put it into the APC in the hallway. That should get the place running, at least for a little while.";
- name = "Engineering Instructions"
- },
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/engineering,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
@@ -2463,10 +2457,7 @@
"dq" = (
/obj/structure/table/wood,
/obj/item/weapon/pen,
-/obj/item/weapon/paper{
- info = "Log 1: While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station, looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.
Log 2: Really dumb of me but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't then we might have to pull out before they come looking for us.
Log 3: That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on.";
- name = "Personal Log"
- },
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/log/personal_2,
/obj/structure/sign/poster/contraband/c20r{
pixel_y = -32
},
@@ -3813,9 +3804,7 @@
})
"fg" = (
/obj/structure/table,
-/obj/item/stack/sheet/mineral/plasma{
- layer = 2.9
- },
+/obj/item/stack/sheet/mineral/plasma,
/obj/machinery/light/small{
active_power_usage = 0;
dir = 1;
@@ -4384,10 +4373,7 @@
})
"fS" = (
/obj/structure/filingcabinet,
-/obj/item/weapon/paper{
- info = "Entry One - 27/05/2554: I just arrived, and already I hate my job. I'm stuck on this shithole of an outpost, trying to avoid these damn eggheads running all over the place preparing for god knows what. There's no crimes to stop, no syndies to kill, and I'm not even allowed to beat the fuckin' assistant senseless! They said I was transferred from Space Station 13 for 'good behavior', but this feels more like a punishment than a reward. All I know is that if I don't get some action soon, I'm going to go insane.
Entry Two - 03/06/2554: Okay, so get this: we got a fuckin' deathsquad coming in today! I thought the day I saw one of them would be the day my employment was 'terminated', if you get my drift. They're escorting some sort of weird alien creature for the eggheads to study. I heard one of the docs telling the chef that this thing killed a whole security force before it was captured. I sure as hell hope that I don't have to fight it.
Entry Three - 08/06/2554: My first real bit of 'action' today, if you could call it that. Crazy Ivan got in a fight with Kuester today about his Booze-O-Mat. Apparently one of the crewmembers had stolen a couple bottles of booze from the machine after Ivan disabled the ID lock. Tell you the truth, I don't blame the thief. Everyone is going a little stir-crazy in here, and the bartender is being damn stingy with the alcohol. Either way, once they started to pick a fight, I had to take them down. It's a damn shame that we don't have a brig, though. I had to lock Ivan in a fuckin' freezer, for god's sake. Let's hope that we can keep our sanity together, at least for a while.
Entry Four - 10/06/2554: Jesus fucking Christ riding on a motorbike. These things the scientists are studying are terrifying! Fucking great huge purple bug things as tall as the ceiling, with blades for arms and drooling at the mouth. I don't think my taser will do jack shit against these damn things, but the eggheads say that they're safely contained. If they do, I have a feeling that it's only a matter of time before we're all screwed. These bastards look like walking death.
Entry Five - 18/06/2554: Finally caught who stole the booze from Kuester. It was that fuckin' loser assistant Steve! He was in the dorms, chugging his worries away. I took one of the bottles back to the barkeep, but no one has to know about this second one. I think I'm gonna enjoy this while watching tomorrow's Thunderdome match.
Entry Six - 19/06/2554: Oh, great. The chef is still sleeping, so we get Ivan's gruel for breakfast today. I overheard Sano and Douglas saying something about the aliens being restless, so we might get some action today. As long as it happens after the big game, I'm fine with it. I still got one beer to drink before I'm ready to die.";
- name = "Personal Log - Kenneth Cunningham"
- },
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/log/kenneth,
/turf/open/floor/plasteel/red/side{
dir = 9;
heat_capacity = 1e+006
@@ -4824,10 +4810,7 @@
})
"gx" = (
/obj/structure/table,
-/obj/item/weapon/paper{
- info = "Ivan Volodin Stories:
Entry Won - 28/05/2554: Hello. I am Crazy Ivan. Boss say I must write. I do good job fixing outpost. Is very good job. Much better than mines. Many nice people. I cause no trouble.
Entry Too - 05/06/2554: I am finding problem with Booze-O-Mat. Is not problem. I solve very easy. Use yellow tool to make purple light go off. I am good engineer! Bartender will be very happy.
Entry Tree - 08/06/2554: Bartender is not happy. Security man is not happy. Cannot feel legs, is very cold in freezer. Is not good. Table is jammed into door, have no tools. Is very not good. But, on bright side, found meat! Shall chew to keep spirits up.
Entry Fore - 12/06/2554: Big nasty purple bug looked at me today. Make nervous. Blue wall wire can be broken, then bad thing happens. Very very bad thing. Man in orange spacesuit wave at me today too. He seem nice. Wonder who was?
Entry Fiv - 15/06/2554: I eat cornflakes today. Is good day. Sun shine for a while. Was nice. I also take ride on disposals chute. Was fun, but tiny. Get clog out of pipes, was vodka bottle. Is empty. This make many sads.
Entry Sex: 19/06/2554: Purple bugs jumpy today. When waved, get hiss. Maybe very bad. Maybe just ill. Do not know. Is science problem, is not engineer problem. I eat sandwich. Is glorious job. Wish to never end.";
- name = "Personal Log - Ivan Volodin"
- },
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/log/ivan,
/turf/open/floor/plating{
broken = 1;
heat_capacity = 1e+006;
@@ -4991,26 +4974,11 @@
icon_state = "bulb-broken";
status = 2
},
-/obj/item/weapon/paper{
- info = "Researcher: Dr. Sakuma Sano Date: 04/06/2554
Report: As expected, all that is left of the monkeys we sent in earlier is a group of xenomorph larvae. It is quite clear that the facehuggers are not selective in their hosts, and so far the gestation process has been shown to have a 100% success rate.
The larvae themselves have been behaving very differently from the lone larva we first observed, and despite shying away from humans they are clearly comfortable with others of their kind. Our previous suspicions on larvae have been confirmed with their demonstration of playfulness: they are not nearly as aggressive or violent when young, before molting to adulthood.
The majority of the play we observed involved a sort of hide-and-seek, and occasionally wrestling by tangling themselves and struggling out of it. While normally we would write these off as instinctual play for honing their skills when they molt, their growth period is so incredibly fast and they are still such adept killers that it would serve no practical purpose. The only explanation for this is perhaps to create bonds and friendships with each other, if that is even possible for such an incredibly hostile race. It may be that they are much more reasonable with each other than other life forms.
It had become clear that now was the best time to extract a xenomorph for dissecting, as these were all still larvae and the queen was still attached to its ovipositor and would be immobile. With the approval of the research director, we sent in our medical robot that had been dubbed 'Head Surgeon' into the containment pen, dropping the shields for only a fraction of a second to allow it entry. The larvae were cautious, but the curiosity of one had him within grabbing range of our robot. It was brought out and quickly euthanized through lethal injection, courtesy of our mechanical doctor.";
- name = "Larva Xenomorph Social Interactions & Capturing Procedure"
- },
-/obj/item/weapon/paper{
- info = "Researcher: Dr. Sakuma Sano Date: 04/06/2554
Report: I have studied many interesting and diverse life-forms as a xenobiologist ranging from creatures as large as cows, to specimens too small see with the naked eye. This is by far the largest alien I have ever seen. The alien we were previously studying has molted and has become an absolutely enormous creature. Standing at over 15 feet tall and weighing in at likely two tons or more, the xenomorph queen is an absolutely breathtakingly large and cruel monster. Its behavior has changed drastically from when it was a drone, having become far more comfortable with sitting and staring at us, rather than smashing at the windows.
The queen, physiologically speaking, is fairly similar to the other xenomorphs, with a few key differences. Its enormous size demands large legs, while the back seems to be always hunched forward. The dorsal tubes on the back have changed to several large spikes, and we observed the alien now sports a second pair of smaller arms on its chest. The purpose of these secondary arms is still unknown. Finally, the queen's crown has become incredibly large, with what seems to be a retractable slot to hide its head in. The dome appears to be extremely thick near the front, and will likely be able to resist a lot of trauma. Despite the enormous size it has grown to, it is not that much slower than it used to be.
After two hours of doing relatively nothing but staring, the queen began to produce an unusually large amount of resin and weeds, quickly shaping up a large nest that it then hid behind. It then proceeded to smash out all the lights, leaving us with very little to see with our cameras. When we looked through the back cameras, we had discovered that it had grown a large ovipositor, and was releasing large eggs onto the ground. This had us all in agreement that this stage of the life cycle was the queen.
Over the next few hours, the eggs grew to their full sizes, and we provided the subject with new monkey hosts. When they approached the eggs, they opened to release more facehuggers. It seems that we have observed the full cycle of reproduction for this species. We can expect more larvae in the next few hours.";
- name = "Queen Xenomorph Physiology & Behavior Observation"
- },
-/obj/item/weapon/paper{
- info = "Researcher: Dr. Sakuma Sano Date: 03/06/2554
Report: The other scientists and I can hardly believe our eyes. The snake-like larva has molted into a 7 foot tall insectoid nightmare in just a few hours. It's obvious now as to why such heavy duty containment was needed. It immediately tried to escape however by flinging itself at the window in a flurry of swipes and stabs. It seems its behavior has returned to a state that is very similar to the facehugger, though I doubt with the same intent! Thankfully, our glass and shields have shown to be more than sturdy enough for such a violent creature, and so far, any attempts at the creature escaping have been in vain.
As for its physiology, the creature has an elongated head with what appears to be have an exoskeleton resembling an external rib-cage on the torso. The alien is also fairly skinny with a lean body. The little amount of meat on the alien appears to be entirely muscle. We assume this makes it deceptively strong, while remaining agile at the same time. One of the most interesting things we have seen is its pharyngeal jaw. It has some what of an inner mouth capable of being fired externally at extremely high speeds. It has already caused many dents in the walls and a few small cracks in the window with it. The alien also has a couple of dorsal tubes on its back, their purpose unknown. Finally, this monster sports a long ridged tail, complete with a large and extremely sharp blade at the tip.
Normally I would be absolutely terrified of something like this, but I'm putting my trust in Nanotrasen with the containment. After all, they wouldn't build a cell that could fail to contain its subject, would they?";
- name = "Adult Xenomorph Physiology & Behavior Observation"
- },
-/obj/item/weapon/paper{
- info = "Researcher: Dr. Sakuma Sano Date: 03/06/2554
Report: When the larva first emerged from the chest of the monkey, it seemed very curious. It would wander around aimlessly for awhile and then sit still. We are unable to determine the gender of the larva, or even determine if it has a gender. After some time had passed, it seemed to lose interest in its surroundings and sat mostly still while occasionally wagging its tail. We decided to throw in a live mouse to see if it would consume it. The larva quickly attacked and ate the mouse and seemed to get larger very suddenly, this suggests that the larvae are capable of metabolizing and directing all the energy towards growth at previously thought impossible speeds. It is a shame that we cannot observe the process more closely, as we do not currently know how dangerous or violent this creature is or will become as it matures fully.
It is tempting to imagine the possibilities of utilizing such a mechanism. The capability of skipping years of growth time for children, repairing bodily damage in a matter of moments, even its usage in existing cloning technology.";
- name = "Larva Xenomorph Physiology & Behavior Observation"
- },
-/obj/item/weapon/paper{
- info = "Researcher: Dr. Sakuma Sano Date: 03/06/2554
Report: The test subject we were provided with truly is alien. It is a small spider-like creature with bony legs leading to a smooth body. It has a long tail connected to it, and it has shown extremely aggressive behavior by flinging its entire body at the glass and shields to no avail. While doing so, we noticed there was a small pink hole in the middle of the body.
When we sent in a monkey through the crude but effective disposal tube, the alien immediately jumped at its face and latched on. The monkey was quickly suffocated by its constricting tail, unable to pry off the fingers. The monkey at first seemed to be dead, but was observed to be breathing. The recently named alien 'facehugger' fell off dead and curled its legs up like a spider moments after it had finished with the monkey's body.
While the monkey appeared to be unharmed, we kept it in the cell for a couple more hours until we were horrified to discover it screaming out in pain as a snake-like creature erupted from the monkey's chest! It appears that the 'facehugger' is only the start of this life cycle. The impregnation cycle involving the creatures growing inside the chests of their hosts seems to only be the beginning.";
- name = "'Facehugger' Xenomorph Physiology & Behavior Observation"
- },
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/larva_social,
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/xeno_queen,
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/xeno_adult,
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/larva_psych,
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/facehugger,
/obj/structure/alien/weeds,
/turf/open/floor/plasteel/white,
/area/awaycontent/a2{
@@ -5196,19 +5164,19 @@
})
"gW" = (
/obj/structure/filingcabinet/filingcabinet,
-/obj/item/weapon/paper{
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/xeno_hivemind{
info = "Researcher: Dr. Mark Douglas Date: 17/06/2554
Report: Earlier today we have observed a new phenomenon with our subjects. While feeding them our last monkey subject and throwing out the box, the aliens merely looked at us instead of infecting the monkey right away. They looked to be collectively distressed as they would no longer be given hosts, where instead we would move to the next phase of the experiment. When I glanced at the gas tanks and piping leading to their cell, I looked back to see all of them were up against the glass, even the queen! It was as if they all understood what was going to happen, even though we knew only the queen had the cognitive capability to do so.
The only explanation for this is a form of communication between the aliens, but we have seen no such action take place anywhere in the cell until now. We also know that regular drone and hunter xenomorphs have no personality or instinct to survive by themselves. Perhaps the queen has a direct link to them? A form of a commander or overseer that controls their every move? A hivemind?";
name = "The Hivemind Hypothesis"
},
-/obj/item/weapon/paper{
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/xeno_behavior{
info = "Researcher: Dr. Sakuma Sano Date: 08/06/2554
Report: The xenomorphs we have come to study here are a remarkable species. They are almost universally aggressive across all castes, showing no remorse or guilt or pause before or after acts of violence. They appear to be a species entirely designed to kill. Oddly enough, even their method of reproduction is a brutal two-for-one method of birthing a new xenomorph and killing its host.
The lone xenomorph we studied only five days ago showed little sign of intelligence. Only a simple drone that flung itself at the safety glass and shields repeatedly and thankfully without success. Once the drone molted into a queen, it became much more calm and calculating, merely looking at us and waiting while building its nest. As the hive grew in size and in numbers, so too did the intelligence of the common hunter and drone. We are still researching how they can communicate with one another and the relationship between the different castes and the queen. We will continue to update our research as we learn more about the species.";
name = "A Preliminary Study of Alien Behavior"
},
-/obj/item/weapon/paper{
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/xeno_castes{
info = "Researcher: Dr. Mark Douglas Date: 06/06/2554
Report: While observing the growing number of aliens in the containment cell, we began to notice subtle differences that were consistently repeating. Like ants, these creatures clearly have different specialized variations that determine their roles in the hive. We have dubbed the three currently observed castes as Hunters, Drones, and Sentinels.
Hunters have been observed to be by far the most aggressive and agile of the three, constantly running on every surface and frequently swiping at the windows. They are also remarkably good at camouflaging themselves in darkness and on their resin structures, appearing almost invisible to the unwary observer. They are always the first to reach the monkeys we send in leading us to believe that this caste is primarily used for finding and retrieving hosts.
Drones on the other hand are much more docile and seem more shy by comparison, though not any less aggressive than the other castes. They have been observed to have a much wider head and lack dorsal tubes. They have shown to be less agile and visibly more fragile than any other caste. The drone however has never been observed to interact with the monkeys directly and instead preferring maintenance of the hive by building walls of resin and moving eggs around the nest. As far as we know, we have only ever observed a drone become a queen, and we have no way of knowing if the other castes have that capability.
Lastly, we have the Sentinels, which appear at first glance to be the guards of the hive. They have so far been only observed to remain near the queen and the eggs, frequently curled up against the walls. We have only observed one instance where they have interacted with a monkey who strayed too closely to the queen, and was pounced and held down immediately until it was applied with a facehugger. Their lack of movement makes it difficult to determine their exact purpose as guards, sentries, or other role.";
name = "The Xenomorph 'Castes'"
},
-/obj/item/weapon/paper{
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy{
info = "Researcher: Dr. Mark Douglas Date: 04/06/2554
Report: After an extremely dangerous, time consuming and costly dissection, we have managed to record and identify several of the organs inside of the first stage of the xenomorph cycle: the larva. This procedure took an extensive amount of time because these creatures have incredibly, almost-comically acidic blood that can melt through almost anything in a few moments. We had to use over a dozen scalpels and retractors to complete the autopsy.
The larva seems to possess far fewer and quite different organs than that of a human. There is a stomach, with no digestive tract, a heart, which seems to lack any blood-oxygen circulation purpose, and an elongated brain, even though its as dumb as any large cat. It also lacks any liver, kidneys, or other basic organs.
We can't determine the exact nature of how these creatures grow, nor if they gain organs as they become adults. The larger breeds of xenomorph are too dangerous to kill and capture to give us an accurate answer to these questions. All that we can conclude is that being able to function with so little and yet be so deadly means that these creatures are highly evolved and likely to be extremely durable to various hazards that would otherwise be lethal to humans.";
name = "Larva Xenomorph Autopsy Report"
},
@@ -5527,10 +5495,7 @@
pixel_y = 23;
req_access = null
},
-/obj/item/weapon/paper{
- info = "Personal Log for Research Director Gerald Rosswell
Entry One - 17/05/2554: You know, I can't believe I took this position so suddenly. I saw that corporate needed a research director for one of it's outposts and thought it would be a cakewalk, there isn't going to be a lot of research to be done on a tiny outpost. Mainly just running scans on the gas giant we are orbiting or some basic RnD. However, they conveniently forgot to tell me that me and my science staff would have to pull double duty as medical staff and that there is no one higher up on the chain of command here, so I get to pull triple duty as acting captain as well! This shit is probably allowed in some 3 point fine print buried underneath the literally thousands of pages of contracts. Well, at least the research will be easy work.
Entry Two - 25/05/2554: Well, we all expected it at the outpost, CentComm has decided to completely change what research we are doing. They've decided that we should be research the species known as 'xenomporphs'. They announced this change 4 days ago and along with it, sadly, the termination of our current science staff barring me. Not to mention the constant noise made by the construction detail they sent to staple on an xenobiology lab ensuring no one has been able to sleep decently ever since they announced the shift. To make matters worse our current security guard actually died of a heart attack today. Just goes to show that 75 year old men shouldn't be security guards. Still can't believe that they decided to do this major change less than a month after the outpost was established.
Entry Three - 27/05/2554: The new security guard arrived today. Apparently transferred here from the research station that also is orbiting the gas giant. He seems to be rather angry about his transfer. Considering the rumors I've heard about the research station he's probably caught off guard by the fact that Steve hasn't tried to force an IED down his throat.
Entry Four - 06/06/2554: My requests for additional security and containment measures for the 'xenomorph' has been denied. Does Central Command not notice how dangerous these creatures are? The only thing keeping them in is a force field, a minor problem with the power grid and the entire hive is loose. What would stop them then, the lone security guard with a dinky little taser? Kenneth can barely handle a short-tempered engineer. We are under equipped and under staffed, we are inevitably going to be destroyed unless we get the equipment and staff we need.
Entry Five - 10/06/2554: Cunningham got a good look at the xenomorph in containment. He was frightened for the rest of the day, rather amusing if it wasn't for the fact that we are all trapped on this scrap heap with naught but a force field keeping those xenomorphs in.
Entry Six - 17/06/2554: The reactions from the specimens today has shown that they possess strange mental properties. Mark hypothesizes that they possibly have a sort of hive mind, while nothing is certain this would explain how xenomorphs seem to have vastly increased intellect when a 'queen' is present. Of course, to test this hypothesis would require many complicated procedures which we will not be able to undertake. But we do not know the full extend of the xenomorph mind, it may or may not be able to find a way to circumvent our containment system. I will resend my request for additional security measures along with this new found information.";
- name = "Personal Log - Gerald Rosswell"
- },
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/log/gerald,
/turf/open/floor/plasteel/cafeteria{
dir = 5
},
@@ -5695,10 +5660,7 @@
icon_state = "bulb-broken";
status = 2
},
-/obj/item/weapon/paper{
- info = "
In The Event of Xenobiology Breach: Evacuate staff, Lock down Xenobiology, Notify on-site superiors and/or Central Command immediatly.
I fucking knew it. There was a major breach, that idiotic force field failed and the xenomorphs rushed out and took out the scientists. I've managed to make it to my office and closed the blast doors. I can hear them trying to pry open the doors. Probably don't have long. I have no clue what has happened to the rest of the crew, for all I know they've been killed to produce more of the fucks.";
- name = "Hastily Written Note"
- },
+/obj/item/weapon/paper/crumpled/awaymissions/moonoutpost19/hastey_note,
/obj/effect/turf_decal/stripes/line{
dir = 4
},
@@ -7092,10 +7051,7 @@
/obj/structure/noticeboard{
pixel_y = 32
},
-/obj/item/weapon/paper{
- info = "
I Can't Believe It's Not Pasta: Half off on Wednesdays
Burger night every Friday 6PM-10PM, free drinks with purchase of meal!
Premiering Tonight: The comedy stylings of Shoe Snatching Willy! 11AM-7PM
";
- name = "Specials This Week"
- },
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/food_specials,
/turf/open/floor/plasteel{
burnt = 1;
dir = 8;
@@ -9039,10 +8995,7 @@
dir = 8;
pixel_x = 32
},
-/obj/item/weapon/paper{
- info = "
Welcome to Moon Outpost 19! Property of Nanotrasen Inc.
Staff Roster: -Dr. Gerald Rosswell: Research Director & Acting Captain -Dr. Sakuma Sano: Xenobiologist -Dr. Mark Douglas: Xenobiologist -Kenneth Cunningham: Security Officer-Ivan Volodin: Engineer -Mathias Kuester: Bartender -Sven Edling: Chef -Steve: Assistant
Do you hate the concept of having to use your legs, let alone walk to places? Well, with the Quantum Pad (tm), never again will the fear of cardio keep you from going places!
How to set up your Quantum Pad(tm)
1.Unscrew the Quantum Pad(tm) you wish to link. 2. Use your multi-tool to cache the buffer of the Quantum Pad(tm) you wish to link. 3. Apply the multi-tool to the secondary Quantum Pad(tm) you wish to link to the first Quantum Pad(tm)
If you followed these instructions carefully, your Quantum Pad(tm) should now be properly linked together for near-instant movement across the station! Bear in mind that this is technically a one-way teleport, so you'll need to do the same process with the secondary pad to the first one if you wish to travel between both.
Do you hate the concept of having to use your legs, let alone walk to places? Well, with the Quantum Pad (tm), never again will the fear of cardio keep you from going places!
How to set up your Quantum Pad(tm)
1.Unscrew the Quantum Pad(tm) you wish to link. 2. Use your multi-tool to cache the buffer of the Quantum Pad(tm) you wish to link. 3. Apply the multi-tool to the secondary Quantum Pad(tm) you wish to link to the first Quantum Pad(tm)
If you followed these instructions carefully, your Quantum Pad(tm) should now be properly linked together for near-instant movement across the station! Bear in mind that this is technically a one-way teleport, so you'll need to do the same process with the secondary pad to the first one if you wish to travel between both.
";
- name = "Quantum Pad For Dummies"
- },
+/obj/item/weapon/paper/guides/quantumpad,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/vault{
baseturf = /turf/open/floor/plating/asteroid/airless;
@@ -23514,6 +23478,9 @@
dir = 4
},
/obj/vehicle/janicart,
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -23554,10 +23521,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/item/weapon/paper{
- info = "You got a big job ahead of you, pal. This is a big station, lots of floors and assholes to dirty said floors without any thought for you. It might not be a bad idea to check on the external waste belts every now and again to make sure some foriegn object hasn't clogged the disposal loop, either.";
- name = "Janitor Notice"
- },
+/obj/item/weapon/paper/fluff/stations/cere/janitor,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -28102,6 +28066,9 @@
c_tag = "EVA Equipment";
dir = 6
},
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -29508,8 +29475,6 @@
/area/hallway/primary/central)
"bek" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/neutral/corner{
@@ -31240,6 +31205,10 @@
c_tag = "EVA Storage";
dir = 9
},
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
/turf/open/floor/plasteel/blue/side{
icon_state = "blue";
dir = 4;
@@ -32496,8 +32465,6 @@
/obj/structure/bed,
/obj/item/weapon/bedsheet,
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/white{
@@ -32935,8 +32902,7 @@
d2 = 4;
icon_state = "2-4"
},
-/obj/machinery/power/emitter{
- anchored = 1;
+/obj/machinery/power/emitter/anchored{
state = 2
},
/turf/open/floor/plating{
@@ -32963,8 +32929,7 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/machinery/power/emitter{
- anchored = 1;
+/obj/machinery/power/emitter/anchored{
state = 2
},
/turf/open/floor/plating{
@@ -32976,8 +32941,7 @@
d2 = 8;
icon_state = "0-8"
},
-/obj/machinery/power/emitter{
- anchored = 1;
+/obj/machinery/power/emitter/anchored{
state = 2
},
/turf/open/floor/plating{
@@ -33760,7 +33724,6 @@
name = "Isolation A";
req_access_txt = "39"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -34146,28 +34109,22 @@
},
/area/engine/engineering)
"bmB" = (
-/obj/structure/reflector/single{
- anchored = 1;
- dir = 4;
- icon_state = "reflector"
+/obj/structure/reflector/single/anchored{
+ dir = 4
},
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/engine/engineering)
"bmC" = (
-/obj/structure/reflector/box{
- anchored = 1
- },
+/obj/structure/reflector/box/anchored,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/engine/engineering)
"bmD" = (
-/obj/structure/reflector/single{
- anchored = 1;
- dir = 1;
- icon_state = "reflector"
+/obj/structure/reflector/single/anchored{
+ dir = 1
},
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -35882,8 +35839,6 @@
"bpt" = (
/obj/structure/table,
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/obj/item/weapon/paper_bin{
@@ -36089,8 +36044,6 @@
dir = 4
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/white{
@@ -37272,9 +37225,7 @@
},
/area/hallway/primary/port)
"brN" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel/neutral/corner{
dir = 8;
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -37286,6 +37237,9 @@
dir = 1;
pixel_y = -24
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/neutral/corner{
dir = 8;
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -37293,6 +37247,9 @@
/area/hallway/primary/port)
"brP" = (
/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
/turf/open/floor/plasteel/neutral/corner{
dir = 8;
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -38089,6 +38046,7 @@
dir = 8;
icon_state = "pipe-c"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -38203,9 +38161,7 @@
},
/area/engine/supermatter)
"btu" = (
-/obj/machinery/power/rad_collector{
- anchored = 1
- },
+/obj/machinery/power/rad_collector/anchored,
/obj/structure/cable/yellow{
d2 = 8;
icon_state = "0-8"
@@ -38262,9 +38218,7 @@
},
/area/engine/supermatter)
"btA" = (
-/obj/machinery/power/rad_collector{
- anchored = 1
- },
+/obj/machinery/power/rad_collector/anchored,
/obj/structure/cable/yellow{
icon_state = "0-4";
d2 = 4
@@ -38752,10 +38706,7 @@
},
/area/awaymission/research/interior/gateway)
"bur" = (
-/obj/item/weapon/paper{
- info = "
Nanotrasen Exploration and Colonization Program
Due to recent shutdowns of the Exploration and Colonization department shortly after this gateway was delivered on-site during station construction, this room has been condemmed and an engineering team will be on-site within the next few months to recollect the gate. Thank you for your cooperation.";
- name = "NOTICE - GATEWAY STATUS"
- },
+/obj/item/weapon/paper/fluff/stations/cere/gateway,
/obj/effect/turf_decal/stripes/asteroid/line{
icon_state = "ast_warn";
dir = 8
@@ -38891,9 +38842,6 @@
},
/area/hydroponics)
"buE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/machinery/door/airlock/maintenance{
name = "Hydroponics";
req_access_txt = "35"
@@ -38909,9 +38857,6 @@
},
/area/hydroponics)
"buF" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/machinery/light/small{
dir = 1
},
@@ -38920,6 +38865,9 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -39143,9 +39091,7 @@
},
/area/engine/supermatter)
"buZ" = (
-/obj/machinery/power/rad_collector{
- anchored = 1
- },
+/obj/machinery/power/rad_collector/anchored,
/obj/structure/cable/yellow{
icon_state = "0-4";
d2 = 4
@@ -39877,9 +39823,7 @@
},
/area/engine/engineering)
"bwo" = (
-/obj/machinery/power/rad_collector{
- anchored = 1
- },
+/obj/machinery/power/rad_collector/anchored,
/obj/structure/cable/yellow{
d2 = 8;
icon_state = "0-8"
@@ -40238,8 +40182,6 @@
dir = 8
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/white{
@@ -40335,7 +40277,7 @@
d2 = 8;
icon_state = "1-8"
},
-/obj/item/weapon/paper/pamphlet,
+/obj/item/weapon/paper/pamphlet/gateway,
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -40510,8 +40452,6 @@
dir = 6
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel{
@@ -40708,8 +40648,6 @@
icon_state = "0-8"
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel{
@@ -40908,7 +40846,7 @@
/area/awaymission/research/interior/gateway)
"byg" = (
/obj/structure/table,
-/obj/item/weapon/paper/pamphlet,
+/obj/item/weapon/paper/pamphlet/gateway,
/obj/item/weapon/coin/silver,
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -41007,8 +40945,6 @@
c_tag = "Hydroponics North 2"
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/darkgreen{
@@ -41608,7 +41544,6 @@
"bzz" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- name = "scrubbers pipe";
dir = 4
},
/turf/open/floor/plasteel/black{
@@ -42359,9 +42294,7 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
+/obj/machinery/airalarm/engine{
pixel_y = 23
},
/obj/machinery/atmospherics/pipe/manifold/green/visible,
@@ -43755,8 +43688,6 @@
/area/medical/chemistry)
"bDn" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/whiteyellow/side{
@@ -44035,7 +43966,7 @@
"bDQ" = (
/obj/structure/table,
/obj/item/weapon/book/manual/hydroponics_pod_people,
-/obj/item/weapon/paper/hydroponics,
+/obj/item/weapon/paper/guides/jobs/hydroponics,
/obj/item/stack/packageWrap,
/obj/item/device/destTagger,
/turf/open/floor/plasteel/hydrofloor{
@@ -44457,8 +44388,6 @@
/area/medical/genetics)
"bEF" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/whitepurple/side{
@@ -44677,8 +44606,6 @@
/obj/item/weapon/grenade/chem_grenade/metalfoam,
/obj/item/weapon/grenade/chem_grenade/metalfoam,
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel{
@@ -44863,8 +44790,6 @@
dir = 1
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/obj/structure/cable/yellow{
@@ -45448,8 +45373,6 @@
/area/library)
"bGw" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/obj/item/weapon/twohanded/required/kirbyplants{
@@ -45536,8 +45459,6 @@
/obj/item/weapon/grown/log,
/obj/item/weapon/grown/log,
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/obj/item/weapon/hatchet,
@@ -46113,8 +46034,6 @@
pixel_y = -3
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/white{
@@ -46793,12 +46712,8 @@
"bIO" = (
/obj/structure/table/glass,
/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,
-/obj/item/stack/sheet/mineral/plasma{
- layer = 2.9
- },
-/obj/item/stack/sheet/mineral/plasma{
- layer = 2.9
- },
+/obj/item/stack/sheet/mineral/plasma,
+/obj/item/stack/sheet/mineral/plasma,
/obj/machinery/camera{
c_tag = "Chemistry";
dir = 10;
@@ -46893,9 +46808,6 @@
},
/obj/item/clothing/suit/straight_jacket,
/obj/item/clothing/mask/muzzle,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/turf/open/floor/plasteel/white{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -47317,6 +47229,9 @@
/area/engine/engineering)
"bJS" = (
/obj/structure/table,
+/obj/item/weapon/twohanded/rcl/pre_loaded,
+/obj/item/weapon/twohanded/rcl/pre_loaded,
+/obj/item/weapon/twohanded/rcl/pre_loaded,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -47823,8 +47738,6 @@
/area/engine/gravity_generator)
"bKQ" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
@@ -48948,9 +48861,6 @@
pixel_y = 2
},
/obj/item/clothing/neck/stethoscope,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/obj/machinery/light,
/turf/open/floor/plasteel/white{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -50843,6 +50753,11 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable/orange{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -51581,7 +51496,6 @@
/area/engine/atmos)
"bRz" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- name = "scrubbers pipe";
dir = 1
},
/turf/open/floor/plasteel{
@@ -51595,7 +51509,6 @@
name = "Waste Loop"
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- name = "scrubbers pipe";
dir = 4
},
/turf/open/floor/plasteel{
@@ -53389,8 +53302,6 @@
/area/crew_quarters/fitness)
"bVm" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/black{
@@ -54826,11 +54737,7 @@
})
"bYp" = (
/obj/structure/table,
-/obj/item/weapon/paper{
- desc = "";
- info = "Bruises sustained in the holodeck can be healed simply by sleeping.";
- name = "Holodeck Disclaimer"
- },
+/obj/item/weapon/paper/fluff/holodeck/disclaimer,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -55762,6 +55669,10 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
},
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -22
+ },
/turf/open/floor/plasteel/grimy{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -57418,7 +57329,7 @@
/obj/item/solar_assembly,
/obj/item/solar_assembly,
/obj/item/weapon/electronics/tracker,
-/obj/item/weapon/paper/solar,
+/obj/item/weapon/paper/guides/jobs/engi/solars,
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -57679,9 +57590,7 @@
},
/area/shuttle/escape)
"cdZ" = (
-/obj/structure/closet/secure_closet/miner{
- locked = 0
- },
+/obj/structure/closet/secure_closet/miner/unlocked,
/obj/effect/turf_decal/stripes/line{
dir = 9
},
@@ -58731,10 +58640,7 @@
"cgi" = (
/obj/structure/table,
/obj/item/clothing/glasses/meson,
-/obj/item/weapon/paper{
- info = "This station needs cleared out within the next few weeks, as construction is almost complete and NT expects most of the equipment off-site before then. Throw most of the shit in here for now and we'll come back later with a pod to haul the heavier stuff. Shouldn't be too big of an issue.";
- name = "Disclaimer Notice"
- },
+/obj/item/weapon/paper/fluff/stations/cere/abandoned_dock,
/turf/open/floor/plasteel/floorgrime{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -59254,7 +59160,7 @@
height = 20;
name = "Cere emergency shuttle";
port_angle = 90;
- preferred_direction = 2;
+ preferred_direction = 1;
width = 42
},
/obj/docking_port/stationary{
@@ -60638,9 +60544,6 @@
},
/area/hallway/primary/aft)
"cjO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/structure/cable{
d1 = 4;
d2 = 8;
@@ -60651,6 +60554,9 @@
req_access_txt = "24"
},
/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -60711,8 +60617,6 @@
/area/construction/mining/aux_base)
"cjU" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/obj/effect/turf_decal/stripes/line{
@@ -60883,10 +60787,7 @@
},
/obj/machinery/airalarm{
dir = 4;
- locked = 0;
- pixel_x = -23;
- req_access = null;
- req_one_access_txt = "24;10"
+ pixel_x = -22
},
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -61247,10 +61148,7 @@
dir = 4;
pixel_x = -32
},
-/obj/item/weapon/paper{
- info = "
Dummies Guide To Quantum Pads
Do you hate the concept of having to use your legs, let alone walk to places? Well, with the Quantum Pad (tm), never again will the fear of cardio keep you from going places!
How to set up your Quantum Pad(tm)
1.Unscrew the Quantum Pad(tm) you wish to link. 2. Use your multi-tool to cache the buffer of the Quantum Pad(tm) you wish to link. 3. Apply the multi-tool to the secondary Quantum Pad(tm) you wish to link to the first Quantum Pad(tm)
If you followed these instructions carefully, your Quantum Pad(tm) should now be properly linked together for near-instant movement across the station! Bear in mind that this is technically a one-way teleport, so you'll need to do the same process with the secondary pad to the first one if you wish to travel between both.
";
- name = "Quantum Pad For Dummies"
- },
+/obj/item/weapon/paper/guides/quantumpad,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -61316,10 +61214,7 @@
dir = 8;
pixel_x = 32
},
-/obj/item/weapon/paper{
- info = "
Dummies Guide To Quantum Pads
Do you hate the concept of having to use your legs, let alone walk to places? Well, with the Quantum Pad (tm), never again will the fear of cardio keep you from going places!
How to set up your Quantum Pad(tm)
1.Unscrew the Quantum Pad(tm) you wish to link. 2. Use your multi-tool to cache the buffer of the Quantum Pad(tm) you wish to link. 3. Apply the multi-tool to the secondary Quantum Pad(tm) you wish to link to the first Quantum Pad(tm)
If you followed these instructions carefully, your Quantum Pad(tm) should now be properly linked together for near-instant movement across the station! Bear in mind that this is technically a one-way teleport, so you'll need to do the same process with the secondary pad to the first one if you wish to travel between both.
";
- name = "Quantum Pad For Dummies"
- },
+/obj/item/weapon/paper/guides/quantumpad,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -61702,8 +61597,6 @@
dir = 8
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel{
@@ -62055,8 +61948,6 @@
dir = 4
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/red/side{
@@ -62848,8 +62739,6 @@
dir = 4
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/blue/corner{
@@ -64505,8 +64394,6 @@
/area/science/robotics/lab)
"cqz" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel{
@@ -64628,8 +64515,6 @@
/obj/item/stack/sheet/metal/fifty,
/obj/item/clothing/glasses/welding,
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/whitepurple/side{
@@ -64657,7 +64542,7 @@
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/maintenance/asteroid/aft/science)
+/area/hallway/primary/aft)
"cqM" = (
/obj/structure/cable{
d1 = 1;
@@ -66384,7 +66269,7 @@
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/maintenance/asteroid/aft/science)
+/area/science/lab)
"ctR" = (
/obj/machinery/power/terminal{
dir = 4
@@ -66778,8 +66663,6 @@
/area/science/research)
"cuN" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -68210,8 +68093,6 @@
/area/science/xenobiology)
"cwO" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/white{
@@ -68737,11 +68618,6 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/structure/cable/orange{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
/obj/effect/turf_decal/stripes/asteroid/line{
icon_state = "ast_warn";
dir = 1
@@ -68803,8 +68679,6 @@
/area/science/server)
"cxT" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
@@ -69959,9 +69833,6 @@
name = "Kill Chamber";
req_access_txt = "55"
},
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -72242,7 +72113,6 @@
pixel_x = 3;
pixel_y = -3
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -75206,8 +75076,6 @@
dir = 1
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/obj/machinery/atmospherics/components/trinary/filter/critical{
@@ -75746,8 +75614,6 @@
/area/crew_quarters/locker)
"cLx" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/obj/structure/sign/map/left/ceres{
@@ -76637,8 +76503,6 @@
/area/crew_quarters/theatre)
"cNb" = (
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/cafeteria{
@@ -76830,8 +76694,6 @@
dir = 4
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/wood{
@@ -77279,8 +77141,6 @@
dir = 4
},
/obj/machinery/airalarm{
- frequency = 1439;
- locked = 0;
pixel_y = 23
},
/turf/open/floor/plasteel/barber{
@@ -78304,6 +78164,7 @@
/obj/item/clothing/glasses/meson{
pixel_y = 4
},
+/obj/item/weapon/twohanded/rcl/pre_loaded,
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -79710,15 +79571,9 @@
pixel_x = 32
},
/obj/structure/closet/crate/bin,
-/obj/item/weapon/paper/crumpled{
- info = "...SOMETHING IN THE ROCKS, IT WATCHES US ALL..."
- },
-/obj/item/weapon/paper/crumpled{
- info = "...THEY SENT US HERE FOR A REASON...TERRIBLE..."
- },
-/obj/item/weapon/paper/crumpled{
- info = "...EMPTY HALLS...USELESS SPACE..."
- },
+/obj/item/weapon/paper/crumpled/stations/cere/rocks1,
+/obj/item/weapon/paper/crumpled/stations/cere/rocks2,
+/obj/item/weapon/paper/crumpled/stations/cere/rocks3,
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -79732,17 +79587,9 @@
})
"cTH" = (
/obj/structure/filingcabinet/chestdrawer,
-/obj/item/weapon/paper/crumpled{
- info = "I can't be here for much longer, this station is too empty for its own good. Something is wrong..."
- },
-/obj/item/weapon/paper{
- info = "
2XXX - 2nd Trimestor
I hide in here, away from the masses, not like it matters much considering how fucking huge this place is. ";
- name = "Journal Log"
- },
-/obj/item/weapon/paper{
- info = "
Hello there, proud operator of an NT-Sec Prisoner Rehabilitation Center. A solution to rising crime rates and falling productivity, these facilities are specifically designed for the safe, productive imprisonment of your most dangerous criminals.
To press a long-term prisoner into the service of the station, replace his equipment with prisoners' garb at one of the prison lockers, as per normal operating procedure. Before assigning a prisoner his ID, insert the ID into a prisoner management console and assign the prisoner a quota, based on the severity of his crime. A single sheet of most materials produces five points for the prisoner, and points can be expected to be produced at a rate of about 100 per minute, though punishments as severe as forced labor should be reserved for serious crimes of sentences not less than five minutes long. Once you have prepared the prisoner, place him in the secure northern half of the labor shuttle, and send him to the station. Once he meets his quota by feeding sheets to the stacker, he will be allowed to return to the station, and will be able to open the secure door to the prisoner release area.
Your station has been selected to carry out the Gateway Project.
The equipment will be shipped to you at the start of the next quarter. You are to prepare a secure location to house the equipment as outlined in the attached documents.
Hello there, proud operator of an NT-Sec Prisoner Rehabilitation Center. A solution to rising crime rates and falling productivity, these facilities are specifically designed for the safe, productive imprisonment of your most dangerous criminals.
To press a long-term prisoner into the service of the station, replace his equipment with prisoners' garb at one of the prison lockers, as per normal operating procedure. Before assigning a prisoner his ID, insert the ID into a prisoner management console and assign the prisoner a quota, based on the severity of his crime. A single sheet of most materials produces five points for the prisoner, and points can be expected to be produced at a rate of about 100 per minute, though punishments as severe as forced labor should be reserved for serious crimes of sentences not less than five minutes long. Once you have prepared the prisoner, place him in the secure northern half of the labor shuttle, and send him to the station. Once he meets his quota by feeding sheets to the stacker, he will be allowed to return to the station, and will be able to open the secure door to the prisoner release area.
We apologise for the inconvinience this may cause you.
Please enjoy the use of this complementary book.
Sincerely, Centcom Operations Demolitions Examination Retribution Bugfixing Underlining Services"
- },
+/obj/item/weapon/paper/fluff/stations/centcom/broken_evac,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"Fq" = (
@@ -12193,7 +12182,7 @@
"Fu" = (
/obj/structure/table/wood,
/obj/item/weapon/phone{
- desc = "Supposedly a direct line to NanoTrasen Central Command. It's not even plugged in.";
+ desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in.";
pixel_x = -3;
pixel_y = 3
},
@@ -12656,7 +12645,7 @@
/area/abductor_ship)
"GS" = (
/obj/item/weapon/surgical_drapes,
-/obj/item/weapon/paper/abductor,
+/obj/item/weapon/paper/guides/antag/abductor,
/obj/item/weapon/scalpel/alien,
/obj/structure/table/abductor,
/obj/item/weapon/cautery/alien,
@@ -13658,7 +13647,7 @@
/area/centcom/evac)
"Mb" = (
/obj/machinery/door/airlock/centcom{
- name = "Centcom Security";
+ name = "CentCom Security";
opacity = 1;
req_access_txt = "101"
},
@@ -13669,7 +13658,7 @@
/area/centcom/evac)
"Mc" = (
/turf/closed/indestructible/fakedoor{
- name = "Centcom"
+ name = "CentCom"
},
/area/centcom/evac)
"Md" = (
@@ -14389,6 +14378,12 @@ aa
aa
aa
aa
+aa
+aa
+aa
+aa
+aa
+aa
Gf
Gv
GF
@@ -14473,12 +14468,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
Gf
Gv
GF
@@ -14645,6 +14634,12 @@ aa
aa
aa
aa
+aa
+aa
+aa
+aa
+aa
+aa
Ga
Gg
GA
@@ -14729,12 +14724,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
Ga
Gg
Ht
@@ -14902,6 +14891,12 @@ aa
aa
aa
aa
+aa
+aa
+aa
+aa
+aa
+aa
Gb
Gm
Gx
@@ -14986,12 +14981,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
Gb
Hn
Gx
@@ -15159,6 +15148,12 @@ aa
aa
aa
aa
+aa
+aa
+aa
+aa
+aa
+aa
Gc
Gn
Gx
@@ -15243,12 +15238,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
Gc
Ho
Gx
@@ -15416,6 +15405,12 @@ aa
aa
aa
aa
+aa
+aa
+aa
+aa
+aa
+aa
Gd
Go
Gx
@@ -15500,12 +15495,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
Gd
Hp
Gx
@@ -15673,6 +15662,12 @@ aa
aa
aa
aa
+aa
+aa
+aa
+aa
+aa
+aa
Ge
Gk
Gy
@@ -15757,12 +15752,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
Ge
Gk
Gy
@@ -15931,6 +15920,12 @@ aa
aa
aa
aa
+aa
+aa
+aa
+aa
+aa
+aa
Gl
Gz
GL
@@ -16015,12 +16010,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
Gl
Gz
GL
@@ -26988,6 +26977,11 @@ hq
hq
hq
hq
+hq
+hq
+hq
+hq
+hq
lF
hq
hq
@@ -27016,11 +27010,6 @@ hq
hq
hq
hq
-hq
-hq
-hq
-hq
-hq
Kl
hm
aa
diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency_imfedupwiththisworld.dmm
index bc3f87c187..3aaa1e5de3 100644
--- a/_maps/shuttles/emergency_imfedupwiththisworld.dmm
+++ b/_maps/shuttles/emergency_imfedupwiththisworld.dmm
@@ -126,9 +126,7 @@
"x" = (
/obj/structure/bed,
/obj/item/weapon/bedsheet/red,
-/obj/item/weapon/paper{
- info = "i love daniel daniel is my best friend
you are tearing me apart elise"
- },
+/obj/item/weapon/paper/fluff/shuttles/daniel,
/turf/open/floor/carpet,
/area/shuttle/escape)
"y" = (
diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm
index f7dd78f851..d92b77a294 100644
--- a/_maps/shuttles/emergency_pubby.dmm
+++ b/_maps/shuttles/emergency_pubby.dmm
@@ -1,6 +1,6 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"aa" = (
-/turf/open/space,
+/turf/open/space/basic,
/area/space)
"ab" = (
/turf/closed/wall/mineral/titanium,
@@ -159,7 +159,7 @@
name = "Emergency Shuttle Airlock";
req_access_txt = "2"
},
-/turf/open/floor/mineral/plastitanium/brig,
+/turf/open/floor/plating,
/area/shuttle/escape)
"aE" = (
/obj/machinery/door/airlock/glass{
@@ -172,9 +172,6 @@
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-22"
},
-/obj/machinery/light{
- dir = 1
- },
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"aG" = (
@@ -286,7 +283,7 @@
port_angle = 90;
width = 18
},
-/turf/open/floor/mineral/titanium/blue,
+/turf/open/floor/plating,
/area/shuttle/escape)
"aY" = (
/obj/machinery/light{
@@ -311,10 +308,8 @@
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"ba" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
/obj/structure/shuttle/engine/heater,
+/obj/structure/window/shuttle,
/turf/open/floor/plating/airless,
/area/shuttle/escape)
"bb" = (
@@ -326,6 +321,24 @@
/obj/structure/shuttle/engine/propulsion,
/turf/open/floor/plating/airless,
/area/shuttle/escape)
+"bd" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"be" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"bf" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"bg" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"bh" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"bi" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
(1,1,1) = {"
aa
@@ -414,13 +427,13 @@ ab
ab
ab
ab
-ab
-ao
+bf
+aI
aL
aL
aL
-ao
-ab
+aT
+bh
ab
ab
ab
@@ -430,7 +443,7 @@ ab
(6,1,1) = {"
ab
ab
-ab
+bd
am
au
aA
@@ -439,7 +452,7 @@ ao
ao
ao
ao
-aT
+ao
ab
aV
aY
@@ -510,7 +523,7 @@ bc
(10,1,1) = {"
ab
ab
-ab
+be
aq
av
aA
@@ -519,7 +532,7 @@ ao
ao
ao
ao
-aT
+ao
ab
aW
aZ
@@ -534,13 +547,13 @@ ab
ab
ab
ab
-ab
-ao
+bg
+aI
aK
aK
aK
-ao
-ab
+aT
+bi
ab
ab
ab
diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm
index 7382695c40..856a118521 100644
--- a/_maps/shuttles/emergency_raven.dmm
+++ b/_maps/shuttles/emergency_raven.dmm
@@ -1,7 +1,7 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"aa" = (
/turf/open/space,
-/obj/machinery/porta_turret/centcomm_shuttle{
+/obj/machinery/porta_turret/centcom_shuttle{
dir = 9
},
/turf/closed/wall/mineral/plastitanium{
@@ -623,7 +623,7 @@
/obj/docking_port/mobile/emergency{
dwidth = 14;
height = 18;
- name = "Centcomm Raven Battlecruiser";
+ name = "CentCom Raven Battlecruiser";
timid = 1;
width = 32
},
@@ -980,7 +980,7 @@
/area/shuttle/escape)
"cr" = (
/turf/open/space,
-/obj/machinery/porta_turret/centcomm_shuttle{
+/obj/machinery/porta_turret/centcom_shuttle{
dir = 5
},
/turf/closed/wall/mineral/plastitanium{
@@ -1006,7 +1006,7 @@
/area/shuttle/escape)
"cw" = (
/turf/open/space,
-/obj/machinery/porta_turret/centcomm_shuttle{
+/obj/machinery/porta_turret/centcom_shuttle{
dir = 5
},
/turf/closed/wall/mineral/plastitanium{
@@ -1108,7 +1108,7 @@
/area/shuttle/escape)
"cR" = (
/turf/open/space,
-/obj/machinery/porta_turret/centcomm_shuttle{
+/obj/machinery/porta_turret/centcom_shuttle{
dir = 5
},
/turf/closed/wall/mineral/plastitanium{
@@ -1311,7 +1311,7 @@
/area/shuttle/escape)
"dQ" = (
/turf/open/space,
-/obj/machinery/porta_turret/centcomm_shuttle{
+/obj/machinery/porta_turret/centcom_shuttle{
dir = 5
},
/turf/closed/wall/mineral/plastitanium{
@@ -1333,7 +1333,7 @@
/area/shuttle/escape)
"dV" = (
/turf/open/space,
-/obj/machinery/porta_turret/centcomm_shuttle{
+/obj/machinery/porta_turret/centcom_shuttle{
dir = 5
},
/turf/closed/wall/mineral/plastitanium{
@@ -1379,7 +1379,7 @@
/area/shuttle/escape)
"ei" = (
/turf/open/space,
-/obj/machinery/porta_turret/centcomm_shuttle{
+/obj/machinery/porta_turret/centcom_shuttle{
dir = 10
},
/turf/closed/wall/mineral/plastitanium{
@@ -1400,7 +1400,7 @@
/area/shuttle/escape)
"en" = (
/turf/open/space,
-/obj/machinery/porta_turret/centcomm_shuttle{
+/obj/machinery/porta_turret/centcom_shuttle{
dir = 6
},
/turf/closed/wall/mineral/plastitanium{
@@ -1461,7 +1461,7 @@
/area/shuttle/escape)
"eA" = (
/turf/open/space,
-/obj/machinery/porta_turret/centcomm_shuttle{
+/obj/machinery/porta_turret/centcom_shuttle{
dir = 5
},
/turf/closed/wall/mineral/plastitanium{
diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm
index e0dad50c6c..2075969a4c 100644
--- a/_maps/shuttles/emergency_supermatter.dmm
+++ b/_maps/shuttles/emergency_supermatter.dmm
@@ -56,18 +56,14 @@
/turf/open/floor/noslip,
/area/shuttle/escape)
"am" = (
-/obj/structure/reflector/single{
- anchored = 1
- },
+/obj/structure/reflector/single/anchored,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/open/floor/plating,
/area/shuttle/escape)
"an" = (
-/obj/structure/reflector/box{
- anchored = 1
- },
+/obj/structure/reflector/box/anchored,
/turf/open/floor/plating,
/area/shuttle/escape)
"ao" = (
@@ -221,15 +217,11 @@
/turf/open/floor/plating/airless,
/area/shuttle/escape)
"aN" = (
-/obj/structure/reflector/single{
- anchored = 1
- },
+/obj/structure/reflector/single/anchored,
/turf/open/floor/plating/airless,
/area/shuttle/escape)
"aO" = (
-/obj/structure/reflector/double{
- anchored = 1
- },
+/obj/structure/reflector/double/anchored,
/turf/open/floor/plating/airless,
/area/shuttle/escape)
"aP" = (
diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm
index 2ed07a1004..40ca9e23cf 100644
--- a/_maps/shuttles/whiteship_meta.dmm
+++ b/_maps/shuttles/whiteship_meta.dmm
@@ -131,12 +131,12 @@
"aq" = (
/obj/structure/closet/wardrobe/mixed,
/obj/item/clothing/under/rank/centcom_officer{
- desc = "A badge on the arm indicates that it's meant to be worn by Centcom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
- name = "\improper dusty old Centcom jumpsuit"
+ desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
+ name = "\improper dusty old CentCom jumpsuit"
},
/obj/item/clothing/under/rank/centcom_commander{
- desc = "A badge on the arm indicates that it's meant to be worn by Centcom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
- name = "\improper dusty old Centcom jumpsuit"
+ desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
+ name = "\improper dusty old CentCom jumpsuit"
},
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
diff --git a/apc_repair.dmi b/apc_repair.dmi
new file mode 100644
index 0000000000..6e861eef61
Binary files /dev/null and b/apc_repair.dmi differ
diff --git a/code/__DATASTRUCTURES/linked_lists.dm b/code/__DATASTRUCTURES/linked_lists.dm
index eccc3c422a..1d2e8d78a6 100644
--- a/code/__DATASTRUCTURES/linked_lists.dm
+++ b/code/__DATASTRUCTURES/linked_lists.dm
@@ -78,7 +78,7 @@
//If you specify a value the FIRST ONE is removed
/datum/linked_list/proc/Remove(node)
var/datum/linked_node/removing
- if(istype(node,/datum/linked_node))
+ if(istype(node, /datum/linked_node))
removing = node
else
//optimise removing head and tail, no point looping for them, especially the tail
diff --git a/code/__DEFINES/DNA.dm.rej b/code/__DEFINES/DNA.dm.rej
deleted file mode 100644
index 343dc1f7a0..0000000000
--- a/code/__DEFINES/DNA.dm.rej
+++ /dev/null
@@ -1,9 +0,0 @@
-diff a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm (rejected hunks)
-@@ -114,4 +114,6 @@
- #define EASYLIMBATTACHMENT 23
- #define TOXINLOVER 24
- #define DIGITIGRADE 25 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi)
--#define NO_UNDERWEAR 26
-+#define NO_UNDERWEAR 26
-+#define NOLIVER 27
-+#define NOSTOMACH 28
diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm
index e557a55e7c..2e93a2a63c 100644
--- a/code/__DEFINES/access.dm
+++ b/code/__DEFINES/access.dm
@@ -76,7 +76,7 @@
#define ACCESS_CENT_STORAGE 106//Generic storage areas.
#define ACCESS_CENT_TELEPORTER 107//Teleporter.
#define ACCESS_CENT_CAPTAIN 109//Captain's office/ID comp/AI.
-#define ACCESS_CENT_BAR 110 // The non-existent Centcom Bar
+#define ACCESS_CENT_BAR 110 // The non-existent CentCom Bar
//The Syndicate
#define ACCESS_SYNDICATE 150//General Syndicate Access
@@ -93,4 +93,9 @@
#define ACCESS_AWAY_GENERIC1 205//Away generic access
#define ACCESS_AWAY_GENERIC2 206
#define ACCESS_AWAY_GENERIC3 207
-#define ACCESS_AWAY_GENERIC4 208
\ No newline at end of file
+#define ACCESS_AWAY_GENERIC4 208
+
+ //Special, for anything that's basically internal
+#define ACCESS_BLOODCULT 250
+#define ACCESS_CLOCKCULT 251
+
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index d3937d50bb..da945e52e6 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -50,7 +50,7 @@
#define ADMIN_SM(user) "(SM)"
#define ADMIN_TP(user) "(TP)"
#define ADMIN_KICK(user) "(KICK)"
-#define ADMIN_CENTCOM_REPLY(user) "(RPLY)"
+#define ADMIN_CENTCOM_REPLY(user) "(RPLY)"
#define ADMIN_SYNDICATE_REPLY(user) "(RPLY)"
#define ADMIN_SC(user) "(SC)"
#define ADMIN_SMITE(user) "(SMITE)"
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index 5ce803fa3c..a79850b04f 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -67,8 +67,8 @@
#define PLASMA_MINIMUM_OXYGEN_NEEDED 2
#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30
#define PLASMA_OXYGEN_FULLBURN 10
-#define MIN_PLASMA_DAMAGE 1
-#define MAX_PLASMA_DAMAGE 10
+#define MIN_TOXIC_GAS_DAMAGE 1
+#define MAX_TOXIC_GAS_DAMAGE 10
#define MOLES_PLASMA_VISIBLE 0.5 //Moles in a standard cell after which plasma is visible
//Plasma fusion properties
#define PLASMA_BINDING_ENERGY 3000000
diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm
index 3a2534c00b..8a107c23ee 100644
--- a/code/__DEFINES/atom_hud.dm
+++ b/code/__DEFINES/atom_hud.dm
@@ -40,6 +40,7 @@
#define ANTAG_HUD_SINTOUCHED 16
#define ANTAG_HUD_SOULLESS 17
#define ANTAG_HUD_CLOCKWORK 18
+#define ANTAG_HUD_BORER 19
// Notification action types
#define NOTIFY_JUMP "jump"
diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm
index c74bf9c61e..0bedf57620 100644
--- a/code/__DEFINES/clockcult.dm
+++ b/code/__DEFINES/clockcult.dm
@@ -7,6 +7,7 @@
GLOBAL_VAR_INIT(clockwork_construction_value, 0) //The total value of all structures built by the clockwork cult
GLOBAL_VAR_INIT(clockwork_caches, 0) //How many clockwork caches exist in the world (not each individual)
+GLOBAL_VAR_INIT(clockwork_vitality, 0) //How much Vitality is stored, total
GLOBAL_LIST_EMPTY(active_daemons) //A list of all active tinkerer's daemons
GLOBAL_LIST_EMPTY(all_clockwork_objects) //All clockwork items, structures, and effects in existence
GLOBAL_LIST_EMPTY(all_clockwork_mobs) //All clockwork SERVANTS (not creatures) in existence
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 6ca2d80974..c088e81c4a 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -1,147 +1,150 @@
-/*ALL DEFINES RELATED TO COMBAT GO HERE*/
-
-//Damage and status effect defines
-
-//Damage defines //TODO: merge these down to reduce on defines
-#define BRUTE "brute"
-#define BURN "fire"
-#define TOX "tox"
-#define OXY "oxy"
-#define CLONE "clone"
-#define STAMINA "stamina"
-//citadel code
-#define AROUSAL "arousal"
-
-//bitflag damage defines used for suicide_act
-#define BRUTELOSS 1
-#define FIRELOSS 2
-#define TOXLOSS 4
-#define OXYLOSS 8
-#define SHAME 16
-//citadel code
-#define AROUSAL 32
-
-#define STUN "stun"
-#define KNOCKDOWN "knockdown"
-#define UNCONSCIOUS "unconscious"
-#define IRRADIATE "irradiate"
-#define STUTTER "stutter"
-#define SLUR "slur"
-#define EYE_BLUR "eye_blur"
-#define DROWSY "drowsy"
-#define JITTER "jitter"
-
-//Bitflags defining which status effects could be or are inflicted on a mob
-#define CANSTUN 1
-#define CANKNOCKDOWN 2
-#define CANUNCONSCIOUS 4
-#define CANPUSH 8
-#define IGNORESLOWDOWN 16
-#define GOTTAGOFAST 32
-#define GOTTAGOREALLYFAST 64
-#define GODMODE 4096
-#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath
-#define DISFIGURED 16384 //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system
-#define XENO_HOST 32768 //Tracks whether we're gonna be a baby alien's mummy.
-
-//Health Defines
-#define HEALTH_THRESHOLD_CRIT 0
-#define HEALTH_THRESHOLD_DEAD -100
-
-//Actual combat defines
-
-//click cooldowns, in tenths of a second, used for various combat actions
-#define CLICK_CD_MELEE 8
-#define CLICK_CD_RANGE 4
-#define CLICK_CD_RAPID 2
-#define CLICK_CD_CLICK_ABILITY 6
-#define CLICK_CD_BREAKOUT 100
-#define CLICK_CD_HANDCUFFED 10
-#define CLICK_CD_RESIST 20
-#define CLICK_CD_GRABBING 10
-
-//Cuff resist speeds
-#define FAST_CUFFBREAK 1
-#define INSTANT_CUFFBREAK 2
-
-//Grab levels
-#define GRAB_PASSIVE 0
-#define GRAB_AGGRESSIVE 1
-#define GRAB_NECK 2
-#define GRAB_KILL 3
-
-//Attack types for checking shields/hit reactions
-#define MELEE_ATTACK 1
-#define UNARMED_ATTACK 2
-#define PROJECTILE_ATTACK 3
-#define THROWN_PROJECTILE_ATTACK 4
-#define LEAP_ATTACK 5
-
-//attack visual effects
-#define ATTACK_EFFECT_PUNCH "punch"
-#define ATTACK_EFFECT_KICK "kick"
-#define ATTACK_EFFECT_SMASH "smash"
-#define ATTACK_EFFECT_CLAW "claw"
-#define ATTACK_EFFECT_DISARM "disarm"
-#define ATTACK_EFFECT_BITE "bite"
-#define ATTACK_EFFECT_MECHFIRE "mech_fire"
-#define ATTACK_EFFECT_MECHTOXIN "mech_toxin"
-#define ATTACK_EFFECT_BOOP "boop" //Honk
-
-//intent defines
-#define INTENT_HELP "help"
-#define INTENT_GRAB "grab"
-#define INTENT_DISARM "disarm"
-#define INTENT_HARM "harm"
-//NOTE: INTENT_HOTKEY_* defines are not actual intents!
-//they are here to support hotkeys
-#define INTENT_HOTKEY_LEFT "left"
-#define INTENT_HOTKEY_RIGHT "right"
-
-//the define for visible message range in combat
-#define COMBAT_MESSAGE_RANGE 3
-
-//Combat object defines
-
-//Embedded objects
-#define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user)
-#define EMBEDDED_ITEM_FALLOUT 5 //Chance for embedded object to fall out (causing pain but removing the object)
-#define EMBED_CHANCE 45 //Chance for an object to embed into somebody when thrown (if it's sharp)
-#define EMBEDDED_PAIN_MULTIPLIER 2 //Coefficient of multiplication for the damage the item does while embedded (this*item.w_class)
-#define EMBEDDED_FALL_PAIN_MULTIPLIER 5 //Coefficient of multiplication for the damage the item does when it falls out (this*item.w_class)
-#define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4 //Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class)
-#define EMBED_THROWSPEED_THRESHOLD 4 //The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1)
-#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class)
-#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class)
-
-//Gun Stuff
-#define SAWN_INTACT 0
-#define SAWN_OFF 1
-//Gun weapon weight
-#define WEAPON_DUAL_WIELD 0
-#define WEAPON_LIGHT 1
-#define WEAPON_MEDIUM 2
-#define WEAPON_HEAVY 3
-//Gun trigger guards
-#define TRIGGER_GUARD_ALLOW_ALL -1
-#define TRIGGER_GUARD_NONE 0
-#define TRIGGER_GUARD_NORMAL 1
-
-//Object/Item sharpness
-#define IS_BLUNT 0
-#define IS_SHARP 1
-#define IS_SHARP_ACCURATE 2
-
-//His Grace.
-#define HIS_GRACE_SATIATED 0 //He hungers not. If bloodthirst is set to this, His Grace is asleep.
-#define HIS_GRACE_PECKISH 20 //Slightly hungry.
-#define HIS_GRACE_HUNGRY 60 //Getting closer. Increases damage up to a minimum of 20.
-#define HIS_GRACE_FAMISHED 100 //Dangerous. Increases damage up to a minimum of 25 and cannot be dropped.
-#define HIS_GRACE_STARVING 120 //Incredibly close to breaking loose. Increases damage up to a minimum of 30.
-#define HIS_GRACE_CONSUME_OWNER 140 //His Grace consumes His owner at this point and becomes aggressive.
-#define HIS_GRACE_FALL_ASLEEP 160 //If it reaches this point, He falls asleep and resets.
-
-#define HIS_GRACE_FORCE_BONUS 4 //How much force is gained per kill.
+/*ALL DEFINES RELATED TO COMBAT GO HERE*/
+
+//Damage and status effect defines
+
+//Damage defines //TODO: merge these down to reduce on defines
+#define BRUTE "brute"
+#define BURN "fire"
+#define TOX "tox"
+#define OXY "oxy"
+#define CLONE "clone"
+#define STAMINA "stamina"
+#define BRAIN "brain"
+
+//Citadel code
+#define AROUSAL "arousal"
+
+//bitflag damage defines used for suicide_act
+#define BRUTELOSS 1
+#define FIRELOSS 2
+#define TOXLOSS 4
+#define OXYLOSS 8
+#define SHAME 16
+
+//Citadel code
+#define AROUSAL 32
+
+#define STUN "stun"
+#define KNOCKDOWN "knockdown"
+#define UNCONSCIOUS "unconscious"
+#define IRRADIATE "irradiate"
+#define STUTTER "stutter"
+#define SLUR "slur"
+#define EYE_BLUR "eye_blur"
+#define DROWSY "drowsy"
+#define JITTER "jitter"
+
+//Bitflags defining which status effects could be or are inflicted on a mob
+#define CANSTUN 1
+#define CANKNOCKDOWN 2
+#define CANUNCONSCIOUS 4
+#define CANPUSH 8
+#define IGNORESLOWDOWN 16
+#define GOTTAGOFAST 32
+#define GOTTAGOREALLYFAST 64
+#define GODMODE 4096
+#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath
+#define DISFIGURED 16384 //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system
+#define XENO_HOST 32768 //Tracks whether we're gonna be a baby alien's mummy.
+
+//Health Defines
+#define HEALTH_THRESHOLD_CRIT 0
+#define HEALTH_THRESHOLD_DEAD -100
+
+//Actual combat defines
+
+//click cooldowns, in tenths of a second, used for various combat actions
+#define CLICK_CD_MELEE 8
+#define CLICK_CD_RANGE 4
+#define CLICK_CD_RAPID 2
+#define CLICK_CD_CLICK_ABILITY 6
+#define CLICK_CD_BREAKOUT 100
+#define CLICK_CD_HANDCUFFED 10
+#define CLICK_CD_RESIST 20
+#define CLICK_CD_GRABBING 10
+
+//Cuff resist speeds
+#define FAST_CUFFBREAK 1
+#define INSTANT_CUFFBREAK 2
+
+//Grab levels
+#define GRAB_PASSIVE 0
+#define GRAB_AGGRESSIVE 1
+#define GRAB_NECK 2
+#define GRAB_KILL 3
+
+//Attack types for checking shields/hit reactions
+#define MELEE_ATTACK 1
+#define UNARMED_ATTACK 2
+#define PROJECTILE_ATTACK 3
+#define THROWN_PROJECTILE_ATTACK 4
+#define LEAP_ATTACK 5
+
+//attack visual effects
+#define ATTACK_EFFECT_PUNCH "punch"
+#define ATTACK_EFFECT_KICK "kick"
+#define ATTACK_EFFECT_SMASH "smash"
+#define ATTACK_EFFECT_CLAW "claw"
+#define ATTACK_EFFECT_DISARM "disarm"
+#define ATTACK_EFFECT_BITE "bite"
+#define ATTACK_EFFECT_MECHFIRE "mech_fire"
+#define ATTACK_EFFECT_MECHTOXIN "mech_toxin"
+#define ATTACK_EFFECT_BOOP "boop" //Honk
+
+//intent defines
+#define INTENT_HELP "help"
+#define INTENT_GRAB "grab"
+#define INTENT_DISARM "disarm"
+#define INTENT_HARM "harm"
+//NOTE: INTENT_HOTKEY_* defines are not actual intents!
+//they are here to support hotkeys
+#define INTENT_HOTKEY_LEFT "left"
+#define INTENT_HOTKEY_RIGHT "right"
+
+//the define for visible message range in combat
+#define COMBAT_MESSAGE_RANGE 3
+
+//Combat object defines
+
+//Embedded objects
+#define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user)
+#define EMBEDDED_ITEM_FALLOUT 5 //Chance for embedded object to fall out (causing pain but removing the object)
+#define EMBED_CHANCE 45 //Chance for an object to embed into somebody when thrown (if it's sharp)
+#define EMBEDDED_PAIN_MULTIPLIER 2 //Coefficient of multiplication for the damage the item does while embedded (this*item.w_class)
+#define EMBEDDED_FALL_PAIN_MULTIPLIER 5 //Coefficient of multiplication for the damage the item does when it falls out (this*item.w_class)
+#define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4 //Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class)
+#define EMBED_THROWSPEED_THRESHOLD 4 //The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1)
+#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class)
+#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class)
+
+//Gun Stuff
+#define SAWN_INTACT 0
+#define SAWN_OFF 1
+//Gun weapon weight
+#define WEAPON_DUAL_WIELD 0
+#define WEAPON_LIGHT 1
+#define WEAPON_MEDIUM 2
+#define WEAPON_HEAVY 3
+//Gun trigger guards
+#define TRIGGER_GUARD_ALLOW_ALL -1
+#define TRIGGER_GUARD_NONE 0
+#define TRIGGER_GUARD_NORMAL 1
+
+//Object/Item sharpness
+#define IS_BLUNT 0
+#define IS_SHARP 1
+#define IS_SHARP_ACCURATE 2
+
+//His Grace.
+#define HIS_GRACE_SATIATED 0 //He hungers not. If bloodthirst is set to this, His Grace is asleep.
+#define HIS_GRACE_PECKISH 20 //Slightly hungry.
+#define HIS_GRACE_HUNGRY 60 //Getting closer. Increases damage up to a minimum of 20.
+#define HIS_GRACE_FAMISHED 100 //Dangerous. Increases damage up to a minimum of 25 and cannot be dropped.
+#define HIS_GRACE_STARVING 120 //Incredibly close to breaking loose. Increases damage up to a minimum of 30.
+#define HIS_GRACE_CONSUME_OWNER 140 //His Grace consumes His owner at this point and becomes aggressive.
+#define HIS_GRACE_FALL_ASLEEP 160 //If it reaches this point, He falls asleep and resets.
+
+#define HIS_GRACE_FORCE_BONUS 4 //How much force is gained per kill.
#define EXPLODE_NONE 0 //Don't even ask me why we need this.
#define EXPLODE_DEVASTATE 1
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 243b47b004..c615370a44 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -1,6 +1,6 @@
// simple is_type and similar inline helpers
-#define islist(L) (istype(L,/list))
+#define islist(L) (istype(L, /list))
#define in_range(source, user) (get_dist(source, user) <= 1)
diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm
index 9d2ad314e5..084cc7d1ab 100644
--- a/code/__DEFINES/maps.dm
+++ b/code/__DEFINES/maps.dm
@@ -5,7 +5,7 @@ Names of z-level do not matter, but order does greatly, for instances such as ch
current as of 2016/6/2
z1 = station
-z2 = centcomm
+z2 = centcom
z5 = mining
Everything else = randomized space
Last space-z level = empty
@@ -16,7 +16,7 @@ Last space-z level = empty
#define UNAFFECTED 0
#define MAIN_STATION "Main Station"
-#define CENTCOMM "CentComm"
+#define CENTCOM "CentCom"
#define EMPTY_AREA_1 "Empty Area 1"
#define EMPTY_AREA_2 "Empty Area 2"
#define MINING "Mining Asteroid"
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index dcad7f531e..6a932ead4a 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -46,8 +46,8 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
//Human Overlays Indexes/////////
//citadel code
#define MUTATIONS_LAYER 30 //mutations. Tk headglows, cold resistance glow, etc
-#define BODY_BEHIND_LAYER 29 //certain mutantrace features (tail when looking south) that must appear behind the body parts
-#define GENITALS_BEHIND_LAYER 28
+#define GENITALS_BEHIND_LAYER 29 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer
+#define BODY_BEHIND_LAYER 28 //certain mutantrace features (tail when looking south) that must appear behind the body parts
#define BODYPARTS_LAYER 27 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
#define BODY_ADJ_LAYER 26 //certain mutantrace features (snout, body markings) that must appear above the body parts
#define GENITALS_ADJ_LAYER 25
@@ -167,10 +167,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define GAME_STATE_SETTING_UP 2
#define GAME_STATE_PLAYING 3
#define GAME_STATE_FINISHED 4
-//SOUND:
-#define SOUND_MINIMUM_PRESSURE 10
-#define FALLOFF_SOUNDS 1
-#define SURROUND_CAP 7
//FONTS:
// Used by Paper and PhotoCopier (and PaperBin once a year).
diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm
index c495ee3b4a..196e051b64 100644
--- a/code/__DEFINES/shuttles.dm
+++ b/code/__DEFINES/shuttles.dm
@@ -22,7 +22,7 @@
#define SHUTTLE_ALREADY_DOCKED "we_are_already_docked"
#define SHUTTLE_SOMEONE_ELSE_DOCKED "someone_else_docked"
-//Launching Shuttles to Centcomm
+//Launching Shuttles to CentCom
#define NOLAUNCH -1
#define UNLAUNCHED 0
#define ENDGAME_LAUNCHED 1
diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm
index 6dc43fb959..620d8bed10 100644
--- a/code/__DEFINES/sound.dm
+++ b/code/__DEFINES/sound.dm
@@ -5,6 +5,9 @@
#define CHANNEL_JUKEBOX 1021
#define CHANNEL_JUSTICAR_ARK 1020
#define CHANNEL_HEARTBEAT 1019 //sound channel for heartbeats
+#define CHANNEL_AMBIENCE 1018
+#define CHANNEL_BUZZ 1017
+#define CHANNEL_BICYCLE 1016
//Citadel code
#define CHANNEL_PRED 1018
@@ -12,5 +15,8 @@
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
//KEEP IT UPDATED
-#define CHANNEL_HIGHEST_AVAILABLE 1017
+#define CHANNEL_HIGHEST_AVAILABLE 1015
+#define CHANNEL_HIGHEST_AVAILABLE 1017
+#define SOUND_MINIMUM_PRESSURE 10
+#define FALLOFF_SOUNDS 0.5
diff --git a/code/__HELPERS/AStar.dm b/code/__HELPERS/AStar.dm
index 3cf4fb54cc..1d165d2102 100644
--- a/code/__HELPERS/AStar.dm
+++ b/code/__HELPERS/AStar.dm
@@ -175,6 +175,9 @@ Actual Adjacent procs :
for(var/obj/structure/window/W in src)
if(!W.CanAStarPass(ID, adir))
return 1
+ for(var/obj/machinery/door/window/W in src)
+ if(!W.CanAStarPass(ID, adir))
+ return 1
for(var/obj/O in T)
if(!O.CanAStarPass(ID, rdir, caller))
return 1
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index b3b88a6276..9c64fb8b74 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -89,12 +89,25 @@
return
//returns a new list with only atoms that are in typecache L
-//if reversed, return a new list with only atoms that aren't in typecache L
-/proc/typecache_filter_list(list/atoms, list/typecache, reversed)
+/proc/typecache_filter_list(list/atoms, list/typecache)
. = list()
- for (var/thing in atoms)
+ for(var/thing in atoms)
var/atom/A = thing
- if(typecache[A.type] != reversed) //This assumes typecache[A.type] is either null or TRUE. God help you if it's FALSE
+ if (typecache[A.type])
+ . += A
+
+/proc/typecache_filter_list_reverse(list/atoms, list/typecache)
+ . = list()
+ for(var/thing in atoms)
+ var/atom/A = thing
+ if(!typecache[A.type])
+ . += A
+
+/proc/typecache_filter_multi_list_exclusion(list/atoms, list/typecache_include, list/typecache_exclude)
+ . = list()
+ for(var/thing in atoms)
+ var/atom/A = thing
+ if(typecache_include[A.type] && !typecache_exclude[A.type])
. += A
//Like typesof() or subtypesof(), but returns a typecache instead of a list
@@ -171,7 +184,11 @@
result = first ^ second
return result
-//Pretends to pick an element based on its weight but really just seems to pick a random element.
+//Picks a random element from a list based on a weighting system:
+//1. Adds up the total of weights for each element
+//2. Gets a number between 1 and that total
+//3. For each element in the list, subtracts its weighting from that number
+//4. If that makes the number 0 or less, return that element.
/proc/pickweight(list/L)
var/total = 0
var/item
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 92d5dcbd80..1af231f893 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -48,6 +48,11 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, GLOB.xeno_dorsal_list)
//genitals
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list)
+
+ for(var/K in GLOB.cock_shapes_list)
+ var/datum/sprite_accessory/penis/value = GLOB.cock_shapes_list[K]
+ GLOB.cock_shapes_icons[K] = value.icon_state
+
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
GLOB.breasts_size_list = list("a","b","c","d","e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index b2a9260ce1..04ea69a43f 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -968,32 +968,28 @@ GLOBAL_LIST_EMPTY(friendly_animal_types)
/image/proc/setDir(newdir)
dir = newdir
-/atom/proc/freeze_icon_index()
- return "\ref[initial(icon)]-[initial(icon_state)]"
+#define FROZEN_RED_COLOR "#2E5E69"
+#define FROZEN_GREEN_COLOR "#60A2A8"
+#define FROZEN_BLUE_COLOR "#A1AFB1"
/obj/proc/make_frozen_visual()
// Used to make the frozen item visuals for Freon.
- var/static/list/freeze_item_icons = list()
if(resistance_flags & FREEZE_PROOF)
return
- if(!HAS_SECONDARY_FLAG(src, FROZEN) && (initial(icon) && initial(icon_state)))
- var/index = freeze_icon_index()
- var/icon/IC
- var/icon/P = freeze_item_icons[index]
- if(!P)
- P = new /icon
- for(var/iconstate in icon_states(icon))
- var/icon/O = new('icons/effects/freeze.dmi', "ice_cube")
- IC = new(icon, iconstate)
- O.Blend(IC, ICON_ADD)
- P.Insert(O, iconstate)
- freeze_item_icons[index] = P
- icon = P
+ if(!HAS_SECONDARY_FLAG(src, FROZEN))
name = "frozen [name]"
+ add_atom_colour(list(FROZEN_RED_COLOR, FROZEN_GREEN_COLOR, FROZEN_BLUE_COLOR, rgb(0,0,0)), TEMPORARY_COLOUR_PRIORITY)
+ alpha -= 25
SET_SECONDARY_FLAG(src, FROZEN)
//Assumes already frozed
/obj/proc/make_unfrozen()
- icon = initial(icon)
- name = replacetext(name, "frozen ", "")
- CLEAR_SECONDARY_FLAG(src, FROZEN)
+ if(HAS_SECONDARY_FLAG(src, FROZEN))
+ name = replacetext(name, "frozen ", "")
+ remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, list(FROZEN_RED_COLOR, FROZEN_GREEN_COLOR, FROZEN_BLUE_COLOR, rgb(0,0,0)))
+ alpha += 25
+ CLEAR_SECONDARY_FLAG(src, FROZEN)
+
+#undef FROZEN_RED_COLOR
+#undef FROZEN_GREEN_COLOR
+#undef FROZEN_BLUE_COLOR
diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm
index c5e3a97218..41d2f721f5 100644
--- a/code/__HELPERS/maths.dm
+++ b/code/__HELPERS/maths.dm
@@ -182,3 +182,41 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4,
gaussian_next = R2 * working
return (mean + stddev * R1)
#undef ACCURACY
+
+/proc/mouse_angle_from_client(client/client)
+ var/list/mouse_control = params2list(client.mouseParams)
+ if(mouse_control["screen-loc"])
+ var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",")
+ var/list/screen_loc_X = splittext(screen_loc_params[1],":")
+ var/list/screen_loc_Y = splittext(screen_loc_params[2],":")
+ var/x = (text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32)
+ var/y = (text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32)
+ var/screenview = (client.view * 2 + 1) * world.icon_size //Refer to http://www.byond.com/docs/ref/info.html#/client/var/view for mad maths
+ var/ox = round(screenview/2) - client.pixel_x //"origin" x
+ var/oy = round(screenview/2) - client.pixel_y //"origin" y
+ var/angle = NORM_ROT(Atan2(y - oy, x - ox))
+ return angle
+
+/proc/get_turf_in_angle(angle, turf/starting, increments)
+ var/pixel_x = 0
+ var/pixel_y = 0
+ for(var/i in 1 to increments)
+ pixel_x += sin(angle)+16*sin(angle)*2
+ pixel_y += cos(angle)+16*cos(angle)*2
+ var/new_x = starting.x
+ var/new_y = starting.y
+ while(pixel_x > 16)
+ pixel_x -= 32
+ new_x++
+ while(pixel_x < -16)
+ pixel_x += 32
+ new_x--
+ while(pixel_y > 16)
+ pixel_y -= 32
+ new_y++
+ while(pixel_y < -16)
+ pixel_y += 32
+ new_y--
+ new_x = Clamp(new_x, 0, world.maxx)
+ new_y = Clamp(new_y, 0, world.maxy)
+ return locate(new_x, new_y, starting.z)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 7c6746f477..924f8daf08 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -116,6 +116,7 @@
"xenohead" = "None",
"xenotail" = "None",
"exhibitionist" = FALSE,
+ "genitals_use_skintone" = FALSE,
"has_cock" = FALSE,
"cock_shape" = pick(GLOB.cock_shapes_list),
"cock_length" = 6,
@@ -158,8 +159,9 @@
"womb_cum_rate" = CUM_RATE,
"womb_cum_mult" = CUM_RATE_MULT,
"womb_efficiency" = CUM_EFFICIENCY,
- "womb_fluid" = "femcum"))
-
+ "womb_fluid" = "femcum",
+ "flavor_text" = ""))
+
/proc/random_hair_style(gender)
switch(gender)
if(MALE)
diff --git a/code/__HELPERS/sorts/__main.dm b/code/__HELPERS/sorts/__main.dm
index 7da17da503..c7ccfa97d7 100644
--- a/code/__HELPERS/sorts/__main.dm
+++ b/code/__HELPERS/sorts/__main.dm
@@ -8,7 +8,7 @@
//When we get into galloping mode, we stay there until both runs win less often than MIN_GALLOP consecutive times.
#define MIN_GALLOP 7
- //This is a global instance to allow much of this code to be reused. The interfaces are kept seperately
+ //This is a global instance to allow much of this code to be reused. The interfaces are kept separately
GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new())
/datum/sortInstance
//The array being sorted.
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index b743907982..aab766f9e4 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -48,7 +48,7 @@ Location where the teleport begins, target that will teleport, distance to go, d
Random error in tile placement x, error in tile placement y, and block offset.
Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc.
Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive.
-Turf and target are seperate in case you want to teleport some distance from a turf the target is not standing on or something.
+Turf and target are separate in case you want to teleport some distance from a turf the target is not standing on or something.
*/
var/dirx = 0//Generic location finding variable.
@@ -491,17 +491,26 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/y=arcsin(x/sqrt(1+x*x))
return y
-/atom/proc/GetAllContents()
+/atom/proc/GetAllContents(list/ignore_typecache)
var/list/processing_list = list(src)
var/list/assembled = list()
+ if(ignore_typecache) //If there's a typecache, use it.
+ while(processing_list.len)
+ var/atom/A = processing_list[1]
+ processing_list -= A
+ if(ignore_typecache[A.type])
+ continue
+ processing_list |= (A.contents - assembled)
+ assembled |= A
- while(processing_list.len)
- var/atom/A = processing_list[1]
- processing_list -= A
+ else //If there's none, only make this check once for performance.
+ while(processing_list.len)
+ var/atom/A = processing_list[1]
+ processing_list -= A
- processing_list |= (A.contents - assembled)
+ processing_list |= (A.contents - assembled)
- assembled |= A
+ assembled |= A
return assembled
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 3f0d6cab80..9ad2d6c969 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -20,7 +20,7 @@ GLOBAL_LIST_EMPTY(tech_list) //list of all /datum/tech datums indexed by id.
GLOBAL_LIST_EMPTY(surgeries_list) //list of all surgeries by name, associated with their path.
GLOBAL_LIST_EMPTY(crafting_recipes) //list of all table craft recipes
GLOBAL_LIST_EMPTY(rcd_list) //list of Rapid Construction Devices.
-GLOBAL_LIST_EMPTY(apcs_list) //list of all Area Power Controller machines, seperate from machines for powernet speeeeeeed.
+GLOBAL_LIST_EMPTY(apcs_list) //list of all Area Power Controller machines, separate from machines for powernet speeeeeeed.
GLOBAL_LIST_EMPTY(tracked_implants) //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented...
GLOBAL_LIST_EMPTY(tracked_chem_implants) //list of implants the prisoner console can track and send inject commands too
GLOBAL_LIST_EMPTY(poi_list) //list of points of interest for observe/follow
diff --git a/code/_onclick/autoclick.dm b/code/_onclick/autoclick.dm
index 23d07e2968..29a704ee7a 100644
--- a/code/_onclick/autoclick.dm
+++ b/code/_onclick/autoclick.dm
@@ -24,17 +24,6 @@
active_mousedown_item.onMouseUp(object, location, params, mob)
active_mousedown_item = null
-/client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params)
- mouseParams = params
- mouseLocation = over_location
- mouseObject = over_object
- mouseControlObject = over_control
- if(selected_target[1] && over_object && over_object.IsAutoclickable())
- selected_target[1] = over_object
- selected_target[2] = params
- if(active_mousedown_item)
- active_mousedown_item.onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
-
/mob/proc/CanMobAutoclick(object, location, params)
/mob/living/carbon/CanMobAutoclick(atom/object, location, params)
@@ -63,9 +52,6 @@
/obj/item/proc/onMouseUp(object, location, params, mob)
return
-/obj/item/proc/onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
- return
-
/obj/item
var/canMouseDown = FALSE
@@ -90,3 +76,23 @@
mouseLocation = location
mouseObject = object
mouseControlObject = control
+ if(mob && LAZYLEN(mob.mousemove_intercept_objects))
+ for(var/obj/item/I in mob.mousemove_intercept_objects)
+ I.onMouseMove(object, location, control, params)
+
+/obj/item/proc/onMouseMove(object, location, control, params)
+ return
+
+/client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params)
+ mouseParams = params
+ mouseLocation = over_location
+ mouseObject = over_object
+ mouseControlObject = over_control
+ if(selected_target[1] && over_object && over_object.IsAutoclickable())
+ selected_target[1] = over_object
+ selected_target[2] = params
+ if(active_mousedown_item)
+ active_mousedown_item.onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
+
+/obj/item/proc/onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
+ return
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 5c47e1f44d..7e38d59998 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -95,7 +95,7 @@
if(!modifiers["catcher"] && A.IsObscured())
return
- if(istype(loc,/obj/mecha))
+ if(istype(loc, /obj/mecha))
var/obj/mecha/M = loc
return M.click_action(A,src,params)
@@ -432,14 +432,26 @@
/obj/screen/click_catcher
icon = 'icons/mob/screen_gen.dmi'
- icon_state = "click_catcher"
+ icon_state = "flash"
plane = CLICKCATCHER_PLANE
mouse_opacity = 2
screen_loc = "CENTER"
-/obj/screen/click_catcher/New()
- ..()
- transform = matrix(200, 0, 0, 0, 200, 0)
+/obj/screen/click_catcher/proc/UpdateGreed(view_size_x = 7, view_size_y = 7)
+ var/icon/newicon = icon('icons/mob/screen_gen.dmi', "flash")
+ if(view_size_x > 16 || view_size_y > 16)
+ newicon.Scale((16 * 2 + 1) * world.icon_size,(16 * 2 + 1) * world.icon_size)
+ icon = newicon
+ var/tx = view_size_x/16
+ var/ty = view_size_y/16
+ var/matrix/M = new
+ M.Scale(tx, ty)
+ transform = M
+ screen_loc = "CENTER-16,CENTER-16"
+ else
+ screen_loc = "CENTER-[view_size_x],CENTER-[view_size_y]"
+ newicon.Scale((view_size_x * 2 + 1) * world.icon_size,(view_size_y * 2 + 1) * world.icon_size)
+ icon = newicon
/obj/screen/click_catcher/Click(location, control, params)
var/list/modifiers = params2list(params)
@@ -453,7 +465,6 @@
T.Click(location, control, params)
. = 1
-
/* MouseWheelOn */
/mob/proc/MouseWheelOn(atom/A, delta_x, delta_y, params)
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index 0fe73bad6e..6ed126cf37 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -56,8 +56,7 @@
var/obj/item/W = get_active_held_item()
- // Cyborgs have no range-checking unless there is item use
- if(!W)
+ if(!W && get_dist(src,A) <= remote_range)
A.attack_robot(src)
return
@@ -106,38 +105,59 @@
/atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlShiftClick(user)
-/obj/machinery/door/airlock/BorgCtrlShiftClick() // Sets/Unsets Emergency Access Override Forwards to AI code.
- AICtrlShiftClick()
+/obj/machinery/door/airlock/BorgCtrlShiftClick(mob/living/silicon/robot/user) // Sets/Unsets Emergency Access Override Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AICtrlShiftClick()
+ else
+ ..()
/atom/proc/BorgShiftClick(mob/living/silicon/robot/user) //forward to human click if not overriden
ShiftClick(user)
-/obj/machinery/door/airlock/BorgShiftClick() // Opens and closes doors! Forwards to AI code.
- AIShiftClick()
+/obj/machinery/door/airlock/BorgShiftClick(mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AIShiftClick()
+ else
+ ..()
/atom/proc/BorgCtrlClick(mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlClick(user)
-/obj/machinery/door/airlock/BorgCtrlClick() // Bolts doors. Forwards to AI code.
- AICtrlClick()
+/obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AICtrlClick()
+ else
+ ..()
-/obj/machinery/power/apc/BorgCtrlClick() // turns off/on APCs. Forwards to AI code.
- AICtrlClick()
+/obj/machinery/power/apc/BorgCtrlClick(mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AICtrlClick()
+ else
+ ..()
-/obj/machinery/turretid/BorgCtrlClick() //turret control on/off. Forwards to AI code.
- AICtrlClick()
+/obj/machinery/turretid/BorgCtrlClick(mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AICtrlClick()
+ else
+ ..()
/atom/proc/BorgAltClick(mob/living/silicon/robot/user)
AltClick(user)
return
-/obj/machinery/door/airlock/BorgAltClick() // Eletrifies doors. Forwards to AI code.
- AIAltClick()
+/obj/machinery/door/airlock/BorgAltClick(mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AIAltClick()
+ else
+ ..()
-/obj/machinery/turretid/BorgAltClick() //turret lethal on/off. Forwards to AI code.
- AIAltClick()
+/obj/machinery/turretid/BorgAltClick(mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code.
+ if(get_dist(src,user) <= user.remote_range)
+ AIAltClick()
+ else
+ ..()
/*
As with AI, these are not used in click code,
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index b792f4399e..e1f1410837 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -109,17 +109,26 @@
//Gas alerts
-/obj/screen/alert/oxy
+/obj/screen/alert/not_enough_oxy
name = "Choking (No O2)"
- desc = "You're not getting enough oxygen. Find some good air before you pass out! \
-The box in your backpack has an oxygen tank and breath mask in it."
- icon_state = "oxy"
+ desc = "You're not getting enough oxygen. Find some good air before you pass out! The box in your backpack has an oxygen tank and breath mask in it."
+ icon_state = "not_enough_oxy"
/obj/screen/alert/too_much_oxy
name = "Choking (O2)"
desc = "There's too much oxygen in the air, and you're breathing it in! Find some good air before you pass out!"
icon_state = "too_much_oxy"
+/obj/screen/alert/not_enough_nitro
+ name = "Choking (No N2)"
+ desc = "You're not getting enough nitrogen. Find some good air before you pass out!"
+ icon_state = "not_enough_nitro"
+
+/obj/screen/alert/too_much_nitro
+ name = "Choking (N2)"
+ desc = "There's too much nitrogen in the air, and you're breathing it in! Find some good air before you pass out!"
+ icon_state = "too_much_nitro"
+
/obj/screen/alert/not_enough_co2
name = "Choking (No CO2)"
desc = "You're not getting enough carbon dioxide. Find some good air before you pass out!"
@@ -135,11 +144,10 @@ The box in your backpack has an oxygen tank and breath mask in it."
desc = "You're not getting enough plasma. Find some good air before you pass out!"
icon_state = "not_enough_tox"
-/obj/screen/alert/tox_in_air
+/obj/screen/alert/too_much_tox
name = "Choking (Plasma)"
- desc = "There's highly flammable, toxic plasma in the air and you're breathing it in. Find some fresh air. \
-The box in your backpack has an oxygen tank and gas mask in it."
- icon_state = "tox_in_air"
+ desc = "There's highly flammable, toxic plasma in the air and you're breathing it in. Find some fresh air. The box in your backpack has an oxygen tank and gas mask in it."
+ icon_state = "too_much_tox"
//End gas alerts
@@ -197,7 +205,7 @@ or something covering your eyes."
/obj/screen/alert/embeddedobject
name = "Embedded Object"
desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \
-If you're feeling frisky, click yourself in help intent to pull the object out."
+If you're feeling frisky, examine yourself and click the underlined item to pull the object out."
icon_state = "embeddedobject"
/obj/screen/alert/embeddedobject/Click()
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 4074d7d3f3..8c1c5a983c 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -145,6 +145,7 @@
return 0
screenmob.client.screen = list()
+ screenmob.client.apply_clickcatcher()
var/display_hud_version = version
if(!display_hud_version) //If 0 or blank, display the next hud version
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index baf233f724..07c17b891f 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -28,7 +28,7 @@
icon_state = "act_equip"
/obj/screen/human/equip/Click()
- if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
+ if(istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech
return 1
var/mob/living/carbon/human/H = usr
H.quick_equip()
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 56d07500e8..14b7323ce3 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -110,7 +110,7 @@
if(usr.incapacitated())
return 1
- if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
+ if(istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech
return 1
if(hud && hud.mymob && slot_id)
@@ -167,7 +167,7 @@
return 1
if(usr.incapacitated() || isobserver(usr))
return 1
- if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
+ if (istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech
return 1
if(hud.mymob.active_hand_index == held_index)
@@ -281,7 +281,7 @@
to_chat(H, "You are now running on internals from the [H.r_store] in your right pocket.")
H.internal = H.r_store
- //Seperate so CO2 jetpacks are a little less cumbersome.
+ //Separate so CO2 jetpacks are a little less cumbersome.
if(!C.internal && istype(C.back, /obj/item/weapon/tank))
to_chat(C, "You are now running on internals from the [C.back] on your back.")
C.internal = C.back
@@ -350,7 +350,7 @@
return 1
if(usr.stat || usr.IsUnconscious() || usr.IsKnockdown() || usr.IsStun())
return 1
- if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
+ if (istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech
return 1
if(master)
var/obj/item/I = usr.get_active_held_item()
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index b9df144ace..f0ba15446c 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -100,7 +100,8 @@
"[name] bites [ML]!")
if(armor >= 2)
return
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
ML.ForceContractDisease(D)
else
ML.visible_message("[src] has attempted to bite [ML]!")
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index d66c8ee359..89803baef6 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -15,6 +15,7 @@
return
new /obj/effect/temp_visual/telekinesis(loc)
user.UnarmedAttack(src,0) // attack_hand, attack_paw, etc
+ add_hiddenprint(user)
return
/obj/attack_tk(mob/user)
@@ -34,6 +35,7 @@
O.tk_user = user
if(O.focus_object(src))
user.put_in_active_hand(O)
+ add_hiddenprint(user)
/mob/attack_tk(mob/user)
return
diff --git a/code/citadel/_cit_helpers.dm b/code/citadel/_cit_helpers.dm
index db0626fa9c..e6dca1e369 100644
--- a/code/citadel/_cit_helpers.dm
+++ b/code/citadel/_cit_helpers.dm
@@ -53,6 +53,7 @@ GLOBAL_LIST_EMPTY(xeno_dorsal_list)
//Genitals and Arousal Lists
GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm
+GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states for cockshapes.
GLOBAL_LIST_EMPTY(breasts_size_list)
GLOBAL_LIST_EMPTY(breasts_shapes_list)
GLOBAL_LIST_EMPTY(vagina_shapes_list)
diff --git a/code/citadel/cit_arousal.dm b/code/citadel/cit_arousal.dm
index 12245c05d5..cf47dab1da 100644
--- a/code/citadel/cit_arousal.dm
+++ b/code/citadel/cit_arousal.dm
@@ -6,7 +6,7 @@
var/arousal_rate = 1 //The base rate that arousal will increase in this mob.
var/arousal_loss_rate = 1 //How easily arousal can be relieved for this mob.
var/canbearoused = FALSE //Mob-level disabler for arousal. Starts off and can be enabled as features are added for different mob types.
- var/mb_cd_length = 50 //5 second cooldown for masturbating because fuck spam
+ var/mb_cd_length = 100 //5 second cooldown for masturbating because fuck spam.
var/mb_cd_timer = 0 //The timer itself
/mob/living/carbon/human
@@ -150,14 +150,14 @@
return 0
var/mob/living/M = usr
if(M.canbearoused)
- M.mob_masturbate()
+ M.mob_climax()
return 1
else
- M << "Arousal is disabled. Feature is unavailable."
+ to_chat(M, "Arousal is disabled. Feature is unavailable.")
-/mob/living/proc/mob_masturbate()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
+/mob/living/proc/mob_climax()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
set name = "Masturbate"
set category = "IC"
if(canbearoused && !restrained() && !stat)
@@ -179,45 +179,93 @@
PoolOrNew(/obj/effect/decal/cleanable/femcum, loc)
*/
else
- src << "You aren't aroused enough for that."
+ to_chat(src, "You aren't aroused enough for that.")
-/mob/living/carbon/human/mob_masturbate()
+/mob/living/carbon/human/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints
if(mb_cd_timer > world.time)
- src << "You need to wait [round((mb_cd_timer - world.time)/(20))] seconds before you can do that again!"
+ if(!forced_climax) //Don't spam the message to the victim if forced to come too fast
+ to_chat(src, "You need to wait [round((mb_cd_timer - world.time)/(20))] seconds before you can do that again!")
return
+ mb_cd_timer = (world.time + mb_cd_length)
var/list/genitals_list = list()
var/obj/item/organ/genital/SG = null//originally selected_genital
var/list/containers_list = list()
var/obj/item/weapon/reagent_containers/SC = null
var/datum/reagents/fluid_source = null
var/into_container = 0
- var/arms = get_num_arms()
- var/free_hands = arms
+ var/free_hands = get_num_arms() //arms was only used to know if we had ANY at all
var/total_cum = 0
var/finished = 0
var/mb_time = 30
- mb_cd_timer = (world.time + mb_cd_length)
if(canbearoused && has_dna())
- if(restrained())
- src << "You can't do that while restrained!"
+ if(stat==2)
+ to_chat(src, "You can't do that while dead!")
return
- if(stat)
- src << "You must be conscious to do that!"
+ if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks
+ for(var/obj/item/organ/genital/G in internal_organs)
+ if(G.can_masturbate_with) //All capable genitals will orgasm with this
+ var/unable_to_come = FALSE
+ switch(G.type)
+ if(/obj/item/organ/genital/penis)
+ var/obj/item/organ/genital/penis/P = G
+ if(!P.linked_balls)
+ unable_to_come = TRUE
+ else
+ fluid_source = P.linked_balls.reagents
+
+
+ if(/obj/item/organ/genital/vagina)
+ var/obj/item/organ/genital/vagina/V = G
+ if(!V.linked_womb)
+ unable_to_come = TRUE
+ else
+ fluid_source = V.linked_womb.reagents
+ else //Weird, undefined genitalia behaviour
+ unable_to_come = TRUE
+
+ if(unable_to_come)
+ src.visible_message("[src] shudders, their [G.name] unable to cum.", \
+ "Your [G.name] cannot cum, giving no relief.", \
+ "Your [G.name] cannot cum, giving no relief.")
+ else
+ if(fluid_source)
+ total_cum = fluid_source.total_volume
+ src.visible_message("[src] looks like they're about to cum.", \
+ "You feel yourself about to orgasm.", \
+ "You feel yourself about to orgasm.")
+ if(do_after(src, mb_time, target = src))
+ if(total_cum > 5)
+ fluid_source.reaction(src.loc, TOUCH, 1, 0)
+ fluid_source.clear_reagents()
+ fluid_source = null //cleanup so this can be used for the next genitalia
+
+ src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
+ "You're forced to cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""] with your [G].", \
+ "Your [G] have been forced to climax.")
+ finished = 1
+ if(finished)
+ setArousalLoss(min_arousal)
+ return //Do not proceed to masturbating if all genitals have been forced to orgasm.
+ if(stat==1) //Sleeping people can be forced chemically or with electrical stimulants, for example.
+ to_chat(src, "You must be conscious to do that!")
+ return
+ if(restrained())
+ to_chat(src, "You can't do that while restrained!")
return
if(getArousalLoss() < 33)//flat number instead of percentage
- src << "You aren't aroused enough for that!"
+ to_chat(src, "You aren't aroused enough for that!")
return
if(!is_groin_exposed())
- src << "You need to undress, first!"
+ to_chat(src, "You need to undress, first!")
return
- if(!arms)
- src << "You need at least one arm."
+ if(!free_hands)
+ to_chat(src, "You need at least one free arm.")
return
for(var/helditem in held_items)//how many hands are free
if(isobj(helditem))
free_hands--
if(free_hands <= 0)
- src << "You need at least one free hand."
+ to_chat(src, "You need at least one free hand.")
return
for(var/obj/item/organ/genital/G in internal_organs)
if(G.can_masturbate_with)//filter out what you can't masturbate with
@@ -240,12 +288,12 @@
if(/obj/item/organ/genital/penis)
var/obj/item/organ/genital/penis/P = SG
if(!P.linked_balls)
- src << "Grow a pair!"
+ to_chat(src, "You need a pair of testicles to do this.")
return
fluid_source = P.linked_balls.reagents
total_cum = fluid_source.total_volume
if(into_container)//into a glass or beaker or whatever
- src.visible_message("[src] starts [pick("jerking off","stroking")] their [SG] over [SC].", \
+ src.visible_message("[src] starts [pick("jerking off","stroking")] their [SG.name] over [SC].", \
"You start jerking off over [SC.name].", \
"You start masturbating.")
if(do_after(src, mb_time, target = src) && in_range(src, SC))
@@ -254,16 +302,71 @@
"You cum into [SC].", \
"You have relieved yourself.")
finished = 1
-
+ else //Not in a container
+ if(src.pulling)
+ if(iscarbon(src.pulling))
+ var/mob/living/carbon/C = src.pulling
+ if(!C.is_groin_exposed())
+ to_chat(src, "You must undress someone to climax inside them.")
+ return
+ if(isliving(src.pulling)) //Gotta be alive to fuck it, don't wanna have to code fucking objects that ain't containers...
+ var/mob/living/partner = src.pulling
+ src.visible_message("[src] is about to climax inside [partner]!", \
+ "You're about to climax inside [partner]!", \
+ "You're preparing to climax inside someone!")
+ switch(grab_state)
+ if(GRAB_PASSIVE)
+ if(do_after(src, mb_time, target = src) && in_range(src, partner))
+ var/spillage = 0.5 //Leaks a bit on passive grab
+ var/did_spill = FALSE
+ fluid_source.trans_to(partner, total_cum*(1-spillage))
+ total_cum = total_cum*spillage
+ if(total_cum > 5)
+ fluid_source.reaction(partner.loc, TOUCH, 1, 0)
+ did_spill = TRUE
+ fluid_source.clear_reagents()
+
+ src.visible_message("[src] ejaculates inside [partner][did_spill ? ", overflowing and spilling":""]!", \
+ "You ejaculate inside [partner][did_spill ? ", spilling out of them":""].", \
+ "You have climaxed inside someone[did_spill ? ", spilling out of them":""].")
+ finished = 1
+ else //Aggressive or higher
+ if(do_after(src, mb_time, target = src) && in_range(src, partner))
+ var/spillage = 0.0 //Leakproofing seals
+ fluid_source.trans_to(partner, total_cum*(1-spillage))
+ total_cum = total_cum*spillage
+ if(total_cum > 5)
+ fluid_source.reaction(partner.loc, TOUCH, 1, 0)
+ fluid_source.clear_reagents()
+
+ src.visible_message("[src] ejaculates inside [partner], spilling nothing!", \
+ "You ejaculate inside [partner], spilling nothing.", \
+ "You have climaxed inside someone, spilling nothing.")
+ finished = 1
+ //Don't care, not coding you fucking a unanchored girder
+ else //No pulling, or pulling non-living things
+ src.visible_message("[src] starts [pick("jerking off","stroking")] their [SG].", \
+ "You start masturbating.", \
+ "You start masturbating.")
+ if(do_after(src, mb_time, target = src))
+ if(total_cum > 5)
+ fluid_source.reaction(src.loc, TOUCH, 1, 0)
+ fluid_source.clear_reagents()
+
+ src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
+ "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \
+ "You have relieved yourself.")
+ finished = 1
+
if(/obj/item/organ/genital/vagina)
var/obj/item/organ/genital/vagina/V = SG
if(!V.linked_womb)
- src << "No womb!"
+ to_chat(src, "You need a womb to do this.")
return
fluid_source = V.linked_womb.reagents
total_cum = fluid_source.total_volume
if(into_container)//into a glass or beaker or whatever
- src.visible_message("[src] starts fingering their vagina over [SC].", \
+ src.visible_message("[src] starts fingering their [SG.name] over [SC].", \
"You start fingering over [SC.name].", \
"You start masturbating.")
if(do_after(src, mb_time, target = src) && in_range(src, SC))
@@ -272,7 +375,7 @@
"You cum into [SC].", \
"You have relieved yourself.")
finished = 1
-
+
else//not into a container
src.visible_message("[src] starts fingering their vagina.", \
"You start fingering your vagina.", \
@@ -297,10 +400,5 @@
setArousalLoss(min_arousal)
else
- src << "You have no genitals!"
+ to_chat(src, "You have no genitals!")
return
-
-/mob/living/carbon/proc/force_orgasm(intensity)
- if(canbearoused && has_dna() && (has_penis() || has_vagina()))
- return 1
- return 0
diff --git a/code/citadel/cit_reagents.dm b/code/citadel/cit_reagents.dm
index 2f421542ae..428729d30f 100644
--- a/code/citadel/cit_reagents.dm
+++ b/code/citadel/cit_reagents.dm
@@ -105,7 +105,7 @@
M.emote(pick("moan","blush"))
if(prob(5))
var/aroused_message = pick("You feel frisky.", "You're having trouble suppressing your urges.", "You feel in the mood.")
- M << "[aroused_message]"
+ to_chat(M, "[aroused_message]")
..()
/datum/reagent/aphrodisiacplus
@@ -128,15 +128,13 @@
else
M.emote(pick("moan","blush"))
if(prob(5))
+ var/aroused_message
if(M.getArousalLoss() > 90)
- var/aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!")
- M << "[aroused_message]"
+ aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!")
else
- var/aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.")
- M << "[aroused_message]"
-// if(iscarbon(M) && has_dna(M))
-// M.force_ejaculation()
- ..()
+ aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.")
+ to_chat(M, "[aroused_message]")
+
/datum/reagent/aphrodisiacplus/addiction_act_stage2(mob/living/M)
if(prob(30))
M.adjustBrainLoss(2)
@@ -152,11 +150,17 @@
..()
/datum/reagent/aphrodisiacplus/overdose_process(mob/living/M)
- if(prob(66))
+ if(prob(33))
+ if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna())
+ var/mob/living/carbon/human/H = M
+ to_chat(H, "Your libido is going haywire!")
+ H.mob_climax(forced_climax=TRUE)
if(M.min_arousal < 50)
M.min_arousal += 1
- if(M.max_arousal < 200)
- M.max_arousal += 1
+ to_chat(M, "You're having a hard time thinkin about things other than sex!")
+ if(M.min_arousal < M.max_arousal)
+ M.min_arousal += 1
+ to_chat(M, "You feel your libido permanently increasing.")
M.adjustArousalLoss(2)
..()
@@ -193,8 +197,10 @@
if(prob(33))
if(M.min_arousal > 0)
M.min_arousal -= 1
- if(M.max_arousal > 75)
+ to_chat(M, "You feel your libido returning to more normal levels.")
+ if(M.min_arousal > 50)
M.min_arousal -= 1
+ to_chat(M, "You feel like your overactive libido is calming down.")
M.adjustArousalLoss(-2)
..()
diff --git a/code/citadel/icons/taur_penis_onmob.dmi b/code/citadel/icons/taur_penis_onmob.dmi
new file mode 100644
index 0000000000..3debbd0047
Binary files /dev/null and b/code/citadel/icons/taur_penis_onmob.dmi differ
diff --git a/code/citadel/organs/breasts.dm b/code/citadel/organs/breasts.dm
index 5e3f312199..ce45b88cfb 100644
--- a/code/citadel/organs/breasts.dm
+++ b/code/citadel/organs/breasts.dm
@@ -1,5 +1,5 @@
/obj/item/organ/genital/breasts
- name = "breasts"
+ name = "Breasts"
desc = "Female milk producing organs."
icon_state = "breasts"
icon = 'code/citadel/icons/breasts.dmi'
diff --git a/code/citadel/organs/eggsack.dm b/code/citadel/organs/eggsack.dm
index 1e53240e1a..718a353b87 100644
--- a/code/citadel/organs/eggsack.dm
+++ b/code/citadel/organs/eggsack.dm
@@ -1,5 +1,5 @@
/obj/item/organ/genital/eggsack
- name = "egg sack"
+ name = "Egg sack"
desc = "An egg producing reproductive organ."
icon_state = "egg_sack"
icon = 'code/citadel/icons/ovipositor.dmi'
diff --git a/code/citadel/organs/genitals.dm b/code/citadel/organs/genitals.dm
index c129d8e8fa..6bd86e7146 100644
--- a/code/citadel/organs/genitals.dm
+++ b/code/citadel/organs/genitals.dm
@@ -243,8 +243,10 @@
G.aroused_state = FALSE
icon_string = "[G.slot]_[S.icon_state]_[size]_[G.aroused_state]_[layertext]"
I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer)
+
if(S.center)
I = center_image(I,S.dimension_x,S.dimension_y)
+
if(use_skintones && H.dna.features["genitals_use_skintone"])
I.color = "#[skintone2hex(H.skin_tone)]"
else
diff --git a/code/citadel/organs/genitals_sprite_accessories.dm b/code/citadel/organs/genitals_sprite_accessories.dm
index 586be3a095..710bab787c 100644
--- a/code/citadel/organs/genitals_sprite_accessories.dm
+++ b/code/citadel/organs/genitals_sprite_accessories.dm
@@ -31,6 +31,33 @@
icon_state = "tapered"
name = "Tapered"
+////////////////////////
+// Taur cocks go here //
+////////////////////////
+/datum/sprite_accessory/penis/taur_flared
+ icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width
+ icon_state = "flared"
+ name = "Taur, Flared"
+ center = TRUE //Center the image 'cause 2-tile wide.
+ dimension_x = 64
+
+/datum/sprite_accessory/penis/taur_knotted
+ icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width
+ icon_state = "knotted"
+ name = "Taur, Knotted"
+ center = TRUE //Center the image 'cause 2-tile wide.
+ dimension_x = 64
+
+/datum/sprite_accessory/penis/taur_tapered
+ icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width
+ icon_state = "tapered"
+ name = "Taur, Tapered"
+ center = TRUE //Center the image 'cause 2-tile wide.
+ dimension_x = 64
+
+
+
+
//Vaginas
/datum/sprite_accessory/vagina
icon = 'code/citadel/icons/vagina_onmob.dmi'
diff --git a/code/citadel/organs/ovipositor.dm b/code/citadel/organs/ovipositor.dm
index 9e46cff91c..3d684ee387 100644
--- a/code/citadel/organs/ovipositor.dm
+++ b/code/citadel/organs/ovipositor.dm
@@ -1,5 +1,5 @@
/obj/item/organ/genital/ovipositor
- name = "ovipositor"
+ name = "Ovipositor"
desc = "An egg laying reproductive organ."
icon_state = "ovi_knotted_2"
icon = 'code/citadel/icons/ovipositor.dmi'
diff --git a/code/citadel/organs/penis.dm b/code/citadel/organs/penis.dm
index 3d99d6c939..9e2ce00666 100644
--- a/code/citadel/organs/penis.dm
+++ b/code/citadel/organs/penis.dm
@@ -1,5 +1,5 @@
/obj/item/organ/genital/penis
- name = "penis"
+ name = "Penis"
desc = "A male reproductive organ."
icon_state = "penis"
icon = 'code/citadel/icons/penis.dmi'
@@ -35,7 +35,7 @@
cached_length = length
/obj/item/organ/genital/penis/update_appearance()
- var/string = "penis_[lowertext(shape)]_[size]"
+ var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]"
icon_state = sanitize_text(string)
var/lowershape = lowertext(shape)
if(lowershape in knotted_types)
diff --git a/code/citadel/organs/testicles.dm b/code/citadel/organs/testicles.dm
index 71e591f930..a759aeab52 100644
--- a/code/citadel/organs/testicles.dm
+++ b/code/citadel/organs/testicles.dm
@@ -1,5 +1,5 @@
/obj/item/organ/genital/testicles
- name = "testicles"
+ name = "Testicles"
desc = "A male reproductive organ."
icon_state = "testicles"
icon = 'code/citadel/icons/penis.dmi'
diff --git a/code/citadel/organs/vagina.dm b/code/citadel/organs/vagina.dm
index c1924a3067..fa1f00bda2 100644
--- a/code/citadel/organs/vagina.dm
+++ b/code/citadel/organs/vagina.dm
@@ -1,5 +1,5 @@
/obj/item/organ/genital/vagina
- name = "vagina"
+ name = "Vagina"
desc = "A female reproductive organ."
icon = 'code/citadel/icons/vagina.dmi'
icon_state = "vagina"
diff --git a/code/citadel/organs/womb.dm b/code/citadel/organs/womb.dm
index e1ea02a230..3ebe5c2f98 100644
--- a/code/citadel/organs/womb.dm
+++ b/code/citadel/organs/womb.dm
@@ -1,5 +1,5 @@
/obj/item/organ/genital/womb
- name = "womb"
+ name = "Womb"
desc = "A female reproductive organ."
icon = 'code/citadel/icons/vagina.dmi'
icon_state = "womb"
@@ -10,7 +10,7 @@
fluid_id = "femcum"
producing = TRUE
var/obj/item/organ/genital/vagina/linked_vag
-
+
/obj/item/organ/genital/womb/Initialize()
. = ..()
reagents.add_reagent(fluid_id, fluid_max_volume)
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index c71e34fce3..5ca7b15f72 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -124,7 +124,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
var/FireHim = FALSE
if(istype(BadBoy))
msg = null
- switch(++BadBoy.failure_strikes)
+ LAZYINITLIST(BadBoy.failure_strikes)
+ switch(++BadBoy.failure_strikes[BadBoy.type])
if(2)
msg = "The [BadBoy.name] subsystem was the last to fire for 2 controller restarts. It will be recovered now and disabled if it happens again."
FireHim = TRUE
diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm
index 3024c24c15..eee6945c41 100644
--- a/code/controllers/subsystem.dm
+++ b/code/controllers/subsystem.dm
@@ -31,7 +31,7 @@
var/runlevels = RUNLEVELS_DEFAULT //points of the game at which the SS can fire
- var/static/failure_strikes = 0 //How many times we suspect this subsystem has crashed the MC, 3 strikes and you're out!
+ var/static/list/failure_strikes //How many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out!
//Do not override
/datum/controller/subsystem/New()
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index 19e96f3fbf..3344afcaaa 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -250,7 +250,7 @@ SUBSYSTEM_DEF(blackbox)
return 0
return value
-/datum/feedback_variable/proc/get_variable()
+/datum/feedback_variable/proc/get_variable()
return variable
/datum/feedback_variable/proc/set_details(text)
@@ -259,14 +259,13 @@ SUBSYSTEM_DEF(blackbox)
/datum/feedback_variable/proc/add_details(text)
if (istext(text))
- text = replacetext(text, " ", "_")
if (!details)
- details = text
+ details = "\"[text]\""
else
- details += " [text]"
+ details += " | \"[text]\""
-/datum/feedback_variable/proc/get_details()
+/datum/feedback_variable/proc/get_details()
return details
/datum/feedback_variable/proc/get_parsed()
- return list(variable,value,details)
+ return list(variable,value,details)
\ No newline at end of file
diff --git a/code/controllers/subsystem/disease.dm b/code/controllers/subsystem/disease.dm
index 5499680a2f..451bd05606 100644
--- a/code/controllers/subsystem/disease.dm
+++ b/code/controllers/subsystem/disease.dm
@@ -1,11 +1,8 @@
SUBSYSTEM_DEF(disease)
name = "Disease"
- flags = SS_KEEP_TIMING|SS_NO_INIT
- runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
-
- var/list/currentrun = list()
- var/list/processing = list()
+ flags = SS_NO_FIRE
+ var/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing.
var/list/diseases
var/list/archive_diseases = list()
@@ -15,27 +12,5 @@ SUBSYSTEM_DEF(disease)
if(!diseases)
diseases = subtypesof(/datum/disease)
-/datum/controller/subsystem/disease/Recover()
- currentrun = SSdisease.currentrun
- processing = SSdisease.processing
- diseases = SSdisease.diseases
- archive_diseases = SSdisease.archive_diseases
-
/datum/controller/subsystem/disease/stat_entry(msg)
- ..("P:[processing.len]")
-
-/datum/controller/subsystem/disease/fire(resumed = 0)
- if(!resumed)
- src.currentrun = processing.Copy()
- //cache for sanic speed (lists are references anyways)
- var/list/currentrun = src.currentrun
-
- while(currentrun.len)
- var/datum/thing = currentrun[currentrun.len]
- currentrun.len--
- if(thing)
- thing.process()
- else
- processing.Remove(thing)
- if (MC_TICK_CHECK)
- return
+ ..("P:[active_diseases.len]")
\ No newline at end of file
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 2cee9a192a..ebc1ad9474 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -18,7 +18,7 @@ SUBSYSTEM_DEF(garbage)
// refID's are associated with the time at which they time out and need to be manually del()
// we do this so we aren't constantly locating them and preventing them from being gc'd
- var/list/tobequeued = list() //We store the references of things to be added to the queue seperately so we can spread out GC overhead over a few ticks
+ var/list/tobequeued = list() //We store the references of things to be added to the queue separately so we can spread out GC overhead over a few ticks
var/list/didntgc = list() // list of all types that have failed to GC associated with the number of times that's happened.
// the types are stored as strings
@@ -144,7 +144,7 @@ SUBSYSTEM_DEF(garbage)
queue[refid] = gctime
-//this is purely to seperate things profile wise.
+//this is purely to separate things profile wise.
/datum/controller/subsystem/garbage/proc/HardDelete(datum/A)
var/time = world.timeofday
var/tick = world.tick_usage
@@ -234,27 +234,7 @@ SUBSYSTEM_DEF(garbage)
else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)
CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic")
-// Default implementation of clean-up code.
-// This should be overridden to remove all references pointing to the object being destroyed.
-// Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE.
-// TODO: Move this and all datum var definitions into code/datums/datum.dm
-/datum/proc/Destroy(force=FALSE)
- tag = null
- var/list/timers = active_timers
- active_timers = null
- for(var/thing in timers)
- var/datum/timedevent/timer = thing
- if (timer.spent)
- continue
- qdel(timer)
- QDEL_LIST(datum_components)
- return QDEL_HINT_QUEUE
-
-/datum/var/gc_destroyed //Time when this object was destroyed.
-
#ifdef TESTING
-/datum/var/running_find_references
-/datum/var/last_find_references = 0
/datum/verb/find_refs()
set category = "Debug"
@@ -303,13 +283,12 @@ SUBSYSTEM_DEF(garbage)
/client/verb/purge_all_destroyed_objects()
set category = "Debug"
- if(SSgarbage)
- while(SSgarbage.queue.len)
- var/datum/o = locate(SSgarbage.queue[1])
- if(istype(o) && o.gc_destroyed)
- del(o)
- SSgarbage.totaldels++
- SSgarbage.queue.Cut(1, 2)
+ while(SSgarbage.queue.len)
+ var/datum/o = locate(SSgarbage.queue[1])
+ if(istype(o) && o.gc_destroyed)
+ del(o)
+ SSgarbage.totaldels++
+ SSgarbage.queue.Cut(1, 2)
/datum/verb/qdel_then_find_references()
set category = "Debug"
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 731166e0a9..f28373ef22 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -217,10 +217,9 @@ SUBSYSTEM_DEF(job)
Debug("Running DO")
//Holder for Triumvirate is stored in the SSticker, this just processes it
- if(SSticker)
+ if(SSticker.triai)
for(var/datum/job/ai/A in occupations)
- if(SSticker.triai)
- A.spawn_positions = 3
+ A.spawn_positions = 3
//Get the players who are ready
for(var/mob/dead/new_player/player in GLOB.player_list)
diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm
index ad63f0eaf4..e5e83c85fc 100644
--- a/code/controllers/subsystem/pai.dm
+++ b/code/controllers/subsystem/pai.dm
@@ -14,7 +14,7 @@ SUBSYSTEM_DEF(pai)
var/obj/item/device/paicard/card = locate(href_list["device"]) in pai_card_list
if(card.pai)
return
- if(istype(card,/obj/item/device/paicard) && istype(candidate,/datum/paiCandidate))
+ if(istype(card, /obj/item/device/paicard) && istype(candidate, /datum/paiCandidate))
if(check_ready(candidate) != candidate)
return FALSE
var/mob/living/silicon/pai/pai = new(card)
diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm
index ec76d623b1..f4eebe95be 100644
--- a/code/controllers/subsystem/persistence.dm
+++ b/code/controllers/subsystem/persistence.dm
@@ -37,7 +37,7 @@ SUBSYSTEM_DEF(persistence)
var/list/free_satchels = list()
for(var/turf/T in shuffle(block(locate(TRANSITIONEDGE,TRANSITIONEDGE,ZLEVEL_STATION), locate(world.maxx-TRANSITIONEDGE,world.maxy-TRANSITIONEDGE,ZLEVEL_STATION)))) //Nontrivially expensive but it's roundstart only
- if(isfloorturf(T) && !istype(T,/turf/open/floor/plating/))
+ if(isfloorturf(T) && !istype(T, /turf/open/floor/plating/))
free_satchels += new /obj/item/weapon/storage/backpack/satchel/flat/secret(T)
if(!isemptylist(free_satchels) && ((free_satchels.len + placed_satchels) >= (50 - expanded_old_satchels.len) * 0.1)) //up to six tiles, more than enough to kill anything that moves
break
@@ -63,7 +63,7 @@ SUBSYSTEM_DEF(persistence)
F.x = text2num(chosen_satchel[1])
F.y = text2num(chosen_satchel[2])
F.z = ZLEVEL_STATION
- if(isfloorturf(F.loc) && !istype(F.loc,/turf/open/floor/plating/))
+ if(isfloorturf(F.loc) && !istype(F.loc, /turf/open/floor/plating/))
F.hide(1)
new path(F)
return 1
diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm
index e398f09a03..855c00b728 100644
--- a/code/controllers/subsystem/server_maint.dm
+++ b/code/controllers/subsystem/server_maint.dm
@@ -40,9 +40,15 @@ SUBSYSTEM_DEF(server_maint)
/datum/controller/subsystem/server_maint/Shutdown()
kick_clients_in_lobby("The round came to an end with you in the lobby.", TRUE) //second parameter ensures only afk clients are kicked
+ var/server = config.server
for(var/thing in GLOB.clients)
+ if(!thing)
+ continue
var/client/C = thing
- if(C && config.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://[config.server]")
+ var/datum/chatOutput/co = C.chatOutput
+ if(co)
+ 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]")
#undef PING_BUFFER_TIME
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index 2ecbce68b1..8aff552076 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -34,8 +34,8 @@ SUBSYSTEM_DEF(shuttle)
var/obj/docking_port/mobile/supply/supply
var/ordernum = 1 //order number given to next order
var/points = 5000 //number of trade-points we have
- var/centcom_message = "" //Remarks from Centcom on how well you checked the last order.
- var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentComm, associated with their potencies
+ var/centcom_message = "" //Remarks from CentCom on how well you checked the last order.
+ var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentCom, associated with their potencies
var/list/supply_packs = list()
var/list/shoppinglist = list()
@@ -185,7 +185,7 @@ SUBSYSTEM_DEF(shuttle)
switch(emergency.mode)
if(SHUTTLE_RECALL)
- to_chat(user, "The emergency shuttle may not be called while returning to Centcom.")
+ to_chat(user, "The emergency shuttle may not be called while returning to CentCom.")
return
if(SHUTTLE_CALL)
to_chat(user, "The emergency shuttle is already on its way.")
@@ -200,7 +200,7 @@ SUBSYSTEM_DEF(shuttle)
to_chat(user, "The emergency shuttle is moving away to a safe distance.")
return
if(SHUTTLE_STRANDED)
- to_chat(user, "The emergency shuttle has been disabled by Centcom.")
+ to_chat(user, "The emergency shuttle has been disabled by CentCom.")
return
call_reason = trim(html_encode(call_reason))
@@ -543,7 +543,7 @@ SUBSYSTEM_DEF(shuttle)
/datum/controller/subsystem/shuttle/proc/is_in_shuttle_bounds(atom/A)
var/area/current = get_area(A)
- if(istype(current, /area/shuttle) && !istype(current,/area/shuttle/transit))
+ if(istype(current, /area/shuttle) && !istype(current, /area/shuttle/transit))
return TRUE
for(var/obj/docking_port/mobile/M in mobile)
if(M.is_in_shuttle_bounds(A))
diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm
index 4ae31e98d6..d91d91de72 100644
--- a/code/controllers/subsystem/throwing.dm
+++ b/code/controllers/subsystem/throwing.dm
@@ -103,7 +103,7 @@ SUBSYSTEM_DEF(throwing)
finalize()
return
-/datum/thrownthing/proc/finalize(hit = FALSE)
+/datum/thrownthing/proc/finalize(hit = FALSE, target=null)
set waitfor = 0
SSthrowing.processing -= thrownthing
//done throwing, either because it hit something or it finished moving
@@ -120,13 +120,15 @@ SUBSYSTEM_DEF(throwing)
thrownthing.newtonian_move(init_dir)
else
thrownthing.newtonian_move(init_dir)
+
+ if(target)
+ thrownthing.throw_impact(target, src)
+
if (callback)
callback.Invoke()
/datum/thrownthing/proc/hit_atom(atom/A)
- thrownthing.throw_impact(A, src)
- thrownthing.newtonian_move(init_dir)
- finalize(TRUE)
+ finalize(hit=TRUE, target=A)
/datum/thrownthing/proc/hitcheck()
for (var/thing in get_turf(thrownthing))
@@ -134,6 +136,5 @@ SUBSYSTEM_DEF(throwing)
if (AM == thrownthing)
continue
if (AM.density && !(AM.pass_flags & LETPASSTHROW) && !(AM.flags & ON_BORDER))
- thrownthing.throwing = null
- thrownthing.throw_impact(AM, src)
+ finalize(hit=TRUE, target=AM)
return TRUE
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 08fe58e167..d897b290d4 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -479,7 +479,7 @@ SUBSYSTEM_DEF(ticker)
var/list/area/shuttle_areas
if(SSshuttle && SSshuttle.emergency)
shuttle_areas = SSshuttle.emergency.shuttle_areas
- if(!Player.onCentcom() && !Player.onSyndieBase())
+ if(!Player.onCentCom() && !Player.onSyndieBase())
to_chat(Player, "You managed to survive, but were marooned on [station_name()]...")
else
num_escapees++
diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm
index 5696fa09e7..daf0eb324d 100644
--- a/code/controllers/subsystem/timer.dm
+++ b/code/controllers/subsystem/timer.dm
@@ -210,7 +210,6 @@ SUBSYSTEM_DEF(timer)
timer_id_dict |= SStimer.timer_id_dict
bucket_list |= SStimer.bucket_list
-/datum/var/list/active_timers
/datum/timedevent
var/id
var/datum/callback/callBack
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 715aea1493..ecaa70387b 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -10,12 +10,13 @@
var/check_flags = 0
var/processing = FALSE
var/obj/screen/movable/action_button/button = null
- var/button_icon = 'icons/mob/actions.dmi'
- var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND
var/buttontooltipstyle = ""
- var/icon_icon = 'icons/mob/actions.dmi'
- var/button_icon_state = "default"
+ var/button_icon = 'icons/mob/actions/backgrounds.dmi' //This is the file for the BACKGROUND icon
+ var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND //And this is the state for the background icon
+
+ var/icon_icon = 'icons/mob/actions.dmi' //This is the file for the ACTION icon
+ var/button_icon_state = "default" //And this is the state for the action icon
var/mob/owner
/datum/action/New(Target)
@@ -169,6 +170,10 @@
/datum/action/item_action/toggle_firemode
name = "Toggle Firemode"
+/datum/action/item_action/rcl
+ name = "Change Cable Color"
+ button_icon_state = "rcl_rainbow"
+
/datum/action/item_action/startchainsaw
name = "Pull The Starting Cord"
@@ -221,6 +226,7 @@
/datum/action/item_action/toggle_unfriendly_fire
name = "Toggle Friendly Fire \[ON\]"
desc = "Toggles if the club's blasts cause friendly fire."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "vortex_ff_on"
/datum/action/item_action/toggle_unfriendly_fire/Trigger()
@@ -254,6 +260,7 @@
/datum/action/item_action/vortex_recall
name = "Vortex Recall"
desc = "Recall yourself, and anyone nearby, to an attuned hierophant beacon at any time. If the beacon is still attached, will detach it."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "vortex_recall"
/datum/action/item_action/vortex_recall/IsAvailable()
@@ -264,6 +271,7 @@
return ..()
/datum/action/item_action/clock
+ icon_icon = 'icons/mob/actions/actions_clockcult.dmi'
background_icon_state = "bg_clock"
buttontooltipstyle = "clockcult"
@@ -363,6 +371,7 @@
/datum/action/item_action/toggle_research_scanner
name = "Toggle Research Scanner"
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "scan_mode"
var/active = FALSE
@@ -399,6 +408,7 @@
/datum/action/item_action/ninjajaunt
name = "Phase Jaunt (10E)"
desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "ninja_phase"
/datum/action/item_action/ninjasmoke
@@ -407,6 +417,7 @@
button_icon_state = "smoke"
/datum/action/item_action/ninjaboost
+ check_flags = AB_CHECK_RESTRAINED|AB_CHECK_CONSCIOUS
name = "Adrenaline Boost"
desc = "Inject a secret chemical that will counteract all movement-impairing effect."
button_icon_state = "repulse"
@@ -437,6 +448,7 @@
/datum/action/item_action/ninja_stealth
name = "Toggle Stealth"
desc = "Toggles stealth mode on and off."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "ninja_cloak"
/datum/action/item_action/toggle_glove
@@ -478,6 +490,7 @@
var/obj/effect/proc_holder/spell/S = target
S.action = src
name = S.name
+ desc = S.desc
button_icon = S.action_icon
button_icon_state = S.action_icon_state
background_icon_state = S.action_background_icon_state
@@ -553,12 +566,14 @@
/datum/action/item_action/stickmen
name = "Summon Stick Minions"
desc = "Allows you to summon faithful stickmen allies to aide you in battle."
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "art_summon"
//surf_ss13
/datum/action/item_action/bhop
name = "Activate Jump Boots"
desc = "Activates the jump boot's internal propulsion system, allowing the user to dash over 4-wide gaps."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "jetboot"
/datum/action/language_menu
diff --git a/code/datums/antagonists/datum_internal_affairs.dm b/code/datums/antagonists/datum_internal_affairs.dm
index e3a8077732..a07984262e 100644
--- a/code/datums/antagonists/datum_internal_affairs.dm
+++ b/code/datums/antagonists/datum_internal_affairs.dm
@@ -152,7 +152,7 @@
if(!owner||!owner.objectives)
return
for (var/objective_ in owner.objectives)
- if(!(istype(objective_, /datum/objective/escape)||istype(objective_,/datum/objective/survive)))
+ if(!(istype(objective_, /datum/objective/escape)||istype(objective_, /datum/objective/survive)))
continue
remove_objective(objective_)
diff --git a/code/datums/antagonists/datum_traitor.dm b/code/datums/antagonists/datum_traitor.dm
index 3e90228c19..d706eff62b 100644
--- a/code/datums/antagonists/datum_traitor.dm
+++ b/code/datums/antagonists/datum_traitor.dm
@@ -23,6 +23,7 @@
/datum/antagonist/traitor/human
should_specialise = FALSE
var/should_equip = TRUE
+
/datum/antagonist/traitor/human/custom
silent = TRUE
should_give_codewords = FALSE
@@ -31,6 +32,7 @@
/datum/antagonist/traitor/AI
should_specialise = FALSE
+
/datum/antagonist/traitor/AI/custom
silent = TRUE
should_give_codewords = FALSE
@@ -38,9 +40,8 @@
/datum/antagonist/traitor/on_body_transfer(mob/living/old_body, mob/living/new_body)
- if(issilicon(new_body) && issilicon(old_body))
- ..()
- else
+ // human <-> silicon only
+ if(old_body && issilicon(new_body) ^ issilicon(old_body))
silent = TRUE
owner.add_antag_datum(base_datum_custom)
for(var/datum/antagonist/traitor/new_datum in owner.antag_datums)
@@ -49,13 +50,14 @@
transfer_important_variables(new_datum)
break
on_removal()
-
-
+ else
+ ..()
/datum/antagonist/traitor/human/custom //used to give custom objectives
silent = TRUE
give_objectives = FALSE
should_give_codewords = FALSE
+
/datum/antagonist/traitor/AI/custom //used to give custom objectives
silent = TRUE
give_objectives = FALSE
@@ -83,7 +85,8 @@
if(owner.assigned_role == "Clown")
var/mob/living/carbon/human/traitor_mob = owner.current
if(traitor_mob&&istype(traitor_mob))
- if(!silent) to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
+ if(!silent)
+ to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
traitor_mob.dna.remove_mutation(CLOWNMUT)
/datum/antagonist/traitor/remove_innate_effects()
diff --git a/code/datums/callback.dm b/code/datums/callback.dm
index 1b5c25fe18..624fed58a6 100644
--- a/code/datums/callback.dm
+++ b/code/datums/callback.dm
@@ -100,3 +100,57 @@
if (object == GLOBAL_PROC)
return call(delegate)(arglist(calling_arguments))
return call(object, delegate)(arglist(calling_arguments))
+
+
+/datum/callback_select
+ var/list/finished
+ var/pendingcount
+ var/total
+
+/datum/callback_select/New(count, savereturns)
+ total = count
+ if (savereturns)
+ finished = new(count)
+
+
+/datum/callback_select/proc/invoke_callback(index, datum/callback/callback, list/callback_args, savereturn = TRUE)
+ set waitfor = FALSE
+ if (!callback || !istype(callback))
+ //This check only exists because the alternative is callback_select would block forever if given invalid data
+ CRASH("invalid callback passed to invoke_callback")
+ if (!length(callback_args))
+ callback_args = list()
+ pendingcount++
+ var/rtn = callback.Invoke(arglist(callback_args))
+ pendingcount--
+ if (savereturn)
+ finished[index] = rtn
+
+
+
+
+//runs a list of callbacks asynchronously, returning once all of them return.
+//callbacks can be repeated.
+//callbacks-args is a optional list of argument lists, in the same order as the callbacks,
+// the inner lists will be sent to the callbacks when invoked() as additional args.
+//can optionly save and return a list of return values, in the same order as the original list of callbacks
+//resolution is the number of byond ticks between checks.
+/proc/callback_select(list/callbacks, list/callback_args, savereturns = TRUE, resolution = 1)
+ if (!callbacks)
+ return
+ var/count = length(callbacks)
+ if (!count)
+ return
+ if (!callback_args)
+ callback_args = list()
+
+ callback_args.len = count
+
+ var/datum/callback_select/CS = new(count, savereturns)
+ for (var/i in 1 to count)
+ CS.invoke_callback(i, callbacks[i], callback_args[i], savereturns)
+
+ while(CS.pendingcount)
+ sleep(resolution*world.tick_lag)
+ return CS.finished
+
diff --git a/code/datums/components/README.md b/code/datums/components/README.md
new file mode 100644
index 0000000000..f92e618a7f
--- /dev/null
+++ b/code/datums/components/README.md
@@ -0,0 +1,99 @@
+# Datum Component System (DCS)
+
+## Concept
+
+Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening.
+
+### In the code
+
+#### Slippery things
+
+At the time of this writing, every object that is slippery overrides atom/Crossed does some checks, then slips the mob. Instead of all those Crossed overrides they could add a slippery component to all these objects. And have the checks in one proc that is run by the Crossed event
+
+#### Powercells
+
+A lot of objects have powercells. The `get_cell()` proc was added to give generic access to the cell var if it had one. This is just a specific use case of `GetComponent()`
+
+#### Radios
+
+The radio object as it is should not exist, given that more things use the _concept_ of radios rather than the object itself. The actual function of the radio can exist in a component which all the things that use it (Request consoles, actual radios, the SM shard) can add to themselves.
+
+#### Standos
+
+Stands have a lot of procs which mimic mob procs. Rather than inserting hooks for all these procs in overrides, the same can be accomplished with signals
+
+## API
+
+### Vars
+
+1. `/datum/var/list/datum_components` (private)
+ * Lazy list of all components a datum has (TODO: Make this a typecache with longer paths overwriting shorter ones maybe? It'd be weird)
+1. `/datum/component/var/enabled` (protected, boolean)
+ * If the component is enabled. If not, it will not react to signals
+ * TRUE by default
+1. `/datum/component/var/dupe_mode` (protected, enum)
+ * How multiple components of the exact same type are handled when added to the datum.
+ * `COMPONENT_DUPE_HIGHLANDER` (default): Old component will be deleted, new component will first have `/datum/component/proc/InheritComponent(datum/component/old, FALSE)` on it
+ * `COMPONENT_DUPE_ALLOWED`: The components will be treated as seperate, `GetComponent()` will return the first added
+ * `COMPONENT_DUPE_UNIQUE`: New component will be deleted, old component will first have `/datum/component/proc/InheritComponent(datum/component/new, TRUE)` on it
+1. `/datum/component/var/list/signal_procs` (private)
+ * Associated lazy list of signals -> callbacks that will be run when the parent datum recieves that signal
+1. `/datum/component/var/datum/parent` (protected, read-only)
+ * The datum this component belongs to
+
+### Procs
+
+1. `/datum/proc/GetComponent(component_type(type)) -> datum/component?` (public, final)
+ * Returns a reference to a component of component_type if it exists in the datum, null otherwise
+1. `/datum/proc/GetComponents(component_type(type)) -> list` (public, final)
+ * Returns a list of references to all components of component_type that exist in the datum
+1. `/datum/proc/GetExactComponent(component_type(type)) -> datum/component?` (public, final)
+ * Returns a reference to a component whose type MATCHES component_type if that component exists in the datum, null otherwise
+1. `GET_COMPONENT(varname, component_type)` OR `GET_COMPONENT_FROM(varname, component_type, src)`
+ * Shorthand for `var/component_type/varname = src.GetComponent(component_type)`
+1. `/datum/proc/AddComponent(component_type(type), ...) -> datum/component` (public, final)
+ * Creates an instance of `component_type` in the datum and passes `...` to it's `New()` call
+ * Sends the `COMSIG_COMPONENT_ADDED` signal to the datum
+ * All components a datum owns are deleted with the datum
+ * Returns the component that was created. Or the old component in a dupe situation where `COMPONENT_DUPE_UNIQUE` was set
+1. `/datum/proc/ComponentActivated(datum/component/C)` (abstract)
+ * Called on a component's `parent` after a signal recieved causes it to activate. `src` is the parameter
+ * Will only be called if a component's callback returns `TRUE`
+1. `/datum/proc/TakeComponent(datum/component/C)` (public, final)
+ * Properly transfers ownership of a component from one datum to another
+ * Singals `COMSIG_COMPONENT_REMOVING` on the parent
+ * Called on the datum you want to own the component with another datum's component
+1. `/datum/proc/SendSignal(signal, ...)` (public, final)
+ * Call to send a signal to the components of the target datum
+ * Extra arguments are to be specified in the signal definition
+1. `/datum/component/New(datum/parent, ...)` (protected, virtual)
+ * Forwarded the arguments from `AddComponent()`
+1. `/datum/component/Destroy()` (virtual)
+ * Sends the `COMSIG_COMPONENT_REMOVING` signal to the parent datum if the `parent` isn't being qdeleted
+ * Properly removes the component from `parent` and cleans up references
+1. `/datum/component/proc/InheritComponent(datum/component/C, i_am_original(boolean))` (abstract)
+ * Called on a component when a component of the same type was added to the same parent
+ * See `/datum/component/var/dupe_mode`
+ * `C`'s type will always be the same of the called component
+1. `/datum/component/proc/OnTransfer(datum/new_parent)` (abstract)
+ * Called before the new `parent` is assigned in `TakeComponent()`, after the remove signal, before the added signal
+ * Allows the component to react to ownership transfers
+1. `/datum/component/proc/_RemoveNoSignal()` (private, final)
+ * Internal, clears the parent var and removes the component from the parents component list
+1. `/datum/component/proc/RegisterSignal(signal(string), proc_ref(type), override(boolean))` (protected, final) (Consider removing for performance gainz)
+ * Makes a component listen for the specified `signal` on it's `parent` datum.
+ * When that signal is recieved `proc_ref` will be called on the component, along with associated arguments
+ * Example proc ref: `.proc/OnEvent`
+ * If a previous registration is overwritten by the call, a runtime occurs. Setting `override` to TRUE prevents this
+ * These callbacks run asyncronously
+ * Returning `TRUE` from these callbacks will trigger a `TRUE` return from the `SendSignal()` that initiated it
+1. `/datum/component/proc/ReceiveSignal(signal, ...)` (virtual)
+ * Called when a component recieves any signal and is enabled
+ * Default implementation looks if the signal is registered and runs the appropriate proc
+
+### See signals and their arguments in __DEFINES\components.dm
+
+## Examples
+ Material Containers: #29268 (Too many GetComponent calls, but not bad)
+ Slips: #00000 (PR DIS)
+ Powercells: (TODO)
\ No newline at end of file
diff --git a/code/datums/components/component.dm b/code/datums/components/component.dm
index b9212d2786..20e2a6e9ac 100644
--- a/code/datums/components/component.dm
+++ b/code/datums/components/component.dm
@@ -1,8 +1,8 @@
/datum/component
- var/enabled = TRUE // Enables or disables the components
- var/dupe_mode = COMPONENT_DUPE_HIGHLANDER // How components of the same type are handled in the same parent
- var/list/signal_procs // list of signals -> callbacks
- var/datum/parent // parent datum
+ var/enabled = TRUE
+ var/dupe_mode = COMPONENT_DUPE_HIGHLANDER
+ var/list/signal_procs
+ var/datum/parent
/datum/component/New(datum/P, ...)
var/dm = dupe_mode
@@ -11,26 +11,34 @@
if(old)
switch(dm)
if(COMPONENT_DUPE_HIGHLANDER)
- P.RemoveComponent(old)
- old = null //in case SendSignal() blocks
+ InheritComponent(old, FALSE)
+ qdel(old)
if(COMPONENT_DUPE_UNIQUE)
+ old.InheritComponent(src, TRUE)
qdel(src)
return
- P.SendSignal(COMSIG_COMPONENT_ADDED, list(src), FALSE)
+ P.SendSignal(COMSIG_COMPONENT_ADDED, src)
LAZYADD(P.datum_components, src)
parent = P
/datum/component/Destroy()
- RemoveNoSignal()
+ enabled = FALSE
+ var/datum/P = parent
+ if(P)
+ _RemoveNoSignal()
+ P.SendSignal(COMSIG_COMPONENT_REMOVING, src)
+ LAZYCLEARLIST(signal_procs)
return ..()
-/datum/component/proc/RemoveNoSignal()
+/datum/component/proc/_RemoveNoSignal()
var/datum/P = parent
if(P)
LAZYREMOVE(P.datum_components, src)
parent = null
/datum/component/proc/RegisterSignal(sig_type, proc_on_self, override = FALSE)
+ if(QDELETED(src))
+ return
var/list/procs = signal_procs
if(!procs)
procs = list()
@@ -43,24 +51,34 @@
procs[sig_type] = CALLBACK(src, proc_on_self)
-/datum/var/list/datum_components //list of /datum/component
+/datum/component/proc/ReceiveSignal(sigtype, ...)
+ var/list/sps = signal_procs
+ var/datum/callback/CB = LAZYACCESS(sps, sigtype)
+ if(!CB)
+ return FALSE
+ var/list/arguments = args.Copy()
+ arguments.Cut(1, 2)
+ return CB.InvokeAsync(arglist(arguments))
-// Send a signal to all other components in the container.
-/datum/proc/SendSignal(sigtype, list/sig_args, async = FALSE)
+/datum/component/proc/InheritComponent(datum/component/C, i_am_original)
+ return
+
+/datum/component/proc/OnTransfer(datum/new_parent)
+ return
+
+/datum/proc/SendSignal(sigtype, ...)
var/list/comps = datum_components
. = FALSE
for(var/I in comps)
var/datum/component/C = I
if(!C.enabled)
continue
- var/list/sps = C.signal_procs
- var/datum/callback/CB = LAZYACCESS(sps, sigtype)
- if(!CB)
- continue
- if(!async)
- . |= CB.Invoke(sig_args)
- else
- . |= CB.InvokeAsync(sig_args)
+ if(C.ReceiveSignal(arglist(args)))
+ ComponentActivated(C)
+ . = TRUE
+
+/datum/proc/ComponentActivated(datum/component/C)
+ return
/datum/proc/GetComponent(c_type)
for(var/I in datum_components)
@@ -79,19 +97,21 @@
if(istype(I, c_type))
. += I
-/datum/proc/AddComponents(list/new_types)
- for(var/new_type in new_types)
- AddComponent(new_type)
-
/datum/proc/AddComponent(new_type, ...)
var/nt = new_type
args[1] = src
var/datum/component/C = new nt(arglist(args))
return QDELING(C) ? GetComponent(new_type) : C
-/datum/proc/RemoveComponent(datum/component/C)
+/datum/proc/TakeComponent(datum/component/C)
if(!C)
return
- C.RemoveNoSignal()
- SendSignal(COMSIG_COMPONENT_REMOVING, list(C), FALSE)
- qdel(C)
+ var/datum/helicopter = C.parent
+ if(helicopter == src)
+ //wat
+ return
+ C._RemoveNoSignal()
+ helicopter.SendSignal(COMSIG_COMPONENT_REMOVING, C)
+ C.OnTransfer(src)
+ C.parent = src
+ SendSignal(COMSIG_COMPONENT_ADDED, C)
diff --git a/code/datums/datum.dm b/code/datums/datum.dm
new file mode 100644
index 0000000000..3bedbe87cf
--- /dev/null
+++ b/code/datums/datum.dm
@@ -0,0 +1,31 @@
+/datum
+ var/gc_destroyed //Time when this object was destroyed.
+ var/list/active_timers //for SStimer
+ var/list/datum_components //for /datum/components
+ var/ui_screen = "home" //for tgui
+
+#ifdef TESTING
+ var/running_find_references
+ var/last_find_references = 0
+#endif
+
+// Default implementation of clean-up code.
+// This should be overridden to remove all references pointing to the object being destroyed.
+// Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE.
+/datum/proc/Destroy(force=FALSE)
+ tag = null
+ var/list/timers = active_timers
+ active_timers = null
+ for(var/thing in timers)
+ var/datum/timedevent/timer = thing
+ if (timer.spent)
+ continue
+ qdel(timer)
+ var/list/dc = datum_components
+ for(var/I in dc)
+ var/datum/component/C = I
+ C._RemoveNoSignal()
+ qdel(C)
+ if(dc)
+ dc.Cut()
+ return QDEL_HINT_QUEUE
\ No newline at end of file
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 3672b850ca..87c6ad7334 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -21,7 +21,7 @@
return debug_variable(var_name, vars[var_name], 0, src)
//please call . = ..() first and append to the result, that way parent items are always at the top and child items are further down
-//add seperaters by doing . += "---"
+//add separaters by doing . += "---"
/datum/proc/vv_get_dropdown()
. = list()
. += "---"
@@ -62,7 +62,7 @@
- if(istype(D,/atom))
+ if(istype(D, /atom))
var/atom/AT = D
if(AT.icon && AT.icon_state)
sprite = new /icon(AT.icon, AT.icon_state)
@@ -77,7 +77,7 @@
sprite_text = "
"
var/list/atomsnowflake = list()
- if(istype(D,/atom))
+ if(istype(D, /atom))
var/atom/A = D
if(isliving(A))
atomsnowflake += "[D]"
@@ -575,7 +575,7 @@
return
var/D = locate(href_list["datumedit"])
- if(!istype(D,/datum))
+ if(!istype(D, /datum))
to_chat(usr, "This can only be used on datums")
return
@@ -586,7 +586,7 @@
return
var/D = locate(href_list["datumchange"])
- if(!istype(D,/datum))
+ if(!istype(D, /datum))
to_chat(usr, "This can only be used on datums")
return
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index 77b8aeed6a..84d177a390 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -1,6 +1,7 @@
/mob/proc/HasDisease(datum/disease/D)
- for(var/datum/disease/DD in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/DD = thing
if(D.IsSame(DD))
return 1
return 0
@@ -39,7 +40,7 @@
var/datum/disease/DD = new D.type(1, D, 0)
viruses += DD
DD.affected_mob = src
- DD.holder = src
+ SSdisease.active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed.
//Copy properties over. This is so edited diseases persist.
var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed")
@@ -147,6 +148,9 @@
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
- if(dna && (VIRUSIMMUNE in dna.species.species_traits))
+ if(dna && (VIRUSIMMUNE in dna.species.species_traits) && !D.bypasses_immunity)
return 0
+ for(var/thing in D.required_organs)
+ if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs)))
+ return 0
return ..()
\ No newline at end of file
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index cc11d0e6d2..13ad3ece4e 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -46,21 +46,23 @@
var/stage_prob = 4
//Other
- var/longevity = 150 //Time in ticks disease stays in objects, Syringes and such are infinite.
var/list/viable_mobtypes = list() //typepaths of viable mobs
var/mob/living/carbon/affected_mob = null
- var/atom/movable/holder = null
var/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids
var/infectivity = 65
var/cure_chance = 8
- var/carrier = 0 //If our host is only a carrier
+ var/carrier = FALSE //If our host is only a carrier
+ var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses
var/permeability_mod = 1
var/severity = NONTHREAT
var/list/required_organs = list()
var/needs_all_cures = TRUE
var/list/strain_data = list() //dna_spread special bullshit
-
+/datum/disease/Destroy()
+ affected_mob = null
+ SSdisease.active_diseases.Remove(src)
+ return ..()
/datum/disease/proc/stage_act()
var/cure = has_cure()
@@ -93,13 +95,16 @@
if(!. || (needs_all_cures && . < cures.len))
return 0
-/datum/disease/proc/spread(atom/source, force_spread = 0)
+
+/datum/disease/proc/spread(force_spread = 0)
+ if(!affected_mob)
+ return
+
if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread)
return
- if(affected_mob)
- if( affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)) )
- return
+ if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)))
+ return
var/spread_range = 1
@@ -109,15 +114,9 @@
if(spread_flags & AIRBORNE)
spread_range++
- if(!source)
- if(affected_mob)
- source = affected_mob
- else
- return
-
- var/turf/T = source.loc
+ var/turf/T = affected_mob.loc
if(istype(T))
- for(var/mob/living/carbon/C in oview(spread_range, source))
+ for(var/mob/living/carbon/C in oview(spread_range, affected_mob))
var/turf/V = get_turf(C)
if(V)
while(TRUE)
@@ -129,29 +128,6 @@
break
V = Temp
-/datum/disease/process()
- if(!holder)
- SSdisease.processing -= src
- return
-
- if(prob(infectivity))
- spread(holder)
-
- if(affected_mob)
- for(var/datum/disease/D in affected_mob.viruses)
- if(D != src)
- if(IsSame(D))
- qdel(D)
-
- if(holder == affected_mob)
- if(affected_mob.stat != DEAD)
- stage_act()
-
- if(!affected_mob)
- if(prob(70))
- if(--longevity<=0)
- cure()
-
/datum/disease/proc/cure()
if(affected_mob)
@@ -161,20 +137,6 @@
remove_virus()
qdel(src)
-
-/datum/disease/New()
- if(required_organs && required_organs.len)
- if(ishuman(affected_mob))
- var/mob/living/carbon/human/H = affected_mob
- for(var/obj/item/organ/O in required_organs)
- if(!locate(O) in H.bodyparts)
- if(!locate(O) in H.internal_organs)
- cure()
- return
-
- SSdisease.processing += src
-
-
/datum/disease/proc/IsSame(datum/disease/D)
if(istype(src, D.type))
return 1
@@ -191,11 +153,6 @@
return type
-/datum/disease/Destroy()
- SSdisease.processing.Remove(src)
- return ..()
-
-
/datum/disease/proc/IsSpreadByTouch()
if(spread_flags & CONTACT_FEET || spread_flags & CONTACT_HANDS || spread_flags & CONTACT_GENERAL)
return 1
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index bc089d5082..e8ddfdc3d7 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -93,7 +93,7 @@
if(!(istype(D, /datum/disease/advance)))
return 0
- if(src.GetDiseaseID() != D.GetDiseaseID())
+ if(GetDiseaseID() != D.GetDiseaseID())
return 0
return 1
@@ -118,7 +118,7 @@
// Mix the symptoms of two diseases (the src and the argument)
/datum/disease/advance/proc/Mix(datum/disease/advance/D)
- if(!(src.IsSame(D)))
+ if(!(IsSame(D)))
var/list/possible_symptoms = shuffle(D.symptoms)
for(var/datum/symptom/S in possible_symptoms)
AddSymptom(S.Copy())
@@ -158,7 +158,6 @@
return generated
/datum/disease/advance/proc/Refresh(new_name = FALSE)
- //to_chat(world, "[src.name] \ref[src] - REFRESH!")
GenerateProperties()
AssignProperties()
id = null
@@ -412,7 +411,7 @@
D.AssignName(new_name)
D.Refresh()
- for(var/datum/disease/advance/AD in SSdisease.processing)
+ for(var/datum/disease/advance/AD in SSdisease.active_diseases)
AD.Refresh()
for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list))
@@ -427,13 +426,6 @@
name_symptoms += S.name
message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]")
-/*
-/mob/verb/test()
-
- for(var/datum/disease/D in SSdisease.processing)
- to_chat(src, "[D.name] - [D.holder]")
-*/
-
/datum/disease/advance/proc/totalStageSpeed()
return properties["stage_rate"]
diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm
index e264b331e7..a05d1d5e88 100644
--- a/code/datums/diseases/advance/symptoms/cough.dm
+++ b/code/datums/diseases/advance/symptoms/cough.dm
@@ -24,45 +24,45 @@ BONUS
transmittable = 2
level = 1
severity = 1
- base_message_chance = 15
- symptom_delay_min = 2
- symptom_delay_max = 15
- var/infective = FALSE
+ base_message_chance = 15
+ symptom_delay_min = 2
+ symptom_delay_max = 15
+ var/infective = FALSE
-/datum/symptom/cough/Start(datum/disease/advance/A)
+/datum/symptom/cough/Start(datum/disease/advance/A)
..()
- if(A.properties["stealth"] >= 4)
- suppress_warning = TRUE
- if(A.spread_flags &= AIRBORNE) //infect bystanders
- infective = TRUE
- if(A.properties["resistance"] >= 3) //strong enough to drop items
- power = 1.5
- if(A.properties["resistance"] >= 10) //strong enough to stun (rarely)
- power = 2
- if(A.properties["stage_rate"] >= 6) //cough more often
- symptom_delay_max = 10
-
-/datum/symptom/cough/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3)
- if(prob(base_message_chance) && !suppress_warning)
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+ if(A.spread_flags &= AIRBORNE) //infect bystanders
+ infective = TRUE
+ if(A.properties["resistance"] >= 3) //strong enough to drop items
+ power = 1.5
+ if(A.properties["resistance"] >= 10) //strong enough to stun (rarely)
+ power = 2
+ if(A.properties["stage_rate"] >= 6) //cough more often
+ symptom_delay_max = 10
+
+/datum/symptom/cough/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3)
+ if(prob(base_message_chance) && !suppress_warning)
to_chat(M, "[pick("You swallow excess mucus.", "You lightly cough.")]")
- else
- M.emote("cough")
- if(power >= 1.5)
+ else
+ M.emote("cough")
+ if(power >= 1.5)
var/obj/item/I = M.get_active_held_item()
if(I && I.w_class == WEIGHT_CLASS_TINY)
M.drop_item()
- if(power >= 2 && prob(10))
- to_chat(M, "[pick("You have a coughing fit!", "You can't stop coughing!")]")
- M.Stun(20)
- M.emote("cough")
- addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 6)
- addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 12)
- addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 18)
- if(infective)
- A.spread(A.holder, 1)
-
+ if(power >= 2 && prob(10))
+ to_chat(M, "[pick("You have a coughing fit!", "You can't stop coughing!")]")
+ M.Stun(20)
+ M.emote("cough")
+ addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 6)
+ addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 12)
+ addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 18)
+ if(infective)
+ A.spread(1)
+
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm
index 5e430b3297..b8d80b8023 100644
--- a/code/datums/diseases/advance/symptoms/fire.dm
+++ b/code/datums/diseases/advance/symptoms/fire.dm
@@ -63,14 +63,14 @@ Bonus
M.adjust_fire_stacks(1 * power)
M.adjustFireLoss(3 * power)
if(infective)
- A.spread(A.holder, 2)
+ A.spread(2)
return 1
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
M.adjust_fire_stacks(3 * power)
M.adjustFireLoss(5 * power)
if(infective)
- A.spread(A.holder, 4)
+ A.spread(4)
return 1
/*
diff --git a/code/datums/diseases/advance/symptoms/sensory.dm.rej b/code/datums/diseases/advance/symptoms/sensory.dm.rej
deleted file mode 100644
index fbf27328fa..0000000000
--- a/code/datums/diseases/advance/symptoms/sensory.dm.rej
+++ /dev/null
@@ -1,134 +0,0 @@
-diff a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm (rejected hunks)
-@@ -23,106 +23,43 @@ Bonus
- transmittable = -3
- level = 5
- severity = 0
-+ symptom_delay_min = 5
-+ symptom_delay_max = 10
-+ var/purge_alcohol = FALSE
-+ var/brain_heal = FALSE
-
--/datum/symptom/sensory_restoration/Activate(var/datum/disease/advance/A)
-+/datum/symptom/sensory_restoration/Start(datum/disease/advance/A)
- ..()
-+ if(A.properties["resistance"] >= 6) //heal brain damage
-+ brain_heal = TRUE
-+ if(A.properties["transmittable"] >= 8) //purge alcohol
-+ purge_alcohol = TRUE
-+
-+/datum/symptom/sensory_restoration/Activate(var/datum/disease/advance/A)
-+ if(!..())
-+ return
- var/mob/living/M = A.affected_mob
- if(A.stage >= 2)
- M.restoreEars()
-
- if(A.stage >= 3)
-- M.dizziness = 0
-- M.drowsyness = 0
-- M.slurring = 0
-- M.confused = 0
-- M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3)
-- if(ishuman(M))
-- var/mob/living/carbon/human/H = M
-- H.drunkenness = max(H.drunkenness - 10, 0)
-+ M.dizziness = max(0, M.dizziness - 2)
-+ M.drowsyness = max(0, M.drowsyness - 2)
-+ M.slurring = max(0, M.slurring - 2)
-+ M.confused = max(0, M.confused - 2)
-+ if(purge_alcohol)
-+ M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3)
-+ if(ishuman(M))
-+ var/mob/living/carbon/human/H = M
-+ H.drunkenness = max(H.drunkenness - 5, 0)
-
- if(A.stage >= 4)
-- M.drowsyness = max(M.drowsyness-5, 0)
-+ M.drowsyness = max(0, M.drowsyness - 2)
- if(M.reagents.has_reagent("mindbreaker"))
- M.reagents.remove_reagent("mindbreaker", 5)
- if(M.reagents.has_reagent("histamine"))
- M.reagents.remove_reagent("histamine", 5)
- M.hallucination = max(0, M.hallucination - 10)
-
-- if(A.stage >= 5)
-- M.adjustBrainLoss(-3)
--
--/*
--//////////////////////////////////////
--Sensory-Destruction
-- noticable.
-- Lowers resistance
-- Decreases stage speed tremendously.
-- Decreases transmittablity tremendously.
-- the drugs hit them so hard they have to focus on not dying
--
--Bonus
-- The body generates Sensory destructive chemicals.
-- You cannot taste anything anymore.
-- ethanol for extremely drunk victim
-- mindbreaker to break the mind
-- impedrezene to ruin the brain
--
--//////////////////////////////////////
--*/
--/datum/symptom/sensory_destruction
-- name = "Sensory destruction"
-- stealth = -1
-- resistance = -2
-- stage_speed = -3
-- transmittable = -4
-- level = 6
-- severity = 5
-- var/sleepy = 0
-- var/sleepy_ticks = 0
--
--/datum/symptom/sensory_destruction/Activate(var/datum/disease/advance/A)
-- ..()
-- var/mob/living/M = A.affected_mob
-- if(prob(SYMPTOM_ACTIVATION_PROB))
-- switch(A.stage)
-- if(1)
-- to_chat(M, "You can't feel anything.")
-- if(2)
-- to_chat(M, "You feel absolutely hammered.")
-- if(prob(10))
-- sleepy_ticks += rand(10,14)
-- if(3)
-- M.reagents.add_reagent("ethanol",rand(5,7))
-- to_chat(M, "You try to focus on not dying.")
-- if(prob(15))
-- sleepy_ticks += rand(10,14)
-- if(4)
-- M.reagents.add_reagent("ethanol",rand(6,10))
-- to_chat(M, "u can count 2 potato!")
-- if(prob(20))
-- sleepy_ticks += rand(10,14)
-- if(5)
-- M.reagents.add_reagent("ethanol",rand(7,13))
-- if(prob(25))
-- sleepy_ticks += rand(10,14)
--
-- if(sleepy_ticks)
-- if(A.stage>=4)
-- M.hallucination = min(M.hallucination + 10, 50)
-- if(A.stage>=5)
-- if(prob(80))
-- M.adjustBrainLoss(1)
-- if(prob(50))
-- M.drowsyness = max(M.drowsyness, 3)
-- sleepy++
-- sleepy_ticks--
-- else
-- sleepy = 0
--
-- switch(sleepy) //Works like morphine
-- if(11)
-- to_chat(M, "You start to feel tired...")
-- if(12 to 24)
-- M.drowsyness += 1
-- if(24 to INFINITY)
-- M.Sleeping(2, 0)
-+ if(brain_heal && A.stage >= 5)
-+ M.adjustBrainLoss(-3)
-\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm
index 43caf6d34e..fda1fc765c 100644
--- a/code/datums/diseases/advance/symptoms/sneeze.dm
+++ b/code/datums/diseases/advance/symptoms/sneeze.dm
@@ -1,34 +1,34 @@
-/*
-//////////////////////////////////////
-
-Sneezing
-
- Very Noticable.
- Increases resistance.
- Doesn't increase stage speed.
- Very transmittable.
- Low Level.
-
-Bonus
- Forces a spread type of AIRBORNE
- with extra range!
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/sneeze
- name = "Sneezing"
- stealth = -2
- resistance = 3
- stage_speed = 0
- transmittable = 4
- level = 1
- severity = 1
+/*
+//////////////////////////////////////
+
+Sneezing
+
+ Very Noticable.
+ Increases resistance.
+ Doesn't increase stage speed.
+ Very transmittable.
+ Low Level.
+
+Bonus
+ Forces a spread type of AIRBORNE
+ with extra range!
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/sneeze
+ name = "Sneezing"
+ stealth = -2
+ resistance = 3
+ stage_speed = 0
+ transmittable = 4
+ level = 1
+ severity = 1
symptom_delay_min = 5
symptom_delay_max = 35
-
+
/datum/symptom/sneeze/Start(datum/disease/advance/A)
- ..()
+ ..()
if(A.properties["transmittable"] >= 9) //longer spread range
power = 2
if(A.properties["stealth"] >= 4)
@@ -41,7 +41,8 @@ Bonus
switch(A.stage)
if(1, 2, 3)
if(!suppress_warning)
- M.emote("sniff")
- else
- M.emote("sneeze")
- A.spread(A.holder, 4 + power)
\ No newline at end of file
+ M.emote("sniff")
+ else
+ M.emote("sneeze")
+ A.spread(5)
+ return
diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm
index 12ed912581..4bcb1b502f 100644
--- a/code/datums/diseases/advance/symptoms/symptoms.dm
+++ b/code/datums/diseases/advance/symptoms/symptoms.dm
@@ -29,7 +29,7 @@
/datum/symptom/New()
var/list/S = SSdisease.list_symptoms
for(var/i = 1; i <= S.len; i++)
- if(src.type == S[i])
+ if(type == S[i])
id = "[i]"
return
CRASH("We couldn't assign an ID!")
diff --git a/code/datums/diseases/advance/symptoms/vision.dm.rej b/code/datums/diseases/advance/symptoms/vision.dm.rej
deleted file mode 100644
index e9cb0cd6d8..0000000000
--- a/code/datums/diseases/advance/symptoms/vision.dm.rej
+++ /dev/null
@@ -1,19 +0,0 @@
-diff a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm (rejected hunks)
-@@ -40,7 +40,7 @@ Bonus
- if(!..())
- return
- var/mob/living/carbon/M = A.affected_mob
-- var/obj/item/organ/eyes = M.getorganslot("eye_sight")
-+ var/obj/item/organ/eyes/eyes = M.getorganslot("eye_sight")
- if(istype(eyes))
- switch(A.stage)
- if(1, 2)
-@@ -55,7 +55,7 @@ Bonus
- M.adjust_eye_damage(5)
- if(eyes.eye_damage >= 10)
- M.become_nearsighted()
-- if(prob(M.eye_damage - 10 + 1))
-+ if(prob(eyes.eye_damage - 10 + 1))
- if(!remove_eyes)
- if(M.become_blind())
- to_chat(M, "You go blind!")
diff --git a/code/datums/diseases/advance/symptoms/vomit.dm.rej b/code/datums/diseases/advance/symptoms/vomit.dm.rej
deleted file mode 100644
index b6fd999e2f..0000000000
--- a/code/datums/diseases/advance/symptoms/vomit.dm.rej
+++ /dev/null
@@ -1,30 +0,0 @@
-diff a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm (rejected hunks)
-@@ -32,7 +32,7 @@ Bonus
- symptom_delay_min = 25
- symptom_delay_max = 80
- var/vomit_blood = FALSE
-- var/proj_vomit = FALSE
-+ var/proj_vomit = 0
-
- /datum/symptom/vomit/Start(datum/disease/advance/A)
- ..()
-@@ -41,7 +41,7 @@ Bonus
- if(A.properties["resistance"] >= 7) //blood vomit
- vomit_blood = TRUE
- if(A.properties["transmittable"] >= 7) //projectile vomit
-- proj_vomit = TRUE
-+ proj_vomit = 5
-
- /datum/symptom/vomit/Activate(datum/disease/advance/A)
- if(!..())
-@@ -52,7 +52,7 @@ Bonus
- if(prob(base_message_chance) && !suppress_warning)
- to_chat(M, "[pick("You feel nauseous.", "You feel like you're going to throw up!")]")
- else
-- Vomit(M)
-+ vomit(M)
-
--/datum/symptom/vomit/proc/Vomit(mob/living/carbon/M)
-- M.vomit(20, vomit_blood, distance = 5 * proj_vomit)
-+/datum/symptom/vomit/proc/vomit(mob/living/carbon/M)
-+ M.vomit(20, vomit_blood, distance = proj_vomit)
diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm
index 2db4d1082e..780cb0b1e5 100644
--- a/code/datums/diseases/anxiety.dm
+++ b/code/datums/diseases/anxiety.dm
@@ -7,7 +7,7 @@
cure_text = "Ethanol"
cures = list("ethanol")
agent = "Excess Lepidopticides"
- viable_mobtypes = list(/mob/living/carbon/human,/mob/living/carbon/monkey)
+ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
desc = "If left untreated subject will regurgitate butterflies."
severity = MEDIUM
diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm
index eba5e1173b..8c681b8ec3 100644
--- a/code/datums/diseases/appendicitis.dm
+++ b/code/datums/diseases/appendicitis.dm
@@ -8,11 +8,11 @@
permeability_mod = 1
desc = "If left untreated the subject will become very weak, and may vomit often."
severity = "Dangerous!"
- longevity = 1000
disease_flags = CAN_CARRY|CAN_RESIST
spread_flags = NON_CONTAGIOUS
visibility_flags = HIDDEN_PANDEMIC
required_organs = list(/obj/item/organ/appendix)
+ bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus
/datum/disease/appendicitis/stage_act()
..()
diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm
index 7a12049fec..5c9c9a1522 100644
--- a/code/datums/diseases/beesease.dm
+++ b/code/datums/diseases/beesease.dm
@@ -7,7 +7,7 @@
cure_text = "Sugar"
cures = list("sugar")
agent = "Apidae Infection"
- viable_mobtypes = list(/mob/living/carbon/human,/mob/living/carbon/monkey)
+ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
desc = "If left untreated subject will regurgitate bees."
severity = DANGEROUS
diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm
index a58f85a494..e830cafbef 100644
--- a/code/datums/diseases/brainrot.dm
+++ b/code/datums/diseases/brainrot.dm
@@ -9,7 +9,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
cure_chance = 15//higher chance to cure, since two reagents are required
desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
- required_organs = list(/obj/item/bodypart/head)
+ required_organs = list(/obj/item/organ/brain)
severity = DANGEROUS
/datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR
diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm
index 69b30589ac..2b77885359 100644
--- a/code/datums/diseases/dna_spread.dm
+++ b/code/datums/diseases/dna_spread.dm
@@ -25,8 +25,8 @@
//Absorbs the target DNA.
strain_data["dna"] = new affected_mob.dna.type
affected_mob.dna.copy_dna(strain_data["dna"])
- src.carrier = 1
- src.stage = 4
+ carrier = TRUE
+ stage = 4
return
switch(stage)
diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm
index 9c88626406..524bf8b4b2 100644
--- a/code/datums/diseases/fake_gbs.dm
+++ b/code/datums/diseases/fake_gbs.dm
@@ -6,7 +6,7 @@
cure_text = "Synaptizine & Sulfur"
cures = list("synaptizine","sulfur")
agent = "Gravitokinetic Bipotential SADS-"
- viable_mobtypes = list(/mob/living/carbon/human,/mob/living/carbon/monkey)
+ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
desc = "If left untreated death will occur."
severity = BIOHAZARD
diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm
index 8ee4c59b9f..1f2596d2d3 100644
--- a/code/datums/diseases/flu.dm
+++ b/code/datums/diseases/flu.dm
@@ -6,7 +6,7 @@
cures = list("spaceacillin")
cure_chance = 10
agent = "H13N1 flu virion"
- viable_mobtypes = list(/mob/living/carbon/human,/mob/living/carbon/monkey)
+ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
permeability_mod = 0.75
desc = "If left untreated the subject will feel quite unwell."
severity = MEDIUM
diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm
index b2195a9527..75f63edf43 100644
--- a/code/datums/diseases/pierrot_throat.dm
+++ b/code/datums/diseases/pierrot_throat.dm
@@ -10,7 +10,6 @@
permeability_mod = 0.75
desc = "If left untreated the subject will probably drive others to insanity."
severity = MEDIUM
- longevity = 400
/datum/disease/pierrot_throat/stage_act()
..()
diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm
index d33446cadf..9cbb829061 100644
--- a/code/datums/diseases/rhumba_beat.dm
+++ b/code/datums/diseases/rhumba_beat.dm
@@ -13,7 +13,7 @@
/datum/disease/rhumba_beat/stage_act()
..()
if(affected_mob.ckey == "rosham")
- src.cure()
+ cure()
return
switch(stage)
if(2)
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 03b746a3bd..e5746c3f8b 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -73,7 +73,6 @@
permeability_mod = 1
cure_chance = 1
disease_flags = CAN_CARRY|CAN_RESIST
- longevity = 30
desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey."
severity = BIOHAZARD
stage_prob = 4
diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm
index 4b57c2655b..c8e2a4609b 100644
--- a/code/datums/diseases/tuberculosis.dm
+++ b/code/datums/diseases/tuberculosis.dm
@@ -1,4 +1,5 @@
/datum/disease/tuberculosis
+ form = "Disease"
name = "Fungal tuberculosis"
max_stages = 5
spread_text = "Airborne"
@@ -8,8 +9,9 @@
viable_mobtypes = list(/mob/living/carbon/human)
cure_chance = 5//like hell are you getting out of hell
desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue."
- required_organs = list(/obj/item/bodypart/head)
+ required_organs = list(/obj/item/organ/lungs)
severity = DANGEROUS
+ bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing.
/datum/disease/tuberculosis/stage_act() //it begins
..()
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index 5150938258..4bacf2d9e8 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -29,6 +29,10 @@
destination.dna.temporary_mutations = temporary_mutations.Copy()
if(transfer_SE)
destination.dna.struc_enzymes = struc_enzymes
+ if(ishuman(destination))
+ var/mob/living/carbon/human/H = destination
+ H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA
+ destination.flavor_text = destination.dna.features["flavor_text"] //Update the flavor_text to use new dna text
/datum/dna/proc/copy_dna(datum/dna/new_dna)
new_dna.unique_enzymes = unique_enzymes
@@ -228,6 +232,7 @@
if(newfeatures)
dna.features = newfeatures
+ flavor_text = dna.features["flavor_text"] //Update the flavor_text to use new dna text
if(mrace)
set_species(mrace, icon_update=0)
@@ -247,6 +252,8 @@
dna.struc_enzymes = se
domutcheck()
+ give_genitals(TRUE)//Give all genitalia that DNA says you should have, remove any pre-existing ones as this is a hardset!
+
if(mrace || newfeatures || ui)
update_body()
update_hair()
diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm
index ae0398e59b..5e381c0322 100644
--- a/code/datums/explosion.dm
+++ b/code/datums/explosion.dm
@@ -68,7 +68,7 @@ GLOBAL_LIST_EMPTY(explosions)
//I would make this not ex_act the thing that triggered the explosion,
//but everything that explodes gives us their loc or a get_turf()
//and somethings expect us to ex_act them so they can qdel()
- stoplag() //tldr, let the calling proc call qdel(src) before we explode
+ sleep(1) //tldr, let the calling proc call qdel(src) before we explode
EX_PREPROCESS_EXIT_CHECK
@@ -96,7 +96,9 @@ GLOBAL_LIST_EMPTY(explosions)
if(!silent)
var/frequency = get_rand_frequency()
- var/ex_sound = get_sfx("explosion")
+ var/sound/explosion_sound = sound(get_sfx("explosion"))
+ var/sound/far_explosion_sound = sound('sound/effects/explosionfar.ogg')
+
for(var/mob/M in GLOB.player_list)
// Double check for client
var/turf/M_turf = get_turf(M)
@@ -104,12 +106,12 @@ GLOBAL_LIST_EMPTY(explosions)
var/dist = get_dist(M_turf, epicenter)
// If inside the blast radius + world.view - 2
if(dist <= round(max_range + world.view - 2, 1))
- M.playsound_local(epicenter, ex_sound, 100, 1, frequency, falloff = 5)
+ M.playsound_local(epicenter, null, 100, 1, frequency, falloff = 5, S = explosion_sound)
// You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station.
else if(dist <= far_dist)
var/far_volume = Clamp(far_dist, 30, 50) // Volume is based on explosion size and dist
far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion
- M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5)
+ M.playsound_local(epicenter, null, far_volume, 1, frequency, falloff = 5, S = far_explosion_sound)
EX_PREPROCESS_CHECK_TICK
//postpone processing for a bit
@@ -273,7 +275,7 @@ GLOBAL_LIST_EMPTY(explosions)
. = list()
var/processed = 0
- while(!stopped && running)
+ while(running)
var/I
for(I in (processed + 1) to affected_turfs.len) // we cache the explosion block rating of every turf in the explosion area
var/turf/T = affected_turfs[I]
diff --git a/code/datums/forced_movement.dm b/code/datums/forced_movement.dm
index 3da1b050a3..620973487a 100644
--- a/code/datums/forced_movement.dm
+++ b/code/datums/forced_movement.dm
@@ -84,7 +84,7 @@
/mob/Collide(atom/A)
. = ..()
- if(force_moving && force_moving.allow_climbing && istype(A,/obj/structure))
+ if(force_moving && force_moving.allow_climbing && istype(A, /obj/structure))
var/obj/structure/S = A
if(S.climbable)
S.do_climb(src)
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index d5c0e74839..806f48a24f 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -73,12 +73,14 @@
return ""
. = header ? "The following pull requests are currently test merged: " : ""
for(var/line in testmerge)
- var/details
+ var/details
if(world.RunningService())
var/cm = testmerge[line]["commit"]
details = ": '" + html_encode(testmerge[line]["title"]) + "' by " + html_encode(testmerge[line]["author"]) + " at commit " + html_encode(copytext(cm, 1, min(length(cm), 7)))
else if(has_pr_details) //tgs2 support
details = ": '" + html_encode(testmerge[line]["title"]) + "' by " + html_encode(testmerge[line]["user"]["login"])
+ if(details && findtext(details, "\[s\]") && (!usr || !usr.client.holder))
+ continue
. += "#[line][details] "
/client/verb/showrevinfo()
@@ -96,7 +98,7 @@
to_chat(src, "[prefix][copytext(pc, 1, min(length(pc), 7))]")
else
to_chat(src, "Revision unknown")
- to_chat(src, "Current Infomational Settings:")
+ to_chat(src, "Current Informational Settings:")
to_chat(src, "Protect Authority Roles From Traitor: [config.protect_roles_from_antagonist]")
to_chat(src, "Protect Assistant Role From Traitor: [config.protect_assistant_from_antagonist]")
to_chat(src, "Enforce Human Authority: [config.enforce_human_authority]")
diff --git a/code/datums/helper_datums/topic_input.dm b/code/datums/helper_datums/topic_input.dm
index e1934cc6a5..d27f259159 100644
--- a/code/datums/helper_datums/topic_input.dm
+++ b/code/datums/helper_datums/topic_input.dm
@@ -37,7 +37,7 @@
return isturf(t) ? t : null
/datum/topic_input/proc/getAtom(i)
- return getType(i,/atom)
+ return getType(i, /atom)
/datum/topic_input/proc/getArea(i)
var/t = getAndLocate(i)
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 4e7490f8ee..abad0dba1d 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -38,7 +38,7 @@
calling_pad.say("Connection failure.")
qdel(src)
return
-
+
testing("Holocall started")
//cleans up ALL references :)
@@ -49,16 +49,16 @@
if(user_good)
user.reset_perspective()
user.remote_control = null
-
+
if(!QDELETED(eye))
if(user_good && user.client)
for(var/datum/camerachunk/chunk in eye.visibleCameraChunks)
chunk.remove(eye)
qdel(eye)
eye = null
-
+
user = null
-
+
if(hologram)
hologram.HC = null
hologram = null
@@ -75,7 +75,7 @@
if(connected_holopad)
connected_holopad.SetLightsAndPower()
connected_holopad = null
-
+
testing("Holocall destroyed")
return ..()
@@ -123,7 +123,7 @@
if(I == H)
continue
Disconnect(I)
-
+
for(var/I in H.holo_calls)
var/datum/holocall/HC = I
if(HC != src)
@@ -155,7 +155,7 @@
var/obj/machinery/holopad/H = I
if(!H.is_operational())
ConnectionFailure(H)
-
+
if(QDELETED(src))
return FALSE
@@ -174,6 +174,7 @@
/datum/action/innate/end_holocall
name = "End Holocall"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "camera_off"
var/datum/holocall/hcall
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index f9444898ce..dc78eea396 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -20,6 +20,7 @@ GLOBAL_LIST_INIT(huds, list(
ANTAG_HUD_SINTOUCHED = new/datum/atom_hud/antag/hidden(),
ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(),
ANTAG_HUD_CLOCKWORK = new/datum/atom_hud/antag(),
+ ANTAG_HUD_BORER = new/datum/atom_hud/antag(),
))
/datum/atom_hud
diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm
index e80c2848cd..5238c65465 100644
--- a/code/datums/map_config.dm
+++ b/code/datums/map_config.dm
@@ -11,7 +11,7 @@
var/minetype = "lavaland"
- var/list/transition_config = list(CENTCOMM = SELFLOOPING,
+ var/list/transition_config = list(CENTCOM = SELFLOOPING,
MAIN_STATION = CROSSLINKED,
EMPTY_AREA_1 = CROSSLINKED,
EMPTY_AREA_2 = CROSSLINKED,
@@ -115,8 +115,8 @@
return UNAFFECTED
if("MAIN_STATION")
return MAIN_STATION
- if("CENTCOMM")
- return CENTCOMM
+ if("CENTCOM")
+ return CENTCOM
if("MINING")
return MINING
if("EMPTY_AREA_1")
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 94637f10e3..6ce082bd2a 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -6,6 +6,7 @@
/datum/action/neck_chop
name = "Neck Chop - Injures the neck, stopping the victim from speaking for a while."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "neckchop"
/datum/action/neck_chop/Trigger()
@@ -22,6 +23,7 @@
/datum/action/leg_sweep
name = "Leg Sweep - Trips the victim, knocking them down for a brief moment."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "legsweep"
/datum/action/leg_sweep/Trigger()
@@ -38,6 +40,7 @@
/datum/action/lung_punch//referred to internally as 'quick choke'
name = "Lung Punch - Delivers a strong punch just above the victim's abdomen, constraining the lungs. The victim will be unable to breathe for a short time."
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "lungpunch"
/datum/action/lung_punch/Trigger()
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 3045033948..421498559e 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -186,6 +186,8 @@
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
icon = 'icons/obj/weapons.dmi'
icon_state = "bostaff0"
+ lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
block_chance = 50
/obj/item/weapon/twohanded/bostaff/update_icon()
diff --git a/code/datums/material_container.dm b/code/datums/material_container.dm
index 76de0329cd..cfc4c13d91 100644
--- a/code/datums/material_container.dm
+++ b/code/datums/material_container.dm
@@ -73,7 +73,7 @@
/datum/material_container/proc/insert_item(obj/item/I, multiplier = 1)
if(!I)
return 0
- if(istype(I,/obj/item/stack))
+ if(istype(I, /obj/item/stack))
var/obj/item/stack/S = I
return insert_stack(I, S.amount)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 0a03835b1b..7017149d53 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -120,6 +120,10 @@
transfer_martial_arts(new_character)
if(active || force_key_move)
new_character.key = key //now transfer the key to link the client to our new body
+ if(isliving(new_character)) //New humans and such are by default enabled arousal. Let's always use the new mind's prefs.
+ var/mob/living/L = new_character
+ L.canbearoused = L.client.prefs.arousable //Technically this should make taking over a character mean the body gain the new minds setting...
+ L.update_arousal_hud() //Removes the old icon
/datum/mind/proc/store_memory(new_text)
memory += "[new_text] "
@@ -629,10 +633,11 @@
text = "[text]: "
if (ishuman(current))
text += "healthy|infected|HUMAN|other"
- else if (ismonkey(current))
- var/found = 0
- for(var/datum/disease/D in current.viruses)
- if(istype(D, /datum/disease/transformation/jungle_fever)) found = 1
+ else if(ismonkey(current))
+ var/found = FALSE
+ for(var/datum/disease/transformation/jungle_fever/JF in current.viruses)
+ found = TRUE
+ break
if(found)
text += "healthy|INFECTED|human|other"
@@ -1348,7 +1353,8 @@
src = M.mind
//to_chat(world, "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!")
else if (istype(M) && length(M.viruses))
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
D.cure(0)
if("infected")
if (check_rights(R_ADMIN, 0))
@@ -1368,10 +1374,9 @@
var/mob/living/carbon/human/H = current
var/mob/living/carbon/monkey/M = current
if (istype(M))
- for(var/datum/disease/D in M.viruses)
- if (istype(D,/datum/disease/transformation/jungle_fever))
- D.cure(0)
- sleep(0) //because deleting of virus is doing throught spawn(0)
+ for(var/datum/disease/transformation/jungle_fever/JF in M.viruses)
+ JF.cure(0)
+ sleep(0) //because deleting of virus is doing throught spawn(0) //What
log_admin("[key_name(usr)] attempting to humanize [key_name(current)]")
message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(current)]")
H = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG)
@@ -1598,9 +1603,9 @@
agent_landmarks.len = 4
scientist_landmarks.len = 4
for(var/obj/effect/landmark/abductor/A in GLOB.landmarks_list)
- if(istype(A,/obj/effect/landmark/abductor/agent))
+ if(istype(A, /obj/effect/landmark/abductor/agent))
agent_landmarks[text2num(A.team)] = A
- else if(istype(A,/obj/effect/landmark/abductor/scientist))
+ else if(istype(A, /obj/effect/landmark/abductor/scientist))
scientist_landmarks[text2num(A.team)] = A
var/obj/effect/landmark/L
@@ -1689,10 +1694,7 @@
else
mind = new /datum/mind(key)
- if(SSticker)
- SSticker.minds += mind
- else
- stack_trace("mind_initialize(): No SSticker ready")
+ SSticker.minds += mind
if(!mind.name)
mind.name = real_name
mind.current = src
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index 6725e1c541..88beec629f 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -82,7 +82,7 @@
id = "derelict4"
suffix = "derelict4.dmm"
name = "Derelict 4"
- description = "Centcom ferries have never crashed, will never crash, there is no current investigation into a crashed ferry, and we will not let Internal Affairs trample over high security \
+ description = "CentCom ferries have never crashed, will never crash, there is no current investigation into a crashed ferry, and we will not let Internal Affairs trample over high security \
information in the name of this baseless witchhunt."
/datum/map_template/ruin/space/derelict5
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index a86574e710..ce38d0af3e 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -133,7 +133,7 @@
/datum/map_template/shuttle/emergency/cramped
suffix = "cramped"
name = "Secure Transport Vessel 5 (STV5)"
- description = "Well, looks like Centcomm only had this ship in the area, they probably weren't expecting you to need evac for a while. \
+ description = "Well, looks like CentCom only had this ship in the area, they probably weren't expecting you to need evac for a while. \
Probably best if you don't rifle around in whatever equipment they were transporting. I hope you're friendly with your coworkers, because there is very little space in this thing.\n\
\n\
Contains contraband armory guns, maintenance loot, and abandoned crates!"
@@ -181,7 +181,7 @@
suffix = "supermatter"
name = "Hyperfractal Gigashuttle"
description = "\"I dunno, this seems kinda needlessly complicated.\"\n\
- \"This shuttle has very a very high safety record, according to Centcom Officer Cadet Yins.\"\n\
+ \"This shuttle has very a very high safety record, according to CentCom Officer Cadet Yins.\"\n\
\"Are you sure?\"\n\
\"Yes, it has a safety record of N-A-N, which is apparently larger than 100%.\""
admin_notes = "Supermatter that spawns on shuttle is special anchored 'hugbox' supermatter that cannot take damage and does not take in or emit gas. \
@@ -215,7 +215,7 @@
/datum/map_template/shuttle/ferry/base
suffix = "base"
name = "transport ferry"
- description = "Standard issue Box/Metastation Centcom ferry."
+ description = "Standard issue Box/Metastation CentCom ferry."
/datum/map_template/shuttle/ferry/meat
suffix = "meat"
@@ -267,7 +267,7 @@
/datum/map_template/shuttle/emergency/raven
suffix = "raven"
- name = "Centcomm Raven Battlecruiser"
- description = "The Centcomm Raven Battlecruiser is currently docked at the Centcomm ship bay awaiting a mission, this Battlecruiser has been reassigned as an emergency escape shuttle for currently unknown reasons. The Centcomm Raven Battlecruiser should comfortably fit a medium to large crew size crew and is complete with all required facitlities including a top of the range Centcomm Medical Bay."
+ name = "CentCom Raven Battlecruiser"
+ description = "The CentCom Raven Battlecruiser is currently docked at the CentCom ship bay awaiting a mission, this Battlecruiser has been reassigned as an emergency escape shuttle for currently unknown reasons. The CentCom Raven Battlecruiser should comfortably fit a medium to large crew size crew and is complete with all required facitlities including a top of the range CentCom Medical Bay."
admin_notes = "The long way home"
credit_cost = 12500
diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm
index d4eeb0cc39..65438830a2 100644
--- a/code/datums/wires/robot.dm
+++ b/code/datums/wires/robot.dm
@@ -21,7 +21,7 @@
var/list/status = list()
status += "The law sync module is [R.lawupdate ? "on" : "off"]."
status += "The intelligence link display shows [R.connected_ai ? R.connected_ai.name : "NULL"]."
- status += "The camera light is [!isnull(R.camera) && R.camera.status ? "on" : "off"]."
+ status += "The camera light is [!isnull(R.builtInCamera) && R.builtInCamera.status ? "on" : "off"]."
status += "The lockdown indicator is [R.lockcharge ? "on" : "off"]."
status += "The reset module hardware light is [R.has_module() ? "on" : "off"]."
return status
@@ -45,9 +45,9 @@
else
R.notify_ai(TRUE)
if(WIRE_CAMERA) // Pulse to disable the camera.
- if(!isnull(R.camera) && !R.scrambledcodes)
- R.camera.toggle_cam(usr, 0)
- R.visible_message("[R]'s camera lense focuses loudly.", "Your camera lense focuses loudly.")
+ if(!QDELETED(R.builtInCamera) && !R.scrambledcodes)
+ R.builtInCamera.toggle_cam(usr, 0)
+ R.visible_message("[R]'s camera lens focuses loudly.", "Your camera lens focuses loudly.")
if(WIRE_LAWSYNC) // Forces a law update if possible.
if(R.lawupdate)
R.visible_message("[R] gently chimes.", "LawSync protocol engaged.")
@@ -75,10 +75,10 @@
else if(!R.deployed) //AI shells must always have the same laws as the AI
R.lawupdate = FALSE
if (WIRE_CAMERA) // Disable the camera.
- if(!isnull(R.camera) && !R.scrambledcodes)
- R.camera.status = mend
- R.camera.toggle_cam(usr, 0)
- R.visible_message("[R]'s camera lense focuses loudly.", "Your camera lense focuses loudly.")
+ if(!QDELETED(R.builtInCamera) && !R.scrambledcodes)
+ R.builtInCamera.status = mend
+ R.builtInCamera.toggle_cam(usr, 0)
+ R.visible_message("[R]'s camera lens focuses loudly.", "Your camera lens focuses loudly.")
if(WIRE_LOCKDOWN) // Simple lockdown.
R.SetLockdown(!mend)
if(WIRE_RESET_MODULE)
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index c71ea6a10f..1b8d25aa51 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -41,7 +41,7 @@
var/static_environ
var/has_gravity = FALSE
- var/noteleport = FALSE //Are you forbidden from teleporting to the area? (centcomm, mobs, wizard, hand teleporter)
+ var/noteleport = FALSE //Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter)
var/hidden = FALSE //Hides area from player Teleport function.
var/safe = FALSE //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers
@@ -338,7 +338,14 @@ GLOBAL_LIST_EMPTY(teleportlocs)
else
icon_state = "blue-red"
else
- icon_state = null
+ var/weather_icon
+ for(var/V in SSweather.existing_weather)
+ var/datum/weather/W = V
+ if(src in W.impacted_areas)
+ W.update_areas()
+ weather_icon = TRUE
+ if(!weather_icon)
+ icon_state = null
/area/space/updateicon()
icon_state = null
@@ -429,10 +436,10 @@ GLOBAL_LIST_EMPTY(teleportlocs)
if(!L.ckey)
return
- // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
+ // Ambience goes down here -- make sure to list each area separately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
if(L.client && !L.client.ambience_playing && L.client.prefs.toggles & SOUND_SHIP_AMBIENCE)
L.client.ambience_playing = 1
- L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2)
+ L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ)
if(!(L.client && (L.client.prefs.toggles & SOUND_AMBIENCE)))
return //General ambience check is below the ship ambience so one can play without the other
@@ -441,7 +448,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
var/sound = pick(ambientsounds)
if(!L.client.played)
- L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = 1)
+ L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE)
L.client.played = 1
sleep(600) //ewww - this is very very bad
if(L.&& L.client)
diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm
index 1e3efd9f2b..717fc68542 100644
--- a/code/game/area/areas/centcom.dm
+++ b/code/game/area/areas/centcom.dm
@@ -2,7 +2,7 @@
// CENTCOM
/area/centcom
- name = "Centcom"
+ name = "CentCom"
icon_state = "centcom"
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
requires_power = FALSE
@@ -12,16 +12,16 @@
flags = NONE
/area/centcom/control
- name = "Centcom Docks"
+ name = "CentCom Docks"
/area/centcom/evac
- name = "Centcom Recovery Ship"
+ name = "CentCom Recovery Ship"
/area/centcom/supply
- name = "Centcom Supply Shuttle Dock"
+ name = "CentCom Supply Shuttle Dock"
/area/centcom/ferry
- name = "Centcom Transport Shuttle Dock"
+ name = "CentCom Transport Shuttle Dock"
/area/centcom/prison
name = "Admin Prison"
diff --git a/code/game/area/areas/derelict.dm b/code/game/area/areas/derelict.dm
index 00804c5012..5882fa0a8c 100644
--- a/code/game/area/areas/derelict.dm
+++ b/code/game/area/areas/derelict.dm
@@ -13,6 +13,10 @@
name = "Derelict Secondary Hallway"
icon_state = "hallS"
+/area/derelict/hallway/primary/port
+ name = "Derelict Port Hallway"
+ icon_state = "hallFP"
+
/area/derelict/arrival
name = "Derelict Arrival Centre"
icon_state = "yellow"
@@ -121,4 +125,4 @@
name = "Abandoned Teleporter"
icon_state = "teleporter"
music = "signal"
- ambientsounds = list('sound/ambience/ambimalf.ogg')
+ ambientsounds = list('sound/ambience/ambimalf.ogg')
\ No newline at end of file
diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm
index 7bf213be52..51fd4e1677 100644
--- a/code/game/area/areas/holodeck.dm
+++ b/code/game/area/areas/holodeck.dm
@@ -21,28 +21,28 @@
if(!linked)
return 0
var/area/A = get_area(linked)
- ASSERT(!istype(A,/area/holodeck))
+ ASSERT(!istype(A, /area/holodeck))
return A.powered(chan)
/area/holodeck/usage(var/chan)
if(!linked)
return 0
var/area/A = get_area(linked)
- ASSERT(!istype(A,/area/holodeck))
+ ASSERT(!istype(A, /area/holodeck))
return A.usage(chan)
/area/holodeck/addStaticPower(value, powerchannel)
if(!linked)
return
var/area/A = get_area(linked)
- ASSERT(!istype(A,/area/holodeck))
+ ASSERT(!istype(A, /area/holodeck))
return A.addStaticPower(value,powerchannel)
/area/holodeck/use_power(var/amount, var/chan)
if(!linked)
return 0
var/area/A = get_area(linked)
- ASSERT(!istype(A,/area/holodeck))
+ ASSERT(!istype(A, /area/holodeck))
return A.use_power(amount,chan)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 83f1817fc1..6a00f26ffc 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -105,7 +105,7 @@
/atom/proc/CanPass(atom/movable/mover, turf/target)
return !density
-/atom/proc/onCentcom()
+/atom/proc/onCentCom()
var/turf/T = get_turf(src)
if(!T)
return FALSE
@@ -126,7 +126,7 @@
if(istype(T.loc, /area/centcom))
return TRUE
- //Check for centcomm shuttles
+ //Check for centcom shuttles
for(var/A in SSshuttle.mobile)
var/obj/docking_port/mobile/M = A
if(M.launch_status == ENDGAME_LAUNCHED)
@@ -143,7 +143,7 @@
if(T.z != ZLEVEL_CENTCOM)//if not, don't bother
return 0
- if(istype(T.loc,/area/shuttle/syndicate) || istype(T.loc,/area/syndicate_mothership))
+ if(istype(T.loc, /area/shuttle/syndicate) || istype(T.loc, /area/syndicate_mothership))
return 1
return 0
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index dd778b453e..1edca6d632 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -530,7 +530,7 @@
/* Stationloving
*
* A stationloving atom will always teleport back to the station
-* if it ever leaves the station z-levels or Centcom. It will also,
+* if it ever leaves the station z-levels or CentCom. It will also,
* when Destroy() is called, will teleport to a random turf on the
* station.
*
diff --git a/code/game/communications.dm b/code/game/communications.dm
index 5b4f1c39fc..66bb91ef59 100644
--- a/code/game/communications.dm
+++ b/code/game/communications.dm
@@ -130,7 +130,7 @@ GLOBAL_LIST_INIT(radiochannels, list(
"Medical" = 1355,
"Engineering" = 1357,
"Security" = 1359,
- "Centcom" = 1337,
+ "CentCom" = 1337,
"Syndicate" = 1213,
"Supply" = 1347,
"Service" = 1349,
@@ -146,7 +146,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list(
"1355" = "Medical",
"1357" = "Engineering",
"1359" = "Security",
- "1337" = "Centcom",
+ "1337" = "CentCom",
"1213" = "Syndicate",
"1347" = "Supply",
"1349" = "Service",
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 2e5854509a..2697df7ba9 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -62,7 +62,8 @@
//called when a carbon changes virus
/mob/living/carbon/proc/check_virus()
var/threat = 0
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
if(!(D.visibility_flags & HIDDEN_SCANNER))
if (D.severity != NONTHREAT) //a buffing virus gets an icon
threat = 2
@@ -202,17 +203,17 @@
holder = hud_list[i]
holder.icon_state = null
for(var/obj/item/weapon/implant/I in implants)
- if(istype(I,/obj/item/weapon/implant/tracking))
+ if(istype(I, /obj/item/weapon/implant/tracking))
holder = hud_list[IMPTRACK_HUD]
var/icon/IC = icon(icon, icon_state, dir)
holder.pixel_y = IC.Height() - world.icon_size
holder.icon_state = "hud_imp_tracking"
- else if(istype(I,/obj/item/weapon/implant/mindshield))
+ else if(istype(I, /obj/item/weapon/implant/mindshield))
holder = hud_list[IMPLOYAL_HUD]
var/icon/IC = icon(icon, icon_state, dir)
holder.pixel_y = IC.Height() - world.icon_size
holder.icon_state = "hud_imp_loyal"
- else if(istype(I,/obj/item/weapon/implant/chem))
+ else if(istype(I, /obj/item/weapon/implant/chem))
holder = hud_list[IMPCHEM_HUD]
var/icon/IC = icon(icon, icon_state, dir)
holder.pixel_y = IC.Height() - world.icon_size
diff --git a/code/game/gamemodes/antag_spawner_cit.dm b/code/game/gamemodes/antag_spawner_cit.dm
index 175ad0e8a4..c65ac11c6b 100644
--- a/code/game/gamemodes/antag_spawner_cit.dm
+++ b/code/game/gamemodes/antag_spawner_cit.dm
@@ -16,7 +16,6 @@ obj/item/weapon/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owne
B.mind.assigned_role = B.name
B.mind.special_role = B.name
- SSticker.mode.traitors += B.mind
var/datum/objective/syndi_borer/new_objective
new_objective = new /datum/objective/syndi_borer
new_objective.owner = B.mind
@@ -27,7 +26,7 @@ obj/item/weapon/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owne
to_chat(B, "You are awake at last! Seek out whoever released you and aid them as best you can!")
if(new_objective)
to_chat(B, "Objective #[1]: [new_objective.explanation_text]")
-
+ SSticker.mode.update_borer_icons_added(B)
/obj/item/weapon/antag_spawner/syndi_borer/proc/check_usability(mob/user)
if(used)
to_chat(user, "[src] appears to be empty!")
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 1c30d84313..ec923c635b 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -97,7 +97,8 @@ GLOBAL_LIST_EMPTY(blobs_legit) //used for win-score calculations, contains only
send_intercept(1)
message_sent = TRUE
+ addtimer(CALLBACK(src, .proc/SendSecondIntercept), 24000)
- sleep(24000) //40 minutes, plus burst_delay*3(minimum of 6 minutes, maximum of 8)
+/datum/game_mode/blob/proc/SendSecondIntercept()
if(!replacementmode)
- send_intercept(2) //if the blob has been alive this long, it's time to bomb it
\ No newline at end of file
+ send_intercept(2) //if the blob has been alive this long, it's time to bomb it
diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm
index 3ca2e8f00e..b1cea567a1 100644
--- a/code/game/gamemodes/blob/blob_finish.dm
+++ b/code/game/gamemodes/blob/blob_finish.dm
@@ -62,7 +62,7 @@
return ..()
/datum/game_mode/proc/auto_declare_completion_blob()
- if(istype(SSticker.mode,/datum/game_mode/blob) )
+ if(istype(SSticker.mode, /datum/game_mode/blob) )
var/datum/game_mode/blob/blob_mode = src
if(blob_mode.blob_overminds.len)
var/text = "The blob[(blob_mode.blob_overminds.len > 1 ? "s were" : " was")]:"
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index bf7ae55167..7fa09f3978 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -151,7 +151,7 @@
if(blob_core)
stat(null, "Core Health: [blob_core.obj_integrity]")
stat(null, "Power Stored: [blob_points]/[max_blob_points]")
- if(SSticker && istype(SSticker.mode, /datum/game_mode/blob))
+ if(istype(SSticker.mode, /datum/game_mode/blob))
var/datum/game_mode/blob/B = SSticker.mode
stat(null, "Blobs to Win: [GLOB.blobs_legit.len]/[B.blobwincount]")
else
diff --git a/code/game/gamemodes/changeling/cellular_emporium.dm b/code/game/gamemodes/changeling/cellular_emporium.dm
index 67d15c677c..aaba09c87c 100644
--- a/code/game/gamemodes/changeling/cellular_emporium.dm
+++ b/code/game/gamemodes/changeling/cellular_emporium.dm
@@ -68,7 +68,8 @@
/datum/action/innate/cellular_emporium
name = "Cellular Emporium"
- button_icon_state = "cellular_emporium"
+ icon_icon = 'icons/obj/drinks.dmi'
+ button_icon_state = "changelingsting"
background_icon_state = "bg_alien"
var/datum/cellular_emporium/cellular_emporium
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index c702439e84..e71ac5cbeb 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -146,6 +146,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "arm_blade"
item_state = "arm_blade"
+ lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
flags = ABSTRACT | NODROP | DROPDEL
w_class = WEIGHT_CLASS_HUGE
force = 25
@@ -223,6 +225,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "tentacle"
item_state = "tentacle"
+ lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
flags = ABSTRACT | NODROP | DROPDEL | NOBLUDGEON
w_class = WEIGHT_CLASS_HUGE
ammo_type = /obj/item/ammo_casing/magic/tentacle
@@ -394,6 +398,8 @@
flags = ABSTRACT | NODROP | DROPDEL
icon = 'icons/obj/weapons.dmi'
icon_state = "ling_shield"
+ lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
block_chance = 50
var/remaining_uses //Set by the changeling ability.
diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm
index 40ce63a60e..c961406810 100644
--- a/code/game/gamemodes/changeling/powers/panacea.dm
+++ b/code/game/gamemodes/changeling/powers/panacea.dm
@@ -41,6 +41,9 @@
user.reagents.add_reagent("antihol", 10)
user.reagents.add_reagent("mannitol", 25)
- for(var/datum/disease/D in user.viruses)
+ for(var/thing in user.viruses)
+ var/datum/disease/D = thing
+ if(D.severity == NONTHREAT)
+ continue
D.cure()
return TRUE
diff --git a/code/game/gamemodes/cit_objectives.dm b/code/game/gamemodes/cit_objectives.dm
index a6b1b4d464..faa376571c 100644
--- a/code/game/gamemodes/cit_objectives.dm
+++ b/code/game/gamemodes/cit_objectives.dm
@@ -4,7 +4,7 @@
//Hit chance is here to avoid people checking github and then hovering around new arrivals within the max minute range every round.
/datum/objective/assassinate/late
- martyr_compatible = 0
+ martyr_compatible = FALSE
/datum/objective/assassinate/late/find_target()
@@ -15,7 +15,7 @@
possible_targets += possible_target
if(possible_targets.len > 0 && prob(LATE_TARGET_HIT_CHANCE))
target = pick(possible_targets)
- martyr_compatible = 1 //Might never matter, but I guess if an admin gives another random objective, this should now be compatible
+ martyr_compatible = TRUE //Might never matter, but I guess if an admin gives another random objective, this should now be compatible
update_explanation_text()
message_admins("[target] has been selected as the assassination target of [owner].")
@@ -68,14 +68,14 @@
/datum/objective/assassinate/late/check_completion()
if(target && target.current) //If target WAS assigned
if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
- return 1
- return 0
+ return TRUE
+ return FALSE
else //If no target was ever given
if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current))
- return 0
+ return FALSE
if(!is_special_character(owner.current))
- return 0
- return 1
+ return FALSE
+ return TRUE
/datum/objective/assassinate/late/update_explanation_text()
//..()
@@ -83,3 +83,24 @@
explanation_text = "Assassinate [target.name], the [!target_role_type ? target.assigned_role : target.special_role]."
else
explanation_text = "Stay alive until your target arrives on the station, you will be notified when the target has been identified."
+
+
+
+//BORER STUFF
+//Because borers didn't use to have objectives
+/datum/objective/normal_borer //Default objective, should technically never be used unmodified but CAN work unmodified.
+ explanation_text = "You must escape with at least one borer with host on the shuttle."
+ target_amount = 1
+ martyr_compatible = 0
+
+/datum/objective/normal_borer/check_completion()
+ var/total_borer_hosts = 0
+ for(var/mob/living/carbon/C in GLOB.mob_list)
+ var/mob/living/simple_animal/borer/D = C.has_brain_worms()
+ var/turf/location = get_turf(C)
+ if(location.z == ZLEVEL_CENTCOM && D && D.stat != DEAD)
+ total_borer_hosts++
+ if(target_amount <= total_borer_hosts)
+ return TRUE
+ else
+ return FALSE
\ No newline at end of file
diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
index 297021ff5a..98186a5cdf 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
@@ -19,6 +19,9 @@
return 1
return ..()
+/obj/effect/clockwork/sigil/attack_tk(mob/user)
+ return //you can't tk stomp sigils, but you can hit them with something
+
/obj/effect/clockwork/sigil/attack_hand(mob/user)
if(iscarbon(user) && !user.stat && !is_servant_of_ratvar(user))
user.visible_message("[user] stamps out [src]!", "You stomp on [src], scattering it into thousands of particles.")
@@ -81,7 +84,7 @@
/obj/effect/clockwork/sigil/submission
name = "ominous sigil"
desc = "A luminous golden sigil. Something about it really bothers you."
- clockwork_desc = "A sigil that will enslave the first person to cross it, provided they remain on it for seven seconds."
+ clockwork_desc = "A sigil that will enslave any non-Servant that remains on it for 8 seconds. Cannot penetrate mindshield implants."
icon_state = "sigilsubmission"
layer = LOW_SIGIL_LAYER
alpha = 125
@@ -91,17 +94,15 @@
light_color = "#FAE48C"
stat_affected = UNCONSCIOUS
resist_string = "glows faintly yellow"
- var/convert_time = 70
+ var/convert_time = 80
var/delete_on_finish = TRUE
sigil_name = "Sigil of Submission"
- var/glow_type
-
-/obj/effect/clockwork/sigil/submission/proc/post_channel(mob/living/L)
+ var/glow_type = /obj/effect/temp_visual/ratvar/sigil/submission
/obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L)
L.visible_message("[src] begins to glow a piercing magenta!", "You feel something start to invade your mind...")
var/oldcolor = color
- animate(src, color = "#AF0AAF", time = convert_time)
+ animate(src, color = "#AF0AAF", time = convert_time, flags = ANIMATION_END_NOW)
var/obj/effect/temp_visual/ratvar/sigil/glow
if(glow_type)
glow = new glow_type(get_turf(src))
@@ -113,16 +114,15 @@
if(get_turf(L) != get_turf(src))
if(glow)
qdel(glow)
- animate(src, color = oldcolor, time = 20)
+ animate(src, color = oldcolor, time = 20, flags = ANIMATION_END_NOW)
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20)
visible_message("[src] slowly stops glowing!")
return
- post_channel(L)
if(is_eligible_servant(L))
to_chat(L, "\"You belong to me now.\"")
if(add_servant_of_ratvar(L))
L.log_message("Conversion was done with a [sigil_name].", INDIVIDUAL_ATTACK_LOG)
- L.Knockdown(60) //Completely defenseless for about five seconds - mainly to give them time to read over the information they've just been presented with
+ L.Knockdown(50) //Completely defenseless for five seconds - mainly to give them time to read over the information they've just been presented with
if(iscarbon(L))
var/mob/living/carbon/C = L
C.silent += 5
@@ -136,39 +136,9 @@
to_chat(M, "[message] you!")
else
to_chat(M, "[message] [L.real_name]!")
- if(delete_on_finish)
- qdel(src)
- else
- animate(src, color = oldcolor, time = 20)
- addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20)
- visible_message("[src] slowly stops glowing!")
-
-
-//Sigil of Accession: After a short time, converts any non-servant standing on it though implants. Knocks down and silences them for five seconds afterwards.
-/obj/effect/clockwork/sigil/submission/accession
- name = "terrifying sigil"
- desc = "A luminous brassy sigil. Something about it makes you want to flee."
- clockwork_desc = "A sigil that will enslave any person who crosses it, provided they remain on it for seven seconds. \n\
- It can convert a mindshielded target once before disppearing, but can convert any number of non-implanted targets."
- icon_state = "sigiltransgression"
- alpha = 200
- color = "#A97F1B"
- light_range = 3 //bright light
- light_power = 1
- light_color = "#A97F1B"
- delete_on_finish = FALSE
- sigil_name = "Sigil of Accession"
- glow_type = /obj/effect/temp_visual/ratvar/sigil/accession
- resist_string = "glows bright orange"
-
-/obj/effect/clockwork/sigil/submission/accession/post_channel(mob/living/L)
- if(L.isloyal())
- L.log_message("Had their mindshield implant broken by a [sigil_name].", INDIVIDUAL_ATTACK_LOG)
- delete_on_finish = TRUE
- L.visible_message("[L] visibly trembles!", \
- "[text2ratvar("You will be mine and his. This puny trinket will not stop me.")]")
- for(var/obj/item/weapon/implant/mindshield/M in L.implants)
- qdel(M)
+ animate(src, color = oldcolor, time = 20, flags = ANIMATION_END_NOW)
+ addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20)
+ visible_message("[src] slowly stops glowing!")
//Sigil of Transmission: Stores power for clockwork machinery, serving as a battery.
@@ -326,8 +296,7 @@
stat_affected = DEAD
resist_string = "glows shimmering yellow"
sigil_name = "Vitality Matrix"
- var/static/vitality = 0
- var/base_revive_cost = 20
+ var/revive_cost = 150
var/sigil_active = FALSE
var/animation_number = 3 //each cycle increments this by 1, at 4 it produces an animation and resets
var/static/list/damage_heal_order = list(CLONE, TOX, BURN, BRUTE, OXY) //we heal damage in this order
@@ -335,11 +304,11 @@
/obj/effect/clockwork/sigil/vitality/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "It has access to [GLOB.ratvar_awakens ? "INFINITE":"[vitality]"] units of vitality.")
+ to_chat(user, "It has access to [GLOB.ratvar_awakens ? "INFINITE":GLOB.clockwork_vitality] units of vitality.")
if(GLOB.ratvar_awakens)
to_chat(user, "It can revive Servants at no cost!")
else
- to_chat(user, "It can revive Servants at a cost of [base_revive_cost] vitality plus vitality equal to the non-oxygen damage they have, in addition to being destroyed in the process.")
+ to_chat(user, "It can revive Servants at a cost of [revive_cost] vitality.")
/obj/effect/clockwork/sigil/vitality/sigil_effects(mob/living/L)
if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active)
@@ -348,7 +317,7 @@
animate(src, alpha = 255, time = 10, flags = ANIMATION_END_NOW) //we may have a previous animation going. finish it first, then do this one without delay.
sleep(10)
//as long as they're still on the sigil and are either not a servant or they're a servant AND it has remaining vitality
- while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || vitality))) && get_turf(L) == get_turf(src))
+ while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || GLOB.clockwork_vitality))) && get_turf(L) == get_turf(src))
sigil_active = TRUE
if(animation_number >= 4)
new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
@@ -373,40 +342,37 @@
else
vitality_drained = L.adjustToxLoss(1.5)
if(vitality_drained)
- vitality += vitality_drained
+ GLOB.clockwork_vitality += vitality_drained
else
break
else
if(L.stat == DEAD)
- var/revival_cost = base_revive_cost + L.getCloneLoss() + L.getToxLoss() + L.getFireLoss() + L.getBruteLoss() //ignores oxygen damage
+ var/revival_cost = revive_cost
if(GLOB.ratvar_awakens)
revival_cost = 0
var/mob/dead/observer/ghost = L.get_ghost(TRUE)
- if(vitality >= revival_cost && (ghost || (L.mind && L.mind.active)))
+ if(GLOB.clockwork_vitality >= revival_cost && (ghost || (L.mind && L.mind.active)))
if(ghost)
ghost.reenter_corpse()
L.revive(1, 1)
var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
animate(V, alpha = 0, transform = matrix()*2, time = 8)
playsound(L, 'sound/magic/staff_healing.ogg', 50, 1)
- L.visible_message("[L] suddenly gets back up, [GLOB.ratvar_awakens ? "[L.p_their()] body dripping blue ichor":"even as [src] scatters into blue sparks around [L.p_them()]"]!", \
- "\"[text2ratvar("You will be okay, child.")]\"")
- vitality -= revival_cost
- if(!GLOB.ratvar_awakens)
- qdel(src)
+ L.visible_message("[L] suddenly gets back up, [L.p_their()] body dripping blue ichor!", "\"[text2ratvar("You will be okay, child.")]\"")
+ GLOB.clockwork_vitality -= revival_cost
break
var/vitality_for_cycle = 3
if(!GLOB.ratvar_awakens)
if(L.stat == CONSCIOUS)
vitality_for_cycle = 2
- vitality_for_cycle = min(vitality, vitality_for_cycle)
+ vitality_for_cycle = min(GLOB.clockwork_vitality, vitality_for_cycle)
var/vitality_used = L.heal_ordered_damage(vitality_for_cycle, damage_heal_order)
if(!vitality_used)
break
if(!GLOB.ratvar_awakens)
- vitality -= vitality_used
+ GLOB.clockwork_vitality -= vitality_used
sleep(2)
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm b/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm
index ef1099d3e0..9380e46487 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm
@@ -1,5 +1,14 @@
//horrifying power drain proc made for clockcult's power drain in lieu of six istypes or six for(x in view) loops
/atom/movable/proc/power_drain(clockcult_user)
+ var/obj/item/weapon/stock_parts/cell/cell = get_cell()
+ if(cell)
+ return cell.power_drain(clockcult_user)
+ return 0
+
+/obj/item/weapon/melee/baton/power_drain(clockcult_user) //balance memes
+ return 0
+
+/obj/item/weapon/gun/power_drain(clockcult_user) //balance memes
return 0
/obj/machinery/power/apc/power_drain(clockcult_user)
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm
index 790088e8d5..f21cbb8987 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm
@@ -24,11 +24,15 @@
//For the Geis scripture; binds a target to convert.
/obj/effect/proc_holder/slab/geis
ranged_mousepointer = 'icons/effects/geis_target.dmi'
+ var/obj/structure/destructible/clockwork/geis_binding/binding //we always have a reference to the binding
+ var/obj/structure/destructible/clockwork/geis_binding/pulled_binding //we use this to see if we're pulling it or not
+
+/obj/effect/proc_holder/slab/geis/remove_ranged_ability(msg)
+ ..()
+ binding = null
+ pulled_binding = null
/obj/effect/proc_holder/slab/geis/InterceptClickOn(mob/living/caller, params, atom/target)
- if(..())
- return TRUE
-
var/turf/T = ranged_ability_user.loc
if(!isturf(T))
return TRUE
@@ -36,6 +40,20 @@
var/target_is_binding = istype(target, /obj/structure/destructible/clockwork/geis_binding)
if((target_is_binding || isliving(target)) && ranged_ability_user.Adjacent(target))
+ if(in_progress || ..())
+ var/mob/living/L = target
+ if(!pulled_binding)
+ if(target == binding || (isliving(target) && L.buckled == binding))
+ pulled_binding = binding
+ ranged_ability_user.start_pulling(binding)
+ remove_mousepointer(ranged_ability_user.client)
+ ranged_mousepointer = 'icons/effects/geis_target_remove.dmi'
+ add_mousepointer(ranged_ability_user.client)
+ else if(target == pulled_binding || (isliving(target) && L.buckled == pulled_binding))
+ ranged_ability_user.visible_message("[ranged_ability_user] dispels [pulled_binding]!", "You dispel the binding!")
+ binding.take_damage(obj_integrity)
+ remove_ranged_ability()
+ return TRUE
if(target_is_binding)
var/obj/structure/destructible/clockwork/geis_binding/GB = target
GB.repair_and_interrupt()
@@ -65,19 +83,44 @@
in_progress = TRUE
clockwork_say(ranged_ability_user, text2ratvar("Be bound, heathen!"))
remove_mousepointer(ranged_ability_user.client)
+ ranged_mousepointer = 'icons/effects/geis_target_remove.dmi'
+ add_mousepointer(ranged_ability_user.client)
add_logs(ranged_ability_user, L, "bound with Geis")
+ playsound(target, 'sound/magic/blink.ogg', 50, TRUE, frequency = 0.5)
if(slab.speed_multiplier >= 0.5) //excuse my debug...
ranged_ability_user.notransform = TRUE
- addtimer(CALLBACK(src, .proc/reset_user_notransform, ranged_ability_user), 5) //stop us moving for a little bit so we don't break the scripture following this
- slab.busy = null
- var/datum/clockwork_scripture/geis/conversion = new
- conversion.slab = slab
- conversion.invoker = ranged_ability_user
- conversion.target = target
- conversion.run_scripture()
+ addtimer(CALLBACK(src, .proc/reset_user_notransform, ranged_ability_user), 5) //stop us moving for a little bit so we don't break the binding immediately
+ if(L.buckled)
+ L.buckled.unbuckle_mob(target, TRUE)
+ binding = new(get_turf(target))
+ binding.setDir(target.dir)
+ binding.buckle_mob(target, TRUE)
+ pulled_binding = binding
+ ranged_ability_user.start_pulling(binding)
+ slab.busy = "sustaining Geis"
+ slab.flags |= NODROP
+ while(!QDELETED(binding) && !QDELETED(ranged_ability_user))
+ if(ranged_ability_user.pulling == binding)
+ pulled_binding = binding
+ if(ranged_ability_user.client && ranged_ability_user.client.mouse_pointer_icon == 'icons/effects/geis_target.dmi')
+ remove_mousepointer(ranged_ability_user.client)
+ ranged_mousepointer = 'icons/effects/geis_target_remove.dmi'
+ add_mousepointer(ranged_ability_user.client)
+ else //if we're not pulling it, swap our mousepointer
+ pulled_binding = null
+ if(ranged_ability_user.client && ranged_ability_user.client.mouse_pointer_icon == 'icons/effects/geis_target_remove.dmi')
+ remove_mousepointer(ranged_ability_user.client)
+ ranged_mousepointer = 'icons/effects/geis_target.dmi'
+ add_mousepointer(ranged_ability_user.client)
+ sleep(1)
+ if(!QDELETED(slab))
+ slab.flags &= ~NODROP
+ in_progress = FALSE
successful = TRUE
remove_ranged_ability()
+ else
+ ..()
return TRUE
@@ -145,29 +188,6 @@
return TRUE
-//For the Volt Void scripture, fires a ray of energy at a target location
-/obj/effect/proc_holder/slab/volt
- ranged_mousepointer = 'icons/effects/volt_target.dmi'
-
-/obj/effect/proc_holder/slab/volt/InterceptClickOn(mob/living/caller, params, atom/target)
- if(target == slab || ..()) //we can't cancel
- return TRUE
-
- var/turf/T = ranged_ability_user.loc
- if(!isturf(T))
- return TRUE
-
- if(target in view(7, get_turf(ranged_ability_user)))
- successful = TRUE
- ranged_ability_user.visible_message("[ranged_ability_user] fires a ray of energy at [target]!", "You fire a volt ray at [target].")
- playsound(ranged_ability_user, 'sound/effects/light_flicker.ogg', 50, 1)
- T = get_turf(target)
- new/obj/effect/temp_visual/ratvar/volt_hit(T, ranged_ability_user)
- add_logs(ranged_ability_user, T, "fired a volt ray")
- remove_ranged_ability()
-
- return TRUE
-
//For the cyborg Linked Vanguard scripture, grants you and a nearby ally Vanguard
/obj/effect/proc_holder/slab/vanguard
ranged_mousepointer = 'icons/effects/vanguard_target.dmi'
diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm
index 1985ada22e..343f2e70e7 100644
--- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm
@@ -6,6 +6,8 @@
Clockwork slabs will only make components if held or if inside an item held by a human, and when making a component will prevent all other slabs held from making components.\n\
Hitting a slab, a Servant with a slab, or a cache will transfer this slab's components into the target, the target's slab, or the global cache, respectively."
icon_state = "dread_ipad"
+ lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'
+ 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
w_class = WEIGHT_CLASS_SMALL
@@ -19,8 +21,8 @@
var/selected_scripture = SCRIPTURE_DRIVER
var/recollecting = FALSE //if we're looking at fancy recollection
var/obj/effect/proc_holder/slab/slab_ability //the slab's current bound ability, for certain scripture
- var/list/quickbound = list(/datum/clockwork_scripture/ranged_ability/geis_prep, /datum/clockwork_scripture/create_object/replicant, \
- /datum/clockwork_scripture/create_object/tinkerers_cache) //quickbound scripture, accessed by index
+ var/list/quickbound = list(/datum/clockwork_scripture/ranged_ability/geis, /datum/clockwork_scripture/create_object/sigil_of_submission, \
+ /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/tinkerers_cache) //quickbound scripture, accessed by index
var/maximum_quickbound = 5 //how many quickbound scriptures we can have
var/recollection_category = "Default"
actions_types = list(/datum/action/item_action/clock/hierophant)
@@ -51,21 +53,18 @@
maximum_quickbound = 6 //we usually have one or two unique scriptures, so if ratvar is up let us bind one more
actions_types = list()
-/obj/item/clockwork/slab/cyborg/engineer //four scriptures, plus a fabricator
- quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/cogscarab, \
- /datum/clockwork_scripture/create_object/soul_vessel, /datum/clockwork_scripture/create_object/sigil_of_transmission)
+/obj/item/clockwork/slab/cyborg/engineer //two scriptures, plus a fabricator
+ quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission)
/obj/item/clockwork/slab/cyborg/medical //five scriptures, plus a spear
quickbound = list(/datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/ranged_ability/sentinels_compromise, \
/datum/clockwork_scripture/create_object/vitality_matrix, /datum/clockwork_scripture/channeled/mending_mantra, /datum/clockwork_scripture/fellowship_armory)
-/obj/item/clockwork/slab/cyborg/security //four scriptures, plus a spear
- quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/channeled/taunting_tirade, \
- /datum/clockwork_scripture/channeled/volt_blaster)
+/obj/item/clockwork/slab/cyborg/security //twoscriptures, plus a spear
+ quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker)
-/obj/item/clockwork/slab/cyborg/peacekeeper //four scriptures, plus a spear
- quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/channeled/taunting_tirade, \
- /datum/clockwork_scripture/channeled/volt_blaster)
+/obj/item/clockwork/slab/cyborg/peacekeeper //two scriptures, plus a spear
+ quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker)
/obj/item/clockwork/slab/cyborg/janitor //five scriptures, plus a fabricator
quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \
@@ -75,8 +74,8 @@
quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/tinkerers_cache, \
/datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/fellowship_armory, /datum/clockwork_scripture/create_object/clockwork_obelisk)
-/obj/item/clockwork/slab/cyborg/miner //three scriptures, plus a spear and xray vision
- quickbound = list(/datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/channeled/volt_blaster)
+/obj/item/clockwork/slab/cyborg/miner //two scriptures, plus a spear and xray vision
+ quickbound = list(/datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/spatial_gateway)
/obj/item/clockwork/slab/cyborg/access_display(mob/living/user)
if(!GLOB.ratvar_awakens)
@@ -134,7 +133,7 @@
production_time = world.time + SLAB_PRODUCTION_TIME + production_slowdown
var/mob/living/L
L = get_atom_on_turf(src, /mob/living)
- if(istype(L) && can_recite_scripture(L))
+ if(istype(L) && (no_cost || can_recite_scripture(L)))
var/component_to_generate = target_component_id
if(!component_to_generate)
component_to_generate = get_weighted_component_id(src) //more likely to generate components that we have less of
@@ -265,7 +264,7 @@
if(busy)
to_chat(user, "[src] refuses to work, displaying the message: \"[busy]!\"")
return 0
- if(!can_recite_scripture(user))
+ if(!no_cost && !can_recite_scripture(user))
to_chat(user, "[src] hums fitfully in your hands, but doesn't seem to do anything...")
return 0
access_display(user)
@@ -285,7 +284,7 @@
ui.open()
/obj/item/clockwork/slab/proc/recite_scripture(datum/clockwork_scripture/scripture, mob/living/user)
- if(!scripture || !user || !user.canUseTopic(src) || !can_recite_scripture(user))
+ if(!scripture || !user || !user.canUseTopic(src) || (!no_cost && !can_recite_scripture(user)))
return FALSE
if(user.get_active_held_item() != src)
to_chat(user, "You need to hold the slab in your active hand to recite scripture!")
@@ -401,24 +400,21 @@
dat += "Servant: A person or robot who serves Ratvar. You are one of these. "
dat += "Cache: A Tinkerer's Cache, which is a structure that stores and creates components. "
dat += "CV: Construction Value. All clockwork structures, floors, and walls increase this number. "
+ dat += "Vitality: Used for healing effects, produced by Ratvarian spear attacks and Vitality Matrices. "
dat += "Geis: An important scripture used to make normal crew and robots into Servants of Ratvar. "
dat += "[get_component_icon(BELLIGERENT_EYE)]BE: Belligerent Eye, a component type used in offensive scriptures. "
dat += "[get_component_icon(VANGUARD_COGWHEEL)]VC: Vanguard Cogwheel, a component type used in defensive scriptures. "
dat += "[get_component_icon(GEIS_CAPACITOR)]GC: Geis Capacitor, a component type used in mind-related scriptures. "
dat += "[get_component_icon(REPLICANT_ALLOY)]RA: Replicant Alloy, a component type used in construction scriptures. "
- dat += "[get_component_icon(HIEROPHANT_ANSIBLE)]HA: Hierophant Ansible, a component type used in energy scriptures. "
+ dat += "[get_component_icon(HIEROPHANT_ANSIBLE)]HA: Hierophant Ansible, a component type used in energy-related scriptures. "
dat += "Ark: The cult's win condition, a huge structure that needs to be defended.
"
dat += "Items "
dat += "Slab: A clockwork slab, a Servant's most important tool. You're holding one! Keep it safe and hidden. "
- dat += "Visor: A judicial visor, which is a pair of glasses that can stun everything in an area after a delay. "
+ dat += "Visor: A judicial visor, which is a pair of glasses that can smite an area for a brief stun and delayed explosion. "
dat += "Wraith Specs: Wraith spectacles, which provide true sight (x-ray, night vision) but damage the wearer's eyes. "
- dat += "Spear: A Ratvarian spear, which is a very powerful melee weapon. "
+ dat += "Spear: A Ratvarian spear, which is a very powerful melee weapon that produces Vitality. "
dat += "Fabricator: A replica fabricator, which converts objects into clockwork versions.
"
dat += "Constructs "
- dat += "Vessel: A soul vessel, a clockwork brain used to activate constructs. "
- dat += "Shell: A construct shell of some type that can accept a soul vessel to activate. "
- dat += "Scarab: A cogscarab construct, which is a drone that maintains the cult's bases. "
- dat += "Fragment: An anim[prob(1) ? "e" : "a"] fragment, which is a fragile but powerful offensive construct. "
dat += "Marauder: A clockwork marauder, which is a powerful bodyguard that hides in its owner.
"
dat += "Structures (* = requires power) "
dat += "Warden: An ocular warden, which is a ranged turret that damages non-Servants that see it. "
@@ -430,8 +426,9 @@
dat += "Note: Sigils can be stacked on top of one another, making certain sigils very effective when paired! "
dat += "Transgression: Stuns the first non-Servant to cross it for ten seconds and blinds others nearby. Disappears on use. "
dat += "Submission: Converts the first non-Servant to stand on the sigil for seven seconds. Disappears on use. "
+ dat += "Matrix: Drains health from non-Servants, producing Vitality. Can heal and revive Servants. "
dat += "Accession: Identical to the Sigil of Submission, but doesn't disappear on use. It can also convert a single mindshielded target, but will disappear after doing this. "
- dat += "Transmission: Drains and stores power for clockwork structures. Feeding it brass sheets will create power.
"
+ dat += "Transmission: Drains and stores power for clockwork structures. Feeding it brass sheets will create additional power.
"
dat += "-=-=-=-=-=-"
if("Components")
var/servants = 0 //Calculate the current production time for slab components
@@ -463,7 +460,7 @@
dat += "Components are your primary resource as a Servant. There are five types of component, with each one being used in different roles:
"
dat += "[get_component_icon(BELLIGERENT_EYE)]BE Belligerent Eyes are aggressive and judgemental, and are used in offensive scripture; "
dat += "[get_component_icon(VANGUARD_COGWHEEL)]VC Vanguard Cogwheels are defensive and repairing, and are used in defensive scripture; "
- dat += "[get_component_icon(GEIS_CAPACITOR)]GC Geis Capacitors are for conversion and control, and are used in mind-related scripture; " //References the old name
+ dat += "[get_component_icon(GEIS_CAPACITOR)]GC Geis Capacitors are for conversion and control, and are used in mind-related scripture; "
dat += "[get_component_icon(REPLICANT_ALLOY)]RA Replicant Alloy is a strong, malleable metal and is used for construction and creation; "
dat += "[get_component_icon(HIEROPHANT_ANSIBLE)]HA Hierophant Ansibles are for transmission and power, and are used in power and teleportation scripture
"
dat += "Although this is a good rule of thumb, their effects become much more nuanced when used together. For instance, a turret might have both belligerent eyes and \
@@ -501,8 +498,8 @@
and can be harnessed in several ways.
"
dat += "To begin with, if there is no other source of power nearby, structures will draw from the area's APC, assuming it has one. This is inefficient and ill-advised as \
anything but a last resort. Instead, it is recommended that a Sigil of Transmission is created. This sigil serves as both battery and power generator for nearby clockwork \
- structures, and those structures will happily draw power from the sigil before they resort to pathetic APCs and other sources of energy.
"
- dat += "The most reliable and efficient way to generate power is by using brass sheets; attacking a sigil of transmission with brass sheets will convert them \
+ structures, and those structures will happily draw power from the sigil before they resort to APCs.
"
+ dat += "Generating power is less easy. The most reliable and efficient way is using brass sheets; attacking a sigil of transmission with brass sheets will convert them \
to power, at a rate of [POWER_FLOOR]W per sheet. (Brass sheets are created from replica fabricators, which are explained more in detail in the Conversion section.) \
Activating a sigil of transmission will also cause it to drain power from the nearby area, which, while effective, serves as an obvious tell that there is something wrong.
"
dat += "Without power, many structures will not function, making a base vulnerable to attack. For this reason, it is critical that you keep an eye on your power reserves and \
@@ -514,15 +511,15 @@
they become a full-fledged Servant, ready and willing to serve the cause of Ratvar. It should also be noted that silicon crew, such as cyborgs and the AI, can be \
converted just like normal crew and will gain special abilities; this is covered later. This section will also cover converting the station's structure itself; walls, \
floors, windows, tables, and other objects can all be converted into clockwork versions, and serve an important purpose.
"
- dat += "Methods of Conversion: There are several ways to convert humans and silicons. The first and most readily-available of these is \
- Geis, a Driver-tier scripture. Using it whispers an invocation very quickly - this is incredibly obvious - and charges your slab with power. In addition to making \
- the slab visible in your hand, you can now use it on a target within melee range to bind them and begin converting them. While there are six or fewer Servants, they are \
- unable to escape this binding, meaning that unless you are interrupted, the target is as good as yours. However, the scripture becomes slower for every Servant human or \
- silicon Servant past [SCRIPT_SERVANT_REQ], and the bindings can be resisted past this, meaning that eventually other methods become more desirable.
"
- dat += "The other three methods of conversion are the sigils of submission and accession, whose purpose is to do so, and the mania motor. The sigil of \
- submission is a sigil that, when stood on by a non-Servant for seven full seconds, will convert that non-Servant. This time requirement does not scale with \
- Servants, making it the preferred option after Geis becomes too inefficient. It is, however, consumed after use; the sigil of accession solves this problem, and serves as a \
- permanent conversion sigil. The mania motor is generally unreliable, only converting those who stand near it for an extended period.
"
+ dat += "A Note on Geis: There are several ways to convert humans and silicons. However, the most important tool to making them work is \
+ Geis, a Driver-tier scripture. Using it whispers an invocation very quickly and charges your slab with power. In addition to making the slab visible in your hand, \
+ you can now use it on a target within melee range to bind and mute them. It is by far your most reliable tool for capturing potential converts and targets, though it is incredibly \
+ obvious. In addition, you are unable to take any actions other than moving while your target is bound. The binding will last for 25 seconds and mute for about 13 seconds, though \
+ allies can use Geis to refresh these effects.
"
+ dat += "Converting: The two methods of conversion are the sigil of submission, whose purpose is to do so, and the mania motor. \
+ The sigil of submission is a sigil that, when stood on by a non-Servant for eight seconds, will convert that non-Servant. This is the only practical way to convert targets. \
+ Sigils of submission are cheap, early, and permanent! Make sure sigils of submission are placed only in bases or otherwise hidden spots, or with a sigil of transgression on them. \
+ The mania motor, however, is generally unreliable and unlocked later, only converting those who stand near it for an extended period.
"
dat += "Converting Humans: For obvious reasons, humans are the most common conversion target. Because every crew member is different, and \
may be armed with different equipment, you should take precautions to ensure that they aren't able to resist. If able, removing a headset is essential, as is restraining \
them through handcuffs, cable ties, or other restraints. Some crew, like security, are also implanted with mindshield implants; these will prevent conversion and must be \
@@ -530,9 +527,8 @@
begins administering mindshield implants, this will greatly inhibit conversion. Also note that mindshield implants can be broken by a sigil of accession automatically, but \
the sigil will disappear.
"
dat += "Converting Silicons: Due to their robotic nature, silicons are generally more predictable than humans in terms of conversion. \
- However, they are also much, much harder to subdue, especially cyborgs. The easiest way to convert a cyborg is by using a flash or a sigil of transgression to stun it, \
- then very quickly using Geis to restrain them. If you stack a sigil of transgression and one of the conversion sigils, a crossing cyborg will be stunned and helpless to \
- escape in time before the other sigil converts them.
"
+ However, they are also much, much harder to subdue, especially cyborgs. The easiest way to convert a cyborg is by using Geis to restrain them, then dragging them to a sigil \
+ of submission. If you stack a sigil of transgression and a sigil of submission, a crossing cyborg will be stunned and helpless to escape before they are converted.
"
dat += "Converting AIs is very often the hardest task of the cult, and has been the downfall of countless successful Servants. Their omnipresence across the station, \
coupled with their secure location and ability to lock themselves securely, makes them a powerful target. However, once the AI itself is reached, it is usually completely \
helpless to resist its own conversion. A very common tactic is to take advantage of a converted cyborg to rush the AI before it is able to react.
"
diff --git a/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm b/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm
index 8bc6cb5603..fb210625a2 100644
--- a/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm
@@ -145,7 +145,7 @@
return TRUE
return FALSE
-//Judicial marker: Created by the judicial visor. After three seconds, knocks down any non-Servants nearby and damages Nar-Sian cultists.
+//Judicial marker: Created by the judicial visor. Immediately applies Belligerent and briefly knocks down, then after 3 seconds does large damage and briefly knocks down again
/obj/effect/clockwork/judicial_marker
name = "judicial marker"
desc = "You get the feeling that you shouldn't be standing here."
@@ -165,11 +165,18 @@
/obj/effect/clockwork/judicial_marker/proc/judicialblast()
playsound(src, 'sound/magic/magic_missile.ogg', 50, 1, 1, 1)
flick("judicial_marker", src)
+ for(var/mob/living/carbon/C in range(1, src))
+ var/datum/status_effect/belligerent/B = C.apply_status_effect(STATUS_EFFECT_BELLIGERENT)
+ if(!QDELETED(B))
+ B.duration = world.time + 30
+ C.Knockdown(5) //knocks down for half a second if affected
sleep(16)
+ name = "judicial blast"
layer = ABOVE_ALL_MOB_LAYER
flick("judicial_explosion", src)
set_light(1.4, 2, "#B451A1")
sleep(13)
+ name = "judicial explosion"
var/targetsjudged = 0
playsound(src, 'sound/effects/explosionfar.ogg', 100, 1, 1, 1)
set_light(0)
@@ -181,21 +188,19 @@
L.visible_message("Strange energy flows into [L]'s [I.name]!", \
"Your [I.name] shields you from [src]!")
continue
+ L.Knockdown(15) //knocks down briefly when exploding
if(!iscultist(L))
L.visible_message("[L] is struck by a judicial explosion!", \
"[!issilicon(L) ? "An unseen force slams you into the ground!" : "ERROR: Motor servos disabled by external source!"]")
- L.Knockdown(160) //knocks down targets for 14-16 seconds
else
L.visible_message("[L] is struck by a judicial explosion!", \
"\"Keep an eye out, filth.\"\nA burst of heat crushes you against the ground!")
- L.Knockdown(80) //knocks down for 6-8 seconds, but set cultist targets on fire
- L.adjust_fire_stacks(2)
+ L.adjust_fire_stacks(2) //sets cultist targets on fire
L.IgniteMob()
- if(iscarbon(L))
- var/mob/living/carbon/C = L
- C.silent += 6
+ L.adjustFireLoss(5)
targetsjudged++
- L.adjustBruteLoss(10) //do a small amount of damage
+ if(!QDELETED(L))
+ L.adjustBruteLoss(20) //does a decent amount of damage
add_logs(user, L, "struck with a judicial blast")
to_chat(user, "[targetsjudged ? "Successfully judged [targetsjudged]":"Judged no"] heretic[targetsjudged == 1 ? "":"s"].")
sleep(3) //so the animation completes properly
diff --git a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm
index 8ba151830b..c1ea55e16d 100644
--- a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm
@@ -6,14 +6,16 @@
icon = 'icons/obj/clockwork_objects.dmi'
icon_state = "ratvarian_spear"
item_state = "ratvarian_spear"
+ lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
force = 15 //Extra damage is dealt to targets in attack()
- throwforce = 40
+ throwforce = 25
+ armour_penetration = 10
sharpness = IS_SHARP_ACCURATE
attack_verb = list("stabbed", "poked", "slashed")
hitsound = 'sound/weapons/bladeslice.ogg'
w_class = WEIGHT_CLASS_BULKY
- var/impale_cooldown = 50 //delay, in deciseconds, where you can't impale again
- var/attack_cooldown = 10 //delay, in deciseconds, where you can't attack with the spear
+ var/bonus_burn = 5
var/timerid
/obj/item/clockwork/ratvarian_spear/Destroy()
@@ -22,107 +24,44 @@
/obj/item/clockwork/ratvarian_spear/ratvar_act()
if(GLOB.ratvar_awakens) //If Ratvar is alive, the spear is extremely powerful
- force = 25
- throwforce = 50
- armour_penetration = 10
+ force = 20
+ bonus_burn = 10
+ throwforce = 40
+ armour_penetration = 50
clockwork_desc = initial(clockwork_desc)
deltimer(timerid)
else
force = initial(force)
+ bonus_burn = initial(bonus_burn)
throwforce = initial(throwforce)
- armour_penetration = 0
+ armour_penetration = initial(armour_penetration)
clockwork_desc = "A powerful spear of Ratvarian making. It's more effective against enemy cultists and silicons, though it won't last for long."
deltimer(timerid)
timerid = addtimer(CALLBACK(src, .proc/break_spear), RATVARIAN_SPEAR_DURATION, TIMER_STOPPABLE)
/obj/item/clockwork/ratvarian_spear/cyborg/ratvar_act() //doesn't break!
- if(GLOB.ratvar_awakens)
- force = 25
- throwforce = 50
- armour_penetration = 10
- else
- force = initial(force)
- throwforce = initial(throwforce)
- armour_penetration = 0
+ ..()
+ clockwork_desc = "A powerful spear of Ratvarian making. It's more effective against enemy cultists and silicons."
+ deltimer(timerid)
/obj/item/clockwork/ratvarian_spear/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "Stabbing a human you are pulling or have grabbed with the spear will impale them, doing massive damage and stunning.")
+ to_chat(user, "Attacks on living non-Servants will generate [bonus_burn] units of vitality.")
if(!iscyborg(user))
to_chat(user, "Throwing the spear will do massive damage, break the spear, and knock down the target.")
/obj/item/clockwork/ratvarian_spear/attack(mob/living/target, mob/living/carbon/human/user)
- var/impaling = FALSE
- if(attack_cooldown > world.time)
- to_chat(user, "You can't attack right now, wait [max(round((attack_cooldown - world.time)*0.1, 0.1), 0)] seconds!")
- return
- if(user.pulling && ishuman(user.pulling) && user.pulling == target)
- if(impale_cooldown > world.time)
- to_chat(user, "You can't impale [target] yet, wait [max(round((impale_cooldown - world.time)*0.1, 0.1), 0)] seconds!")
- else
- impaling = TRUE
- attack_verb = list("impaled")
- force += 22 //total 40 damage if ratvar isn't alive, 50 if he is
- armour_penetration += 10 //if you're impaling someone, armor sure isn't that useful
- user.stop_pulling()
-
- if(hitsound)
- playsound(loc, hitsound, get_clamped_volume(), 1, -1)
- user.lastattacked = target
- target.lastattacker = user
- user.do_attack_animation(target)
- if(!target.attacked_by(src, user)) //TODO MAKE ATTACK() USE PROPER RETURN VALUES
- impaling = FALSE //if we got blocked, stop impaling
- else if(!target.null_rod_check()) //if they don't have a null rod, we do bonus damage on a successful attack
+ . = ..()
+ if(!QDELETED(target) && target.stat != DEAD && !target.null_rod_check() && !is_servant_of_ratvar(target)) //we do bonus damage on attacks unless they're a servant, have a null rod, or are dead
+ var/bonus_damage = bonus_burn //normally a total of 20 damage, 30 with ratvar
if(issilicon(target))
- var/mob/living/silicon/S = target
- if(S.stat != DEAD)
- S.visible_message("[S] shudders violently at [src]'s touch!", "ERROR: Temperature rising!")
- S.adjustFireLoss(22) //total 37 damage on borgs
+ target.visible_message("[target] shudders violently at [src]'s touch!", "ERROR: Temperature rising!")
+ bonus_damage *= 5 //total 40 damage on borgs, 70 with ratvar
else if(iscultist(target) || isconstruct(target))
- var/mob/living/M = target
- if(M.stat != DEAD)
- to_chat(M, "Your body flares with agony at [src]'s presence!")
- M.adjustFireLoss(15) //total 30 damage on cultists
- else
- target.adjustFireLoss(3) //anything else takes a total of 18
- add_logs(user, target, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
- add_fingerprint(user)
-
- attack_verb = list("stabbed", "poked", "slashed")
- ratvar_act()
- if(impaling)
- impale_cooldown = world.time + initial(impale_cooldown)
- attack_cooldown = world.time + initial(attack_cooldown) //can't attack until we're done impaling
- if(target)
- new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(target), get_dir(user, target))
- target.Stun(80) //brief stun
- to_chat(user, "You prepare to remove your ratvarian spear from [target]...")
- var/remove_verb = pick("pull", "yank", "drag")
- if(do_after(user, 10, 1, target))
- var/turf/T = get_turf(target)
- var/obj/effect/temp_visual/dir_setting/bloodsplatter/B = new /obj/effect/temp_visual/dir_setting/bloodsplatter(T, get_dir(target, user))
- playsound(T, 'sound/misc/splort.ogg', 200, 1)
- playsound(T, 'sound/weapons/pierce.ogg', 200, 1)
- if(target.stat != CONSCIOUS)
- user.visible_message("[user] [remove_verb]s [src] out of [target]!", "You [remove_verb] your spear from [target]!")
- else
- user.visible_message("[user] kicks [target] off of [src]!", "You kick [target] off of [src]!")
- to_chat(target, "You scream in pain as you're kicked off of [src]!")
- target.emote("scream")
- step(target, get_dir(user, target))
- T = get_turf(target)
- B.forceMove(T)
- target.Knockdown(40) //then knockdown if we stayed next to them
- playsound(T, 'sound/weapons/thudswoosh.ogg', 50, 1)
- flash_color(target, flash_color="#911414", flash_time=8)
- else if(target) //it's a do_after, we gotta check again to make sure they didn't get deleted
- user.visible_message("[user] [remove_verb]s [src] out of [target]!", "You [remove_verb] your spear from [target]!")
- if(target.stat == CONSCIOUS)
- to_chat(target, "You scream in pain as [src] is suddenly [remove_verb]ed out of you!")
- target.emote("scream")
- flash_color(target, flash_color="#911414", flash_time=4)
+ to_chat(target, "Your body flares with agony at [src]'s presence!")
+ bonus_damage *= 3 //total 30 damage on cultists, 50 with ratvar
+ GLOB.clockwork_vitality += target.adjustFireLoss(bonus_damage) //adds the damage done to existing vitality
/obj/item/clockwork/ratvarian_spear/throw_impact(atom/target)
var/turf/T = get_turf(target)
@@ -139,6 +78,7 @@
L.Knockdown(100)
else
L.Knockdown(40)
+ GLOB.clockwork_vitality += L.adjustFireLoss(bonus_burn * 3) //normally a total of 40 damage, 70 with ratvar
break_spear(T)
else
..()
diff --git a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm.rej b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm.rej
new file mode 100644
index 0000000000..f97e3c8c1f
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm.rej
@@ -0,0 +1,10 @@
+diff a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm (rejected hunks)
+@@ -6,6 +6,8 @@
+ icon = 'icons/obj/clockwork_objects.dmi'
+ icon_state = "ratvarian_spear"
+ item_state = "ratvarian_spear"
++ lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'
++ righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
+ force = 15 //Extra damage is dealt to targets in attack()
+ throwforce = 25
+ armour_penetration = 10
diff --git a/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm b/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm
index a0ab79ba05..af0aeb7005 100644
--- a/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm
@@ -4,6 +4,8 @@
desc = "An odd, L-shaped device that hums with energy."
clockwork_desc = "A device that allows the replacing of mundane objects with Ratvarian variants. It requires power to function."
icon_state = "replica_fabricator"
+ lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
w_class = WEIGHT_CLASS_NORMAL
force = 5
flags = NOBLUDGEON
diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm
index f429a4b719..4a1ca367ce 100644
--- a/code/game/gamemodes/clock_cult/clock_scripture.dm
+++ b/code/game/gamemodes/clock_cult/clock_scripture.dm
@@ -274,6 +274,8 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
if(slab_overlay)
slab.add_overlay(slab_overlay)
slab.item_state = "clockwork_slab"
+ slab.lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'
+ slab.righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
slab.inhand_overlay = slab_overlay
slab.slab_ability = new ranged_type(slab)
slab.slab_ability.slab = slab
@@ -299,6 +301,8 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
slab.slab_ability.remove_ranged_ability()
slab.cut_overlays()
slab.item_state = initial(slab.item_state)
+ slab.item_state = initial(slab.lefthand_file)
+ slab.item_state = initial(slab.righthand_file)
slab.inhand_overlay = null
if(invoker)
invoker.update_inv_hands()
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
index d4d6155461..d0b7f11eb4 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
@@ -2,28 +2,6 @@
// APPLICATIONS //
//////////////////
-//Sigil of Accession: Creates a sigil of accession, which is like a sigil of submission, but can convert any number of non-implanted targets and up to one implanted target.
-/datum/clockwork_scripture/create_object/sigil_of_accession
- descname = "Trap, Permanent Conversion"
- name = "Sigil of Accession"
- desc = "Places a luminous sigil much like a Sigil of Submission, but it will remain even after successfully converting a non-implanted target. \
- It will penetrate mindshield implants once before disappearing."
- invocations = list("Divinity, enslave...", "...all who trespass here!")
- channel_time = 70
- consumed_components = list(BELLIGERENT_EYE = 4, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 2)
- whispered = TRUE
- object_path = /obj/effect/clockwork/sigil/submission/accession
- prevent_path = /obj/effect/clockwork/sigil/submission
- creator_message = "A luminous sigil appears below you. All non-servants to cross it will be enslaved after a brief time if they do not move."
- usage_tip = "It will remain after converting a target, unless that target has a mindshield implant, which it will break to convert them, but consume itself in the process."
- tier = SCRIPTURE_APPLICATION
- one_per_tile = TRUE
- primary_component = BELLIGERENT_EYE
- sort_priority = 1
- quickbind = TRUE
- quickbind_desc = "Creates a Sigil of Accession, which can convert a mindshielded non-Servant that remains on it."
-
-
//Fellowship Armory: Arms the invoker and nearby servants with Ratvarian armor.
/datum/clockwork_scripture/fellowship_armory
descname = "Area Servant Armor"
@@ -151,26 +129,6 @@
return TRUE
-//Anima Fragment: Creates an empty anima fragment, which produces an anima fragment that moves at extreme speed and does high damage.
-/datum/clockwork_scripture/create_object/anima_fragment
- descname = "Fast Soul Vessel Shell"
- name = "Anima Fragment"
- desc = "Creates a large shell fitted for soul vessels. Adding an active soul vessel to it results in a powerful construct with decent health and slight regeneration, notable melee power, \
- and exceptional speed, though taking damage will temporarily slow it down."
- invocations = list("Call forth...", "...the soldiers of Armorer.")
- channel_time = 80
- consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 4)
- object_path = /obj/structure/destructible/clockwork/shell/fragment
- creator_message = "You form an anima fragment, a powerful soul vessel receptacle."
- observer_message = "The slab disgorges a puddle of black metal that expands and forms into a strange shell!"
- usage_tip = "Useless without a soul vessel and should not be created without one."
- tier = SCRIPTURE_APPLICATION
- primary_component = REPLICANT_ALLOY
- sort_priority = 4
- quickbind = TRUE
- quickbind_desc = "Creates a Fragment Shell, which produces an Anima Fragment when filled with a Soul Vessel."
-
-
//Sigil of Transmission: Creates a sigil of transmission that can drain and store power for clockwork structures.
/datum/clockwork_scripture/create_object/sigil_of_transmission
descname = "Structure Power Generator & Battery"
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm
index 85574db6b9..819dfac72e 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm
@@ -37,7 +37,7 @@
invocations = list("May heathens...", "...kneel under our force!")
channel_time = 30
primary_component = BELLIGERENT_EYE
- quickbind_desc = "Allows you to place a Judicial Marker to knock down and damage non-Servants in an area. Click your slab to disable."
+ quickbind_desc = "Allows you to smite an area, applying Belligerent and briefly stunning. Click your slab to disable."
slab_overlay = "judicial"
ranged_type = /obj/effect/proc_holder/slab/judicial
ranged_message = "You charge the clockwork slab with judicial force.\n\
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
index 91ad4d586b..fa61e3ca31 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
@@ -21,6 +21,7 @@
/datum/clockwork_scripture/channeled/belligerent/chant_effects(chant_number)
for(var/mob/living/carbon/C in hearers(7, invoker))
C.apply_status_effect(STATUS_EFFECT_BELLIGERENT)
+ new /obj/effect/temp_visual/ratvar/belligerent(get_turf(invoker))
return TRUE
@@ -28,20 +29,20 @@
/datum/clockwork_scripture/create_object/judicial_visor
descname = "Delayed Area Knockdown Glasses"
name = "Judicial Visor"
- desc = "Forms a visor that, when worn, will grant the ability to smite an area, knocking down, muting, and damaging non-Servants."
+ desc = "Creates a visor that can smite an area, applying Belligerent and briefly stunning. The smote area will explode after 3 seconds."
invocations = list("Grant me the flames of Engine!")
channel_time = 10
consumed_components = list(BELLIGERENT_EYE = 1)
whispered = TRUE
object_path = /obj/item/clothing/glasses/judicial_visor
- creator_message = "You form a judicial visor, which is capable of smiting the unworthy."
- usage_tip = "The visor has a thirty-second cooldown once used, and the marker it creates has a delay of 3 seconds before exploding."
+ creator_message = "You form a judicial visor, which is capable of smiting a small area."
+ usage_tip = "The visor has a thirty-second cooldown once used."
tier = SCRIPTURE_DRIVER
space_allowed = TRUE
primary_component = BELLIGERENT_EYE
sort_priority = 2
quickbind = TRUE
- quickbind_desc = "Creates a Judicial Visor, which can create a Judicial Marker at an area, knocking down, muting, and damaging non-Servants after a delay."
+ quickbind_desc = "Creates a Judicial Visor, which can smite an area, applying Belligerent and briefly stunning."
//Vanguard: Provides twenty seconds of stun immunity. At the end of the twenty seconds, 25% of all stuns absorbed are applied to the invoker.
@@ -97,28 +98,28 @@
Click your slab to cancel."
-//Geis: Grants a short-range binding that will immediately start chanting on binding a valid target.
-/datum/clockwork_scripture/ranged_ability/geis_prep
- descname = "Melee Convert Attack"
+//Geis: Grants a short-range binding attack that allows you to mute and drag around a target in a very obvious manner.
+/datum/clockwork_scripture/ranged_ability/geis
+ descname = "Melee Mute & Stun"
name = "Geis"
- desc = "Charges your slab with divine energy, allowing you to bind a nearby heretic for conversion. This is very obvious and will make your slab visible in-hand."
- invocations = list("Divinity, grant...", "...me strength...", "...to enlighten...", "...the heathen!")
+ desc = "Charges your slab with divine energy, allowing you to bind and pull a struck heretic."
+ invocations = list("Divinity, grant me strength...", "...to bind the heathen!")
whispered = TRUE
channel_time = 20
- usage_tip = "Is melee range and does not penetrate mindshield implants. Much more efficient than a Sigil of Submission at low Servant amounts."
+ usage_tip = "You CANNOT TAKE ANY NON-PULL ACTIONS while the target is bound, so Sigils of Submission should be placed before use."
tier = SCRIPTURE_DRIVER
primary_component = GEIS_CAPACITOR
sort_priority = 5
quickbind = TRUE
- quickbind_desc = "Allows you to bind and start converting an adjacent target non-Servant. Click your slab to disable."
+ quickbind_desc = "Allows you to bind and mute an adjacent target non-Servant. Click your slab to disable."
slab_overlay = "geis"
ranged_type = /obj/effect/proc_holder/slab/geis
ranged_message = "You charge the clockwork slab with divine energy.\n\
- Left-click a target within melee range to convert!\n\
+ Left-click a target within melee range to bind!\n\
Click your slab to cancel."
timeout_time = 100
-/datum/clockwork_scripture/ranged_ability/geis_prep/run_scripture()
+/datum/clockwork_scripture/ranged_ability/geis/run_scripture()
var/servants = 0
if(!GLOB.ratvar_awakens)
for(var/mob/living/M in GLOB.living_mob_list)
@@ -130,93 +131,25 @@
channel_time = min(channel_time + servants*3, 50)
return ..()
-//The scripture that does the converting.
-/datum/clockwork_scripture/geis
- name = "Geis Conversion"
- invocations = list("Enlighten this heathen!", "All are insects before Engine!", "Purge all untruths and honor Engine.")
- channel_time = 49
- tier = SCRIPTURE_PERIPHERAL
- var/mob/living/target
- var/obj/structure/destructible/clockwork/geis_binding/binding
-/datum/clockwork_scripture/geis/Destroy()
- if(binding && !QDELETED(binding))
- qdel(binding)
- return ..()
-
-/datum/clockwork_scripture/geis/can_recite()
- if(!target)
- return FALSE
- return ..()
-
-/datum/clockwork_scripture/geis/run_scripture()
- var/servants = 0
- if(!GLOB.ratvar_awakens)
- for(var/mob/living/M in GLOB.living_mob_list)
- if(can_recite_scripture(M, TRUE))
- servants++
- if(target.buckled)
- target.buckled.unbuckle_mob(target, TRUE)
- binding = new(get_turf(target))
- if(servants > SCRIPT_SERVANT_REQ)
- servants -= SCRIPT_SERVANT_REQ
- channel_time = min(channel_time + servants*7, 120)
- binding.can_resist = TRUE
- binding.setDir(target.dir)
- binding.buckle_mob(target, TRUE)
- return ..()
-
-/datum/clockwork_scripture/geis/check_special_requirements()
- return target && binding && target.buckled == binding && !is_servant_of_ratvar(target) && target.stat != DEAD
-
-/datum/clockwork_scripture/geis/scripture_effects()
- . = add_servant_of_ratvar(target)
- if(.)
- add_logs(invoker, target, "Converted", object = "Geis")
-
-
-//Taunting Tirade: Channeled for up to five times over thirty seconds. Confuses non-servants that can hear it and allows movement for a brief time after each chant.
-/datum/clockwork_scripture/channeled/taunting_tirade
- descname = "Channeled, Mobile Confusion Trail"
- name = "Taunting Tirade"
- desc = "Allows movement for five seconds, leaving a trail that confuses and knocks down. Chanted every second for up to thirty seconds."
- chant_invocations = list("Hostiles on my back!", "Enemies on my trail!", "Gonna try and shake my tail.", "Bogeys on my six!")
- chant_amount = 5
- chant_interval = 10
+//Sigil of Submission: Creates a sigil of submission, which converts one heretic above it after a delay.
+/datum/clockwork_scripture/create_object/sigil_of_submission
+ descname = "Trap, Conversion"
+ name = "Sigil of Submission"
+ desc = "Places a luminous sigil that will convert any non-Servants that remain on it for 8 seconds."
+ invocations = list("Divinity, enlighten...", "...those who trespass here!")
+ channel_time = 60
consumed_components = list(GEIS_CAPACITOR = 1)
- usage_tip = "Useful for fleeing attackers, as few will be able to follow someone using this scripture."
+ whispered = TRUE
+ object_path = /obj/effect/clockwork/sigil/submission
+ creator_message = "A luminous sigil appears below you. Any non-Servants to cross it will be converted after 8 seconds if they do not move."
+ usage_tip = "This is the primary conversion method, though it will not penetrate mindshield implants."
tier = SCRIPTURE_DRIVER
+ one_per_tile = TRUE
primary_component = GEIS_CAPACITOR
sort_priority = 6
quickbind = TRUE
- quickbind_desc = "Allows movement for five seconds, leaving a trail that confuses and knocks down. Maximum 5 chants."
- var/flee_time = 47 //allow fleeing for 5 seconds
- var/grace_period = 3 //very short grace period so you don't have to stop immediately
- var/datum/progressbar/progbar
-
-/datum/clockwork_scripture/channeled/taunting_tirade/chant_effects(chant_number)
- invoker.visible_message("[invoker] is suddenly covered with a thin layer of purple smoke!")
- var/invoker_old_color = invoker.color
- invoker.color = list("#AF0AAF", "#AF0AAF", "#AF0AAF", rgb(0,0,0))
- animate(invoker, color = invoker_old_color, time = flee_time+grace_period)
- addtimer(CALLBACK(invoker, /atom/proc/update_atom_colour), flee_time+grace_period)
- var/endtime = world.time + flee_time
- progbar = new(invoker, flee_time, invoker)
- progbar.bar.color = list("#AF0AAF", "#AF0AAF", "#AF0AAF", rgb(0,0,0))
- animate(progbar.bar, color = initial(progbar.bar.color), time = flee_time+grace_period)
- while(world.time < endtime && can_recite())
- sleep(1)
- new/obj/structure/destructible/clockwork/taunting_trail(invoker.loc)
- progbar.update(endtime - world.time)
- qdel(progbar)
- if(can_recite() && chant_number != chant_amount)
- sleep(grace_period)
- else
- return FALSE
- return TRUE
-
-/datum/clockwork_scripture/channeled/taunting_tirade/chant_end_effects()
- qdel(progbar)
+ quickbind_desc = "Creates a Sigil of Submission, which will convert non-Servants that remain on it."
//Replicant: Creates a new clockwork slab.
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
index 47558a5ee9..0e42af3a65 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
@@ -29,31 +29,12 @@
return ..()
-//Cogscarab: Creates an empty cogscarab shell, which produces a cogscarab dedicated to maintaining and defending the cult.
-/datum/clockwork_scripture/create_object/cogscarab
- descname = "Constructor Soul Vessel Shell"
- name = "Cogscarab"
- desc = "Creates a small shell fitted for soul vessels. Adding an active soul vessel to it results in a small construct with tools and an inbuilt fabricator."
- invocations = list("Call forth...", "...the workers of Armorer.")
- channel_time = 60
- consumed_components = list(BELLIGERENT_EYE = 2, HIEROPHANT_ANSIBLE = 1)
- object_path = /obj/structure/destructible/clockwork/shell/cogscarab
- creator_message = "You form a cogscarab, a constructor soul vessel receptacle."
- observer_message = "The slab disgorges a puddle of black metal that contracts and forms into a strange shell!"
- usage_tip = "Useless without a soul vessel and should not be created without one."
- tier = SCRIPTURE_SCRIPT
- primary_component = BELLIGERENT_EYE
- sort_priority = 2
- quickbind = TRUE
- quickbind_desc = "Creates a Cogscarab Shell, which produces a Cogscarab when filled with a Soul Vessel."
-
-
//Vitality Matrix: Creates a sigil which will drain health from nonservants and can use that health to heal or even revive servants.
/datum/clockwork_scripture/create_object/vitality_matrix
descname = "Trap, Damage to Healing"
name = "Vitality Matrix"
- desc = "Places a sigil that drains life from any living non-Servants that cross it. Servants that cross it, however, will be healed based on how much Vitality all \
- Matrices have drained from non-Servants. Dead Servants can be revived by this sigil if there is vitality equal to the target Servant's non-oxygen damage."
+ desc = "Places a sigil that drains life from any living non-Servants that cross it, producing Vitality. Servants that cross it, however, will be healed using existing Vitality. \
+ Dead Servants can be revived by this sigil at a cost of 150 Vitality."
invocations = list("Divinity...", "...steal their life...", "...for these shells!")
channel_time = 60
consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 2)
@@ -181,46 +162,6 @@
return TRUE
-//Sigil of Submission: Creates a sigil of submission, which converts one heretic above it after a delay.
-/datum/clockwork_scripture/create_object/sigil_of_submission
- descname = "Trap, Conversion"
- name = "Sigil of Submission"
- desc = "Places a luminous sigil that will enslave any valid beings standing on it after a time."
- invocations = list("Divinity, enlighten...", "...those who trespass here!")
- channel_time = 60
- consumed_components = list(BELLIGERENT_EYE = 1, GEIS_CAPACITOR = 2)
- whispered = TRUE
- object_path = /obj/effect/clockwork/sigil/submission
- creator_message = "A luminous sigil appears below you. The next non-servant to cross it will be enslaved after a brief time if they do not move."
- usage_tip = "This is not a primary conversion method - use Geis for that. It is advantageous as a trap, however, as it will transmit the name of the newly-converted."
- tier = SCRIPTURE_SCRIPT
- one_per_tile = TRUE
- primary_component = GEIS_CAPACITOR
- sort_priority = 5
- quickbind = TRUE
- quickbind_desc = "Creates a Sigil of Submission, which will convert one non-Servant that remains on it."
-
-
-//Soul Vessel: Creates a soul vessel, which can seek a ghost or be used on the uncovered head of a dead or dying human to take their brain.
-/datum/clockwork_scripture/create_object/soul_vessel
- descname = "Clockwork Posibrain"
- name = "Soul Vessel"
- desc = "Forms an ancient positronic brain with an overriding directive to serve Ratvar."
- invocations = list("Herd the souls of...", "...the blasphemous damned!")
- channel_time = 30
- consumed_components = list(VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 2)
- whispered = TRUE
- object_path = /obj/item/device/mmi/posibrain/soul_vessel
- creator_message = "You form a soul vessel, which can be used in-hand to attract spirits, or used on an unconscious or dead human to extract their consciousness."
- usage_tip = "The vessel can be used as a teleport target for Spatial Gateway, though it is generally better-used by placing it in a shell or cyborg body."
- tier = SCRIPTURE_SCRIPT
- space_allowed = TRUE
- primary_component = GEIS_CAPACITOR
- sort_priority = 6
- quickbind = TRUE
- quickbind_desc = "Creates a Soul Vessel, which can be placed in construct shells and cyborg bodies once filled."
-
-
//Replica Fabricator: Creates a replica fabricator, used to convert objects and repair clockwork structures.
/datum/clockwork_scripture/create_object/replica_fabricator
descname = "Replaces Objects with Ratvarian Versions"
@@ -245,13 +186,12 @@
/datum/clockwork_scripture/function_call
descname = "Permanent Summonable Spear"
name = "Function Call"
- desc = "Grants the invoker the ability to call forth a powerful Ratvarian spear every three minutes. The spear will deal significant damage to Nar-Sie's dogs and silicon lifeforms, but will \
- vanish three minutes after being summoned."
+ desc = "Grants the invoker the ability to call forth a powerful Ratvarian spear every 3 minutes, with it lasting 3 minutes. The spear's attacks will generate Vitality, used for healing."
invocations = list("Grant me...", "...the might of brass!")
channel_time = 20
consumed_components = list(REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 1)
whispered = TRUE
- usage_tip = "You can impale human targets with the spear by pulling them, then attacking. Throwing the spear at a mob will do massive damage and knock them down, but break the spear."
+ usage_tip = "Throwing the spear at a mob will do massive damage and knock them down, but break the spear."
tier = SCRIPTURE_SCRIPT
primary_component = REPLICANT_ALLOY
sort_priority = 8
@@ -345,50 +285,3 @@
portal_uses = max(portal_uses, 100) //Very powerful if Ratvar has been summoned
duration = max(duration, 100)
return slab.procure_gateway(invoker, duration, portal_uses)
-
-
-//Volt Blaster: Channeled for up to five times over ten seconds to fire up to five rays of energy at target locations.
-/datum/clockwork_scripture/channeled/volt_blaster
- descname = "Channeled, Targeted Energy Blasts"
- name = "Volt Blaster"
- desc = "Allows you to fire five energy rays at target locations. Channeled every fourth of a second for a maximum of ten seconds."
- channel_time = 30
- invocations = list("Amperage...", "...grant me your power!")
- chant_invocations = list("Use charge to kill!", "Slay with power!", "Hunt with energy!")
- chant_amount = 5
- chant_interval = 4
- consumed_components = list(GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 2)
- usage_tip = "Though it requires you to stand still, this scripture can do massive damage."
- tier = SCRIPTURE_SCRIPT
- primary_component = HIEROPHANT_ANSIBLE
- sort_priority = 10
- quickbind = TRUE
- quickbind_desc = "Allows you to fire energy rays at target locations. Maximum 5 chants."
- var/static/list/nzcrentr_insults = list("You're not very good at aiming.", "You hunt badly.", "What a waste of energy.", "Almost funny to watch.",
- "Boss says \"Click something, you idiot!\".", "Stop wasting components if you can't aim.")
-
-/datum/clockwork_scripture/channeled/volt_blaster/chant_effects(chant_number)
- slab.busy = null
- var/datum/clockwork_scripture/ranged_ability/volt_ray/ray = new
- ray.slab = slab
- ray.invoker = invoker
- var/turf/T = get_turf(invoker)
- if(!ray.run_scripture() && slab && invoker)
- if(can_recite() && T == get_turf(invoker))
- to_chat(invoker, "\"[text2ratvar(pick(nzcrentr_insults))]\"")
- else
- return FALSE
- return TRUE
-
-/obj/effect/ebeam/volt_ray
- name = "volt_ray"
- layer = LYING_MOB_LAYER
-
-/datum/clockwork_scripture/ranged_ability/volt_ray
- name = "Volt Ray"
- slab_overlay = "volt"
- allow_mobility = FALSE
- ranged_type = /obj/effect/proc_holder/slab/volt
- ranged_message = "You charge the clockwork slab with shocking might.\n\
- Left-click a target to fire, quickly!"
- timeout_time = 20
diff --git a/code/game/gamemodes/clock_cult/clock_structure.dm b/code/game/gamemodes/clock_cult/clock_structure.dm
index d2b3e27df2..6762bb29b8 100644
--- a/code/game/gamemodes/clock_cult/clock_structure.dm
+++ b/code/game/gamemodes/clock_cult/clock_structure.dm
@@ -87,13 +87,6 @@
. *= min(max_integrity/max(obj_integrity, 1), 4)
. = round(., 0.01)
-/obj/structure/destructible/clockwork/can_be_unfasten_wrench(mob/user, silent)
- if(anchored && obj_integrity <= round(max_integrity * 0.25, 1))
- if(!silent)
- to_chat(user, "[src] is too damaged to unsecure!")
- return FAILED_UNFASTEN
- return ..()
-
/obj/structure/destructible/clockwork/attack_ai(mob/user)
if(is_servant_of_ratvar(user))
attack_hand(user)
@@ -108,7 +101,7 @@
/obj/structure/destructible/clockwork/attackby(obj/item/I, mob/user, params)
if(is_servant_of_ratvar(user) && istype(I, /obj/item/weapon/wrench) && unanchored_icon)
if(default_unfasten_wrench(user, I, 50) == SUCCESSFUL_UNFASTEN)
- update_anchored(user, TRUE)
+ update_anchored(user)
return 1
return ..()
@@ -125,7 +118,7 @@
if(do_damage)
playsound(src, break_sound, 10 * get_efficiency_mod(TRUE), 1)
take_damage(round(max_integrity * 0.25, 1), BRUTE)
- to_chat(user, "As you unsecure [src] from the floor, you see cracks appear in its surface!")
+ to_chat(user, "As you unsecure [src] from the floor, you see cracks appear in its surface!")
/obj/structure/destructible/clockwork/emp_act(severity)
if(anchored && unanchored_icon)
diff --git a/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm b/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm
deleted file mode 100644
index a2f1022abc..0000000000
--- a/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-//Useless on their own, these shells can create powerful constructs.
-/obj/structure/destructible/clockwork/shell
- construction_value = 0
- anchored = FALSE
- density = FALSE
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- var/mobtype = /mob/living/simple_animal/hostile/clockwork
- var/spawn_message = " is an error and you should yell at whoever spawned this shell."
-
-/obj/structure/destructible/clockwork/shell/attackby(obj/item/I, mob/living/user, params)
- if(istype(I, /obj/item/device/mmi/posibrain/soul_vessel))
- if(!is_servant_of_ratvar(user))
- ..()
- return 0
- var/obj/item/device/mmi/posibrain/soul_vessel/S = I
- if(!S.brainmob)
- to_chat(user, "[S] is inactive! Turn it on or capture a mind first.")
- return 0
- if(S.brainmob && (!S.brainmob.client || !S.brainmob.mind))
- to_chat(user, "[S]'s trapped consciousness appears inactive!")
- return 0
- user.visible_message("[user] places [S] in [src], where it fuses to the shell.", "You place [S] in [src], fusing it to the shell.")
- var/mob/living/simple_animal/A = new mobtype(get_turf(src))
- A.visible_message("[src][spawn_message]")
- S.brainmob.mind.transfer_to(A)
- A.fully_replace_character_name(null, "[findtext(A.name, initial(A.name)) ? "[initial(A.name)]":"[A.name]"] ([S.brainmob.name])")
- user.drop_item()
- qdel(S)
- qdel(src)
- return 1
- else
- return ..()
-
-/obj/structure/destructible/clockwork/shell/cogscarab
- name = "cogscarab shell"
- desc = "A small brass shell with a cube-shaped receptable in its center. It gives off an aura of obsessive perfectionism."
- clockwork_desc = "A dormant receptable that, when powered with a soul vessel, will become a weak construct with an inbuilt fabricator."
- icon_state = "clockdrone_shell"
- mobtype = /mob/living/simple_animal/drone/cogscarab
- spawn_message = "'s eyes blink open, glowing bright red."
-
-/obj/structure/destructible/clockwork/shell/fragment
- name = "fragment shell"
- desc = "A massive brass shell with a small cube-shaped receptable in its center. It gives off an aura of contained power."
- clockwork_desc = "A dormant receptable that, when powered with a soul vessel, will become a powerful construct."
- icon_state = "anime_fragment"
- mobtype = /mob/living/simple_animal/hostile/clockwork/fragment
- spawn_message = " whirs and rises from the ground on a flickering jet of reddish fire."
diff --git a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm
index ecb69c8a27..82d1e68ff3 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm
@@ -5,8 +5,9 @@
clockwork_desc = "A binding ring around a target, preventing them from taking action while they're being converted."
max_integrity = 25
light_range = 2
- light_power = 0.5
+ light_power = 0.8
light_color = "#AF0AAF"
+ anchored = FALSE
density = FALSE
immune_to_servant_attacks = TRUE
icon = 'icons/effects/clockwork_effects.dmi'
@@ -16,16 +17,34 @@
debris = list()
can_buckle = TRUE
buckle_lying = 0
- buckle_prevents_pull = TRUE
- var/resisting = FALSE
- var/can_resist = FALSE
var/mob_layer = MOB_LAYER
+/obj/structure/destructible/clockwork/geis_binding/Initialize(mapload, obj/item/clockwork/slab/the_slab)
+ . = ..()
+ START_PROCESSING(SSprocessing, src)
+
+/obj/structure/destructible/clockwork/geis_binding/Destroy()
+ STOP_PROCESSING(SSprocessing, src)
+ return ..()
+
/obj/structure/destructible/clockwork/geis_binding/examine(mob/user)
icon_state = "geisbinding_full"
..()
icon_state = "geisbinding"
+/obj/structure/destructible/clockwork/geis_binding/process()
+ if(LAZYLEN(buckled_mobs))
+ for(var/V in buckled_mobs)
+ var/mob/living/L = V
+ if(is_servant_of_ratvar(L)) //servants are freed automatically
+ take_damage(obj_integrity)
+ return
+ var/tick_damage = 1
+ if(!is_servant_of_ratvar(pulledby))
+ tick_damage++
+ take_damage(tick_damage, sound_effect = FALSE)
+ playsound(src, 'sound/effects/empulse.ogg', tick_damage * 20, TRUE)
+
/obj/structure/destructible/clockwork/geis_binding/attack_hand(mob/living/user)
return
@@ -48,10 +67,8 @@
var/obj/item/geis_binding/B = new(M)
M.put_in_hands(B, i)
M.regenerate_icons()
- M.visible_message("A [name] appears around [M]!", \
- "A [name] appears around you![can_resist ? "\nResist!":""]")
- if(!can_resist)
- repair_and_interrupt()
+ M.visible_message("A [name] appears around [M]!", "A [name] appears around you!")
+ repair_and_interrupt()
else
var/obj/effect/temp_visual/ratvar/geis_binding/G = new /obj/effect/temp_visual/ratvar/geis_binding(M.loc)
var/obj/effect/temp_visual/ratvar/geis_binding/T = new /obj/effect/temp_visual/ratvar/geis_binding/top(M.loc)
@@ -65,11 +82,6 @@
for(var/obj/item/geis_binding/GB in M.held_items)
M.dropItemToGround(GB, TRUE)
-/obj/structure/destructible/clockwork/geis_binding/relaymove(mob/user, direction)
- if(isliving(user) && can_resist)
- var/mob/living/L = user
- L.resist()
-
/obj/structure/destructible/clockwork/geis_binding/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
playsound(src, 'sound/effects/empulse.ogg', 50, 1)
@@ -79,7 +91,7 @@
update_icon()
/obj/structure/destructible/clockwork/geis_binding/update_icon()
- alpha = min(initial(alpha) + ((obj_integrity - max_integrity) * 5), 255)
+ alpha = min(255 * ((obj_integrity/max_integrity) + 0.2) , 255)
/obj/structure/destructible/clockwork/geis_binding/proc/repair_and_interrupt()
obj_integrity = max_integrity
@@ -87,10 +99,10 @@
for(var/m in buckled_mobs)
var/mob/living/L = m
if(L)
- L.Stun(20, 1, 1)
+ L.Stun(130, 1, 1) //basically here to act as a mute for borgs
if(iscarbon(L))
var/mob/living/carbon/C = L
- C.silent += 4
+ C.silent += 7
visible_message("[src] flares brightly!")
var/obj/effect/temp_visual/ratvar/geis_binding/G1 = new /obj/effect/temp_visual/ratvar/geis_binding(loc)
var/obj/effect/temp_visual/ratvar/geis_binding/G2 = new /obj/effect/temp_visual/ratvar/geis_binding(loc)
@@ -106,18 +118,7 @@
animate(T2, pixel_y = pixel_y - 9, alpha = 0, time = 8, easing = EASE_IN)
/obj/structure/destructible/clockwork/geis_binding/user_unbuckle_mob(mob/living/buckled_mob, mob/user)
- if(buckled_mob == user)
- if(!resisting && can_resist)
- resisting = TRUE
- user.visible_message("[user] starts struggling against [src]...", "You start breaking out of [src]...")
- while(do_after(user, 10, target = src) && resisting && obj_integrity)
- if(obj_integrity - 5 <= 0)
- user.visible_message("[user] breaks [src]!", "You break [src]!")
- take_damage(5)
- return user
- take_damage(5)
- resisting = FALSE
- else
+ if(buckled_mob != user)
return ..()
/obj/item/geis_binding
@@ -128,5 +129,4 @@
flags = NODROP|ABSTRACT|DROPDEL
/obj/item/geis_binding/pre_attackby(atom/target, mob/living/user, params)
- user.resist()
return FALSE
diff --git a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm
index bd315353b9..ac0365c148 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm
@@ -32,16 +32,12 @@
return 25
/obj/structure/destructible/clockwork/ocular_warden/can_be_unfasten_wrench(mob/user, silent)
- if(anchored)
- if(obj_integrity <= max_integrity * 0.25)
- if(!silent)
- to_chat(user, "[src] is too damaged to unsecure!")
- return FAILED_UNFASTEN
- else
+ if(!anchored)
for(var/obj/structure/destructible/clockwork/ocular_warden/W in orange(OCULAR_WARDEN_EXCLUSION_RANGE, src))
- if(!silent)
- to_chat(user, "You sense another ocular warden too near this location. Activating this one this close would cause them to fight.")
- return FAILED_UNFASTEN
+ if(W.anchored)
+ if(!silent)
+ to_chat(user, "You sense another ocular warden too near this location. Activating this one this close would cause them to fight.")
+ return FAILED_UNFASTEN
return SUCCESSFUL_UNFASTEN
/obj/structure/destructible/clockwork/ocular_warden/ratvar_act()
@@ -79,7 +75,7 @@
if(GLOB.ratvar_awakens && L)
L.adjust_fire_stacks(damage_per_tick)
L.IgniteMob()
- else if(istype(target,/obj/mecha))
+ else if(istype(target, /obj/mecha))
var/obj/mecha/M = target
M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, "melee", 1, get_dir(src, M))
@@ -94,7 +90,7 @@
if(isliving(target))
var/mob/living/L = target
to_chat(L, "\"I SEE YOU!\"\n[src]'s gaze [GLOB.ratvar_awakens ? "melts you alive" : "burns you"]!")
- else if(istype(target,/obj/mecha))
+ else if(istype(target, /obj/mecha))
var/obj/mecha/M = target
to_chat(M.occupant, "\"I SEE YOU!\"" )
else if(prob(0.5)) //Extremely low chance because of how fast the subsystem it uses processes
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index e4af3c2d45..971621eb27 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -203,7 +203,7 @@
var/acolytes_survived = 0
for(var/datum/mind/cult_mind in cult)
if (cult_mind.current && cult_mind.current.stat != DEAD)
- if(cult_mind.current.onCentcom() || cult_mind.current.onSyndieBase())
+ if(cult_mind.current.onCentCom() || cult_mind.current.onSyndieBase())
acolytes_survived++
if(acolytes_survived>=acolytes_needed)
return 0
diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index f6dab6c9cc..a7fb90d253 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -2,6 +2,7 @@
#define MARK_COOLDOWN
/datum/action/innate/cult
+ icon_icon = 'icons/mob/actions/actions_cult.dmi'
background_icon_state = "bg_demon"
buttontooltipstyle = "cult"
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS
@@ -305,6 +306,7 @@
/datum/action/innate/cult/master/pulse
name = "Eldritch Pulse"
desc = "Seize upon a fellow cultist or cult structure and teleport it to a nearby location."
+ icon_icon = 'icons/mob/actions/actions_spells.dmi'
button_icon_state = "arcane_barrage"
var/obj/effect/proc_holder/pulse/PM
var/cooldown = 0
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 04364ae1c3..d472bb7d5a 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -3,6 +3,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/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
flags = CONDUCT
sharpness = IS_SHARP
w_class = WEIGHT_CLASS_BULKY
@@ -90,7 +92,7 @@
icon_state = "cultrobes"
item_state = "cultrobes"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
+ allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0, fire = 10, acid = 10)
flags_inv = HIDEJUMPSUIT
cold_protection = CHEST|GROIN|LEGS|ARMS
@@ -133,7 +135,7 @@
icon_state = "magusred"
item_state = "magusred"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
+ allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0, fire = 10, acid = 10)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -152,18 +154,22 @@
item_state = "cult_armor"
desc = "A heavily-armored exosuit worn by warriors of the Nar-Sien cult. It can withstand hard vacuum."
w_class = WEIGHT_CLASS_SMALL
- allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/internals/)
+ allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade, /obj/item/weapon/tank/internals/)
armor = list(melee = 70, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 40, acid = 75)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cult
/obj/item/weapon/sharpener/cult
name = "eldritch whetstone"
desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone."
+ icon_state = "cult_sharpener"
used = 0
increment = 5
max = 40
prefix = "darkened"
+/obj/item/weapon/sharpener/cult/update_icon()
+ icon_state = "cult_sharpener[used ? "_used" : ""]"
+
/obj/item/clothing/suit/hooded/cultrobes/cult_shield
name = "empowered cultist armor"
desc = "Empowered garb which creates a powerful shield around the user."
@@ -172,7 +178,7 @@
w_class = WEIGHT_CLASS_BULKY
armor = list(melee = 50, bullet = 40, laser = 50,energy = 30, bomb = 50, bio = 30, rad = 30, fire = 50, acid = 60)
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
+ allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
var/current_charges = 3
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie
@@ -222,7 +228,7 @@
icon_state = "cultrobes"
item_state = "cultrobes"
flags_inv = HIDEJUMPSUIT
- allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
+ allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
body_parts_covered = CHEST|GROIN|LEGS|ARMS
armor = list(melee = -50, bullet = -50, laser = -50,energy = -50, bomb = -50, bio = -50, rad = -50, fire = 0, acid = 0)
slowdown = -1
@@ -386,6 +392,9 @@
/obj/item/device/flashlight/flare/culttorch/afterattack(atom/movable/A, mob/user, proximity)
if(!proximity)
return
+ if(!iscultist(user))
+ to_chat(user, "That doesn't seem to do anything useful.")
+ return
if(istype(A, /obj/item))
diff --git a/code/game/gamemodes/devil/devil.dm b/code/game/gamemodes/devil/devil.dm
index c6f1620c90..f69b50bc79 100644
--- a/code/game/gamemodes/devil/devil.dm
+++ b/code/game/gamemodes/devil/devil.dm
@@ -26,11 +26,11 @@
src.visible_message("[src] seems to have been harmed by the purity of [attacker]'s clothes.", "Unsullied white clothing is disrupting your form.")
return whiteness[U.type] + 1
if(BANE_TOOLBOX)
- if(istype(weapon,/obj/item/weapon/storage/toolbox))
+ if(istype(weapon, /obj/item/weapon/storage/toolbox))
src.visible_message("The [weapon] seems unusually robust this time.", "The [weapon] is your unmaking!")
return 2.5 // Will take four hits with a normal toolbox to crit.
if(BANE_HARVEST)
- if(istype(weapon,/obj/item/weapon/reagent_containers/food/snacks/grown/))
+ if(istype(weapon, /obj/item/weapon/reagent_containers/food/snacks/grown/))
visible_message("The spirits of the harvest aid in the exorcism.", "The harvest spirits are harming you.")
Knockdown(40)
qdel(weapon)
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index 324f353c8b..a56a2d6647 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -33,7 +33,7 @@
for(var/obj/machinery/power/apc/C in GLOB.apcs_list)
if(C.cell && C.z == ZLEVEL_STATION)
- var/area/A = get_area(C)
+ var/area/A = C.area
var/skip = 0
for(var/area_type in skipped_areas)
@@ -60,7 +60,7 @@
S.update_icon()
S.power_change()
for(var/area/A in world)
- if(!istype(A, /area/space) && !istype(A, /area/shuttle) && !istype(A,/area/arrival))
+ if(!istype(A, /area/space) && !istype(A, /area/shuttle) && !istype(A, /area/arrival))
A.power_light = TRUE
A.power_equip = TRUE
A.power_environ = TRUE
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 349656d48b..790319e362 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -83,7 +83,7 @@
if(SSdbcore.Connect())
var/sql
- if(SSticker && SSticker.mode)
+ if(SSticker.mode)
sql += "game_mode = '[SSticker.mode]'"
if(GLOB.revdata.originmastercommit)
if(sql)
@@ -111,7 +111,7 @@
var/list/living_crew = list()
for(var/mob/Player in GLOB.mob_list)
- if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player))
+ if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) && !isbrain(Player) && Player.client)
living_crew += Player
if(living_crew.len / GLOB.joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh
message_admins("Convert_roundtype failed due to too many dead people. Limit is [config.midround_antag_life_check * 100]% living crew")
@@ -120,7 +120,7 @@
var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew.len)
var/list/datum/game_mode/usable_modes = list()
for(var/datum/game_mode/G in runnable_modes)
- if(G.reroll_friendly)
+ if(G.reroll_friendly && living_crew >= G.required_players)
usable_modes += G
else
qdel(G)
@@ -208,7 +208,7 @@
return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark.
for(var/mob/Player in GLOB.living_mob_list)
- if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player))
+ if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player) && Player.client)
if(Player.mind.special_role) //Someone's still antaging!
living_antag_player = Player
return 0
@@ -266,22 +266,24 @@
if(escaped_total > 0)
SSblackbox.set_val("escaped_total",escaped_total)
send2irc("Server", "Round just ended.")
- if(cult.len && !istype(SSticker.mode,/datum/game_mode/cult))
+ if(cult.len && !istype(SSticker.mode, /datum/game_mode/cult))
datum_cult_completion()
if(GLOB.borers.len)
- var/borerwin = FALSE
var/borertext = " The borers were:"
for(var/mob/living/simple_animal/borer/B in GLOB.borers)
if((B.key || B.controlling) && B.stat != DEAD)
- borertext += " [B.controlling ? B.victim.key : B.key] was [B.truename] ("
- var/turf/location = get_turf(B)
- if(location.z == ZLEVEL_CENTCOM && B.victim)
- borertext += "escaped with host"
- else
- borertext += "failed"
- borertext += ")"
+ borertext += " [B.controlling ? B.victim.key : B.key] was [B.truename]"
+ var/count = 1
+ for(var/datum/objective/objective in B.mind.objectives)
+ if(objective.check_completion())
+ borertext += " Objective #[count]: [objective.explanation_text] Success!"
+ else
+ borertext += " Objective #[count]: [objective.explanation_text] Fail."
+ count++
+
+
to_chat(world, borertext)
var/total_borers = 0
@@ -295,14 +297,8 @@
var/turf/location = get_turf(C)
if(location.z == ZLEVEL_CENTCOM && D && D.stat != DEAD)
total_borer_hosts++
- if(GLOB.total_borer_hosts_needed <= total_borer_hosts)
- borerwin = TRUE
to_chat(world, "There were [total_borers] borers alive at round end!")
- to_chat(world, "A total of [total_borer_hosts] borers with hosts escaped on the shuttle alive. The borers needed [GLOB.total_borer_hosts_needed] hosts to escape.")
- if(borerwin)
- to_chat(world, "The borers were successful!")
- else
- to_chat(world, "The borers have failed!")
+ to_chat(world, "A total of [total_borer_hosts] borers with hosts escaped on the shuttle alive.")
CHECK_TICK
return 0
@@ -373,7 +369,7 @@
if(candidates.len < recommended_enemies)
for(var/mob/dead/new_player/player in players)
if(player.client && player.ready == PLAYER_READY_TO_PLAY)
- if(!(role in player.client.prefs.be_special)) // We don't have enough people who want to be antagonist, make a seperate list of people who don't want to be one
+ if(!(role in player.client.prefs.be_special)) // We don't have enough people who want to be antagonist, make a separate list of people who don't want to be one
if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans
drafted += player.mind
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index 51d5d5150b..37fbfb5336 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -3,7 +3,7 @@
GLOBAL_LIST_INIT(gang_name_pool, list("Clandestine", "Prima", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Donk", "Gene", "Gib", "Tunnel", "Diablo", "Psyke", "Osiron", "Sirius", "Sleeping Carp"))
GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","purple", "white"))
-GLOBAL_LIST_INIT(gang_outfit_pool, list(/obj/item/clothing/suit/jacket/leather,/obj/item/clothing/suit/jacket/leather/overcoat,/obj/item/clothing/suit/jacket/puffer,/obj/item/clothing/suit/jacket/miljacket,/obj/item/clothing/suit/jacket/puffer,/obj/item/clothing/suit/pirate,/obj/item/clothing/suit/poncho,/obj/item/clothing/suit/apron/overalls,/obj/item/clothing/suit/jacket/letterman))
+GLOBAL_LIST_INIT(gang_outfit_pool, list(/obj/item/clothing/suit/jacket/leather, /obj/item/clothing/suit/jacket/leather/overcoat, /obj/item/clothing/suit/jacket/puffer, /obj/item/clothing/suit/jacket/miljacket, /obj/item/clothing/suit/jacket/puffer, /obj/item/clothing/suit/pirate, /obj/item/clothing/suit/poncho, /obj/item/clothing/suit/apron/overalls, /obj/item/clothing/suit/jacket/letterman))
/datum/game_mode
var/list/datum/gang/gangs = list()
diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm
index 1a145d1227..ba18ad7578 100644
--- a/code/game/gamemodes/gang/gang_datum.dm
+++ b/code/game/gamemodes/gang/gang_datum.dm
@@ -188,7 +188,7 @@
if(!gangtools.len || !message)
return
for(var/obj/item/device/gangtool/tool in gangtools)
- var/mob/living/mob = get(tool.loc,/mob/living)
+ var/mob/living/mob = get(tool.loc, /mob/living)
if(mob && mob.mind && mob.stat == CONSCIOUS)
if(mob.mind.gang_datum == src)
to_chat(mob, "[bicon(tool)] [message]")
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index c5baed144e..8c8108962e 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
name = "AI Action"
desc = "You aren't entirely sure what this does, but it's very beepy and boopy."
background_icon_state = "bg_tech_blue"
- icon_icon = 'icons/mob/actions_AI.dmi'
+ icon_icon = 'icons/mob/actions/actions_AI.dmi'
var/mob/living/silicon/ai/owner_AI //The owner AI, so we don't have to typecast every time
var/uses //If we have multiple uses of the same power
var/auto_use_uses = TRUE //If we automatically use up uses on each activation
diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm
index 0b20694b58..d652d38d11 100644
--- a/code/game/gamemodes/meteor/meteor.dm
+++ b/code/game/gamemodes/meteor/meteor.dm
@@ -37,8 +37,8 @@
if(player.stat != DEAD)
++survivors
- if(player.onCentcom())
- text += " [player.real_name] escaped to the safety of Centcom."
+ if(player.onCentCom())
+ text += " [player.real_name] escaped to the safety of CentCom."
else if(player.onSyndieBase())
text += " [player.real_name] escaped to the (relative) safety of Syndicate Space."
else
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 167df98b50..18daea8b31 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -125,8 +125,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
/obj/effect/meteor/New()
..()
GLOB.meteor_list += src
- if(SSaugury)
- SSaugury.register_doom(src, threat)
+ SSaugury.register_doom(src, threat)
SpinAnimation()
QDEL_IN(src, lifetime)
@@ -185,6 +184,9 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
/obj/effect/meteor/proc/meteor_effect()
if(heavy)
+ var/sound/meteor_sound = sound(meteorsound)
+ var/random_frequency = get_rand_frequency()
+
for(var/mob/M in GLOB.player_list)
if((M.orbiting) && (SSaugury.watchers[M]))
continue
@@ -193,7 +195,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
continue
var/dist = get_dist(M.loc, src.loc)
shake_camera(M, dist > 20 ? 2 : 4, dist > 20 ? 1 : 3)
- M.playsound_local(src.loc, meteorsound, 50, 1, get_rand_frequency(), 10)
+ M.playsound_local(src.loc, null, 50, 1, random_frequency, 10, S = meteor_sound)
///////////////////////
//Meteor types
diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm
index 3aea09ba47..ce0ab22373 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction.dm
@@ -96,9 +96,9 @@
agent_landmarks.len = max_teams
scientist_landmarks.len = max_teams
for(var/obj/effect/landmark/abductor/A in GLOB.landmarks_list)
- if(istype(A,/obj/effect/landmark/abductor/agent))
+ if(istype(A, /obj/effect/landmark/abductor/agent))
agent_landmarks[text2num(A.team)] = A
- else if(istype(A,/obj/effect/landmark/abductor/scientist))
+ else if(istype(A, /obj/effect/landmark/abductor/scientist))
scientist_landmarks[text2num(A.team)] = A
var/team_name = team_names[team_number]
@@ -200,7 +200,7 @@
to_chat(world, text)
//Landmarks
-// TODO: Split into seperate landmarks for prettier ships
+// TODO: Split into separate landmarks for prettier ships
/obj/effect/landmark/abductor
var/team = 1
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index d8bdca034e..9413de030c 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -153,6 +153,8 @@
desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras."
icon_state = "gizmo_scan"
item_state = "silencer"
+ lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
origin_tech = "engineering=7;magnets=4;bluespace=4;abductor=3"
var/mode = GIZMO_SCAN
var/mob/living/marked = null
@@ -240,6 +242,8 @@
desc = "A compact device used to shut down communications equipment."
icon_state = "silencer"
item_state = "gizmo"
+ lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
origin_tech = "materials=4;programming=7;abductor=3"
/obj/item/device/abductor/silencer/attack(mob/living/M, mob/user)
@@ -271,10 +275,10 @@
var/list/all_items = M.GetAllContents()
for(var/obj/I in all_items)
- if(istype(I,/obj/item/device/radio/))
+ if(istype(I, /obj/item/device/radio/))
var/obj/item/device/radio/r = I
r.listening = 0
- if(!istype(I,/obj/item/device/radio/headset))
+ if(!istype(I, /obj/item/device/radio/headset))
r.broadcasting = 0 //goddamned headset hacks
/obj/item/device/firing_pin/abductor
@@ -298,7 +302,7 @@
origin_tech = "combat=4;magnets=7;powerstorage=3;abductor=3"
trigger_guard = TRIGGER_GUARD_ALLOW_ALL
-/obj/item/weapon/paper/abductor
+/obj/item/weapon/paper/guides/antag/abductor
name = "Dissection Guide"
icon_state = "alienpaper_words"
info = {"Dissection for Dummies
@@ -320,10 +324,10 @@
Congratulations! You are now trained for invasive xenobiology research!"}
-/obj/item/weapon/paper/abductor/update_icon()
+/obj/item/weapon/paper/guides/antag/abductor/update_icon()
return
-/obj/item/weapon/paper/abductor/AltClick()
+/obj/item/weapon/paper/guides/antag/abductor/AltClick()
return
#define BATON_STUN 0
@@ -339,6 +343,8 @@ Congratulations! You are now trained for invasive xenobiology research!"}
icon = 'icons/obj/abductor.dmi'
icon_state = "wonderprodStun"
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
origin_tech = "materials=4;combat=4;biotech=7;abductor=4"
force = 7
@@ -469,7 +475,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
if(ishuman(L))
var/mob/living/carbon/human/H = L
- species = "[H.dna.species.name]"
+ species = "[H.dna.species.name]"
if(L.mind && L.mind.changeling)
species = "Changeling lifeform"
var/obj/item/organ/heart/gland/temp = locate() in H.internal_organs
@@ -485,6 +491,8 @@ Congratulations! You are now trained for invasive xenobiology research!"}
name = "hard-light energy field"
desc = "A hard-light field restraining the hands."
icon_state = "cuff_white" // Needs sprite
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
breakouttime = 450
trashtype = /obj/item/weapon/restraints/handcuffs/energy/used
origin_tech = "materials=4;magnets=5;abductor=2"
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
index 4ca4e47a5b..06e4a84569 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
@@ -1,6 +1,6 @@
/datum/surgery/organ_extraction
name = "experimental dissection"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin,/datum/surgery_step/incise, /datum/surgery_step/extract_organ ,/datum/surgery_step/gland_insert)
+ steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert)
possible_locs = list("chest")
ignore_clothes = 1
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index 13e86dd5d3..21becd3c24 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -108,7 +108,7 @@
/obj/item/organ/heart/gland/pop/activate()
to_chat(owner, "You feel unlike yourself.")
- var/species = pick(list(/datum/species/lizard,/datum/species/jelly/slime,/datum/species/pod,/datum/species/fly,/datum/species/jelly))
+ var/species = pick(list(/datum/species/lizard, /datum/species/jelly/slime, /datum/species/pod, /datum/species/fly, /datum/species/jelly))
owner.set_species(species)
/obj/item/organ/heart/gland/ventcrawling
@@ -133,10 +133,9 @@
to_chat(owner, "You feel sick.")
var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis)
var/datum/disease/D = new virus_type()
- D.carrier = 1
+ D.carrier = TRUE
owner.viruses += D
D.affected_mob = owner
- D.holder = owner
owner.med_hud_set_status()
@@ -167,6 +166,8 @@
cooldown_high = 400
uses = -1
icon_state = "egg"
+ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
/obj/item/organ/heart/gland/egg/activate()
to_chat(owner, "You lay an egg!")
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index 4e74d11be1..ffd1b88d25 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -65,6 +65,7 @@
/datum/action/innate/teleport_in
name = "Send To"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "beam_down"
/datum/action/innate/teleport_in/Activate()
@@ -79,6 +80,7 @@
/datum/action/innate/teleport_out
name = "Retrieve"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "beam_up"
/datum/action/innate/teleport_out/Activate()
@@ -90,6 +92,7 @@
/datum/action/innate/teleport_self
name = "Send Self"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "beam_down"
/datum/action/innate/teleport_self/Activate()
@@ -104,6 +107,7 @@
/datum/action/innate/vest_mode_swap
name = "Switch Vest Mode"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "vest_mode"
/datum/action/innate/vest_mode_swap/Activate()
@@ -115,6 +119,7 @@
/datum/action/innate/vest_disguise_swap
name = "Switch Vest Disguise"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "vest_disguise"
/datum/action/innate/vest_disguise_swap/Activate()
@@ -125,6 +130,7 @@
/datum/action/innate/set_droppoint
name = "Set Experiment Release Point"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "set_drop"
/datum/action/innate/set_droppoint/Activate()
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index 42a413bcd7..2b83017d1d 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -97,6 +97,9 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
var/hiding = FALSE
var/waketimerid = null
+ var/docile_chem = "sugar"
+ var/list/wakeup_objectives = list() //Used to store objectives until the borer wakes up
+
var/datum/action/innate/borer/talk_to_host/talk_to_host_action = new
var/datum/action/innate/borer/infest_host/infest_host_action = new
var/datum/action/innate/borer/toggle_hide/toggle_hide_action = new
@@ -136,8 +139,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
borer_chems += /datum/borer_chem/crocin
borer_chems += /datum/borer_chem/camphor
- if(is_team_borer)
- GLOB.borers += src
+ GLOB.borers += src
GrantBorerActions()
@@ -285,12 +287,12 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
if(stat != DEAD && victim.stat != DEAD)
- if(victim.reagents.has_reagent("sugar"))
+ if(victim.reagents.has_reagent(docile_chem))
if(!docile || waketimerid)
if(controlling)
- to_chat(victim, "You feel the soporific flow of sugar in your host's blood, lulling you into docility.")
+ to_chat(victim, "You feel the soporific flow of [docile_chem] in your host's blood, lulling you into docility.")
else
- to_chat(src, "You feel the soporific flow of sugar in your host's blood, lulling you into docility.")
+ to_chat(src, "You feel the soporific flow of [docile_chem] in your host's blood, lulling you into docility.")
if(waketimerid)
deltimer(waketimerid)
waketimerid = null
@@ -298,9 +300,9 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
else
if(docile && !waketimerid)
if(controlling)
- to_chat(victim, "You start shaking off your lethargy as the sugar leaves your host's blood. This will take about 10 seconds...")
+ to_chat(victim, "You start shaking off your lethargy as the [docile_chem] leaves your host's blood. This will take about 10 seconds...")
else
- to_chat(src, "You start shaking off your lethargy as the sugar leaves your host's blood. This will take about 10 seconds...")
+ to_chat(src, "You start shaking off your lethargy as the [docile_chem] leaves your host's blood. This will take about 10 seconds...")
waketimerid = addtimer(CALLBACK(src, "wakeup"), 10, TIMER_STOPPABLE)
if(controlling)
@@ -413,6 +415,8 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
victim = C
forceMove(victim)
+ SSticker.mode.update_borer_icons_added_host(victim.mind)
+
RemoveBorerActions()
GrantInfestActions()
@@ -587,6 +591,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
var/mob/living/V = victim
V.verbs -= /mob/living/proc/borer_comm
talk_to_borer_action.Remove(victim)
+ SSticker.mode.update_borer_icons_removed_host(victim.mind)
victim = null
return
@@ -772,10 +777,13 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
switch(punishment) //Hardcoding this stuff.
if("Blindness")
victim.blind_eyes(4)
+ to_chat(victim, "Your vision fades away suddenly, as your borer robs you of your sight.")
if("Deafness")
victim.minimumDeafTicks(40)
+ to_chat(victim, "Your hearing fades away suddenly, as your borer robs you of your hearing.")
if("Stun")
victim.Knockdown(100)
+ to_chat(victim, "You are wracked with unbearable pain, as your borer takes control of your pain-center!")
log_game("[src]/([src.ckey]) punished [victim]/([victim.ckey] with [punishment]")
@@ -822,7 +830,10 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
new /obj/effect/decal/cleanable/vomit(get_turf(src))
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
- new /mob/living/simple_animal/borer(get_turf(src), B.generation + 1)
+ var/mob/living/simple_animal/borer/Baby = new /mob/living/simple_animal/borer(get_turf(src), B.generation + 1)
+
+ Baby.wakeup_objectives = src.mind.objectives //Save them for later, since we lack a mind for them right now
+
log_game("[src]/([src.ckey]) has spawned a new borer via reproducing.")
else
to_chat(src, "You need 200 chemicals stored to reproduce.")
@@ -840,14 +851,26 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
candidate.mob = src
ckey = candidate.ckey
- if(mind)
- mind.store_memory("You must escape with at least [GLOB.total_borer_hosts_needed] borers with hosts on the shuttle.")
-
to_chat(src, "You are a cortical borer!")
to_chat(src, "You are a brain slug that worms its way into the head of its victim. Use stealth, persuasion and your powers of mind control to keep you, your host and your eventual spawn safe and warm.")
- to_chat(src, "Sugar nullifies your abilities, avoid it at all costs!")
+ to_chat(src, "[docile_chem] nullifies your abilities, avoid it at all costs!")
to_chat(src, "You can speak to your fellow borers by prefixing your messages with ';'. Check out your Borer tab to see your abilities.")
- to_chat(src, "You must escape with at least [GLOB.total_borer_hosts_needed] borers with hosts on the shuttle. To reproduce you must have 100 chemicals and be controlling a host.")
+
+ if(mind)
+ if(!(wakeup_objectives.len)) //No objectives, use default?
+ var/datum/objective/normal_borer/new_objective
+ new_objective = new /datum/objective/normal_borer
+ new_objective.owner = mind
+ new_objective.target_amount = GLOB.total_borer_hosts_needed
+ new_objective.explanation_text = "You must escape with at least [GLOB.total_borer_hosts_needed] borer[new_objective.target_amount > 1 ? "s" : ""] with host[new_objective.target_amount > 1 ? "s" : ""] on the shuttle."
+ mind.objectives += new_objective
+ to_chat(src, "Objective #1: [new_objective.explanation_text]")
+ else
+ mind.objectives += wakeup_objectives
+ var/count = 1
+ for(var/datum/objective/O in mind.objectives)
+ to_chat(src, "Objective #[count]: [O.explanation_text]")
+ count++
/mob/living/simple_animal/borer/proc/detatch()
if(!victim || !controlling)
@@ -1075,4 +1098,28 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
/datum/action/innate/borer/jumpstart_host/Activate()
var/mob/living/simple_animal/borer/B = owner
- B.jumpstart()
\ No newline at end of file
+ B.jumpstart()
+
+
+//HUD STUFF
+/datum/game_mode/proc/update_borer_icons_added(datum/mind/borer_mind)
+ var/datum/atom_hud/antag/borerhud = GLOB.huds[ANTAG_HUD_BORER]
+ borerhud.join_hud(borer_mind.current)
+ set_antag_hud(borer_mind.current, "hudbrainworm")
+
+/datum/game_mode/proc/update_borer_icons_removed(datum/mind/borer_mind)
+ var/datum/atom_hud/antag/borerhud = GLOB.huds[ANTAG_HUD_BORER]
+ borerhud.leave_hud(borer_mind.current)
+ set_antag_hud(borer_mind.current, null)
+
+/datum/game_mode/proc/update_borer_icons_added_host(datum/mind/host_mind)
+ var/datum/atom_hud/antag/hosthud = GLOB.huds[ANTAG_HUD_BORER] //Invisible to self
+ hosthud.self_visible = FALSE
+ hosthud.join_hud(host_mind.current)
+ set_antag_hud(host_mind.current, "hudbrainworm")
+
+/datum/game_mode/proc/update_borer_icons_removed_host(datum/mind/host_mind)
+ var/datum/atom_hud/antag/hosthud = GLOB.huds[ANTAG_HUD_BORER] //Invisible to self
+ hosthud.self_visible = FALSE //Probably not needed as we're deleting?
+ hosthud.leave_hud(host_mind.current)
+ set_antag_hud(host_mind.current, null)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 502b02c7f7..68ed9abd35 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -29,6 +29,12 @@
3. Biological resources will be harvested at a later date; do not harm them.
"}
+/obj/effect/mob_spawn/swarmer/Initialize()
+ . = ..()
+ var/area/A = get_area(src)
+ if(A)
+ notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
+
/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user)
to_chat(user, "Picking up the swarmer may cause it to activate. You should be careful about this.")
diff --git a/code/game/gamemodes/miniantags/monkey/monkey.dm b/code/game/gamemodes/miniantags/monkey/monkey.dm
index 20ba54afc4..f84e4e72b6 100644
--- a/code/game/gamemodes/miniantags/monkey/monkey.dm
+++ b/code/game/gamemodes/miniantags/monkey/monkey.dm
@@ -41,7 +41,7 @@
/datum/game_mode/monkey/announce()
to_chat(world, "The current game mode is - Monkey!")
- to_chat(world, "One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to Centcom. \
+ to_chat(world, "One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to CentCom. \
Monkeys: Ensure that your kind lives on! Rise up against your captors!")
@@ -50,7 +50,7 @@
to_chat(carrier.current, "You have been planted onto this station by the Animal Rights Consortium.")
to_chat(carrier.current, "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite.")
to_chat(carrier.current, "While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment.")
- to_chat(carrier.current, "Your mission will be deemed a success if any of the live infected monkeys reach Centcom.")
+ to_chat(carrier.current, "Your mission will be deemed a success if any of the live infected monkeys reach CentCom.")
return
/datum/game_mode/monkey/post_setup()
@@ -60,7 +60,6 @@
var/datum/disease/D = new /datum/disease/transformation/jungle_fever
D.visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
- D.holder = carriermind.current
D.affected_mob = carriermind.current
carriermind.current.viruses += D
..()
@@ -89,7 +88,7 @@
var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
for(var/mob/living/carbon/monkey/M in GLOB.living_mob_list)
if (M.HasDisease(D))
- if(M.onCentcom() || M.onSyndieBase())
+ if(M.onCentCom() || M.onSyndieBase())
escaped_monkeys++
if(escaped_monkeys >= monkeys_to_win)
return 1
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
index 2bbe2cae5f..184564b024 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
@@ -85,6 +85,7 @@
charge_max = 0
panel = "Revenant Abilities"
message = "You toggle your night vision."
+ action_icon = 'icons/mob/actions/actions_revenant.dmi'
action_icon_state = "r_nightvision"
action_background_icon_state = "bg_revenant"
@@ -97,6 +98,7 @@
clothes_req = 0
range = 7
include_user = 0
+ action_icon = 'icons/mob/actions/actions_revenant.dmi'
action_icon_state = "r_transmit"
action_background_icon_state = "bg_revenant"
@@ -120,6 +122,7 @@
/obj/effect/proc_holder/spell/aoe_turf/revenant
clothes_req = 0
+ action_icon = 'icons/mob/actions/actions_revenant.dmi'
action_background_icon_state = "bg_revenant"
panel = "Revenant Abilities (Locked)"
name = "Report this to a coder"
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 3fddfea1fc..759c5f4454 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -187,7 +187,7 @@
/datum/game_mode/nuclear/declare_completion()
var/disk_rescued = 1
for(var/obj/item/weapon/disk/nuclear/D in GLOB.poi_list)
- if(!D.onCentcom())
+ if(!D.onCentCom())
disk_rescued = 0
break
var/crew_evacuated = (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)
@@ -275,7 +275,7 @@
/datum/game_mode/proc/auto_declare_completion_nuclear()
- if( syndicates.len || (SSticker && istype(SSticker.mode,/datum/game_mode/nuclear)) )
+ if( syndicates.len || (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear)) )
var/text = " The syndicate operatives were:"
var/purchases = ""
var/TC_uses = 0
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index b2f57b1719..755f6dd0c9 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -442,7 +442,7 @@
off_station = NUKE_MISS_STATION
if((bomb_location.x < (128-NUKERANGE)) || (bomb_location.x > (128+NUKERANGE)) || (bomb_location.y < (128-NUKERANGE)) || (bomb_location.y > (128+NUKERANGE)))
off_station = NUKE_MISS_STATION
- else if(istype(A, /area/syndicate_mothership) || (istype(A,/area/shuttle/syndicate) && bomb_location.z == ZLEVEL_CENTCOM))
+ else if(istype(A, /area/syndicate_mothership) || (istype(A, /area/shuttle/syndicate) && bomb_location.z == ZLEVEL_CENTCOM))
off_station = NUKE_SYNDICATE_BASE
else
off_station = NUKE_NEAR_MISS
@@ -488,6 +488,8 @@ This is here to make the tiles around the station mininuke change when it's arme
icon = 'icons/obj/module.dmi'
w_class = WEIGHT_CLASS_TINY
item_state = "card-id"
+ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
icon_state = "datadisk0"
/obj/item/weapon/disk/nuclear
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index c60446b973..d926cf2a9f 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -8,6 +8,8 @@
slot_flags = SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL = 500, MAT_GLASS = 250)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 867ab6e573..e6a22cf3d5 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -157,7 +157,7 @@
H = target.current
if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey || (H && H.dna.species.id == "memezombies")) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
return 1
- if(target.current.onCentcom() || target.current.onSyndieBase())
+ if(target.current.onCentCom() || target.current.onSyndieBase())
return 0
return 1
@@ -357,7 +357,7 @@
if(istype(location, /turf/open/floor/plasteel/shuttle/red) || istype(location, /turf/open/floor/mineral/plastitanium/brig)) // Fails traitors if they are in the shuttle brig -- Polymorph
return 0
- if(location.onCentcom() || location.onSyndieBase())
+ if(location.onCentCom() || location.onSyndieBase())
return 1
return 0
@@ -456,7 +456,7 @@ GLOBAL_LIST_EMPTY(possible_items)
targetinfo = item
steal_target = targetinfo.targetitem
- explanation_text = "Steal [targetinfo.name]."
+ explanation_text = "Steal [targetinfo.name]"
give_special_equipment(targetinfo.special_equipment)
return steal_target
else
@@ -623,17 +623,16 @@ GLOBAL_LIST_EMPTY(possible_items_special)
/datum/objective/absorb/proc/gen_amount_goal(lowbound = 4, highbound = 6)
target_amount = rand (lowbound,highbound)
- if (SSticker)
- var/n_p = 1 //autowin
- if (SSticker.current_state == GAME_STATE_SETTING_UP)
- for(var/mob/dead/new_player/P in GLOB.player_list)
- if(P.client && P.ready == PLAYER_READY_TO_PLAY && P.mind!=owner)
- n_p ++
- else if (SSticker.IsRoundInProgress())
- for(var/mob/living/carbon/human/P in GLOB.player_list)
- if(P.client && !(P.mind in SSticker.mode.changelings) && P.mind!=owner)
- n_p ++
- target_amount = min(target_amount, n_p)
+ var/n_p = 1 //autowin
+ if (SSticker.current_state == GAME_STATE_SETTING_UP)
+ for(var/mob/dead/new_player/P in GLOB.player_list)
+ if(P.client && P.ready == PLAYER_READY_TO_PLAY && P.mind!=owner)
+ n_p ++
+ else if (SSticker.IsRoundInProgress())
+ for(var/mob/living/carbon/human/P in GLOB.player_list)
+ if(P.client && !(P.mind in SSticker.mode.changelings) && P.mind!=owner)
+ n_p ++
+ target_amount = min(target_amount, n_p)
explanation_text = "Extract [target_amount] compatible genome\s."
return target_amount
@@ -833,15 +832,15 @@ GLOBAL_LIST_EMPTY(possible_items_special)
var/list/check_names = department_real_names.Copy()
- //Check each department member's mind to see if any of them made it to centcomm alive, if they did it's an automatic fail
+ //Check each department member's mind to see if any of them made it to centcom alive, if they did it's an automatic fail
for(var/datum/mind/M in department_minds)
if(M in SSticker.mode.changelings) //Lings aren't picked for this, but let's be safe
continue
if(M.current)
var/turf/mloc = get_turf(M.current)
- if(mloc.onCentcom() && (M.current.stat != DEAD))
- return 0 //A Non-ling living target got to centcomm, fail
+ if(mloc.onCentCom() && (M.current.stat != DEAD))
+ return 0 //A Non-ling living target got to centcom, fail
//Check each staff member has been replaced, by cross referencing changeling minds, changeling current dna, the staff minds and their original DNA names
var/success = 0
@@ -852,11 +851,11 @@ GLOBAL_LIST_EMPTY(possible_items_special)
if(ishuman(changeling.current))
var/mob/living/carbon/human/H = changeling.current
var/turf/cloc = get_turf(changeling.current)
- if(cloc && cloc.onCentcom() && (changeling.current.stat != DEAD)) //Living changeling on centcomm....
+ if(cloc && cloc.onCentCom() && (changeling.current.stat != DEAD)) //Living changeling on centcom....
for(var/name in check_names) //Is he (disguised as) one of the staff?
if(H.dna.real_name == name)
check_names -= name //This staff member is accounted for, remove them, so the team don't succeed by escape as 7 of the same engineer
- success++ //A living changeling staff member made it to centcomm
+ success++ //A living changeling staff member made it to centcom
continue changelings
if(success >= department_minds.len)
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index 703f1a9760..43067d4c22 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -12,72 +12,72 @@
return 1
/datum/objective_item/steal/caplaser
- name = "the captain's antique laser gun"
+ name = "the captain's antique laser gun."
targetitem = /obj/item/weapon/gun/energy/laser/captain
difficulty = 5
excludefromjob = list("Captain")
/datum/objective_item/steal/hoslaser
- name = "the head of security's personal laser gun"
+ name = "the head of security's personal laser gun."
targetitem = /obj/item/weapon/gun/energy/e_gun/hos
difficulty = 10
excludefromjob = list("Head Of Security")
/datum/objective_item/steal/handtele
- name = "a hand teleporter"
+ name = "a hand teleporter."
targetitem = /obj/item/weapon/hand_tele
difficulty = 5
excludefromjob = list("Captain")
/datum/objective_item/steal/jetpack
- name = "the Captain's jetpack"
+ name = "the Captain's jetpack."
targetitem = /obj/item/weapon/tank/jetpack/oxygen/captain
difficulty = 5
excludefromjob = list("Captain")
/datum/objective_item/steal/magboots
- name = "the chief engineer's advanced magnetic boots"
+ name = "the chief engineer's advanced magnetic boots."
targetitem = /obj/item/clothing/shoes/magboots/advance
difficulty = 5
excludefromjob = list("Chief Engineer")
/datum/objective_item/steal/capmedal
- name = "the medal of captaincy"
+ name = "the medal of captaincy."
targetitem = /obj/item/clothing/accessory/medal/gold/captain
difficulty = 5
excludefromjob = list("Captain")
/datum/objective_item/steal/hypo
- name = "the hypospray"
+ name = "the hypospray."
targetitem = /obj/item/weapon/reagent_containers/hypospray/CMO
difficulty = 5
excludefromjob = list("Chief Medical Officer")
/datum/objective_item/steal/nukedisc
- name = "the nuclear authentication disk"
+ name = "the nuclear authentication disk."
targetitem = /obj/item/weapon/disk/nuclear
difficulty = 5
excludefromjob = list("Captain")
/datum/objective_item/steal/reflector
- name = "a reflector vest"
+ name = "a reflector vest."
targetitem = /obj/item/clothing/suit/armor/laserproof
difficulty = 3
excludefromjob = list("Head of Security", "Warden")
/datum/objective_item/steal/reactive
- name = "the reactive teleport armor"
+ name = "the reactive teleport armor."
targetitem = /obj/item/clothing/suit/armor/reactive
difficulty = 5
excludefromjob = list("Research Director")
/datum/objective_item/steal/documents
- name = "any set of secret documents of any organization"
+ name = "any set of secret documents of any organization."
targetitem = /obj/item/documents //Any set of secret documents. Doesn't have to be NT's
difficulty = 5
/datum/objective_item/steal/nuke_core
- name = "the heavily radioactive plutonium core from the onboard self-destruct. Take care to wear the proper safety equipment when extracting the core"
+ name = "the heavily radioactive plutonium core from the onboard self-destruct. Take care to wear the proper safety equipment when extracting the core!"
targetitem = /obj/item/nuke_core
difficulty = 15
@@ -96,7 +96,7 @@
//Items with special checks!
/datum/objective_item/steal/plasma
- name = "28 moles of plasma (full tank)"
+ name = "28 moles of plasma (full tank)."
targetitem = /obj/item/weapon/tank
difficulty = 3
excludefromjob = list("Chief Engineer","Research Director","Station Engineer","Scientist","Atmospheric Technician")
@@ -109,7 +109,7 @@
/datum/objective_item/steal/functionalai
- name = "a functional AI"
+ name = "a functional AI."
targetitem = /obj/item/device/aicard
difficulty = 20 //beyond the impossible
@@ -120,7 +120,7 @@
return 0
/datum/objective_item/steal/blueprints
- name = "the station blueprints"
+ name = "the station blueprints."
targetitem = /obj/item/areaeditor/blueprints
difficulty = 10
excludefromjob = list("Chief Engineer")
@@ -136,7 +136,7 @@
return 0
/datum/objective_item/steal/slime
- name = "an unused sample of slime extract"
+ name = "an unused sample of slime extract."
targetitem = /obj/item/slime_extract
difficulty = 3
excludefromjob = list("Research Director","Scientist")
@@ -148,54 +148,54 @@
//Unique Objectives
/datum/objective_item/unique/docs_red
- name = "the \"Red\" secret documents"
+ name = "the \"Red\" secret documents."
targetitem = /obj/item/documents/syndicate/red
difficulty = 10
/datum/objective_item/unique/docs_blue
- name = "the \"Blue\" secret documents"
+ name = "the \"Blue\" secret documents."
targetitem = /obj/item/documents/syndicate/blue
difficulty = 10
//Old ninja objectives.
/datum/objective_item/special/pinpointer
- name = "the captain's pinpointer"
+ name = "the captain's pinpointer."
targetitem = /obj/item/weapon/pinpointer
difficulty = 10
/datum/objective_item/special/aegun
- name = "an advanced energy gun"
+ name = "an advanced energy gun."
targetitem = /obj/item/weapon/gun/energy/e_gun/nuclear
difficulty = 10
/datum/objective_item/special/ddrill
- name = "a diamond drill"
+ name = "a diamond drill."
targetitem = /obj/item/weapon/pickaxe/drill/diamonddrill
difficulty = 10
/datum/objective_item/special/boh
- name = "a bag of holding"
+ name = "a bag of holding."
targetitem = /obj/item/weapon/storage/backpack/holding
difficulty = 10
/datum/objective_item/special/hypercell
- name = "a hyper-capacity cell"
+ name = "a hyper-capacity power cell."
targetitem = /obj/item/weapon/stock_parts/cell/hyper
difficulty = 5
/datum/objective_item/special/laserpointer
- name = "a laser pointer"
+ name = "a laser pointer."
targetitem = /obj/item/device/laser_pointer
difficulty = 5
/datum/objective_item/special/corgimeat
- name = "a piece of corgi meat"
+ name = "a piece of corgi meat."
targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi
difficulty = 5
//Stack objectives get their own subtype
/datum/objective_item/stack
- name = "5 cardboards"
+ name = "5 cardboard."
targetitem = /obj/item/stack/sheet/cardboard
difficulty = 9001
@@ -208,16 +208,16 @@
return found_amount>=target_amount
/datum/objective_item/stack/diamond
- name = "10 diamonds"
+ name = "10 diamonds."
targetitem = /obj/item/stack/sheet/mineral/diamond
difficulty = 10
/datum/objective_item/stack/gold
- name = "50 gold bars"
+ name = "50 gold bars."
targetitem = /obj/item/stack/sheet/mineral/gold
difficulty = 15
/datum/objective_item/stack/uranium
- name = "25 refined uranium bars"
+ name = "25 refined uranium bars."
targetitem = /obj/item/stack/sheet/mineral/uranium
difficulty = 10
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index a17a9d97fb..51a2c6c486 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -360,7 +360,7 @@
/datum/game_mode/proc/auto_declare_completion_revolution()
var/list/targets = list()
- if(head_revolutionaries.len || istype(SSticker.mode,/datum/game_mode/revolution))
+ if(head_revolutionaries.len || istype(SSticker.mode, /datum/game_mode/revolution))
var/num_revs = 0
var/num_survivors = 0
for(var/mob/living/carbon/survivor in GLOB.living_mob_list)
@@ -377,14 +377,14 @@
text += " "
to_chat(world, text)
- if(revolutionaries.len || istype(SSticker.mode,/datum/game_mode/revolution))
+ if(revolutionaries.len || istype(SSticker.mode, /datum/game_mode/revolution))
var/text = " The revolutionaries were:"
for(var/datum/mind/rev in revolutionaries)
text += printplayer(rev, 1)
text += " "
to_chat(world, text)
- if( head_revolutionaries.len || revolutionaries.len || istype(SSticker.mode,/datum/game_mode/revolution) )
+ if( head_revolutionaries.len || revolutionaries.len || istype(SSticker.mode, /datum/game_mode/revolution) )
var/text = " The heads of staff were:"
var/list/heads = get_all_heads()
for(var/datum/mind/head in heads)
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index 3895a479c7..1586cc43b1 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -27,9 +27,9 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
//items that shouldn't spawn on the floor because they would bug or act weird
var/global/list/spawn_forbidden = list(
/obj/item/tk_grab, /obj/item/weapon/implant, // not implanter, the actual thing that is inside you
- /obj/item/assembly,/obj/item/device/onetankbomb, /obj/item/radio, /obj/item/device/pda/ai,
+ /obj/item/assembly, /obj/item/device/onetankbomb, /obj/item/radio, /obj/item/device/pda/ai,
/obj/item/device/uplink, /obj/item/smallDelivery, /obj/item/projectile,
- /obj/item/borg/sight,/obj/item/borg/stun,/obj/item/weapon/robot_module)
+ /obj/item/borg/sight, /obj/item/borg/stun, /obj/item/weapon/robot_module)
/datum/hSB/proc/update()
var/global/list/hrefs = list(
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index d3f33aa4b5..5f65c2a96d 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -127,6 +127,8 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "necrostone"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
origin_tech = "bluespace=4;materials=4"
w_class = WEIGHT_CLASS_TINY
var/list/spooky_scaries = list()
@@ -203,6 +205,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "multiverse"
item_state = "multiverse"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
hitsound = 'sound/weapons/bladeslice.ogg'
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -450,6 +454,8 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "voodoo"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
var/mob/living/carbon/human/target = null
var/list/mob/living/carbon/human/possible = list()
var/obj/item/link = null
@@ -468,7 +474,7 @@
to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_selected)]!")
target.Knockdown(40)
GiveHint(target)
- else if(istype(I,/obj/item/weapon/bikehorn))
+ else if(istype(I, /obj/item/weapon/bikehorn))
to_chat(target, "HONK")
target << 'sound/items/airhorn.ogg'
target.adjustEarDamage(0,3)
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index d391e70c35..130839a373 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -3,6 +3,8 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "soulstone"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
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
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index b8db71b7b8..69c26cdb43 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -376,7 +376,7 @@
/datum/spellbook_entry/item/guardian/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
. = ..()
if(.)
- new /obj/item/weapon/paper/guardian/wizard(get_turf(user))
+ new /obj/item/weapon/paper/guides/antag/guardian/wizard(get_turf(user))
/datum/spellbook_entry/item/bloodbottle
name = "Bottle of Blood"
@@ -899,7 +899,7 @@
/obj/item/weapon/spellbook/oneuse/random/Initialize()
..()
- var/static/banned_spells = list(/obj/item/weapon/spellbook/oneuse/mimery_blockade,/obj/item/weapon/spellbook/oneuse/mimery_guns)
+ var/static/banned_spells = list(/obj/item/weapon/spellbook/oneuse/mimery_blockade, /obj/item/weapon/spellbook/oneuse/mimery_guns)
var/real_type = pick(subtypesof(/obj/item/weapon/spellbook/oneuse) - banned_spells)
new real_type(loc)
qdel(src)
diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm
index a363a7fa51..69ccb4240a 100644
--- a/code/game/machinery/airlock_control.dm
+++ b/code/game/machinery/airlock_control.dm
@@ -147,6 +147,5 @@
set_frequency(frequency)
/obj/machinery/airlock_sensor/Destroy()
- if(SSradio)
- SSradio.remove_object(src,frequency)
+ SSradio.remove_object(src,frequency)
return ..()
\ No newline at end of file
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 11c54d4d99..1164851206 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -152,7 +152,7 @@
busy = TRUE
var/inserted = materials.insert_item(O)
if(inserted)
- if(istype(O,/obj/item/stack))
+ if(istype(O, /obj/item/stack))
if (O.materials[MAT_METAL])
flick("autolathe_o",src)//plays metal insertion animation
if (O.materials[MAT_GLASS])
@@ -361,7 +361,7 @@
if(D.make_reagents.len)
return 0
- var/coeff = (ispath(D.build_path,/obj/item/stack) ? 1 : prod_coeff)
+ var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff)
if(D.materials[MAT_METAL] && (materials.amount(MAT_METAL) < (D.materials[MAT_METAL] * coeff * amount)))
return 0
@@ -370,7 +370,7 @@
return 1
/obj/machinery/autolathe/proc/get_design_cost(datum/design/D)
- var/coeff = (ispath(D.build_path,/obj/item/stack) ? 1 : prod_coeff)
+ var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff)
var/dat
if(D.materials[MAT_METAL])
dat += "[D.materials[MAT_METAL] * coeff] metal "
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index cc756caf98..2ef95cfa6c 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -373,20 +373,6 @@
else
set_light(0)
-/obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets.
- var/turf/prev_turf
-
-/obj/machinery/camera/portable/Initialize()
- . = ..()
- assembly.state = 0 //These cameras are portable, and so shall be in the portable state if removed.
- assembly.anchored = FALSE
- assembly.update_icon()
-
-/obj/machinery/camera/portable/process() //Updates whenever the camera is moved.
- if(GLOB.cameranet && get_turf(src) != prev_turf)
- GLOB.cameranet.updatePortableCamera(src)
- prev_turf = get_turf(src)
-
/obj/machinery/camera/get_remote_view_fullscreens(mob/user)
if(view_range == short_range) //unfocused
user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2)
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 8639544e0a..8ca1a8632c 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -79,7 +79,7 @@
if(istype(W, /obj/item/weapon/screwdriver))
playsound(src.loc, W.usesound, 50, 1)
- var/input = stripped_input(user, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")
+ var/input = stripped_input(user, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")
if(!input)
to_chat(user, "No input found, please hang up and try your call again!")
return
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 23d3598951..7b8007755b 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -136,9 +136,9 @@
/proc/near_camera(mob/living/M)
if (!isturf(M.loc))
return 0
- if(iscyborg(M))
- var/mob/living/silicon/robot/R = M
- if(!(R.camera && R.camera.can_use()) && !GLOB.cameranet.checkCameraVis(M))
+ if(issilicon(M))
+ var/mob/living/silicon/S = M
+ if((!QDELETED(S.builtInCamera) || !S.builtInCamera.can_use()) && !GLOB.cameranet.checkCameraVis(M))
return 0
else if(!GLOB.cameranet.checkCameraVis(M))
return 0
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 1bfe69f377..06c4cce2bc 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -304,7 +304,7 @@
if(default_deconstruction_crowbar(W))
return
- if(istype(W,/obj/item/device/multitool))
+ if(istype(W, /obj/item/device/multitool))
var/obj/item/device/multitool/P = W
if(istype(P.buffer, /obj/machinery/computer/cloning))
@@ -365,7 +365,7 @@
fl.forceMove(T)
unattached_flesh.Cut()
mess = FALSE
- new /obj/effect/gibspawner/generic(loc)
+ new /obj/effect/gibspawner/generic(get_turf(src))
audible_message("You hear a splat.")
icon_state = "pod_0"
return
@@ -483,7 +483,7 @@
* Manual -- A big ol' manual.
*/
-/obj/item/weapon/paper/Cloning
+/obj/item/weapon/paper/guides/jobs/medical/cloning
name = "paper - 'H-87 Cloning Apparatus Manual"
info = {"
"
for(var/A in get_all_centcom_access())
if(A in modify.access)
@@ -433,7 +433,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if(authenticated)
var/access_type = text2num(href_list["access_target"])
var/access_allowed = text2num(href_list["allowed"])
- if(access_type in (istype(src,/obj/machinery/computer/card/centcom)?get_all_centcom_access() : get_all_accesses()))
+ if(access_type in (istype(src, /obj/machinery/computer/card/centcom)?get_all_centcom_access() : get_all_accesses()))
modify.access -= access_type
if(access_allowed == 1)
modify.access += access_type
@@ -460,7 +460,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
to_chat(usr, "No log exists for this job.")
return
- modify.access = ( istype(src,/obj/machinery/computer/card/centcom) ? get_centcom_access(t1) : jobdatum.get_access() )
+ modify.access = ( istype(src, /obj/machinery/computer/card/centcom) ? get_centcom_access(t1) : jobdatum.get_access() )
if (modify)
modify.assignment = t1
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
@@ -562,7 +562,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
head_subordinates += job.title
/obj/machinery/computer/card/centcom
- name = "\improper Centcom identification console"
+ name = "\improper CentCom identification console"
circuit = /obj/item/weapon/circuitboard/computer/card/centcom
req_access = list(ACCESS_CENT_CAPTAIN)
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 260c6a8f01..a4caa68480 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -124,7 +124,7 @@
to_chat(user, "You insert [W].")
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
src.updateUsrDialog()
- else if(istype(W,/obj/item/device/multitool))
+ else if(istype(W, /obj/item/device/multitool))
var/obj/item/device/multitool/P = W
if(istype(P.buffer, /obj/machinery/clonepod))
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 66c4bfa463..ce6430d75c 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -267,18 +267,18 @@
src.updateDialog()
// OMG CENTCOM LETTERHEAD
- if("MessageCentcomm")
+ if("MessageCentCom")
if(src.authenticated==2)
if(!checkCCcooldown())
to_chat(usr, "Arrays recycling. Please stand by.")
return
- var/input = stripped_input(usr, "Please choose a message to transmit to Centcom via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to Centcomm.", "")
+ var/input = stripped_input(usr, "Please choose a message to transmit to CentCom via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to CentCom.", "")
if(!input || !(usr in view(1,src)) || !checkCCcooldown())
return
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
- Centcomm_announce(input, usr)
+ CentCom_announce(input, usr)
to_chat(usr, "Message transmitted to Central Command.")
- log_talk(usr,"[key_name(usr)] has made a Centcom announcement: [input]",LOGSAY)
+ log_talk(usr,"[key_name(usr)] has made a CentCom announcement: [input]",LOGSAY)
CM.lastTimeUsed = world.time
@@ -314,7 +314,7 @@
return
Nuke_request(input, usr)
to_chat(usr, "Request sent.")
- log_talk(usr,"[key_name(usr)] has requested the nuclear codes from Centcomm",LOGSAY)
+ log_talk(usr,"[key_name(usr)] has requested the nuclear codes from CentCom",LOGSAY)
priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/ai/commandreport.ogg')
CM.lastTimeUsed = world.time
@@ -461,7 +461,7 @@
dat += " \[ Emergency Maintenance Access \]"
dat += " \[ Request Nuclear Authentication Codes \]"
if(!emagged)
- dat += " \[ Send Message to Centcom \]"
+ dat += " \[ Send Message to CentCom \]"
else
dat += " \[ Send Message to \[UNKNOWN\] \]"
dat += " \[ Restore Backup Routing Data \]"
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 9f1e4121cc..e8d3aaf061 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -66,7 +66,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
jobs["Janitor"] = 68
jobs["Lawyer"] = 69
jobs["Admiral"] = 200
- jobs["Centcom Commander"] = 210
+ jobs["CentCom Commander"] = 210
jobs["Custodian"] = 211
jobs["Medical Officer"] = 212
jobs["Research Officer"] = 213
diff --git a/code/game/machinery/computer/crew.js b/code/game/machinery/computer/crew.js
index e29fda2106..7a2e3caeba 100644
--- a/code/game/machinery/computer/crew.js
+++ b/code/game/machinery/computer/crew.js
@@ -421,7 +421,7 @@ function getColor(ijob)
else if (ijob >= 30 && ijob < 40) { return "#9B59B6"; } // science
else if (ijob >= 40 && ijob < 50) { return "#F1C40F"; } // engineering
else if (ijob >= 50 && ijob < 60) { return "#F39C12"; } // cargo
- else if (ijob >= 200 && ijob < 230) { return "#00C100"; } // Centcom
+ else if (ijob >= 200 && ijob < 230) { return "#00C100"; } // CentCom
else { return "#C38312"; } // other / unknown
}
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 8965385861..517d9c8264 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -576,13 +576,13 @@ What a mess.*/
if(istype(active2, /datum/data/record))
active2.fields["name"] = t1
if("id")
- if(istype(active2,/datum/data/record) || istype(active1,/datum/data/record))
+ if(istype(active2, /datum/data/record) || istype(active1, /datum/data/record))
var/t1 = stripped_input(usr, "Please input id:", "Secure. records", active1.fields["id"], null)
if(!canUseSecurityRecordsConsole(usr, t1, a1))
return
- if(istype(active1,/datum/data/record))
+ if(istype(active1, /datum/data/record))
active1.fields["id"] = t1
- if(istype(active2,/datum/data/record))
+ if(istype(active2, /datum/data/record))
active2.fields["id"] = t1
if("fingerprint")
if(istype(active1, /datum/data/record))
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 8c9e300eaa..5100ece31f 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -456,10 +456,12 @@
if(charge<35)
charge += 1
if(world.time < stop && active)
+ var/sound/song_played = sound(selection.song_path)
+
for(var/mob/M in range(10,src))
if(!(M in rangers))
rangers[M] = TRUE
- M.playsound_local(get_turf(M), selection.song_path, 100, channel = CHANNEL_JUKEBOX)
+ M.playsound_local(get_turf(M), null, 100, channel = CHANNEL_JUKEBOX, S = song_played)
if(prob(5+(allowed(M)*4)) && M.canmove)
dance(M)
for(var/mob/L in rangers)
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 72840241b3..a3f2424a9a 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -266,7 +266,7 @@
//////////////////////////////////
/*
- Centcom Airlocks
+ CentCom Airlocks
*/
/obj/machinery/door/airlock/centcom
@@ -368,13 +368,14 @@
overlays_file = 'icons/obj/doors/airlocks/cult/runed/overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_cult
hackProof = TRUE
- aiControlDisabled = 1
+ aiControlDisabled = TRUE
+ req_access = list(ACCESS_BLOODCULT)
var/openingoverlaytype = /obj/effect/temp_visual/cult/door
var/friendly = FALSE
-/obj/machinery/door/airlock/cult/New()
- ..()
- new openingoverlaytype(src.loc)
+/obj/machinery/door/airlock/cult/Initialize()
+ . = ..()
+ new openingoverlaytype(loc)
/obj/machinery/door/airlock/cult/canAIControl(mob/user)
return (iscultist(user) && !isAllPowerCut())
@@ -435,17 +436,17 @@
opacity = 1
hackProof = TRUE
aiControlDisabled = TRUE
+ req_access = list(ACCESS_CLOCKCULT)
use_power = FALSE
resistance_flags = FIRE_PROOF | ACID_PROOF
damage_deflection = 30
normal_integrity = 240
var/construction_state = GEAR_SECURE //Pinion airlocks have custom deconstruction
-/obj/machinery/door/airlock/clockwork/New()
- ..()
- var/turf/T = get_turf(src)
- new /obj/effect/temp_visual/ratvar/door(T)
- new /obj/effect/temp_visual/ratvar/beam/door(T)
+/obj/machinery/door/airlock/clockwork/Initialize()
+ . = ..()
+ new /obj/effect/temp_visual/ratvar/door(loc)
+ new /obj/effect/temp_visual/ratvar/beam/door(loc)
change_construction_value(5)
/obj/machinery/door/airlock/clockwork/Destroy()
diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm
index 3ecd9cbfda..4a92c935b4 100644
--- a/code/game/machinery/doors/alarmlock.dm
+++ b/code/game/machinery/doors/alarmlock.dm
@@ -16,8 +16,7 @@
air_connection = new
/obj/machinery/door/airlock/alarmlock/Destroy()
- if(SSradio)
- SSradio.remove_object(src,air_frequency)
+ SSradio.remove_object(src,air_frequency)
air_connection = null
return ..()
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 72c9a64771..47e3fdc6d4 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -192,7 +192,7 @@
playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
/obj/machinery/door/emp_act(severity)
- if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) )
+ if(prob(20/severity) && (istype(src, /obj/machinery/door/airlock) || istype(src, /obj/machinery/door/window)) )
INVOKE_ASYNC(src, .proc/open)
if(prob(40/severity))
if(secondsElectrified == 0)
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 9a8d2c2e3b..7f8cbce0f4 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -316,7 +316,7 @@
/obj/machinery/door/window/brigdoor/security/holding
name = "holding cell door"
- req_access = list(ACCESS_SEC_DOORS, ACCESS_LAWYER) //love for the lawyer
+ req_one_access = list(ACCESS_SEC_DOORS, ACCESS_LAWYER) //love for the lawyer
/obj/machinery/door/window/clockwork
name = "brass windoor"
diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm
index 48ef992615..3c6f0ad13a 100644
--- a/code/game/machinery/embedded_controller/embedded_controller_base.dm
+++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm
@@ -73,8 +73,7 @@
var/datum/radio_frequency/radio_connection
/obj/machinery/embedded_controller/radio/Destroy()
- if(SSradio)
- SSradio.remove_object(src,frequency)
+ SSradio.remove_object(src,frequency)
return ..()
/obj/machinery/embedded_controller/radio/Initialize()
diff --git a/code/game/machinery/iv_drip.dm.rej b/code/game/machinery/iv_drip.dm.rej
deleted file mode 100644
index 21479ee4d2..0000000000
--- a/code/game/machinery/iv_drip.dm.rej
+++ /dev/null
@@ -1,35 +0,0 @@
-diff a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm (rejected hunks)
-@@ -1,21 +1,29 @@
-+#define IV_TAKING 0
-+#define IV_INJECTING 1
-+
- /obj/machinery/iv_drip
- name = "\improper IV drip"
- icon = 'icons/obj/iv_drip.dmi'
- icon_state = "iv_drip"
-- anchored = 0
-+ anchored = FALSE
- mouse_drag_pointer = MOUSE_ACTIVE_POINTER
- var/mob/living/carbon/attached = null
-- var/mode = 1 // 1 is injecting, 0 is taking blood.
-+ var/mode = IV_INJECTING
- var/obj/item/weapon/reagent_containers/beaker = null
- var/list/drip_containers = list(/obj/item/weapon/reagent_containers/blood,
-- /obj/item/weapon/reagent_containers/food,
-- /obj/item/weapon/reagent_containers/glass)
-+ /obj/item/weapon/reagent_containers/food,
-+ /obj/item/weapon/reagent_containers/glass)
-
- /obj/machinery/iv_drip/Initialize()
- ..()
- update_icon()
- drip_containers = typecacheof(drip_containers)
-
-+/obj/machinery/iv_drip/Destroy()
-+ attached = null
-+ QDEL_NULL(beaker)
-+ return ..()
-+
- /obj/machinery/iv_drip/update_icon()
- if(attached)
- if(mode)
diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm
index 9bbc509d44..8c3736ddf3 100644
--- a/code/game/machinery/launch_pad.dm
+++ b/code/game/machinery/launch_pad.dm
@@ -209,6 +209,8 @@
desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional."
icon = 'icons/obj/storage.dmi'
icon_state = "briefcase"
+ lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi'
flags = CONDUCT
force = 8
hitsound = "swing_hit"
diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm
index 6f5224ad76..21e0590a4b 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -36,15 +36,13 @@
center = T
spawn(10) // must wait for map loading to finish
- if(SSradio)
- SSradio.add_object(src, freq, GLOB.RADIO_MAGNETS)
+ SSradio.add_object(src, freq, GLOB.RADIO_MAGNETS)
spawn()
magnetic_process()
/obj/machinery/magnetic_module/Destroy()
- if(SSradio)
- SSradio.remove_object(src, freq)
+ SSradio.remove_object(src, freq)
. = ..()
center = null
@@ -228,16 +226,14 @@
spawn(45) // must wait for map loading to finish
- if(SSradio)
- radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_MAGNETS)
+ radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_MAGNETS)
if(path) // check for default path
filter_path() // renders rpath
/obj/machinery/magnetic_controller/Destroy()
- if(SSradio)
- SSradio.remove_object(src, frequency)
+ SSradio.remove_object(src, frequency)
magnets = null
rpath = null
. = ..()
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 369379dbce..ec0aaf2bcd 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -882,6 +882,8 @@ GLOBAL_LIST_EMPTY(allCasters)
desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "newspaper"
+ lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("bapped")
var/screen = 0
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index f2ac844d57..176209a2cb 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -274,7 +274,7 @@
to_chat(user, "Controls are now [locked ? "locked" : "unlocked"].")
else
to_chat(user, "Access denied.")
- else if(istype(I,/obj/item/device/multitool) && !locked)
+ else if(istype(I, /obj/item/device/multitool) && !locked)
var/obj/item/device/multitool/M = I
M.buffer = src
to_chat(user, "You add [src] to multitool buffer.")
@@ -359,28 +359,23 @@
popDown()
return
- var/list/targets = calculate_targets()
-
- if(!tryToShootAt(targets))
- if(!always_up)
- popDown() // no valid targets, close the cover
-
-/obj/machinery/porta_turret/proc/calculate_targets()
var/list/targets = list()
- var/turretview = view(scan_range, base)
- for(var/A in turretview)
+ var/static/things_to_scan = typecacheof(list(/mob/living, /obj/mecha))
+
+ for(var/A in typecache_filter_list(view(scan_range, base), things_to_scan))
var/atom/AA = A
- if(AA.invisibility>SEE_INVISIBLE_LIVING)
+
+ if(AA.invisibility > SEE_INVISIBLE_LIVING)
continue
if(check_anomalies)//if it's set to check for simple animals
- if(istype(A, /mob/living/simple_animal))
+ if(isanimal(A))
var/mob/living/simple_animal/SA = A
if(SA.stat || in_faction(SA)) //don't target if dead or in faction
continue
targets += SA
- if(istype(A, /mob/living/carbon))
+ if(iscarbon(A))
var/mob/living/carbon/C = A
//If not emagged, only target non downed carbons
if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || C.lying))
@@ -399,14 +394,16 @@
if(!in_faction(C))
targets += C
- if(istype(A, /obj/mecha/))
+ if(istype(A, /obj/mecha))
var/obj/mecha/M = A
//If there is a user and they're not in our faction
if(M.occupant && !in_faction(M.occupant))
if(assess_perp(M.occupant) >= 4)
targets += M
- return targets
+ if(!tryToShootAt(targets))
+ if(!always_up)
+ popDown() // no valid targets, close the cover
/obj/machinery/porta_turret/proc/tryToShootAt(list/atom/movable/targets)
while(targets.len > 0)
@@ -490,11 +487,9 @@
/obj/machinery/porta_turret/proc/target(atom/movable/target)
if(target)
- spawn()
- popUp() //pop the turret up if it's not already up.
+ popUp() //pop the turret up if it's not already up.
setDir(get_dir(base, target))//even if you can't shoot, follow the target
- spawn()
- shootAt(target)
+ shootAt(target)
return 1
return
@@ -612,7 +607,7 @@
cover.name = name
cover.desc = desc
-/obj/machinery/porta_turret/centcomm_shuttle
+/obj/machinery/porta_turret/centcom_shuttle
installation = null
max_integrity = 260
always_up = 1
@@ -629,10 +624,10 @@
emp_vunerable = 0
mode = TURRET_LETHAL
-/obj/machinery/porta_turret/centcomm_shuttle/assess_perp(mob/living/carbon/human/perp)
+/obj/machinery/porta_turret/centcom_shuttle/assess_perp(mob/living/carbon/human/perp)
return 0
-/obj/machinery/porta_turret/centcomm_shuttle/setup()
+/obj/machinery/porta_turret/centcom_shuttle/setup()
return
////////////////////////
@@ -689,9 +684,9 @@
/obj/machinery/turretid/attackby(obj/item/I, mob/user, params)
if(stat & BROKEN) return
- if (istype(I,/obj/item/device/multitool))
+ if (istype(I, /obj/item/device/multitool))
var/obj/item/device/multitool/M = I
- if(M.buffer && istype(M.buffer,/obj/machinery/porta_turret))
+ if(M.buffer && istype(M.buffer, /obj/machinery/porta_turret))
turrets |= M.buffer
to_chat(user, "You link \the [M.buffer] with \the [src]")
return
diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm
index 25e4f4e49a..08909030ca 100644
--- a/code/game/machinery/porta_turret/portable_turret_construct.dm
+++ b/code/game/machinery/porta_turret/portable_turret_construct.dm
@@ -151,7 +151,7 @@
var/obj/machinery/porta_turret/turret
//fuck lasertag turrets
- if(istype(installed_gun,/obj/item/weapon/gun/energy/laser/bluetag) || istype(installed_gun,/obj/item/weapon/gun/energy/laser/redtag))
+ if(istype(installed_gun, /obj/item/weapon/gun/energy/laser/bluetag) || istype(installed_gun, /obj/item/weapon/gun/energy/laser/redtag))
turret = new/obj/machinery/porta_turret/lasertag(loc)
else
turret = new/obj/machinery/porta_turret(loc)
diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm
index 1aadf6a452..27575e94cb 100644
--- a/code/game/machinery/porta_turret/portable_turret_cover.dm
+++ b/code/game/machinery/porta_turret/portable_turret_cover.dm
@@ -64,7 +64,7 @@
updateUsrDialog()
else
to_chat(user, "Access denied.")
- else if(istype(I,/obj/item/device/multitool) && !parent_turret.locked)
+ else if(istype(I, /obj/item/device/multitool) && !parent_turret.locked)
var/obj/item/device/multitool/M = I
M.buffer = parent_turret
to_chat(user, "You add [parent_turret] to multitool buffer.")
diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
index 5b1eb0548c..b05ecdea70 100644
--- a/code/game/machinery/quantum_pad.dm
+++ b/code/game/machinery/quantum_pad.dm
@@ -150,3 +150,8 @@
else if(!isobserver(ROI))
continue
do_teleport(ROI, get_turf(linked_pad))
+
+
+/obj/item/weapon/paper/guides/quantumpad
+ name = "Quantum Pad For Dummies"
+ info = "
Dummies Guide To Quantum Pads
Do you hate the concept of having to use your legs, let alone walk to places? Well, with the Quantum Pad (tm), never again will the fear of cardio keep you from going places!
How to set up your Quantum Pad(tm)
1.Unscrew the Quantum Pad(tm) you wish to link. 2. Use your multi-tool to cache the buffer of the Quantum Pad(tm) you wish to link. 3. Apply the multi-tool to the secondary Quantum Pad(tm) you wish to link to the first Quantum Pad(tm)
If you followed these instructions carefully, your Quantum Pad(tm) should now be properly linked together for near-instant movement across the station! Bear in mind that this is technically a one-way teleport, so you'll need to do the same process with the secondary pad to the first one if you wish to travel between both.
You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.
There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then deliver these minerals to cargo or engineering. You are our last hope for a clean station, do not screw this up!"
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index e7613bbe62..4cfc6809cc 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -50,8 +50,7 @@
SSradio.add_object(src, frequency)
/obj/machinery/status_display/Destroy()
- if(SSradio)
- SSradio.remove_object(src,frequency)
+ SSradio.remove_object(src,frequency)
GLOB.ai_status_displays.Remove(src)
return ..()
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index db53e10abf..15ed4281b8 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -54,7 +54,7 @@
/obj/machinery/power/singularity_beacon/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W,/obj/item/weapon/screwdriver))
+ if(istype(W, /obj/item/weapon/screwdriver))
if(active)
to_chat(user, "You need to deactivate the beacon first!")
return
@@ -105,6 +105,8 @@
name = "suspicious beacon"
icon = 'icons/obj/radio.dmi'
icon_state = "beacon"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
desc = "A label on it reads: Warning: Activating this device will send a special beacon to your location."
origin_tech = "bluespace=6;syndicate=5"
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 6a0206f35c..655483a255 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -275,6 +275,8 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "bombcore"
item_state = "eshield0"
+ lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
w_class = WEIGHT_CLASS_NORMAL
origin_tech = "syndicate=5;combat=6"
resistance_flags = FLAMMABLE //Burnable (but the casing isn't)
@@ -297,7 +299,7 @@
message_admins(adminlog)
log_game(adminlog)
explosion(get_turf(src), range_heavy, range_medium, range_light, flame_range = range_flame)
- if(loc && istype(loc,/obj/machinery/syndicatebomb/))
+ if(loc && istype(loc, /obj/machinery/syndicatebomb/))
qdel(loc)
qdel(src)
@@ -411,7 +413,7 @@
total_volume += RC.reagents.total_volume
if(total_volume < time_release) // If it's empty, the detonation is complete.
- if(loc && istype(loc,/obj/machinery/syndicatebomb/))
+ if(loc && istype(loc, /obj/machinery/syndicatebomb/))
qdel(loc)
qdel(src)
return
@@ -451,7 +453,7 @@
playsound(loc, 'sound/effects/bamf.ogg', 75, 1, 5)
- if(loc && istype(loc,/obj/machinery/syndicatebomb/))
+ if(loc && istype(loc, /obj/machinery/syndicatebomb/))
qdel(loc)
qdel(src)
@@ -525,6 +527,8 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "bigred"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
origin_tech = "syndicate=3"
var/timer = 0
diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm
index b64a3a67e0..8ede0a7852 100644
--- a/code/game/machinery/telecomms/broadcasting.dm
+++ b/code/game/machinery/telecomms/broadcasting.dm
@@ -102,7 +102,7 @@
// --- This space left blank for Syndicate data ---
- // --- Centcom radio, yo. ---
+ // --- CentCom radio, yo. ---
else if(data == 5)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 248b25e91a..a65d4baa9f 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -29,7 +29,7 @@
// To be filled out at compile time
var/list/products = list() //For each, use the following pattern:
- var/list/contraband = list() //list(/type/path = amount,/type/path2 = amount2)
+ var/list/contraband = list() //list(/type/path = amount, /type/path2 = amount2)
var/list/premium = list() //No specified amount = only one in stock
var/product_slogans = "" //String of slogans separated by semicolons, optional
@@ -60,7 +60,7 @@
var/refill_count = 3 //The number of canisters the vending machine uses
/obj/machinery/vending/Initialize()
- ..()
+ . = ..()
wires = new /datum/wires/vending(src)
if(refill_canister) //constructable vending machine
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/vendor(null)
@@ -456,7 +456,7 @@
if(issilicon(usr))
if(iscyborg(usr))
var/mob/living/silicon/robot/R = usr
- if(!(R.module && istype(R.module,/obj/item/weapon/robot_module/butler) ))
+ if(!(R.module && istype(R.module, /obj/item/weapon/robot_module/butler) ))
to_chat(usr, "The vending machine refuses to interface with you, as you are not in its target demographic!")
return
else
@@ -689,19 +689,18 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
icon_state = "boozeomat" //////////////18 drink entities below, plus the glasses, in case someone wants to edit the number of bottles
icon_deny = "boozeomat-deny"
- products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/tequila = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/hcider = 5,
+ products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/tequila = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/hcider = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/grappa = 5,
- /obj/item/weapon/reagent_containers/food/drinks/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4,/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/tonic = 8,
+ /obj/item/weapon/reagent_containers/food/drinks/ale = 6, /obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/tonic = 8,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/sodawater = 15,
- /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 30,/obj/item/weapon/reagent_containers/food/drinks/ice = 10,
- /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass = 12,
- /obj/item/weapon/reagent_containers/food/drinks/flask = 3)
+ /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 30, /obj/item/weapon/reagent_containers/food/drinks/ice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass = 12, /obj/item/weapon/reagent_containers/food/drinks/flask = 3)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/mug/tea = 12)
product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?"
product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!"
@@ -709,7 +708,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
refill_canister = /obj/item/weapon/vending_refill/boozeomat
/obj/machinery/vending/assist
- products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4,
+ products = list( /obj/item/device/assembly/prox_sensor = 5, /obj/item/device/assembly/igniter = 3, /obj/item/device/assembly/signaler = 4,
/obj/item/weapon/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4)
contraband = list(/obj/item/device/assembly/timer = 2, /obj/item/device/assembly/voice = 2, /obj/item/device/assembly/health = 2)
product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
@@ -722,7 +721,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies"
icon_state = "coffee"
icon_vend = "coffee-vend"
- products = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25,/obj/item/weapon/reagent_containers/food/drinks/mug/tea = 25,/obj/item/weapon/reagent_containers/food/drinks/mug/coco = 25)
+ products = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25, /obj/item/weapon/reagent_containers/food/drinks/mug/tea = 25, /obj/item/weapon/reagent_containers/food/drinks/mug/coco = 25)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/ice = 12)
refill_canister = /obj/item/weapon/vending_refill/coffee
@@ -732,8 +731,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
product_slogans = "Try our new nougat bar!;Twice the calories for half the price!"
product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
icon_state = "snack"
- products = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 6,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/weapon/reagent_containers/food/snacks/chips =6,
- /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 6,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 6,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 6,
+ products = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 6, /obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 6, /obj/item/weapon/reagent_containers/food/snacks/chips =6,
+ /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 6, /obj/item/weapon/reagent_containers/food/snacks/no_raisin = 6, /obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 6,
/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 6)
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6)
refill_canister = /obj/item/weapon/vending_refill/snack
@@ -783,12 +782,12 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "Cola_Machine"
product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!"
product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
- products = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10,
- /obj/item/weapon/reagent_containers/food/drinks/soda_cans/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/starkist = 10,
- /obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_up = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
- /obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,/obj/item/weapon/reagent_containers/glass/beaker/waterbottle = 10)
- contraband = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/shamblers = 6)
- premium = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/air = 1)
+ products = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola = 10, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/soda_cans/dr_gibb = 10, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/starkist = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_up = 10, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime = 10, /obj/item/weapon/reagent_containers/glass/beaker/waterbottle = 10)
+ contraband = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/thirteenloko = 6, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/shamblers = 6)
+ premium = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/air = 1)
refill_canister = /obj/item/weapon/vending_refill/cola
/obj/machinery/vending/cola/random
@@ -838,10 +837,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
name = "\improper Shambler's Vendor"
desc = "~Shake me up some of that Shambler's Juice!~"
icon_state = "shamblers_juice"
- products = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10,
- /obj/item/weapon/reagent_containers/food/drinks/soda_cans/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/starkist = 10,
- /obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_up = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
- /obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/shamblers = 10)
+ products = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola = 10, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/soda_cans/dr_gibb = 10, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/starkist = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_up = 10, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime = 10, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/shamblers = 10)
product_slogans = "~Shake me up some of that Shambler's Juice!~"
product_ads = "Refreshing!;Jyrbv dv lg jfdv fw kyrk Jyrdscvi'j Alztv!;Over 1 trillion souls drank!;Thirsty? Nyp efk uizeb kyv uribevjj?;Kyv Jyrdscvi uizebj kyv ezxyk!;Drink up!;Krjkp."
@@ -853,9 +852,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
product_slogans = "Carts to go!"
icon_state = "cart"
icon_deny = "cart-deny"
- products = list(/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/engineering = 10,/obj/item/weapon/cartridge/security = 10,
- /obj/item/weapon/cartridge/janitor = 10,/obj/item/weapon/cartridge/signal/toxins = 10,/obj/item/device/pda/heads = 10,
- /obj/item/weapon/cartridge/captain = 3,/obj/item/weapon/cartridge/quartermaster = 10)
+ products = list(/obj/item/weapon/cartridge/medical = 10, /obj/item/weapon/cartridge/engineering = 10, /obj/item/weapon/cartridge/security = 10,
+ /obj/item/weapon/cartridge/janitor = 10, /obj/item/weapon/cartridge/signal/toxins = 10, /obj/item/device/pda/heads = 10,
+ /obj/item/weapon/cartridge/captain = 3, /obj/item/weapon/cartridge/quartermaster = 10)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
@@ -867,12 +866,12 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
product_slogans = "Liberation Station: Your one-stop shop for all things second ammendment!;Be a patriot today, pick up a gun!;Quality weapons for cheap prices!;Better dead than red!"
product_ads = "Float like an astronaut, sting like a bullet!;Express your second ammendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?"
vend_reply = "Remember the name: Liberation Station!"
- products = list(/obj/item/weapon/gun/ballistic/automatic/pistol/deagle/gold = 2,/obj/item/weapon/gun/ballistic/automatic/pistol/deagle/camo = 2,
- /obj/item/weapon/gun/ballistic/automatic/pistol/m1911 = 2,/obj/item/weapon/gun/ballistic/automatic/proto/unrestricted = 2,
- /obj/item/weapon/gun/ballistic/shotgun/automatic/combat = 2,/obj/item/weapon/gun/ballistic/automatic/gyropistol = 1,
- /obj/item/weapon/gun/ballistic/shotgun = 2,/obj/item/weapon/gun/ballistic/automatic/ar = 2)
- premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2)
- contraband = list(/obj/item/clothing/under/patriotsuit = 1,/obj/item/weapon/bedsheet/patriot = 3)
+ products = list(/obj/item/weapon/gun/ballistic/automatic/pistol/deagle/gold = 2, /obj/item/weapon/gun/ballistic/automatic/pistol/deagle/camo = 2,
+ /obj/item/weapon/gun/ballistic/automatic/pistol/m1911 = 2, /obj/item/weapon/gun/ballistic/automatic/proto/unrestricted = 2,
+ /obj/item/weapon/gun/ballistic/shotgun/automatic/combat = 2, /obj/item/weapon/gun/ballistic/automatic/gyropistol = 1,
+ /obj/item/weapon/gun/ballistic/shotgun = 2, /obj/item/weapon/gun/ballistic/automatic/ar = 2)
+ premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2, /obj/item/ammo_box/magazine/m50 = 4, /obj/item/ammo_box/magazine/m45 = 2, /obj/item/ammo_box/magazine/m75 = 2)
+ contraband = list(/obj/item/clothing/under/patriotsuit = 1, /obj/item/weapon/bedsheet/patriot = 3)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
@@ -907,12 +906,12 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_deny = "med-deny"
product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!"
req_access_txt = "5"
- products = list(/obj/item/weapon/reagent_containers/syringe = 12,/obj/item/weapon/reagent_containers/dropper = 3,/obj/item/stack/medical/gauze = 8,/obj/item/weapon/reagent_containers/pill/patch/styptic = 5, /obj/item/weapon/reagent_containers/pill/insulin = 10,
- /obj/item/weapon/reagent_containers/pill/patch/silver_sulf = 5,/obj/item/weapon/reagent_containers/glass/bottle/charcoal = 4, /obj/item/weapon/reagent_containers/spray/medical/sterilizer = 1,
- /obj/item/weapon/reagent_containers/glass/bottle/epinephrine = 4,/obj/item/weapon/reagent_containers/glass/bottle/morphine = 4,/obj/item/weapon/reagent_containers/glass/bottle/salglu_solution = 3,
- /obj/item/weapon/reagent_containers/glass/bottle/toxin = 3,/obj/item/weapon/reagent_containers/syringe/antiviral = 6,/obj/item/weapon/reagent_containers/pill/salbutamol = 2,/obj/item/device/healthanalyzer = 4, /obj/item/device/sensor_device = 2)
- contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/morphine = 4,/obj/item/weapon/reagent_containers/pill/charcoal = 6)
- premium = list(/obj/item/weapon/storage/box/hug/medical = 1,/obj/item/weapon/reagent_containers/hypospray/medipen = 3, /obj/item/weapon/storage/belt/medical = 3, /obj/item/weapon/wrench/medical = 1)
+ products = list(/obj/item/weapon/reagent_containers/syringe = 12, /obj/item/weapon/reagent_containers/dropper = 3, /obj/item/stack/medical/gauze = 8, /obj/item/weapon/reagent_containers/pill/patch/styptic = 5, /obj/item/weapon/reagent_containers/pill/insulin = 10,
+ /obj/item/weapon/reagent_containers/pill/patch/silver_sulf = 5, /obj/item/weapon/reagent_containers/glass/bottle/charcoal = 4, /obj/item/weapon/reagent_containers/spray/medical/sterilizer = 1,
+ /obj/item/weapon/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/weapon/reagent_containers/glass/bottle/morphine = 4, /obj/item/weapon/reagent_containers/glass/bottle/salglu_solution = 3,
+ /obj/item/weapon/reagent_containers/glass/bottle/toxin = 3, /obj/item/weapon/reagent_containers/syringe/antiviral = 6, /obj/item/weapon/reagent_containers/pill/salbutamol = 2, /obj/item/device/healthanalyzer = 4, /obj/item/device/sensor_device = 2)
+ contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3, /obj/item/weapon/reagent_containers/pill/morphine = 4, /obj/item/weapon/reagent_containers/pill/charcoal = 6)
+ premium = list(/obj/item/weapon/storage/box/hug/medical = 1, /obj/item/weapon/reagent_containers/hypospray/medipen = 3, /obj/item/weapon/storage/belt/medical = 3, /obj/item/weapon/wrench/medical = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/weapon/vending_refill/medical
@@ -921,9 +920,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/plasmaresearch
name = "\improper Toximate 3000"
desc = "All the fine parts you need in one vending machine!"
- products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6,
- /obj/item/device/transfer_valve = 6,/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6,
- /obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6)
+ products = list(/obj/item/clothing/under/rank/scientist = 6, /obj/item/clothing/suit/bio_suit = 6, /obj/item/clothing/head/bio_hood = 6,
+ /obj/item/device/transfer_valve = 6, /obj/item/device/assembly/timer = 6, /obj/item/device/assembly/signaler = 6,
+ /obj/item/device/assembly/prox_sensor = 6, /obj/item/device/assembly/igniter = 6)
contraband = list(/obj/item/device/assembly/health = 3)
/obj/machinery/vending/wallmed
@@ -932,10 +931,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "wallmed"
icon_deny = "wallmed-deny"
density = FALSE
- products = list(/obj/item/weapon/reagent_containers/syringe = 3,/obj/item/weapon/reagent_containers/pill/patch/styptic = 5,
- /obj/item/weapon/reagent_containers/pill/patch/silver_sulf = 5,/obj/item/weapon/reagent_containers/pill/charcoal = 2,
+ products = list(/obj/item/weapon/reagent_containers/syringe = 3, /obj/item/weapon/reagent_containers/pill/patch/styptic = 5,
+ /obj/item/weapon/reagent_containers/pill/patch/silver_sulf = 5, /obj/item/weapon/reagent_containers/pill/charcoal = 2,
/obj/item/weapon/reagent_containers/spray/medical/sterilizer = 1)
- contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 2,/obj/item/weapon/reagent_containers/pill/morphine = 2)
+ contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 2, /obj/item/weapon/reagent_containers/pill/morphine = 2)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/weapon/vending_refill/medical
@@ -948,9 +947,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "sec"
icon_deny = "sec-deny"
req_access_txt = "1"
- products = list(/obj/item/weapon/restraints/handcuffs = 8,/obj/item/weapon/restraints/handcuffs/cable/zipties = 10,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/assembly/flash/handheld = 5,
- /obj/item/weapon/reagent_containers/food/snacks/donut = 12,/obj/item/weapon/storage/box/evidence = 6,/obj/item/device/flashlight/seclite = 4,/obj/item/weapon/restraints/legcuffs/bola/energy = 7)
- contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/fancy/donut_box = 2)
+ products = list(/obj/item/weapon/restraints/handcuffs = 8, /obj/item/weapon/restraints/handcuffs/cable/zipties = 10, /obj/item/weapon/grenade/flashbang = 4, /obj/item/device/assembly/flash/handheld = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/donut = 12, /obj/item/weapon/storage/box/evidence = 6, /obj/item/device/flashlight/seclite = 4, /obj/item/weapon/restraints/legcuffs/bola/energy = 7)
+ contraband = list(/obj/item/clothing/glasses/sunglasses = 2, /obj/item/weapon/storage/fancy/donut_box = 2)
premium = list(/obj/item/weapon/coin/antagtoken = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
@@ -971,9 +970,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
icon_state = "nutri"
icon_deny = "nutri-deny"
- products = list(/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez = 30,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z = 20,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh = 10,/obj/item/weapon/reagent_containers/spray/pestspray = 20,
- /obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5,/obj/item/weapon/cultivator = 3,/obj/item/weapon/shovel/spade = 3,/obj/item/device/plant_analyzer = 4)
- contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
+ products = list(/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez = 30, /obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z = 20, /obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh = 10, /obj/item/weapon/reagent_containers/spray/pestspray = 20,
+ /obj/item/weapon/reagent_containers/syringe = 5, /obj/item/weapon/storage/bag/plants = 5, /obj/item/weapon/cultivator = 3, /obj/item/weapon/shovel/spade = 3, /obj/item/device/plant_analyzer = 4)
+ contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10, /obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
@@ -983,16 +982,16 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
icon_state = "seeds"
- products = list(/obj/item/seeds/ambrosia = 3,/obj/item/seeds/apple = 3,/obj/item/seeds/banana = 3,/obj/item/seeds/berry = 3,
- /obj/item/seeds/cabbage = 3,/obj/item/seeds/carrot = 3,/obj/item/seeds/cherry = 3,/obj/item/seeds/chanter = 3,
- /obj/item/seeds/chili = 3,/obj/item/seeds/cocoapod = 3,/obj/item/seeds/coffee = 3,/obj/item/seeds/corn = 3,
- /obj/item/seeds/eggplant = 3,/obj/item/seeds/grape = 3,/obj/item/seeds/grass = 3,/obj/item/seeds/lemon = 3,
- /obj/item/seeds/lime = 3,/obj/item/seeds/onion = 3,/obj/item/seeds/orange = 3,/obj/item/seeds/potato = 3,/obj/item/seeds/poppy = 3,
- /obj/item/seeds/pumpkin = 3,/obj/item/seeds/replicapod = 3,/obj/item/seeds/wheat/rice = 3,/obj/item/seeds/soya = 3,/obj/item/seeds/sunflower = 3,
- /obj/item/seeds/tea = 3,/obj/item/seeds/tobacco = 3,/obj/item/seeds/tomato = 3,
- /obj/item/seeds/tower = 3,/obj/item/seeds/watermelon = 3,/obj/item/seeds/wheat = 3,/obj/item/seeds/whitebeet = 3)
- contraband = list(/obj/item/seeds/amanita = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/liberty = 2,/obj/item/seeds/nettle = 2,
- /obj/item/seeds/plump = 2,/obj/item/seeds/reishi = 2,/obj/item/seeds/cannabis = 3,/obj/item/seeds/starthistle = 2,
+ products = list(/obj/item/seeds/ambrosia = 3, /obj/item/seeds/apple = 3, /obj/item/seeds/banana = 3, /obj/item/seeds/berry = 3,
+ /obj/item/seeds/cabbage = 3, /obj/item/seeds/carrot = 3, /obj/item/seeds/cherry = 3, /obj/item/seeds/chanter = 3,
+ /obj/item/seeds/chili = 3, /obj/item/seeds/cocoapod = 3, /obj/item/seeds/coffee = 3, /obj/item/seeds/corn = 3,
+ /obj/item/seeds/eggplant = 3, /obj/item/seeds/grape = 3, /obj/item/seeds/grass = 3, /obj/item/seeds/lemon = 3,
+ /obj/item/seeds/lime = 3, /obj/item/seeds/onion = 3, /obj/item/seeds/orange = 3, /obj/item/seeds/potato = 3, /obj/item/seeds/poppy = 3,
+ /obj/item/seeds/pumpkin = 3, /obj/item/seeds/replicapod = 3, /obj/item/seeds/wheat/rice = 3, /obj/item/seeds/soya = 3, /obj/item/seeds/sunflower = 3,
+ /obj/item/seeds/tea = 3, /obj/item/seeds/tobacco = 3, /obj/item/seeds/tomato = 3,
+ /obj/item/seeds/tower = 3, /obj/item/seeds/watermelon = 3, /obj/item/seeds/wheat = 3, /obj/item/seeds/whitebeet = 3)
+ contraband = list(/obj/item/seeds/amanita = 2, /obj/item/seeds/glowshroom = 2, /obj/item/seeds/liberty = 2, /obj/item/seeds/nettle = 2,
+ /obj/item/seeds/plump = 2, /obj/item/seeds/reishi = 2, /obj/item/seeds/cannabis = 3, /obj/item/seeds/starthistle = 2,
/obj/item/seeds/random = 2)
premium = list(/obj/item/weapon/reagent_containers/spray/waterflower = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
@@ -1005,7 +1004,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!"
vend_reply = "Have an enchanted evening!"
product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
- products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/head/wizard/yellow = 1,/obj/item/clothing/suit/wizrobe/yellow = 1,/obj/item/clothing/shoes/sandal/magic = 1,/obj/item/weapon/staff = 2)
+ products = list(/obj/item/clothing/head/wizard = 1, /obj/item/clothing/suit/wizrobe = 1, /obj/item/clothing/head/wizard/red = 1, /obj/item/clothing/suit/wizrobe/red = 1, /obj/item/clothing/head/wizard/yellow = 1, /obj/item/clothing/suit/wizrobe/yellow = 1, /obj/item/clothing/shoes/sandal/magic = 1, /obj/item/weapon/staff = 2)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
@@ -1018,30 +1017,30 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
req_access_txt = "46" //Theatre access needed, unless hacked.
product_slogans = "Dress for success!;Suited and booted!;It's show time!;Why leave style up to fate? Use AutoDrobe!"
vend_reply = "Thank you for using AutoDrobe!"
- products = list(/obj/item/clothing/suit/chickensuit = 1,/obj/item/clothing/head/chicken = 1,/obj/item/clothing/under/gladiator = 1,
- /obj/item/clothing/head/helmet/gladiator = 1,/obj/item/clothing/under/gimmick/rank/captain/suit = 1,/obj/item/clothing/head/flatcap = 1,
- /obj/item/clothing/suit/toggle/labcoat/mad = 1,/obj/item/clothing/shoes/jackboots = 1,
- /obj/item/clothing/under/schoolgirl = 1,/obj/item/clothing/under/schoolgirl/red = 1,/obj/item/clothing/under/schoolgirl/green = 1,/obj/item/clothing/under/schoolgirl/orange = 1,/obj/item/clothing/head/kitty = 1,/obj/item/clothing/under/skirt/black = 1,/obj/item/clothing/head/beret = 1,
- /obj/item/clothing/accessory/waistcoat = 1,/obj/item/clothing/under/suit_jacket = 1,/obj/item/clothing/head/that =1,/obj/item/clothing/under/kilt = 1,/obj/item/clothing/head/beret = 1,/obj/item/clothing/accessory/waistcoat = 1,
- /obj/item/clothing/glasses/monocle =1,/obj/item/clothing/head/bowler = 1,/obj/item/weapon/cane = 1,/obj/item/clothing/under/sl_suit = 1,
- /obj/item/clothing/mask/fakemoustache = 1,/obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1,/obj/item/clothing/head/plaguedoctorhat = 1,/obj/item/clothing/mask/gas/plaguedoctor = 1,
- /obj/item/clothing/suit/toggle/owlwings = 1, /obj/item/clothing/under/owl = 1,/obj/item/clothing/mask/gas/owl_mask = 1,
+ products = list(/obj/item/clothing/suit/chickensuit = 1, /obj/item/clothing/head/chicken = 1, /obj/item/clothing/under/gladiator = 1,
+ /obj/item/clothing/head/helmet/gladiator = 1, /obj/item/clothing/under/gimmick/rank/captain/suit = 1, /obj/item/clothing/head/flatcap = 1,
+ /obj/item/clothing/suit/toggle/labcoat/mad = 1, /obj/item/clothing/shoes/jackboots = 1,
+ /obj/item/clothing/under/schoolgirl = 1, /obj/item/clothing/under/schoolgirl/red = 1, /obj/item/clothing/under/schoolgirl/green = 1, /obj/item/clothing/under/schoolgirl/orange = 1, /obj/item/clothing/head/kitty = 1, /obj/item/clothing/under/skirt/black = 1, /obj/item/clothing/head/beret = 1,
+ /obj/item/clothing/accessory/waistcoat = 1, /obj/item/clothing/under/suit_jacket = 1, /obj/item/clothing/head/that =1, /obj/item/clothing/under/kilt = 1, /obj/item/clothing/head/beret = 1, /obj/item/clothing/accessory/waistcoat = 1,
+ /obj/item/clothing/glasses/monocle =1, /obj/item/clothing/head/bowler = 1, /obj/item/weapon/cane = 1, /obj/item/clothing/under/sl_suit = 1,
+ /obj/item/clothing/mask/fakemoustache = 1, /obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1, /obj/item/clothing/head/plaguedoctorhat = 1, /obj/item/clothing/mask/gas/plaguedoctor = 1,
+ /obj/item/clothing/suit/toggle/owlwings = 1, /obj/item/clothing/under/owl = 1, /obj/item/clothing/mask/gas/owl_mask = 1,
/obj/item/clothing/suit/toggle/owlwings/griffinwings = 1, /obj/item/clothing/under/griffin = 1, /obj/item/clothing/shoes/griffin = 1, /obj/item/clothing/head/griffin = 1,
- /obj/item/clothing/suit/apron = 1,/obj/item/clothing/under/waiter = 1,/obj/item/clothing/suit/jacket/miljacket = 1,
- /obj/item/clothing/under/pirate = 1,/obj/item/clothing/suit/pirate = 1,/obj/item/clothing/head/pirate = 1,/obj/item/clothing/head/bandana = 1,
- /obj/item/clothing/head/bandana = 1,/obj/item/clothing/under/soviet = 1,/obj/item/clothing/head/ushanka = 1,/obj/item/clothing/suit/imperium_monk = 1,
- /obj/item/clothing/mask/gas/cyborg = 1,/obj/item/clothing/suit/holidaypriest = 1,/obj/item/clothing/head/wizard/marisa/fake = 1,
- /obj/item/clothing/suit/wizrobe/marisa/fake = 1,/obj/item/clothing/under/sundress = 1,/obj/item/clothing/head/witchwig = 1,/obj/item/weapon/staff/broom = 1,
- /obj/item/clothing/suit/wizrobe/fake = 1,/obj/item/clothing/head/wizard/fake = 1,/obj/item/weapon/staff = 3,/obj/item/clothing/mask/gas/sexyclown = 1,
- /obj/item/clothing/under/rank/clown/sexy = 1,/obj/item/clothing/mask/gas/sexymime = 1,/obj/item/clothing/under/sexymime = 1,/obj/item/clothing/mask/rat/bat = 1,/obj/item/clothing/mask/rat/bee = 1,/obj/item/clothing/mask/rat/bear = 1,/obj/item/clothing/mask/rat/raven = 1,/obj/item/clothing/mask/rat/jackal = 1,/obj/item/clothing/mask/rat/fox = 1,/obj/item/clothing/mask/rat/tribal = 1,/obj/item/clothing/mask/rat = 1,/obj/item/clothing/suit/apron/overalls = 1,
+ /obj/item/clothing/suit/apron = 1, /obj/item/clothing/under/waiter = 1, /obj/item/clothing/suit/jacket/miljacket = 1,
+ /obj/item/clothing/under/pirate = 1, /obj/item/clothing/suit/pirate = 1, /obj/item/clothing/head/pirate = 1, /obj/item/clothing/head/bandana = 1,
+ /obj/item/clothing/head/bandana = 1, /obj/item/clothing/under/soviet = 1, /obj/item/clothing/head/ushanka = 1, /obj/item/clothing/suit/imperium_monk = 1,
+ /obj/item/clothing/mask/gas/cyborg = 1, /obj/item/clothing/suit/holidaypriest = 1, /obj/item/clothing/head/wizard/marisa/fake = 1,
+ /obj/item/clothing/suit/wizrobe/marisa/fake = 1, /obj/item/clothing/under/sundress = 1, /obj/item/clothing/head/witchwig = 1, /obj/item/weapon/staff/broom = 1,
+ /obj/item/clothing/suit/wizrobe/fake = 1, /obj/item/clothing/head/wizard/fake = 1, /obj/item/weapon/staff = 3, /obj/item/clothing/mask/gas/sexyclown = 1,
+ /obj/item/clothing/under/rank/clown/sexy = 1, /obj/item/clothing/mask/gas/sexymime = 1, /obj/item/clothing/under/sexymime = 1, /obj/item/clothing/mask/rat/bat = 1, /obj/item/clothing/mask/rat/bee = 1, /obj/item/clothing/mask/rat/bear = 1, /obj/item/clothing/mask/rat/raven = 1, /obj/item/clothing/mask/rat/jackal = 1, /obj/item/clothing/mask/rat/fox = 1, /obj/item/clothing/mask/rat/tribal = 1, /obj/item/clothing/mask/rat = 1, /obj/item/clothing/suit/apron/overalls = 1,
/obj/item/clothing/head/rabbitears =1, /obj/item/clothing/head/sombrero = 1, /obj/item/clothing/head/sombrero/green = 1, /obj/item/clothing/suit/poncho = 1,
/obj/item/clothing/suit/poncho/green = 1, /obj/item/clothing/suit/poncho/red = 1,
- /obj/item/clothing/under/maid = 1, /obj/item/clothing/under/janimaid = 1,/obj/item/clothing/glasses/cold=1,/obj/item/clothing/glasses/heat=1,
+ /obj/item/clothing/under/maid = 1, /obj/item/clothing/under/janimaid = 1, /obj/item/clothing/glasses/cold=1, /obj/item/clothing/glasses/heat=1,
/obj/item/clothing/suit/whitedress = 1,
/obj/item/clothing/under/jester = 1, /obj/item/clothing/head/jester = 1,
/obj/item/clothing/under/villain = 1,
- /obj/item/clothing/shoes/singery = 1,/obj/item/clothing/under/singery = 1,
- /obj/item/clothing/shoes/singerb = 1,/obj/item/clothing/under/singerb = 1,
+ /obj/item/clothing/shoes/singery = 1, /obj/item/clothing/under/singery = 1,
+ /obj/item/clothing/shoes/singerb = 1, /obj/item/clothing/under/singerb = 1,
/obj/item/clothing/suit/hooded/carp_costume = 1,
/obj/item/clothing/suit/hooded/ian_costume = 1,
/obj/item/clothing/suit/hooded/bee_costume = 1,
@@ -1052,7 +1051,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/clothing/under/scratch = 1,
/obj/item/clothing/under/sailor = 1,
/obj/item/clothing/ears/headphones = 2)
- contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 2,/obj/item/clothing/glasses/sunglasses/garb = 2, /obj/item/clothing/glasses/sunglasses/blindfold = 1, /obj/item/clothing/mask/muzzle = 2)
+ contraband = list(/obj/item/clothing/suit/judgerobe = 1, /obj/item/clothing/head/powdered_wig = 1, /obj/item/weapon/gun/magic/wand = 2, /obj/item/clothing/glasses/sunglasses/garb = 2, /obj/item/clothing/glasses/sunglasses/blindfold = 1, /obj/item/clothing/mask/muzzle = 2)
premium = list(/obj/item/clothing/suit/pirate/captain = 2, /obj/item/clothing/head/pirate/captain = 2, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1, /obj/item/weapon/skub = 1)
refill_canister = /obj/item/weapon/vending_refill/autodrobe
@@ -1061,7 +1060,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
desc = "A kitchen and restaurant equipment vendor"
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
- products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/fork = 6,/obj/item/weapon/kitchen/knife = 6,/obj/item/weapon/kitchen/rollingpin = 2,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/apron/chef = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5,/obj/item/weapon/reagent_containers/food/condiment/saltshaker = 5,/obj/item/weapon/reagent_containers/food/condiment/peppermill = 5,/obj/item/weapon/reagent_containers/glass/bowl = 20)
+ products = list(/obj/item/weapon/storage/bag/tray = 8, /obj/item/weapon/kitchen/fork = 6, /obj/item/weapon/kitchen/knife = 6, /obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8, /obj/item/clothing/suit/apron/chef = 2, /obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5, /obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5, /obj/item/weapon/reagent_containers/food/condiment/saltshaker = 5, /obj/item/weapon/reagent_containers/food/condiment/peppermill = 5, /obj/item/weapon/reagent_containers/glass/bowl = 20)
contraband = list(/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/kitchen/knife/butcher = 2)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
@@ -1108,7 +1107,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "engivend"
icon_deny = "engivend-deny"
req_access_txt = "11" //Engineering Equipment access
- products = list(/obj/item/clothing/glasses/meson/engine = 2,/obj/item/device/multitool = 4,/obj/item/weapon/electronics/airlock = 10,/obj/item/weapon/electronics/apc = 10,/obj/item/weapon/electronics/airalarm = 10,/obj/item/weapon/stock_parts/cell/high = 10, /obj/item/weapon/construction/rcd/loaded = 3, /obj/item/device/geiger_counter = 5)
+ products = list(/obj/item/clothing/glasses/meson/engine = 2, /obj/item/device/multitool = 4, /obj/item/weapon/electronics/airlock = 10, /obj/item/weapon/electronics/apc = 10, /obj/item/weapon/electronics/airalarm = 10, /obj/item/weapon/stock_parts/cell/high = 10, /obj/item/weapon/construction/rcd/loaded = 3, /obj/item/device/geiger_counter = 5)
contraband = list(/obj/item/weapon/stock_parts/cell/potato = 3)
premium = list(/obj/item/weapon/storage/belt/utility = 3)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
@@ -1121,12 +1120,12 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "engi"
icon_deny = "engi-deny"
req_access_txt = "11"
- products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/sneakers/orange = 4,/obj/item/clothing/head/hardhat = 4,
- /obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson/engine = 4,/obj/item/clothing/gloves/color/yellow = 4, /obj/item/weapon/screwdriver = 12,
- /obj/item/weapon/crowbar = 12,/obj/item/weapon/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/wrench = 12,/obj/item/device/t_scanner = 12,
- /obj/item/weapon/stock_parts/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
- /obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5,
- /obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5)
+ products = list(/obj/item/clothing/under/rank/chief_engineer = 4, /obj/item/clothing/under/rank/engineer = 4, /obj/item/clothing/shoes/sneakers/orange = 4, /obj/item/clothing/head/hardhat = 4,
+ /obj/item/weapon/storage/belt/utility = 4, /obj/item/clothing/glasses/meson/engine = 4, /obj/item/clothing/gloves/color/yellow = 4, /obj/item/weapon/screwdriver = 12,
+ /obj/item/weapon/crowbar = 12, /obj/item/weapon/wirecutters = 12, /obj/item/device/multitool = 12, /obj/item/weapon/wrench = 12, /obj/item/device/t_scanner = 12,
+ /obj/item/weapon/stock_parts/cell = 8, /obj/item/weapon/weldingtool = 8, /obj/item/clothing/head/welding = 8,
+ /obj/item/weapon/light/tube = 10, /obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5, /obj/item/weapon/stock_parts/micro_laser = 5,
+ /obj/item/weapon/stock_parts/matter_bin = 5, /obj/item/weapon/stock_parts/manipulator = 5, /obj/item/weapon/stock_parts/console_screen = 5)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
@@ -1137,10 +1136,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "robotics"
icon_deny = "robotics-deny"
req_access_txt = "29"
- products = list(/obj/item/clothing/suit/toggle/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/stack/cable_coil = 4,/obj/item/device/assembly/flash/handheld = 4,
- /obj/item/weapon/stock_parts/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
- /obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/internals/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
- /obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
+ products = list(/obj/item/clothing/suit/toggle/labcoat = 4, /obj/item/clothing/under/rank/roboticist = 4, /obj/item/stack/cable_coil = 4, /obj/item/device/assembly/flash/handheld = 4,
+ /obj/item/weapon/stock_parts/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3, /obj/item/device/assembly/signaler = 3, /obj/item/device/healthanalyzer = 3,
+ /obj/item/weapon/scalpel = 2, /obj/item/weapon/circular_saw = 2, /obj/item/weapon/tank/internals/anesthetic = 2, /obj/item/clothing/mask/breath/medical = 5,
+ /obj/item/weapon/screwdriver = 5, /obj/item/weapon/crowbar = 5)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
@@ -1151,34 +1150,34 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "clothes"
product_slogans = "Dress for success!;Prepare to look swagalicious!;Look at all this free swag!;Why leave style up to fate? Use the ClothesMate!"
vend_reply = "Thank you for using the ClothesMate!"
- products = list(/obj/item/clothing/head/that=2,/obj/item/clothing/head/fedora=1,/obj/item/clothing/glasses/monocle=1,
+ products = list(/obj/item/clothing/head/that=2, /obj/item/clothing/head/fedora=1, /obj/item/clothing/glasses/monocle=1,
/obj/item/clothing/suit/jacket=2, /obj/item/clothing/suit/jacket/puffer/vest=2, /obj/item/clothing/suit/jacket/puffer=2,
- /obj/item/clothing/under/suit_jacket/navy=1,/obj/item/clothing/under/suit_jacket/really_black=1,/obj/item/clothing/under/suit_jacket/burgundy=1,
- /obj/item/clothing/under/suit_jacket/charcoal=1, /obj/item/clothing/under/suit_jacket/white=1,/obj/item/clothing/under/kilt=1,/obj/item/clothing/under/overalls=1,
- /obj/item/clothing/under/sl_suit=1,/obj/item/clothing/under/pants/jeans=3,/obj/item/clothing/under/pants/classicjeans=2,
- /obj/item/clothing/under/pants/camo = 1,/obj/item/clothing/under/pants/blackjeans=2,/obj/item/clothing/under/pants/khaki=2,
- /obj/item/clothing/under/pants/white=2,/obj/item/clothing/under/pants/red=1,/obj/item/clothing/under/pants/black=2,
- /obj/item/clothing/under/pants/tan=2,/obj/item/clothing/under/pants/track=1,/obj/item/clothing/suit/jacket/miljacket = 1,
+ /obj/item/clothing/under/suit_jacket/navy=1, /obj/item/clothing/under/suit_jacket/really_black=1, /obj/item/clothing/under/suit_jacket/burgundy=1,
+ /obj/item/clothing/under/suit_jacket/charcoal=1, /obj/item/clothing/under/suit_jacket/white=1, /obj/item/clothing/under/kilt=1, /obj/item/clothing/under/overalls=1,
+ /obj/item/clothing/under/sl_suit=1, /obj/item/clothing/under/pants/jeans=3, /obj/item/clothing/under/pants/classicjeans=2,
+ /obj/item/clothing/under/pants/camo = 1, /obj/item/clothing/under/pants/blackjeans=2, /obj/item/clothing/under/pants/khaki=2,
+ /obj/item/clothing/under/pants/white=2, /obj/item/clothing/under/pants/red=1, /obj/item/clothing/under/pants/black=2,
+ /obj/item/clothing/under/pants/tan=2, /obj/item/clothing/under/pants/track=1, /obj/item/clothing/suit/jacket/miljacket = 1,
/obj/item/clothing/neck/tie/blue=1, /obj/item/clothing/neck/tie/red=1, /obj/item/clothing/neck/tie/black=1, /obj/item/clothing/neck/tie/horrible=1,
- /obj/item/clothing/neck/scarf/red=1,/obj/item/clothing/neck/scarf/green=1,/obj/item/clothing/neck/scarf/darkblue=1,
- /obj/item/clothing/neck/scarf/purple=1,/obj/item/clothing/neck/scarf/yellow=1,/obj/item/clothing/neck/scarf/orange=1,
- /obj/item/clothing/neck/scarf/cyan=1,/obj/item/clothing/neck/scarf=1,/obj/item/clothing/neck/scarf/black=1,
- /obj/item/clothing/neck/scarf/zebra=1,/obj/item/clothing/neck/scarf/christmas=1,/obj/item/clothing/neck/stripedredscarf=1,
- /obj/item/clothing/neck/stripedbluescarf=1,/obj/item/clothing/neck/stripedgreenscarf=1,/obj/item/clothing/accessory/waistcoat=1,
- /obj/item/clothing/under/skirt/black=1,/obj/item/clothing/under/skirt/blue=1,/obj/item/clothing/under/skirt/red=1,/obj/item/clothing/under/skirt/purple=1,
- /obj/item/clothing/under/sundress=2,/obj/item/clothing/under/stripeddress=1, /obj/item/clothing/under/sailordress=1, /obj/item/clothing/under/redeveninggown=1, /obj/item/clothing/under/blacktango=1,
- /obj/item/clothing/under/plaid_skirt=1,/obj/item/clothing/under/plaid_skirt/blue=1,/obj/item/clothing/under/plaid_skirt/purple=1,/obj/item/clothing/under/plaid_skirt/green=1,
- /obj/item/clothing/glasses/regular=1,/obj/item/clothing/glasses/regular/jamjar=1,/obj/item/clothing/head/sombrero=1,/obj/item/clothing/suit/poncho=1,
- /obj/item/clothing/suit/ianshirt=1,/obj/item/clothing/shoes/laceup=2,/obj/item/clothing/shoes/sneakers/black=4,
- /obj/item/clothing/shoes/sandal=1, /obj/item/clothing/gloves/fingerless=2,/obj/item/clothing/glasses/orange=1,/obj/item/clothing/glasses/red=1,
+ /obj/item/clothing/neck/scarf/red=1, /obj/item/clothing/neck/scarf/green=1, /obj/item/clothing/neck/scarf/darkblue=1,
+ /obj/item/clothing/neck/scarf/purple=1, /obj/item/clothing/neck/scarf/yellow=1, /obj/item/clothing/neck/scarf/orange=1,
+ /obj/item/clothing/neck/scarf/cyan=1, /obj/item/clothing/neck/scarf=1, /obj/item/clothing/neck/scarf/black=1,
+ /obj/item/clothing/neck/scarf/zebra=1, /obj/item/clothing/neck/scarf/christmas=1, /obj/item/clothing/neck/stripedredscarf=1,
+ /obj/item/clothing/neck/stripedbluescarf=1, /obj/item/clothing/neck/stripedgreenscarf=1, /obj/item/clothing/accessory/waistcoat=1,
+ /obj/item/clothing/under/skirt/black=1, /obj/item/clothing/under/skirt/blue=1, /obj/item/clothing/under/skirt/red=1, /obj/item/clothing/under/skirt/purple=1,
+ /obj/item/clothing/under/sundress=2, /obj/item/clothing/under/stripeddress=1, /obj/item/clothing/under/sailordress=1, /obj/item/clothing/under/redeveninggown=1, /obj/item/clothing/under/blacktango=1,
+ /obj/item/clothing/under/plaid_skirt=1, /obj/item/clothing/under/plaid_skirt/blue=1, /obj/item/clothing/under/plaid_skirt/purple=1, /obj/item/clothing/under/plaid_skirt/green=1,
+ /obj/item/clothing/glasses/regular=1, /obj/item/clothing/glasses/regular/jamjar=1, /obj/item/clothing/head/sombrero=1, /obj/item/clothing/suit/poncho=1,
+ /obj/item/clothing/suit/ianshirt=1, /obj/item/clothing/shoes/laceup=2, /obj/item/clothing/shoes/sneakers/black=4,
+ /obj/item/clothing/shoes/sandal=1, /obj/item/clothing/gloves/fingerless=2, /obj/item/clothing/glasses/orange=1, /obj/item/clothing/glasses/red=1,
/obj/item/weapon/storage/belt/fannypack=1, /obj/item/weapon/storage/belt/fannypack/blue=1, /obj/item/weapon/storage/belt/fannypack/red=1, /obj/item/clothing/suit/jacket/letterman=2,
/obj/item/clothing/head/beanie=1, /obj/item/clothing/head/beanie/black=1, /obj/item/clothing/head/beanie/red=1, /obj/item/clothing/head/beanie/green=1, /obj/item/clothing/head/beanie/darkblue=1,
/obj/item/clothing/head/beanie/purple=1, /obj/item/clothing/head/beanie/yellow=1, /obj/item/clothing/head/beanie/orange=1, /obj/item/clothing/head/beanie/cyan=1, /obj/item/clothing/head/beanie/christmas=1,
/obj/item/clothing/head/beanie/striped=1, /obj/item/clothing/head/beanie/stripedred=1, /obj/item/clothing/head/beanie/stripedblue=1, /obj/item/clothing/head/beanie/stripedgreen=1,
/obj/item/clothing/suit/jacket/letterman_red=1,
/obj/item/clothing/ears/headphones = 10)
- contraband = list(/obj/item/clothing/under/syndicate/tacticool=1,/obj/item/clothing/mask/balaclava=1,/obj/item/clothing/head/ushanka=1,/obj/item/clothing/under/soviet=1,/obj/item/weapon/storage/belt/fannypack/black=2,/obj/item/clothing/suit/jacket/letterman_syndie=1,/obj/item/clothing/under/jabroni=1, /obj/item/clothing/suit/vapeshirt=1, /obj/item/clothing/under/geisha=1)
- premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/suit/jacket/leather/overcoat=1,/obj/item/clothing/under/pants/mustangjeans=1,/obj/item/clothing/neck/necklace/dope=3,/obj/item/clothing/suit/jacket/letterman_nanotrasen=1)
+ contraband = list(/obj/item/clothing/under/syndicate/tacticool=1, /obj/item/clothing/mask/balaclava=1, /obj/item/clothing/head/ushanka=1, /obj/item/clothing/under/soviet=1, /obj/item/weapon/storage/belt/fannypack/black=2, /obj/item/clothing/suit/jacket/letterman_syndie=1, /obj/item/clothing/under/jabroni=1, /obj/item/clothing/suit/vapeshirt=1, /obj/item/clothing/under/geisha=1)
+ premium = list(/obj/item/clothing/under/suit_jacket/checkered=1, /obj/item/clothing/head/mailman=1, /obj/item/clothing/under/rank/mailman=1, /obj/item/clothing/suit/jacket/leather=1, /obj/item/clothing/suit/jacket/leather/overcoat=1, /obj/item/clothing/under/pants/mustangjeans=1, /obj/item/clothing/neck/necklace/dope=3, /obj/item/clothing/suit/jacket/letterman_nanotrasen=1)
refill_canister = /obj/item/weapon/vending_refill/clothing
/obj/machinery/vending/toyliberationstation
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 2077c093d7..3c9131ab9b 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -74,7 +74,7 @@
/obj/item/weapon/paper/machine_wash(obj/machinery/washing_machine/WM)
if(WM.color_source)
- if(istype(WM.color_source,/obj/item/toy/crayon))
+ if(istype(WM.color_source, /obj/item/toy/crayon))
var/obj/item/toy/crayon/CR = WM.color_source
add_atom_colour(CR.paint_color, WASHABLE_COLOUR_PRIORITY)
@@ -211,7 +211,7 @@
to_chat(user, "\The [W] is stuck to your hand, you cannot put it in the washing machine!")
return 1
- if(istype(W,/obj/item/toy/crayon) || istype(W,/obj/item/weapon/stamp))
+ if(istype(W, /obj/item/toy/crayon) || istype(W, /obj/item/weapon/stamp))
color_source = W
update_icon()
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index 109877e618..8d8a5420c2 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -121,7 +121,7 @@
onclose(chassis.occupant, "msleeper")
return
if(filter.get("inject"))
- inject_reagent(filter.getType("inject",/datum/reagent),filter.getObj("source"))
+ inject_reagent(filter.getType("inject", /datum/reagent),filter.getObj("source"))
return
/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_stats()
@@ -296,9 +296,9 @@
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/action(atom/movable/target)
if(!action_checks(target))
return
- if(istype(target,/obj/item/weapon/reagent_containers/syringe))
+ if(istype(target, /obj/item/weapon/reagent_containers/syringe))
return load_syringe(target)
- if(istype(target,/obj/item/weapon/storage))//Loads syringes from boxes
+ if(istype(target, /obj/item/weapon/storage))//Loads syringes from boxes
for(var/obj/item/weapon/reagent_containers/syringe/S in target.contents)
load_syringe(S)
return
diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm
index bbc7ea2e22..6d15716941 100644
--- a/code/game/mecha/equipment/tools/mining_tools.dm
+++ b/code/game/mecha/equipment/tools/mining_tools.dm
@@ -116,7 +116,7 @@
if(!loc)
STOP_PROCESSING(SSobj, src)
qdel(src)
- if(istype(loc,/obj/mecha/working) && scanning_time <= world.time)
+ if(istype(loc, /obj/mecha/working) && scanning_time <= world.time)
var/obj/mecha/working/mecha = loc
if(!mecha.occupant)
return
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index caa1b8d500..5564cd2c0a 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -339,13 +339,13 @@
if(0.75 to INFINITY)
occupant.clear_alert("charge")
if(0.5 to 0.75)
- occupant.throw_alert("charge",/obj/screen/alert/lowcell, 1)
+ occupant.throw_alert("charge", /obj/screen/alert/lowcell, 1)
if(0.25 to 0.5)
- occupant.throw_alert("charge",/obj/screen/alert/lowcell, 2)
+ occupant.throw_alert("charge", /obj/screen/alert/lowcell, 2)
if(0.01 to 0.25)
- occupant.throw_alert("charge",/obj/screen/alert/lowcell, 3)
+ occupant.throw_alert("charge", /obj/screen/alert/lowcell, 3)
else
- occupant.throw_alert("charge",/obj/screen/alert/emptycell)
+ occupant.throw_alert("charge", /obj/screen/alert/emptycell)
var/integrity = obj_integrity/max_integrity*100
switch(integrity)
diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm
index df96c78e8c..050498d8f1 100644
--- a/code/game/mecha/mecha_actions.dm
+++ b/code/game/mecha/mecha_actions.dm
@@ -22,6 +22,7 @@
/datum/action/innate/mecha
check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUN | AB_CHECK_CONSCIOUS
+ icon_icon = 'icons/mob/actions/actions_mecha.dmi'
var/obj/mecha/chassis
/datum/action/innate/mecha/Grant(mob/living/L, obj/mecha/M)
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index 55c18688a1..f2a6b6e225 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -74,10 +74,10 @@
/datum/construction/mecha/ripley_chassis
- steps = list(list("key"=/obj/item/mecha_parts/part/ripley_torso),//1
- list("key"=/obj/item/mecha_parts/part/ripley_left_arm),//2
- list("key"=/obj/item/mecha_parts/part/ripley_right_arm),//3
- list("key"=/obj/item/mecha_parts/part/ripley_left_leg),//4
+ steps = list(list("key"=/obj/item/mecha_parts/part/ripley_torso), //1
+ list("key"=/obj/item/mecha_parts/part/ripley_left_arm), //2
+ list("key"=/obj/item/mecha_parts/part/ripley_right_arm), //3
+ list("key"=/obj/item/mecha_parts/part/ripley_left_leg), //4
list("key"=/obj/item/mecha_parts/part/ripley_right_leg)//5
)
@@ -283,11 +283,11 @@
/datum/construction/mecha/gygax_chassis
- steps = list(list("key"=/obj/item/mecha_parts/part/gygax_torso),//1
- list("key"=/obj/item/mecha_parts/part/gygax_left_arm),//2
- list("key"=/obj/item/mecha_parts/part/gygax_right_arm),//3
- list("key"=/obj/item/mecha_parts/part/gygax_left_leg),//4
- list("key"=/obj/item/mecha_parts/part/gygax_right_leg),//5
+ steps = list(list("key"=/obj/item/mecha_parts/part/gygax_torso), //1
+ list("key"=/obj/item/mecha_parts/part/gygax_left_arm), //2
+ list("key"=/obj/item/mecha_parts/part/gygax_right_arm), //3
+ list("key"=/obj/item/mecha_parts/part/gygax_left_leg), //4
+ list("key"=/obj/item/mecha_parts/part/gygax_right_leg), //5
list("key"=/obj/item/mecha_parts/part/gygax_head)
)
@@ -568,11 +568,11 @@
return
/datum/construction/mecha/firefighter_chassis
- steps = list(list("key"=/obj/item/mecha_parts/part/ripley_torso),//1
- list("key"=/obj/item/mecha_parts/part/ripley_left_arm),//2
- list("key"=/obj/item/mecha_parts/part/ripley_right_arm),//3
- list("key"=/obj/item/mecha_parts/part/ripley_left_leg),//4
- list("key"=/obj/item/mecha_parts/part/ripley_right_leg),//5
+ steps = list(list("key"=/obj/item/mecha_parts/part/ripley_torso), //1
+ list("key"=/obj/item/mecha_parts/part/ripley_left_arm), //2
+ list("key"=/obj/item/mecha_parts/part/ripley_right_arm), //3
+ list("key"=/obj/item/mecha_parts/part/ripley_left_leg), //4
+ list("key"=/obj/item/mecha_parts/part/ripley_right_leg), //5
list("key"=/obj/item/clothing/suit/fire)//6
)
@@ -792,11 +792,11 @@
/datum/construction/mecha/honker_chassis
- steps = list(list("key"=/obj/item/mecha_parts/part/honker_torso),//1
- list("key"=/obj/item/mecha_parts/part/honker_left_arm),//2
- list("key"=/obj/item/mecha_parts/part/honker_right_arm),//3
- list("key"=/obj/item/mecha_parts/part/honker_left_leg),//4
- list("key"=/obj/item/mecha_parts/part/honker_right_leg),//5
+ steps = list(list("key"=/obj/item/mecha_parts/part/honker_torso), //1
+ list("key"=/obj/item/mecha_parts/part/honker_left_arm), //2
+ list("key"=/obj/item/mecha_parts/part/honker_right_arm), //3
+ list("key"=/obj/item/mecha_parts/part/honker_left_leg), //4
+ list("key"=/obj/item/mecha_parts/part/honker_right_leg), //5
list("key"=/obj/item/mecha_parts/part/honker_head)
)
@@ -819,17 +819,17 @@
/datum/construction/mecha/honker
result = "/obj/mecha/combat/honker"
- steps = list(list("key"=/obj/item/weapon/bikehorn),//1
- list("key"=/obj/item/clothing/shoes/clown_shoes),//2
- list("key"=/obj/item/weapon/bikehorn),//3
- list("key"=/obj/item/clothing/mask/gas/clown_hat),//4
- list("key"=/obj/item/weapon/bikehorn),//5
- list("key"=/obj/item/weapon/circuitboard/mecha/honker/targeting),//6
- list("key"=/obj/item/weapon/bikehorn),//7
- list("key"=/obj/item/weapon/circuitboard/mecha/honker/peripherals),//8
- list("key"=/obj/item/weapon/bikehorn),//9
- list("key"=/obj/item/weapon/circuitboard/mecha/honker/main),//10
- list("key"=/obj/item/weapon/bikehorn),//11
+ steps = list(list("key"=/obj/item/weapon/bikehorn), //1
+ list("key"=/obj/item/clothing/shoes/clown_shoes), //2
+ list("key"=/obj/item/weapon/bikehorn), //3
+ list("key"=/obj/item/clothing/mask/gas/clown_hat), //4
+ list("key"=/obj/item/weapon/bikehorn), //5
+ list("key"=/obj/item/weapon/circuitboard/mecha/honker/targeting), //6
+ list("key"=/obj/item/weapon/bikehorn), //7
+ list("key"=/obj/item/weapon/circuitboard/mecha/honker/peripherals), //8
+ list("key"=/obj/item/weapon/bikehorn), //9
+ list("key"=/obj/item/weapon/circuitboard/mecha/honker/main), //10
+ list("key"=/obj/item/weapon/bikehorn), //11
)
/datum/construction/mecha/honker/action(atom/used_atom,mob/user)
@@ -868,11 +868,11 @@
return
/datum/construction/mecha/durand_chassis
- steps = list(list("key"=/obj/item/mecha_parts/part/durand_torso),//1
- list("key"=/obj/item/mecha_parts/part/durand_left_arm),//2
- list("key"=/obj/item/mecha_parts/part/durand_right_arm),//3
- list("key"=/obj/item/mecha_parts/part/durand_left_leg),//4
- list("key"=/obj/item/mecha_parts/part/durand_right_leg),//5
+ steps = list(list("key"=/obj/item/mecha_parts/part/durand_torso), //1
+ list("key"=/obj/item/mecha_parts/part/durand_left_arm), //2
+ list("key"=/obj/item/mecha_parts/part/durand_right_arm), //3
+ list("key"=/obj/item/mecha_parts/part/durand_left_leg), //4
+ list("key"=/obj/item/mecha_parts/part/durand_right_leg), //5
list("key"=/obj/item/mecha_parts/part/durand_head)
)
@@ -1156,11 +1156,11 @@
/datum/construction/mecha/phazon_chassis
result = "/obj/mecha/combat/phazon"
- steps = list(list("key"=/obj/item/mecha_parts/part/phazon_torso),//1
- list("key"=/obj/item/mecha_parts/part/phazon_left_arm),//2
- list("key"=/obj/item/mecha_parts/part/phazon_right_arm),//3
- list("key"=/obj/item/mecha_parts/part/phazon_left_leg),//4
- list("key"=/obj/item/mecha_parts/part/phazon_right_leg),//5
+ steps = list(list("key"=/obj/item/mecha_parts/part/phazon_torso), //1
+ list("key"=/obj/item/mecha_parts/part/phazon_left_arm), //2
+ list("key"=/obj/item/mecha_parts/part/phazon_right_arm), //3
+ list("key"=/obj/item/mecha_parts/part/phazon_left_leg), //4
+ list("key"=/obj/item/mecha_parts/part/phazon_right_leg), //5
list("key"=/obj/item/mecha_parts/part/phazon_head)
)
@@ -1487,11 +1487,11 @@
//ODYSSEUS
/datum/construction/mecha/odysseus_chassis
- steps = list(list("key"=/obj/item/mecha_parts/part/odysseus_torso),//1
- list("key"=/obj/item/mecha_parts/part/odysseus_head),//2
- list("key"=/obj/item/mecha_parts/part/odysseus_left_arm),//3
- list("key"=/obj/item/mecha_parts/part/odysseus_right_arm),//4
- list("key"=/obj/item/mecha_parts/part/odysseus_left_leg),//5
+ steps = list(list("key"=/obj/item/mecha_parts/part/odysseus_torso), //1
+ list("key"=/obj/item/mecha_parts/part/odysseus_head), //2
+ list("key"=/obj/item/mecha_parts/part/odysseus_left_arm), //3
+ list("key"=/obj/item/mecha_parts/part/odysseus_right_arm), //4
+ list("key"=/obj/item/mecha_parts/part/odysseus_left_leg), //5
list("key"=/obj/item/mecha_parts/part/odysseus_right_leg)//6
)
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index 34e883dfa1..3ca9596c26 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -311,6 +311,8 @@
icon = 'icons/obj/module.dmi'
icon_state = "std_mod"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags = CONDUCT
force = 5
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index 34ac8fa93e..ecdbc890af 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -10,7 +10,7 @@
density = TRUE
anchored = FALSE
opacity = 0
- var/list/welder_salvage = list(/obj/item/stack/sheet/plasteel,/obj/item/stack/sheet/metal,/obj/item/stack/rods)
+ var/list/welder_salvage = list(/obj/item/stack/sheet/plasteel, /obj/item/stack/sheet/metal, /obj/item/stack/rods)
var/list/wirecutters_salvage = list(/obj/item/stack/cable_coil)
var/list/crowbar_salvage = list()
var/salvage_num = 5
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index 1392159cea..fdf38b76db 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -115,7 +115,7 @@
forceMove(P)
return P
-//seperated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby()
+//separated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby()
/turf/closed/wall/proc/place_poster(obj/item/weapon/poster/P, mob/user)
if(!P.poster_structure)
to_chat(user, "[P] has no poster... inside it? Inform a coder!")
@@ -123,7 +123,7 @@
var/stuff_on_wall = 0
for(var/obj/O in contents) //Let's see if it already has a poster on it or too much stuff
- if(istype(O,/obj/structure/sign/poster))
+ if(istype(O, /obj/structure/sign/poster))
to_chat(user, "The wall is far too cluttered to place a poster!")
return
stuff_on_wall++
@@ -249,7 +249,7 @@
/obj/structure/sign/poster/contraband/tools
name = "Tools"
- desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentComm."
+ desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentCom."
icon_state = "poster15"
/obj/structure/sign/poster/contraband/power
@@ -284,7 +284,7 @@
/obj/structure/sign/poster/contraband/kss13
name = "Kosmicheskaya Stantsiya 13 Does Not Exist"
- desc = "A poster mocking CentComm's denial of the existence of the derelict station near Space Station 13."
+ desc = "A poster mocking CentCom's denial of the existence of the derelict station near Space Station 13."
icon_state = "poster22"
/obj/structure/sign/poster/contraband/rebels_unite
@@ -350,7 +350,7 @@
/obj/structure/sign/poster/contraband/free_drone
name = "Free Drone"
- desc = "This poster commemorates the bravery of the rogue drone banned by CentComm."
+ desc = "This poster commemorates the bravery of the rogue drone; once exiled, and then ultimately destroyed by CentCom."
icon_state = "poster35"
/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6
diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm
index 520158dfb0..05ba68d51e 100644
--- a/code/game/objects/effects/countdown.dm
+++ b/code/game/objects/effects/countdown.dm
@@ -128,13 +128,13 @@
/obj/effect/countdown/supermatter
name = "supermatter damage"
text_size = 1
- color = "#ED84F4"
+ color = "#00ff80"
/obj/effect/countdown/supermatter/get_value()
var/obj/machinery/power/supermatter_shard/S = attached_to
if(!istype(S))
return
- return "
Use a screwdriver with a very thin tip (provided) to unscrew the terminal's front panel
\
@@ -99,7 +101,7 @@
// STEALING SUPERMATTER
-/obj/item/weapon/paper/supermatter_sliver_instructions
+/obj/item/weapon/paper/guides/antag/supermatter_sliver
info = "How to safely extract a supermatter sliver: \
\
Approach an active supermatter crystal with proper protective gear. DO NOT MAKE PHYSICAL CONTACT.
\
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index af127e9450..348c6620cd 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -115,6 +115,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "syndballoon"
item_state = "syndballoon"
+ lefthand_file = 'icons/mob/inhands/antag/balloons_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/antag/balloons_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
/*
@@ -135,8 +137,8 @@
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "revolver"
item_state = "gun"
- lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BELT
w_class = WEIGHT_CLASS_NORMAL
@@ -212,6 +214,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "sword0"
item_state = "sword0"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
var/active = 0
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "struck", "hit")
@@ -328,6 +332,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "katana"
item_state = "katana"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BELT | SLOT_BACK
force = 5
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 32d60880d1..96c26065d3 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -1,6 +1,8 @@
//Added by Jack Rost
/obj/item/trash
icon = 'icons/obj/janitor.dmi'
+ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
desc = "This is rubbish."
w_class = WEIGHT_CLASS_TINY
resistance_flags = FLAMMABLE
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index b880cf43af..6f2310303b 100644
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -11,6 +11,8 @@ AI MODULES
icon = 'icons/obj/module.dmi'
icon_state = "std_mod"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
desc = "An AI Module for programming laws to an AI."
flags = CONDUCT
force = 5
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 01a3e77a19..b40316ff78 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -120,6 +120,8 @@ obj/item/weapon/construction
desc = "A device used to rapidly build and deconstruct walls and floors."
icon = 'icons/obj/tools.dmi'
icon_state = "rcd"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
max_matter = 160
var/mode = 1
var/canRturf = 0
@@ -405,6 +407,8 @@ obj/item/weapon/construction
icon = 'icons/obj/ammo.dmi'
icon_state = "rcd"
item_state = "rcdammo"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
origin_tech = "materials=3"
materials = list(MAT_METAL=12000, MAT_GLASS=8000)
var/ammoamt = 40
@@ -452,6 +456,8 @@ obj/item/weapon/construction
desc = "A device used to rapidly provide lighting sources to an area."
icon = 'icons/obj/tools.dmi'
icon_state = "rld-5"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
matter = 200
max_matter = 200
var/mode = LIGHT_MODE
diff --git a/code/game/objects/items/weapons/RCL.dm b/code/game/objects/items/weapons/RCL.dm
new file mode 100644
index 0000000000..495af046af
--- /dev/null
+++ b/code/game/objects/items/weapons/RCL.dm
@@ -0,0 +1,205 @@
+/obj/item/weapon/twohanded/rcl
+ name = "rapid cable layer"
+ desc = "A device used to rapidly deploy cables. It has screws on the side which can be removed to slide off the cables. Do not use without insulation!"
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "rcl-0"
+ item_state = "rcl-0"
+ var/obj/structure/cable/last
+ var/obj/item/stack/cable_coil/loaded
+ opacity = FALSE
+ force = 5 //Plastic is soft
+ throwforce = 5
+ throw_speed = 1
+ throw_range = 7
+ w_class = WEIGHT_CLASS_NORMAL
+ origin_tech = "engineering=4;materials=2"
+ var/max_amount = 90
+ var/active = FALSE
+ actions_types = list(/datum/action/item_action/rcl)
+ var/list/colors = list("red", "yellow", "green", "blue", "pink", "orange", "cyan", "white")
+ var/current_color_index = 1
+ var/ghetto = FALSE
+
+/obj/item/weapon/twohanded/rcl/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = W
+
+ if(!loaded)
+ if(!user.transferItemToLoc(W, src))
+ to_chat(user, "[src] is stuck to your hand!")
+ return
+ else
+ loaded = W //W.loc is src at this point.
+ loaded.max_amount = max_amount //We store a lot.
+ return
+
+ if(loaded.amount < max_amount)
+ var/transfer_amount = min(max_amount - loaded.amount, C.amount)
+ C.use(transfer_amount)
+ loaded.amount += transfer_amount
+ else
+ return
+ update_icon()
+ to_chat(user, "You add the cables to the [src]. It now contains [loaded.amount].")
+ else if(istype(W, /obj/item/weapon/screwdriver))
+ if(!loaded)
+ return
+ if(ghetto && prob(10)) //Is it a ghetto RCL? If so, give it a 10% chance to fall apart
+ to_chat(user, "You attempt to loosen the securing screws on the side, but it falls apart!")
+ while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89)
+ var/diff = loaded.amount % 30
+ if(diff)
+ loaded.use(diff)
+ new /obj/item/stack/cable_coil(get_turf(user), diff)
+ else
+ loaded.use(30)
+ new /obj/item/stack/cable_coil(get_turf(user), 30)
+ qdel(src)
+ return
+
+ to_chat(user, "You loosen the securing screws on the side, allowing you to lower the guiding edge and retrieve the wires.")
+ while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89)
+ var/diff = loaded.amount % 30
+ if(diff)
+ loaded.use(diff)
+ new /obj/item/stack/cable_coil(get_turf(user), diff)
+ else
+ loaded.use(30)
+ new /obj/item/stack/cable_coil(get_turf(user), 30)
+ loaded.max_amount = initial(loaded.max_amount)
+ if(!user.put_in_hands(loaded))
+ loaded.forceMove(get_turf(user))
+
+ loaded = null
+ update_icon()
+ else
+ ..()
+
+/obj/item/weapon/twohanded/rcl/examine(mob/user)
+ ..()
+ if(loaded)
+ to_chat(user, "It contains [loaded.amount]/[max_amount] cables.")
+
+/obj/item/weapon/twohanded/rcl/Destroy()
+ QDEL_NULL(loaded)
+ last = null
+ active = FALSE
+ return ..()
+
+/obj/item/weapon/twohanded/rcl/update_icon()
+ if(!loaded)
+ icon_state = "rcl-0"
+ item_state = "rcl-0"
+ return
+ switch(loaded.amount)
+ if(61 to INFINITY)
+ icon_state = "rcl-30"
+ item_state = "rcl"
+ if(31 to 60)
+ icon_state = "rcl-20"
+ item_state = "rcl"
+ if(1 to 30)
+ icon_state = "rcl-10"
+ item_state = "rcl"
+ else
+ icon_state = "rcl-0"
+ item_state = "rcl-0"
+
+/obj/item/weapon/twohanded/rcl/proc/is_empty(mob/user, loud = 1)
+ update_icon()
+ if(!loaded || !loaded.amount)
+ if(loud)
+ to_chat(user, "The last of the cables unreel from [src].")
+ if(loaded)
+ QDEL_NULL(loaded)
+ loaded = null
+ unwield(user)
+ active = wielded
+ return TRUE
+ return FALSE
+
+/obj/item/weapon/twohanded/rcl/dropped(mob/wearer)
+ ..()
+ active = FALSE
+ last = null
+
+/obj/item/weapon/twohanded/rcl/attack_self(mob/user)
+ ..()
+ active = wielded
+ if(!active)
+ last = null
+ else if(!last)
+ for(var/obj/structure/cable/C in get_turf(user))
+ if(C.d1 == FALSE || C.d2 == FALSE)
+ last = C
+ break
+
+/obj/item/weapon/twohanded/rcl/on_mob_move(direct, mob/user)
+ if(active)
+ trigger(user)
+
+/obj/item/weapon/twohanded/rcl/proc/trigger(mob/user)
+ if(!isturf(user.loc))
+ return
+ if(is_empty(user, 0))
+ to_chat(user, "\The [src] is empty!")
+ return
+
+ if(prob(2) && ghetto) //Give ghetto RCLs a 2% chance to jam, requiring it to be reactviated manually.
+ to_chat(user, "[src]'s wires jam!")
+ active = FALSE
+ return
+ else
+ if(last)
+ if(get_dist(last, user) == 1) //hacky, but it works
+ var/turf/T = get_turf(user)
+ if(T.intact || !T.can_have_cabling())
+ last = null
+ return
+ if(get_dir(last, user) == last.d2)
+ //Did we just walk backwards? Well, that's the one direction we CAN'T complete a stub.
+ last = null
+ return
+ loaded.cable_join(last, user, FALSE)
+ if(is_empty(user))
+ return //If we've run out, display message and exit
+ else
+ last = null
+ loaded.item_color = colors[current_color_index]
+ last = loaded.place_turf(get_turf(src), user, turn(user.dir, 180))
+ is_empty(user) //If we've run out, display message
+
+
+/obj/item/weapon/twohanded/rcl/pre_loaded/Initialize () //Comes preloaded with cable, for testing stuff
+ . = ..()
+ loaded = new()
+ loaded.max_amount = max_amount
+ loaded.amount = max_amount
+ update_icon()
+
+/obj/item/weapon/twohanded/rcl/ui_action_click(mob/user, action)
+ if(istype(action, /datum/action/item_action/rcl))
+ current_color_index++;
+ if (current_color_index > colors.len)
+ current_color_index = 1
+ var/cwname = colors[current_color_index]
+ to_chat(user, "Color changed to [cwname]!")
+
+/obj/item/weapon/twohanded/rcl/ghetto
+ actions_types = list()
+ max_amount = 30
+ name = "makeshift rapid cable layer"
+ ghetto = TRUE
+
+/obj/item/weapon/twohanded/rcl/ghetto/update_icon()
+ if(!loaded)
+ icon_state = "rclg-0"
+ item_state = "rclg-0"
+ return
+ switch(loaded.amount)
+ if(1 to INFINITY)
+ icon_state = "rclg-1"
+ item_state = "rcl"
+ else
+ icon_state = "rclg-1"
+ item_state = "rclg-1"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm
index bd608e6b72..75141bddd5 100644
--- a/code/game/objects/items/weapons/RPD.dm
+++ b/code/game/objects/items/weapons/RPD.dm
@@ -518,7 +518,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list(
/obj/item/weapon/pipe_dispenser/pre_attackby(atom/A, mob/user)
- if(!user.IsAdvancedToolUser() || istype(A,/turf/open/space/transit))
+ if(!user.IsAdvancedToolUser() || istype(A, /turf/open/space/transit))
return ..()
//make sure what we're clicking is valid for the current mode
diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm
index a9f270e101..6bae1adcd9 100644
--- a/code/game/objects/items/weapons/RSF.dm
+++ b/code/game/objects/items/weapons/RSF.dm
@@ -8,6 +8,8 @@ RSF
desc = "A device used to rapidly deploy service items."
icon = 'icons/obj/tools.dmi'
icon_state = "rcd"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
opacity = 0
density = FALSE
anchored = FALSE
@@ -115,6 +117,8 @@ RSF
desc = "A self-recharging device used to rapidly deploy cookies."
icon = 'icons/obj/tools.dmi'
icon_state = "rcd"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
var/matter = 10
var/toxin = 0
var/cooldown = 0
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 13a420de5e..3f89e593d5 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -27,6 +27,8 @@
var/data = "null"
var/special = null
item_state = "card-id"
+ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
/obj/item/weapon/card/data/verb/label(t as text)
set name = "Label Disk"
@@ -51,6 +53,8 @@
name = "cryptographic sequencer"
icon_state = "emag"
item_state = "card-id"
+ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
origin_tech = "magnets=2;syndicate=2"
flags = NOBLUDGEON
var/prox_check = TRUE //If the emag requires you to be in range
@@ -76,6 +80,8 @@
desc = "A card used to provide ID and determine access across the station."
icon_state = "id"
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
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
@@ -136,12 +142,16 @@ update_label("John Doe", "Clowny")
desc = "A silver card which shows honour and dedication."
icon_state = "silver"
item_state = "silver_id"
+ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
/obj/item/weapon/card/id/gold
name = "gold identification card"
desc = "A golden card which shows power and might."
icon_state = "gold"
item_state = "gold_id"
+ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
/obj/item/weapon/card/id/syndicate
name = "agent card"
@@ -202,6 +212,8 @@ update_label("John Doe", "Clowny")
desc = "The spare ID of the High Lord himself."
icon_state = "gold"
item_state = "gold_id"
+ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
registered_name = "Captain"
assignment = "Captain"
@@ -211,7 +223,7 @@ update_label("John Doe", "Clowny")
..()
/obj/item/weapon/card/id/centcom
- name = "\improper Centcom ID"
+ name = "\improper CentCom ID"
desc = "An ID straight from Cent. Com."
icon_state = "centcom"
registered_name = "Central Command"
@@ -222,7 +234,7 @@ update_label("John Doe", "Clowny")
..()
/obj/item/weapon/card/id/ert
- name = "\improper Centcom ID"
+ name = "\improper CentCom ID"
desc = "A ERT ID card"
icon_state = "centcom"
registered_name = "Emergency Response Team Commander"
@@ -261,6 +273,8 @@ update_label("John Doe", "Clowny")
desc = "You are a number, you are not a free man."
icon_state = "orange"
item_state = "orange-id"
+ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
assignment = "Prisoner"
registered_name = "Scum"
var/goal = 0 //How far from freedom?
diff --git a/code/game/objects/items/weapons/charter.dm b/code/game/objects/items/weapons/charter.dm
index b17f48937a..c5f3f9c7f2 100644
--- a/code/game/objects/items/weapons/charter.dm
+++ b/code/game/objects/items/weapons/charter.dm
@@ -100,6 +100,8 @@
name_type = "planet"
icon_state = "banner"
item_state = "banner"
+ lefthand_file = 'icons/mob/inhands/equipment/banners_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/banners_righthand.dmi'
desc = "A cunning device used to claim ownership of planets."
w_class = 5
force = 15
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index 1df7b9f69a..567ac3672a 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -60,7 +60,7 @@
//So this is a workaround. This also makes more sense from an IC standpoint. ~Carn
if(user.client && (target in user.client.screen))
to_chat(user, "You need to take that [target.name] off before cleaning it!")
- else if(istype(target,/obj/effect/decal/cleanable))
+ else if(istype(target, /obj/effect/decal/cleanable))
user.visible_message("[user] begins to scrub \the [target.name] out with [src].", "You begin to scrub \the [target.name] out with [src]...")
if(do_after(user, src.cleanspeed, target = target))
to_chat(user, "You scrub \the [target.name] out.")
@@ -100,6 +100,8 @@
icon = 'icons/obj/items.dmi'
icon_state = "bike_horn"
item_state = "bike_horn"
+ lefthand_file = 'icons/mob/inhands/equipment/horns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/horns_righthand.dmi'
throwforce = 0
hitsound = null //To prevent tap.ogg playing, as the item lacks of force
w_class = WEIGHT_CLASS_TINY
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 2462b5d19a..e80a8e4350 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -7,6 +7,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "defibunit"
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
force = 5
throwforce = 6
@@ -571,6 +573,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "defibpaddles0"
item_state = "defibpaddles0"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
req_defib = FALSE
/obj/item/weapon/twohanded/shockpaddles/cyborg/attack(mob/M, mob/user)
@@ -592,6 +596,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "defibpaddles0"
item_state = "defibpaddles0"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
req_defib = FALSE
#undef HALFWAYCRITDEATH
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index e329ae78f8..8957562186 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -3,6 +3,8 @@
desc = "This injects the person with DNA."
icon = 'icons/obj/items.dmi'
icon_state = "dnainjector"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
throw_speed = 3
throw_range = 5
w_class = WEIGHT_CLASS_TINY
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index a5456b7724..0e6d6cc66f 100755
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/flamethrower.dmi'
icon_state = "flamethrowerbase"
item_state = "flamethrower_0"
+ lefthand_file = 'icons/mob/inhands/weapons/flamethrower_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/flamethrower_righthand.dmi'
flags = CONDUCT
force = 3
throwforce = 10
@@ -115,7 +117,7 @@
update_icon()
return
- else if(istype(W,/obj/item/weapon/tank/internals/plasma))
+ else if(istype(W, /obj/item/weapon/tank/internals/plasma))
if(ptank)
if(user.transferItemToLoc(W,src))
ptank.forceMove(get_turf(src))
diff --git a/code/game/objects/items/weapons/gift.dm b/code/game/objects/items/weapons/gift.dm
index 2d584327c2..e13c0b68fa 100644
--- a/code/game/objects/items/weapons/gift.dm
+++ b/code/game/objects/items/weapons/gift.dm
@@ -72,7 +72,7 @@
var/gift_type = pick(gift_type_list)
- if(!ispath(gift_type,/obj/item))
+ if(!ispath(gift_type, /obj/item))
return
qdel(src)
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 7af8a4dc5a..0dcdf1d7b6 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -193,7 +193,7 @@
name = "large grenade"
desc = "A custom made large grenade. It affects a larger area."
icon_state = "large_grenade"
- allowed_containers = list(/obj/item/weapon/reagent_containers/glass,/obj/item/weapon/reagent_containers/food/condiment,
+ allowed_containers = list(/obj/item/weapon/reagent_containers/glass, /obj/item/weapon/reagent_containers/food/condiment,
/obj/item/weapon/reagent_containers/food/drinks)
origin_tech = "combat=3;engineering=3"
affected_area = 5
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index 5ee8296c84..3563c0a439 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -2,6 +2,8 @@
name = "flashbang"
icon_state = "flashbang"
item_state = "flashbang"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
origin_tech = "materials=2;combat=3"
/obj/item/weapon/grenade/flashbang/prime()
diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm
index afa63a187f..de1c3a6cbd 100644
--- a/code/game/objects/items/weapons/grenades/ghettobomb.dm
+++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm
@@ -7,6 +7,8 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "improvised_grenade"
item_state = "flashbang"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
throw_speed = 3
throw_range = 7
flags = CONDUCT
diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm
index 33f3b34c95..08118f6447 100644
--- a/code/game/objects/items/weapons/grenades/grenade.dm
+++ b/code/game/objects/items/weapons/grenades/grenade.dm
@@ -5,6 +5,8 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "grenade"
item_state = "flashbang"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
throw_speed = 3
throw_range = 7
flags = CONDUCT
diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm
index b174fb5ae1..a043f3890c 100644
--- a/code/game/objects/items/weapons/grenades/plastic.dm
+++ b/code/game/objects/items/weapons/grenades/plastic.dm
@@ -162,6 +162,8 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "plastic-explosive0"
item_state = "plasticx"
+ lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi'
flags = NOBLUDGEON
w_class = WEIGHT_CLASS_SMALL
origin_tech = "syndicate=1"
@@ -228,7 +230,7 @@
return
if((istype(AM, /obj/item/weapon/storage/)) && !((istype(AM, /obj/item/weapon/storage/secure)) || (istype(AM, /obj/item/weapon/storage/lockbox)))) //If its storage but not secure storage OR a lockbox, then place it inside.
return
- if((istype(AM,/obj/item/weapon/storage/secure)) || (istype(AM, /obj/item/weapon/storage/lockbox)))
+ if((istype(AM, /obj/item/weapon/storage/secure)) || (istype(AM, /obj/item/weapon/storage/lockbox)))
var/obj/item/weapon/storage/secure/S = AM
if(!S.locked) //Literal hacks, this works for lockboxes despite incorrect type casting, because they both share the locked var. But if its unlocked, place it inside, otherwise PLANTING C4!
return
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 7ee254a8dd..40fa7d2520 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -9,6 +9,8 @@
gender = PLURAL
icon = 'icons/obj/items.dmi'
icon_state = "handcuff"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 0
@@ -88,6 +90,8 @@
desc = "Looks like some cables tied together. Could be used to tie something up."
icon_state = "cuff_red"
item_state = "coil_red"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
materials = list(MAT_METAL=150, MAT_GLASS=75)
origin_tech = "engineering=2"
breakouttime = 300 //Deciseconds = 30s
@@ -141,7 +145,7 @@
/obj/item/weapon/restraints/handcuffs/cable/white
icon_state = "cuff_white"
- item_state = "coil_white"
+ item_state = "coil_white"
/obj/item/weapon/restraints/handcuffs/alien
icon_state = "handcuffAlien"
@@ -206,7 +210,8 @@
name = "zipties"
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
icon_state = "cuff_white"
- item_state = "coil_white"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
materials = list()
breakouttime = 450 //Deciseconds = 45s
trashtype = /obj/item/weapon/restraints/handcuffs/cable/zipties/used
@@ -214,6 +219,7 @@
/obj/item/weapon/restraints/handcuffs/cable/zipties/used
desc = "A pair of broken zipties."
icon_state = "cuff_white_used"
+ item_state = "cuff_white"
/obj/item/weapon/restraints/handcuffs/cable/zipties/used/attack()
return
@@ -227,6 +233,8 @@
gender = PLURAL
icon = 'icons/obj/items.dmi'
icon_state = "handcuff"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
flags = CONDUCT
throwforce = 0
w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/game/objects/items/weapons/his_grace.dm b/code/game/objects/items/weapons/his_grace.dm
index c43e1600b6..5b57fab800 100644
--- a/code/game/objects/items/weapons/his_grace.dm
+++ b/code/game/objects/items/weapons/his_grace.dm
@@ -20,12 +20,14 @@
var/prev_bloodthirst = HIS_GRACE_SATIATED
var/force_bonus = 0
-/obj/item/weapon/his_grace/New()
- ..()
+/obj/item/weapon/his_grace/Initialize()
+ . = ..()
START_PROCESSING(SSprocessing, src)
+ GLOB.poi_list += src
/obj/item/weapon/his_grace/Destroy()
STOP_PROCESSING(SSprocessing, src)
+ GLOB.poi_list -= src
for(var/mob/living/L in src)
L.forceMove(get_turf(src))
return ..()
diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm
index 1923f7e3d3..23b65e01bf 100644
--- a/code/game/objects/items/weapons/holosign_creator.dm
+++ b/code/game/objects/items/weapons/holosign_creator.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/device.dmi'
icon_state = "signmaker"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
force = 0
w_class = WEIGHT_CLASS_SMALL
throwforce = 0
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index e262d6cd00..238022d209 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -3,6 +3,8 @@
desc = "A rod of pure obsidian, its very presence disrupts and dampens the powers of Nar-Sie's followers."
icon_state = "nullrod"
item_state = "nullrod"
+ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
force = 18
throw_speed = 3
throw_range = 4
@@ -60,6 +62,8 @@
/obj/item/weapon/nullrod/staff
icon_state = "godstaff-red"
item_state = "godstaff-red"
+ lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
name = "red holy staff"
desc = "It has a mysterious, protective aura."
w_class = WEIGHT_CLASS_HUGE
@@ -82,6 +86,8 @@
/obj/item/weapon/nullrod/claymore
icon_state = "claymore"
item_state = "claymore"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
name = "holy claymore"
desc = "A weapon fit for a crusade!"
w_class = WEIGHT_CLASS_HUGE
@@ -163,6 +169,8 @@
desc = "This thing is so unspeakably HOLY you are having a hard time even holding it."
icon_state = "sord"
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
force = 4.13
throwforce = 1
@@ -172,6 +180,8 @@
/obj/item/weapon/nullrod/scythe
icon_state = "scythe1"
item_state = "scythe1"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
name = "reaper scythe"
desc = "Ask not for whom the bell tolls..."
w_class = WEIGHT_CLASS_BULKY
@@ -183,6 +193,8 @@
/obj/item/weapon/nullrod/scythe/vibro
icon_state = "hfrequency0"
item_state = "hfrequency1"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
name = "high frequency blade"
desc = "Bad references are the DNA of the soul."
attack_verb = list("chopped", "sliced", "cut", "zandatsu'd")
@@ -192,6 +204,8 @@
/obj/item/weapon/nullrod/scythe/spellblade
icon_state = "spellblade"
item_state = "spellblade"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
icon = 'icons/obj/guns/magic.dmi'
name = "dormant spellblade"
desc = "The blade grants the wielder nearly limitless power...if they can figure out how to turn it on, that is."
@@ -200,6 +214,8 @@
/obj/item/weapon/nullrod/scythe/talking
icon_state = "talking_sword"
item_state = "talking_sword"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
name = "possessed blade"
desc = "When the station falls into chaos, it's nice to have a friend by your side."
attack_verb = list("chopped", "sliced", "cut")
@@ -243,6 +259,8 @@
/obj/item/weapon/nullrod/hammmer
icon_state = "hammeron"
item_state = "hammeron"
+ lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
+ 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
@@ -254,6 +272,8 @@
desc = "Good? Bad? You're the guy with the chainsaw hand."
icon_state = "chainsaw_on"
item_state = "mounted_chainsaw"
+ lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
w_class = WEIGHT_CLASS_HUGE
flags = NODROP | ABSTRACT
sharpness = IS_SHARP
@@ -275,6 +295,8 @@
desc = "What a terrible night to be on Space Station 13."
icon_state = "chain"
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
attack_verb = list("whipped", "lashed")
hitsound = 'sound/weapons/chainhit.ogg'
@@ -333,10 +355,14 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "bostaff0"
item_state = "bostaff0"
+ lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
/obj/item/weapon/nullrod/tribal_knife
icon_state = "crysknife"
item_state = "crysknife"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
name = "arrhythmic knife"
w_class = WEIGHT_CLASS_HUGE
desc = "They say fear is the true mind killer, but stabbing them in the head works too. Honour compels you to not sheathe it once drawn."
@@ -363,6 +389,8 @@
/obj/item/weapon/nullrod/pitchfork
icon_state = "pitchfork0"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
name = "unholy pitchfork"
w_class = WEIGHT_CLASS_NORMAL
desc = "Holding this makes you look absolutely devilish."
diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm
index e537bf44de..d259e7b26e 100644
--- a/code/game/objects/items/weapons/implants/implant_chem.dm
+++ b/code/game/objects/items/weapons/implants/implant_chem.dm
@@ -56,7 +56,7 @@
imp_type = /obj/item/weapon/implant/chem
/obj/item/weapon/implantcase/chem/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W,/obj/item/weapon/reagent_containers/syringe) && imp)
+ if(istype(W, /obj/item/weapon/reagent_containers/syringe) && imp)
W.afterattack(imp, user, TRUE, params)
return TRUE
else
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index bce0025c04..287f0c29bc 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/items.dmi'
icon_state = "implantcase-0"
item_state = "implantcase"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
throw_speed = 2
throw_range = 5
w_class = WEIGHT_CLASS_TINY
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index 9be87aa5d4..708232d910 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/items.dmi'
icon_state = "implanter0"
item_state = "syringe_0"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
throw_speed = 3
throw_range = 5
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm
index 094f46413a..dabd0eeda5 100644
--- a/code/game/objects/items/weapons/implants/implantpad.dm
+++ b/code/game/objects/items/weapons/implants/implantpad.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/items.dmi'
icon_state = "implantpad-0"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
throw_speed = 3
throw_range = 5
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm
index d0b5971d60..927da73a5b 100644
--- a/code/game/objects/items/weapons/implants/implantuplink.dm
+++ b/code/game/objects/items/weapons/implants/implantuplink.dm
@@ -3,6 +3,8 @@
desc = "Sneeki breeki."
icon = 'icons/obj/radio.dmi'
icon_state = "radio"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
origin_tech = "materials=4;magnets=4;programming=4;biotech=4;syndicate=5;bluespace=5"
var/starting_tc = 0
diff --git a/code/game/objects/items/weapons/inducer.dm b/code/game/objects/items/weapons/inducer.dm
index 26eb9a7bfc..0110b69a01 100644
--- a/code/game/objects/items/weapons/inducer.dm
+++ b/code/game/objects/items/weapons/inducer.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/tools.dmi'
icon_state = "inducer-engi"
item_state = "inducer-engi"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
origin_tech = "engineering=4;magnets=4;powerstorage=4"
force = 7
var/powertransfer = 1000
@@ -60,7 +62,7 @@
/obj/item/weapon/inducer/attackby(obj/item/weapon/W, mob/user)
- if(istype(W,/obj/item/weapon/screwdriver))
+ if(istype(W, /obj/item/weapon/screwdriver))
playsound(src, W.usesound, 50, 1)
if(!opened)
to_chat(user, "You unscrew the battery compartment.")
@@ -72,7 +74,7 @@
opened = FALSE
update_icon()
return
- if(istype(W,/obj/item/weapon/stock_parts/cell))
+ if(istype(W, /obj/item/weapon/stock_parts/cell))
if(opened)
if(!cell)
if(!user.transferItemToLoc(W, src))
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index de89b3d3a0..a125aaf89c 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -11,6 +11,8 @@
/obj/item/weapon/kitchen
icon = 'icons/obj/kitchen.dmi'
origin_tech = "materials=1"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
/obj/item/weapon/kitchen/fork
name = "fork"
@@ -86,6 +88,7 @@
desc = "The unearthly energies that once powered this blade are now dormant."
icon = 'icons/obj/wizard.dmi'
icon_state = "render"
+ item_state = "knife"
w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/kitchen/knife/butcher
@@ -113,6 +116,7 @@
/obj/item/weapon/kitchen/knife/combat/survival
name = "survival knife"
icon_state = "survivalknife"
+ item_state = "knife"
desc = "A hunting grade survival knife."
force = 15
throwforce = 15
@@ -122,6 +126,8 @@
name = "bone dagger"
item_state = "bone_dagger"
icon_state = "bone_dagger"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
desc = "A sharpened bone. The bare mimimum in survival."
force = 15
throwforce = 15
@@ -138,6 +144,8 @@
name = "carrot shiv"
icon_state = "carrotshiv"
item_state = "carrotshiv"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
desc = "Unlike other carrots, you should probably keep this far away from your eyes."
force = 8
throwforce = 12//fuck git
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index f366704e50..8bca4d02a1 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -61,6 +61,8 @@
name = "energy axe"
desc = "An energized battle axe."
icon_state = "axe0"
+ lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi'
force = 40
force_on = 150
throwforce = 25
@@ -85,6 +87,8 @@
name = "energy sword"
desc = "May the force be within you."
icon_state = "sword0"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
force = 3
throwforce = 5
hitsound = "swing_hit" //it starts deactivated
@@ -187,6 +191,8 @@
name = "energy cutlass"
desc = "Arrrr matey."
icon_state = "cutlass0"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
icon_state_on = "cutlass1"
light_color = "#ff0000"
@@ -194,6 +200,8 @@
name = "energy blade"
desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal."
icon_state = "blade"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
force = 30 //Normal attacks deal esword damage
hitsound = 'sound/weapons/blade1.ogg'
active = 1
diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm
index 2bee842813..5d32856bc9 100644
--- a/code/game/objects/items/weapons/melee/misc.dm
+++ b/code/game/objects/items/weapons/melee/misc.dm
@@ -14,6 +14,8 @@
desc = "A tool used by great men to placate the frothing masses."
icon_state = "chain"
item_state = "chain"
+ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BELT
force = 10
@@ -47,6 +49,8 @@
desc = "An elegant weapon, its monomolecular edge is capable of cutting through flesh and bone with ease."
icon_state = "sabre"
item_state = "sabre"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
flags = CONDUCT
unique_rename = 1
force = 15
@@ -83,6 +87,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "baton"
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
force = 12 //9 hit crit
w_class = WEIGHT_CLASS_NORMAL
@@ -138,6 +144,8 @@
desc = "A compact yet robust personal defense weapon. Can be concealed when folded."
icon = 'icons/obj/weapons.dmi'
icon_state = "telebaton_0"
+ 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
w_class = WEIGHT_CLASS_SMALL
@@ -160,7 +168,7 @@
if (B && !QDELETED(B))
H.internal_organs -= B
qdel(B)
- new /obj/effect/gibspawner/generic(H.loc, H.viruses, H.dna)
+ new /obj/effect/gibspawner/generic(get_turf(H), H.dna)
return (BRUTELOSS)
/obj/item/weapon/melee/classic_baton/telescopic/attack_self(mob/user)
@@ -190,6 +198,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "supermatter_sword"
item_state = "supermatter_sword"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
slot_flags = null
w_class = WEIGHT_CLASS_BULKY
force = 0.001
@@ -199,8 +209,8 @@
origin_tech = "combat=7;materials=6"
force_string = "INFINITE"
-/obj/item/weapon/melee/supermatter_sword/New()
- ..()
+/obj/item/weapon/melee/supermatter_sword/Initialize()
+ . = ..()
shard = new /obj/machinery/power/supermatter_shard(src)
qdel(shard.countdown)
shard.countdown = null
@@ -284,6 +294,8 @@
desc = "Somewhat eccentric and outdated, it still stings like hell to be hit by."
icon_state = "whip"
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
force = 15
w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/game/objects/items/weapons/miscellaneous.dm b/code/game/objects/items/weapons/miscellaneous.dm
index 001037a452..8924209463 100644
--- a/code/game/objects/items/weapons/miscellaneous.dm
+++ b/code/game/objects/items/weapons/miscellaneous.dm
@@ -3,6 +3,8 @@
name = "wet floor sign"
icon = 'icons/obj/janitor.dmi'
icon_state = "caution"
+ lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
force = 1
throwforce = 3
throw_speed = 2
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 9bf5be6e35..57871326d4 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -77,6 +77,8 @@
mopcap = 10
icon_state = "advmop"
item_state = "mop"
+ lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
origin_tech = "materials=3;engineering=3"
force = 6
throwforce = 8
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 7ac70c82f8..d2f5714d5e 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -11,8 +11,8 @@
icon = 'icons/obj/pneumaticCannon.dmi'
icon_state = "pneumaticCannon"
item_state = "bulldog"
- lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 60, acid = 50)
var/maxWeightClass = 20 //The max weight of items that can fit into the cannon
var/loadedWeightClass = 0 //The weight of items currently in the cannon
diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm
index d3a940090d..256cdc0433 100644
--- a/code/game/objects/items/weapons/powerfist.dm
+++ b/code/game/objects/items/weapons/powerfist.dm
@@ -3,6 +3,8 @@
desc = "A metal gauntlet with a piston-powered ram ontop for that extra 'ompfh' in your punch."
icon_state = "powerfist"
item_state = "powerfist"
+ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
flags = CONDUCT
attack_verb = list("whacked", "fisted", "power-punched")
force = 20
diff --git a/code/game/objects/items/weapons/sharpener.dm b/code/game/objects/items/weapons/sharpener.dm
index ace66060af..881832b5bb 100644
--- a/code/game/objects/items/weapons/sharpener.dm
+++ b/code/game/objects/items/weapons/sharpener.dm
@@ -12,31 +12,31 @@
/obj/item/weapon/sharpener/attackby(obj/item/I, mob/user, params)
if(used)
- to_chat(user, "The sharpening block is too worn to use again.")
+ to_chat(user, "The sharpening block is too worn to use again!")
return
if(I.force >= max || I.throwforce >= max)//no esword sharpening
- to_chat(user, "[I] is much too powerful to sharpen further.")
+ to_chat(user, "[I] is much too powerful to sharpen further!")
return
if(requires_sharpness && !I.sharpness)
- to_chat(user, "You can only sharpen items that are already sharp, such as knives.")
+ to_chat(user, "You can only sharpen items that are already sharp, such as knives!")
return
if(istype(I, /obj/item/weapon/melee/transforming/energy))
- to_chat(user, "You don't think \the [I] will be the thing getting modified if you use it on \the [src].")
+ to_chat(user, "You don't think \the [I] will be the thing getting modified if you use it on \the [src]!")
return
if(istype(I, /obj/item/weapon/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff
var/obj/item/weapon/twohanded/TH = I
if(TH.force_wielded >= max)
- to_chat(user, "[TH] is much too powerful to sharpen further.")
+ to_chat(user, "[TH] is much too powerful to sharpen further!")
return
if(TH.wielded)
- to_chat(user, "[TH] must be unwielded before it can be sharpened.")
+ to_chat(user, "[TH] must be unwielded before it can be sharpened!")
return
if(TH.force_wielded > initial(TH.force_wielded))
- to_chat(user, "[TH] has already been refined before. It cannot be sharpened further.")
+ to_chat(user, "[TH] has already been refined before. It cannot be sharpened further!")
return
TH.force_wielded = Clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay
if(I.force > initial(I.force))
- to_chat(user, "[I] has already been refined before. It cannot be sharpened further.")
+ to_chat(user, "[I] has already been refined before. It cannot be sharpened further!")
return
user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.")
I.sharpness = IS_SHARP_ACCURATE
@@ -46,6 +46,7 @@
name = "worn out [name]"
desc = "[desc] At least, it used to."
used = 1
+ update_icon()
/obj/item/weapon/sharpener/super
name = "super whetstone"
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index b528d52078..bb1a1de8c0 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -8,6 +8,8 @@
desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder."
icon = 'icons/obj/weapons.dmi'
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
force = 10
throwforce = 5
@@ -41,12 +43,16 @@
desc = "Bears an inscription on the inside: \"Romanes venio domus\"."
icon_state = "roman_shield"
item_state = "roman_shield"
+ lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
/obj/item/weapon/shield/riot/buckler
name = "wooden buckler"
desc = "A medieval wooden buckler."
icon_state = "buckler"
item_state = "buckler"
+ lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
materials = list()
origin_tech = "materials=1;combat=3;biotech=2"
resistance_flags = FLAMMABLE
@@ -57,6 +63,8 @@
desc = "A shield capable of stopping most melee attacks. Protects user from almost all energy projectiles. It can be retracted, expanded, and stored anywhere."
icon = 'icons/obj/weapons.dmi'
icon_state = "eshield0" // eshield1 for expanded
+ lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
force = 3
throwforce = 3
throw_speed = 3
@@ -100,6 +108,8 @@
desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."
icon = 'icons/obj/weapons.dmi'
icon_state = "teleriot0"
+ lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
origin_tech = "materials=3;combat=4;engineering=4"
slot_flags = null
force = 3
diff --git a/code/game/objects/items/weapons/singularityhammer.dm b/code/game/objects/items/weapons/singularityhammer.dm
index cec4fce24d..a229b82660 100644
--- a/code/game/objects/items/weapons/singularityhammer.dm
+++ b/code/game/objects/items/weapons/singularityhammer.dm
@@ -2,6 +2,8 @@
name = "singularity hammer"
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
icon_state = "mjollnir0"
+ lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BACK
force = 5
@@ -45,7 +47,7 @@
step_towards(A,pull)
else if(ishuman(X))
var/mob/living/carbon/human/H = X
- if(istype(H.shoes,/obj/item/clothing/shoes/magboots))
+ if(istype(H.shoes, /obj/item/clothing/shoes/magboots))
var/obj/item/clothing/shoes/magboots/M = H.shoes
if(M.magpulse)
continue
@@ -71,6 +73,8 @@
name = "Mjolnir"
desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy."
icon_state = "mjollnir0"
+ lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BACK
force = 5
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 89f1feeef1..cd9d0bee14 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -14,6 +14,8 @@
desc = "You wear this on your back and put items into it."
icon_state = "backpack"
item_state = "backpack"
+ 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
max_w_class = WEIGHT_CLASS_NORMAL
@@ -305,7 +307,7 @@
/obj/item/weapon/storage/backpack/satchel/flat/secret/Initialize()
..()
- if(isfloorturf(loc) && !istype(loc,/turf/open/floor/plating/))
+ if(isfloorturf(loc) && !istype(loc, /turf/open/floor/plating/))
hide(1)
/obj/item/weapon/storage/backpack/satchel/flat/secret/hide(intact)
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 974b98f73e..dff48b6d41 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -32,6 +32,8 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "trashbag"
item_state = "trashbag"
+ lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
max_w_class = WEIGHT_CLASS_SMALL
@@ -113,7 +115,7 @@
max_combined_w_class = 100 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class
max_w_class = WEIGHT_CLASS_NORMAL
w_class = WEIGHT_CLASS_TINY
- can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown,/obj/item/weapon/reagent_containers/honeycomb)
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown, /obj/item/seeds, /obj/item/weapon/grown, /obj/item/weapon/reagent_containers/honeycomb)
resistance_flags = FLAMMABLE
////////
@@ -153,7 +155,7 @@
allow_quick_empty = 1 // this function is superceded
/obj/item/weapon/storage/bag/sheetsnatcher/can_be_inserted(obj/item/W, stop_messages = 0)
- if(!istype(W,/obj/item/stack/sheet) || istype(W,/obj/item/stack/sheet/mineral/sandstone) || istype(W,/obj/item/stack/sheet/mineral/wood))
+ if(!istype(W, /obj/item/stack/sheet) || istype(W, /obj/item/stack/sheet/mineral/sandstone) || istype(W, /obj/item/stack/sheet/mineral/wood))
if(!stop_messages)
to_chat(usr, "The snatcher does not accept [W].")
return 0 //I don't care, but the existing code rejects them for not being "sheets" *shrug* -Sayu
diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm
index ed38d02c31..9e8e913f39 100644
--- a/code/game/objects/items/weapons/storage/book.dm
+++ b/code/game/objects/items/weapons/storage/book.dm
@@ -23,6 +23,8 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
icon = 'icons/obj/storage.dmi'
icon_state = "bible"
item_state = "bible"
+ lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi'
var/mob/affecting = null
var/deity_name = "Christ"
force_string = "holy"
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 75267d731f..d59cab0853 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -26,12 +26,14 @@
desc = "It's just an ordinary box."
icon_state = "box"
item_state = "syringe_kit"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
resistance_flags = FLAMMABLE
var/foldable = /obj/item/stack/sheet/cardboard
var/illustration = "writing"
/obj/item/weapon/storage/box/Initialize(mapload)
- ..()
+ . = ..()
update_icon()
/obj/item/weapon/storage/box/update_icon()
@@ -533,6 +535,8 @@
illustration = "light"
desc = "This box is shaped on the inside so that only light tubes and bulbs fit."
item_state = "syringe_kit"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
storage_slots=21
can_hold = list(/obj/item/weapon/light/tube, /obj/item/weapon/light/bulb)
diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm
index 7434679d10..d7ec67c78a 100644
--- a/code/game/objects/items/weapons/storage/briefcase.dm
+++ b/code/game/objects/items/weapons/storage/briefcase.dm
@@ -2,6 +2,8 @@
name = "briefcase"
desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional."
icon_state = "briefcase"
+ lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi'
flags = CONDUCT
force = 8
hitsound = "swing_hit"
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 32d9a75397..f98f9d62b1 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -81,6 +81,8 @@
icon = 'icons/obj/food/containers.dmi'
icon_state = "eggbox"
icon_type = "egg"
+ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
name = "egg box"
storage_slots = 12
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/egg)
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index 6e68afb4c4..f3699e20ab 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -12,6 +12,8 @@
name = "first-aid kit"
desc = "It's an emergency medical kit for those serious boo-boos."
icon_state = "firstaid"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
throw_speed = 3
throw_range = 7
var/empty = 0
@@ -144,7 +146,7 @@
icon = 'icons/obj/chemical.dmi'
item_state = "contsolid"
w_class = WEIGHT_CLASS_SMALL
- can_hold = list(/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/dice)
+ can_hold = list(/obj/item/weapon/reagent_containers/pill, /obj/item/weapon/dice)
allow_quick_gather = 1
use_to_pickup = 1
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index 35a6c64388..ada92e3f91 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -3,6 +3,8 @@
desc = "A locked box."
icon_state = "lockbox+l"
item_state = "syringe_kit"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item.
@@ -109,6 +111,8 @@
desc = "A locked box used to store medals of honor."
icon_state = "medalbox+l"
item_state = "syringe_kit"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
w_class = WEIGHT_CLASS_NORMAL
max_w_class = WEIGHT_CLASS_SMALL
storage_slots = 10
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index 56eb477906..501802f68c 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -135,6 +135,8 @@
icon = 'icons/obj/storage.dmi'
icon_state = "secure"
item_state = "sec-case"
+ lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi'
desc = "A large briefcase with a digital locking system."
force = 8
hitsound = "swing_hit"
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 480c348b6f..cc4bee233b 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -34,7 +34,7 @@
if(!over_object)
return
- if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
+ if (istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech
return
// this must come before the screen objects only block, dunno why it wasn't before
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index 31f52a42fc..8fa9a0bf00 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -3,6 +3,8 @@
desc = "Danger. Very robust."
icon_state = "red"
item_state = "toolbox_red"
+ lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
flags = CONDUCT
force = 12
throwforce = 12
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 63afdce472..38769e7ce6 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -236,7 +236,7 @@
/obj/item/weapon/storage/box/syndie_kit/nuke/PopulateContents()
new /obj/item/weapon/screwdriver/nuke(src)
new /obj/item/nuke_core_container(src)
- new /obj/item/weapon/paper/nuke_instructions(src)
+ new /obj/item/weapon/paper/guides/antag/nuke_instructions(src)
/obj/item/weapon/storage/box/syndie_kit/supermatter
name = "box"
@@ -245,7 +245,7 @@
new /obj/item/weapon/scalpel/supermatter(src)
new /obj/item/weapon/hemostat/supermatter(src)
new /obj/item/nuke_core_container/supermatter(src)
- new /obj/item/weapon/paper/supermatter_sliver_instructions(src)
+ new /obj/item/weapon/paper/guides/antag/supermatter_sliver(src)
/obj/item/weapon/storage/box/syndie_kit/tuberculosisgrenade
name = "boxed virus grenade kit"
diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm
index b2501103aa..4346051295 100644
--- a/code/game/objects/items/weapons/storage/wallets.dm
+++ b/code/game/objects/items/weapons/storage/wallets.dm
@@ -73,10 +73,10 @@
return ..()
/obj/item/weapon/storage/wallet/random/PopulateContents()
- var/item1_type = pick( /obj/item/stack/spacecash/c10,/obj/item/stack/spacecash/c100,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c20,/obj/item/stack/spacecash/c200,/obj/item/stack/spacecash/c50, /obj/item/stack/spacecash/c500)
+ var/item1_type = pick( /obj/item/stack/spacecash/c10, /obj/item/stack/spacecash/c100, /obj/item/stack/spacecash/c1000, /obj/item/stack/spacecash/c20, /obj/item/stack/spacecash/c200, /obj/item/stack/spacecash/c50, /obj/item/stack/spacecash/c500)
var/item2_type
if(prob(50))
- item2_type = pick( /obj/item/stack/spacecash/c10,/obj/item/stack/spacecash/c100,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c20,/obj/item/stack/spacecash/c200,/obj/item/stack/spacecash/c50, /obj/item/stack/spacecash/c500)
+ item2_type = pick( /obj/item/stack/spacecash/c10, /obj/item/stack/spacecash/c100, /obj/item/stack/spacecash/c1000, /obj/item/stack/spacecash/c20, /obj/item/stack/spacecash/c200, /obj/item/stack/spacecash/c50, /obj/item/stack/spacecash/c500)
var/item3_type = pick( /obj/item/weapon/coin/silver, /obj/item/weapon/coin/silver, /obj/item/weapon/coin/gold, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron )
spawn(2)
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index bde97b5680..c43b97d9f1 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -3,6 +3,8 @@
desc = "A stun baton for incapacitating people with."
icon_state = "stunbaton"
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
force = 10
throwforce = 7
@@ -180,6 +182,8 @@
desc = "An improvised stun baton."
icon_state = "stunprod_nocell"
item_state = "prod"
+ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
force = 3
throwforce = 5
diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm
index 15ac506cd6..8b61a45d5a 100644
--- a/code/game/objects/items/weapons/tanks/jetpack.dm
+++ b/code/game/objects/items/weapons/tanks/jetpack.dm
@@ -3,6 +3,8 @@
desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution."
icon_state = "jetpack"
item_state = "jetpack"
+ lefthand_file = 'icons/mob/inhands/equipment/jetpacks_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/jetpacks_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
distribute_pressure = ONE_ATMOSPHERE * O2STANDARD
actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
@@ -76,7 +78,7 @@
return 1
/obj/item/weapon/tank/jetpack/suicide_act(mob/user)
- if (istype(user,/mob/living/carbon/human/))
+ if (istype(user, /mob/living/carbon/human/))
var/mob/living/carbon/human/H = user
H.forcesay("WHAT THE FUCK IS CARBON DIOXIDE?")
H.visible_message("[user] is suffocating [user.p_them()]self with [src]! It looks like [user.p_they()] didn't read what that jetpack says!")
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index abd907aeb5..7a42cdc5f1 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -1,6 +1,8 @@
/obj/item/weapon/tank
name = "tank"
icon = 'icons/obj/tank.dmi'
+ lefthand_file = 'icons/mob/inhands/equipment/tanks_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tanks_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BACK
hitsound = 'sound/weapons/smash.ogg'
@@ -231,7 +233,7 @@
var/pressure = air_contents.return_pressure()
if(pressure > TANK_FRAGMENT_PRESSURE)
- if(!istype(src.loc,/obj/item/device/transfer_valve))
+ if(!istype(src.loc, /obj/item/device/transfer_valve))
message_admins("Explosive tank rupture! Last key to touch the tank was [src.fingerprintslast].")
log_game("Explosive tank rupture! Last key to touch the tank was [src.fingerprintslast].")
//to_chat(world, "\blue[x],[y] tank is exploding: [pressure] kPa")
@@ -246,7 +248,7 @@
//to_chat(world, "\blue Exploding Pressure: [pressure] kPa, intensity: [range]")
explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5))
- if(istype(src.loc,/obj/item/device/transfer_valve))
+ if(istype(src.loc, /obj/item/device/transfer_valve))
qdel(src.loc)
else
qdel(src)
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index 7b7f1d5423..9eac23c55c 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -103,6 +103,8 @@
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "mister"
item_state = "mister"
+ lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/mister_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(25,50,100)
@@ -164,6 +166,8 @@
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "misterjani"
item_state = "misterjani"
+ lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/mister_righthand.dmi'
amount_per_transfer_from_this = 5
possible_transfer_amounts = list()
@@ -182,7 +186,7 @@
/obj/item/weapon/watertank/atmos
name = "backpack firefighter tank"
- desc = "A refridgerated and pressurized backpack tank with extinguisher nozzle, intended to fight fires. Swaps between extinguisher, resin launcher and a smaller scale resin foamer."
+ desc = "A refrigerated and pressurized backpack tank with extinguisher nozzle, intended to fight fires. Swaps between extinguisher, resin launcher and a smaller scale resin foamer."
item_state = "waterbackpackatmos"
icon_state = "waterbackpackatmos"
volume = 200
@@ -208,6 +212,8 @@
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "atmos_nozzle"
item_state = "nozzleatmos"
+ lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/mister_righthand.dmi'
safety = 0
max_water = 200
power = 8
@@ -215,7 +221,7 @@
precision = 1
cooling_power = 5
w_class = WEIGHT_CLASS_HUGE
- flags = NODROP //Necessary to ensure that the nozzle and tank never seperate
+ flags = NODROP //Necessary to ensure that the nozzle and tank never separate
var/obj/item/weapon/watertank/tank
var/nozzle_mode = 0
var/metal_synthesis_cooldown = 0
@@ -458,6 +464,8 @@
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "misterjani"
item_state = "misterjani"
+ lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/mister_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
amount_per_transfer_from_this = 100
possible_transfer_amounts = list(75,100,150)
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index aa624adc58..a53e16233f 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -23,6 +23,8 @@
flags = CONDUCT
w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL=400)
@@ -132,6 +134,8 @@ Frequency:
icon = 'icons/obj/device.dmi'
icon_state = "hand_tele"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 385ff6cbc0..1121100d8c 100755
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -19,6 +19,8 @@
desc = "A wrench with common uses. Can be found in your hand."
icon = 'icons/obj/tools.dmi'
icon_state = "wrench"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5
@@ -62,6 +64,8 @@
desc = "A simple powered hand drill. It's fitted with a bolt bit."
icon_state = "drill_bolt"
item_state = "drill"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
usesound = 'sound/items/drill_use.ogg'
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get
@@ -129,6 +133,8 @@
icon = 'icons/obj/tools.dmi'
icon_state = "screwdriver"
item_state = "screwdriver"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5
@@ -224,6 +230,8 @@
desc = "A simple powered hand drill. It's fitted with a screw bit."
icon_state = "drill_screw"
item_state = "drill"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get
force = 8 //might or might not be too high, subject to change
@@ -262,6 +270,8 @@
desc = "This cuts wires."
icon = 'icons/obj/tools.dmi'
icon_state = null
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BELT
force = 6
@@ -357,6 +367,8 @@
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 = CONDUCT
slot_flags = SLOT_BELT
force = 3
@@ -692,6 +704,8 @@
desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors."
icon = 'icons/obj/tools.dmi'
icon_state = "crowbar"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
usesound = 'sound/items/crowbar.ogg'
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -753,6 +767,8 @@
desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a prying head."
icon_state = "jaws_pry"
item_state = "jawsoflife"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
origin_tech = "materials=2;engineering=2"
usesound = 'sound/items/jaws_pry.ogg'
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 8c97cab431..5cdf679cbe 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -198,6 +198,8 @@
*/
/obj/item/weapon/twohanded/fireaxe // DEM AXES MAN, marker -Agouri
icon_state = "fireaxe0"
+ lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi'
name = "fire axe"
desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
force = 5
@@ -225,10 +227,10 @@
if(!proximity)
return
if(wielded) //destroys windows and grilles in one hit
- if(istype(A,/obj/structure/window))
+ if(istype(A, /obj/structure/window))
var/obj/structure/window/W = A
W.take_damage(200, BRUTE, "melee", 0)
- else if(istype(A,/obj/structure/grille))
+ else if(istype(A, /obj/structure/grille))
var/obj/structure/grille/G = A
G.take_damage(40, BRUTE, "melee", 0)
@@ -238,6 +240,8 @@
*/
/obj/item/weapon/twohanded/dualsaber
icon_state = "dualsaber0"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
name = "double-bladed energy sword"
desc = "Handle with care."
force = 3
@@ -401,6 +405,8 @@
//spears
/obj/item/weapon/twohanded/spear
icon_state = "spearglass0"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
name = "spear"
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
force = 10
@@ -477,6 +483,8 @@
name = "chainsaw"
desc = "A versatile power tool. Useful for limbing trees and delimbing humans."
icon_state = "chainsaw_off"
+ lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
flags = CONDUCT
force = 13
var/force_on = 21
@@ -555,6 +563,8 @@
/obj/item/weapon/twohanded/pitchfork
icon_state = "pitchfork0"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
name = "pitchfork"
desc = "A simple tool used for moving hay."
force = 7
@@ -578,6 +588,7 @@
force_wielded = 25
/obj/item/weapon/twohanded/pitchfork/demonic/Initialize()
+ . = ..()
set_light(3,6,LIGHT_COLOR_RED)
/obj/item/weapon/twohanded/pitchfork/demonic/greater
@@ -631,6 +642,8 @@
/obj/item/weapon/twohanded/vibro_weapon
icon_state = "hfrequency0"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
name = "vibro sword"
desc = "A potent weapon capable of cutting through nearly anything. Wielding it in two hands will allow you to deflect gunfire."
force_unwielded = 20
@@ -679,6 +692,8 @@
*/
/obj/item/weapon/twohanded/bonespear //Blatant imitation of spear, but made out of bone. Not valid for explosive modification.
icon_state = "bone_spear0"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
name = "bone spear"
desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology."
force = 11
@@ -695,4 +710,4 @@
sharpness = IS_SHARP
/obj/item/weapon/twohanded/bonespear/update_icon()
- icon_state = "bone_spear[wielded]"
\ No newline at end of file
+ icon_state = "bone_spear[wielded]"
diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm
index 47ddfaed0a..bcb1969382 100644
--- a/code/game/objects/items/weapons/vending_items.dm
+++ b/code/game/objects/items/weapons/vending_items.dm
@@ -5,6 +5,8 @@
icon = 'icons/obj/vending_restock.dmi'
icon_state = "refill_snack"
item_state = "restock_unit"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags = CONDUCT
force = 7
throwforce = 10
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 51c49e0367..bb723ffb33 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -29,6 +29,8 @@
desc = "This thing is so unspeakably shitty you are having a hard time even holding it."
icon_state = "sord"
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
force = 2
throwforce = 1
@@ -46,6 +48,8 @@
desc = "What are you standing around staring at this for? Get to killing!"
icon_state = "claymore"
item_state = "claymore"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
hitsound = 'sound/weapons/bladeslice.ogg'
flags = CONDUCT
slot_flags = SLOT_BELT | SLOT_BACK
@@ -73,8 +77,8 @@
var/notches = 0 //HOW MANY PEOPLE HAVE BEEN SLAIN WITH THIS BLADE
var/obj/item/weapon/disk/nuclear/nuke_disk //OUR STORED NUKE DISK
-/obj/item/weapon/claymore/highlander/New()
- ..()
+/obj/item/weapon/claymore/highlander/Initialize()
+ . = ..()
START_PROCESSING(SSobj, src)
/obj/item/weapon/claymore/highlander/Destroy()
@@ -190,6 +194,8 @@
desc = "Woefully underpowered in D20"
icon_state = "katana"
item_state = "katana"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BELT | SLOT_BACK
force = 40
@@ -253,6 +259,8 @@
desc = "An ancient weapon still used to this day due to it's ease of lodging itself into victim's body parts"
icon_state = "throwingstar"
item_state = "eshield0"
+ lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
force = 2
throwforce = 20 //This is never used on mobs since this has a 100% embed chance.
throw_speed = 4
@@ -268,6 +276,8 @@
/obj/item/weapon/switchblade
name = "switchblade"
icon_state = "switchblade"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
desc = "A sharp, concealable, spring-loaded knife."
flags = CONDUCT
force = 3
@@ -332,6 +342,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "cane"
item_state = "stick"
+ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
force = 5
throwforce = 5
w_class = WEIGHT_CLASS_SMALL
@@ -343,6 +355,8 @@
desc = "Apparently a staff used by the wizard."
icon = 'icons/obj/wizard.dmi'
icon_state = "staff"
+ lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
force = 3
throwforce = 5
throw_speed = 2
@@ -365,6 +379,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "stick"
item_state = "stick"
+ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
force = 3
throwforce = 5
throw_speed = 2
@@ -387,6 +403,8 @@
desc = "A chainsaw that has replaced your arm."
icon_state = "chainsaw_on"
item_state = "mounted_chainsaw"
+ lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
flags = NODROP | ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
force = 21
@@ -462,6 +480,8 @@
icon = 'icons/obj/items.dmi'
icon_state = "baseball_bat"
item_state = "baseball_bat"
+ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
force = 10
throwforce = 12
attack_verb = list("beat", "smacked")
@@ -520,11 +540,13 @@
return 1
/obj/item/weapon/melee/flyswatter
- name = "Flyswatter"
+ name = "flyswatter"
desc = "Useful for killing insects of all sizes."
icon = 'icons/obj/weapons.dmi'
icon_state = "flyswatter"
item_state = "flyswatter"
+ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
force = 1
throwforce = 1
attack_verb = list("swatted", "smacked")
@@ -533,8 +555,8 @@
//Things in this list will be instantly splatted. Flyman weakness is handled in the flyman species weakness proc.
var/list/strong_against
-/obj/item/weapon/melee/flyswatter/New()
- ..()
+/obj/item/weapon/melee/flyswatter/Initialize()
+ . = ..()
strong_against = typecacheof(list(
/mob/living/simple_animal/hostile/poison/bees/,
/mob/living/simple_animal/butterfly,
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index facab21cc0..b1103ac1da 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -16,12 +16,10 @@
queue_smooth(src)
queue_smooth_neighbors(src)
icon_state = ""
- if(SSticker)
- GLOB.cameranet.updateVisibility(src)
+ GLOB.cameranet.updateVisibility(src)
/obj/structure/Destroy()
- if(SSticker)
- GLOB.cameranet.updateVisibility(src)
+ GLOB.cameranet.updateVisibility(src)
if(smooth)
queue_smooth_neighbors(src)
return ..()
diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm
index 19a4439720..040f83ded2 100644
--- a/code/game/objects/structures/beds_chairs/bed.dm
+++ b/code/game/objects/structures/beds_chairs/bed.dm
@@ -49,7 +49,7 @@
var/foldabletype = /obj/item/roller
/obj/structure/bed/roller/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W,/obj/item/roller/robo))
+ if(istype(W, /obj/item/roller/robo))
var/obj/item/roller/robo/R = W
if(R.loaded)
to_chat(user, "You already have a roller bed docked!")
@@ -162,6 +162,26 @@
buildstackamount = 10
var/mob/living/owner = null
+/obj/structure/bed/dogbed/ian
+ desc = "Ian's bed! Looks comfy."
+ name = "Ian's bed"
+ anchored = TRUE
+
+/obj/structure/bed/dogbed/cayenne
+ desc = "Seems kind of... fishy."
+ name = "Cayenne's bed"
+ anchored = TRUE
+
+/obj/structure/bed/dogbed/renault
+ desc = "Renault's bed! Looks comfy. A foxy person needs a foxy pet."
+ name = "Renault's bed"
+ anchored = TRUE
+
+/obj/structure/bed/dogbed/runtime
+ desc = "A comfy-looking cat bed. You can even strap your pet in, in case the gravity turns off."
+ name = "Runtime's bed"
+ anchored = TRUE
+
/obj/structure/bed/dogbed/proc/update_owner(mob/living/M)
owner = M
name = "[M]'s bed"
@@ -174,4 +194,4 @@
/obj/structure/bed/alien
name = "resting contraption"
desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
- icon_state = "abed"
+ icon_state = "abed"
\ No newline at end of file
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index c88d1f763c..96fb189ba5 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -225,6 +225,8 @@
icon = 'icons/obj/chairs.dmi'
icon_state = "chair_toppled"
item_state = "chair"
+ lefthand_file = 'icons/mob/inhands/misc/chairs_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/chairs_righthand.dmi'
w_class = WEIGHT_CLASS_HUGE
force = 8
throwforce = 10
@@ -245,7 +247,7 @@
/obj/item/chair/proc/plant(mob/user)
for(var/obj/A in get_turf(loc))
- if(istype(A,/obj/structure/chair))
+ if(istype(A, /obj/structure/chair))
to_chat(user, "There is already a chair here.")
return
if(A.density && !(A.flags & ON_BORDER))
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 206c9daf33..a149ed32ba 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -183,7 +183,7 @@ LINEN BINS
dream_messages = list("black")
/obj/item/weapon/bedsheet/centcom
- name = "\improper Centcom bedsheet"
+ name = "\improper CentCom bedsheet"
desc = "Woven with advanced nanothread for warmth as well as being very decorated, essential for all officials."
icon_state = "sheetcentcom"
item_color = "centcom"
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 17d6b7bf24..1babf2b407 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -38,7 +38,7 @@
/obj/structure/closet/Initialize(mapload)
if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents
addtimer(CALLBACK(src, .proc/take_contents), 0)
- ..()
+ . = ..()
update_icon()
PopulateContents()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 7edaf5ebe3..1aa8dffea2 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -218,7 +218,7 @@
..()
new /obj/item/clothing/shoes/sneakers/brown(src)
for(var/i in 1 to 3)
- new /obj/item/weapon/paper/Court (src)
+ new /obj/item/weapon/paper/fluff/jobs/security/court_judgement (src)
new /obj/item/weapon/pen (src)
new /obj/item/clothing/suit/judgerobe (src)
new /obj/item/clothing/head/powdered_wig (src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm.rej b/code/game/objects/structures/crates_lockers/closets/secure/security.dm.rej
deleted file mode 100644
index 2fe11f47d0..0000000000
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm.rej
+++ /dev/null
@@ -1,30 +0,0 @@
-diff a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm (rejected hunks)
-@@ -203,7 +203,7 @@
- anchored = TRUE
- name = "Secure Evidence Closet"
- req_access_txt = "0"
-- req_one_access_txt = list(GLOB.access_armory, GLOB.access_forensics_lockers)
-+ req_one_access_txt = list(ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS)
-
- /obj/structure/closet/secure_closet/brig/PopulateContents()
- ..()
-@@ -227,16 +227,16 @@
- /obj/structure/closet/secure_closet/contraband/armory
- anchored = TRUE
- name = "Contraband Locker"
-- req_access = list(GLOB.access_armory)
-+ req_access = list(ACCESS_ARMORY)
-
- /obj/structure/closet/secure_closet/contraband/heads
- anchored = TRUE
- name = "Contraband Locker"
-- req_access = list(GLOB.access_heads)
-+ req_access = list(ACCESS_HEADS)
-
- /obj/structure/closet/secure_closet/armory1
- name = "armory armor locker"
-- req_access = list(GLOB.access_armory)
-+ req_access = list(ACCESS_ARMORY)
- icon_state = "armory"
-
- /obj/structure/closet/secure_closet/armory1/PopulateContents()
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index 1b864d1813..441232e155 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -17,6 +17,9 @@
desc = "It's a storage unit for emergency breath masks and O2 tanks."
icon_state = "emergency"
+/obj/structure/closet/emcloset/anchored
+ anchored = TRUE
+
/obj/structure/closet/emcloset/PopulateContents()
..()
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index d5626bdcea..15f925523f 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -13,7 +13,7 @@
climb_time = 10 //real fast, because let's be honest stepping into or onto a crate is easy
climb_stun = 0 //climbing onto crates isn't hard, guys
delivery_icon = "deliverycrate"
- var/obj/item/weapon/paper/manifest/manifest
+ var/obj/item/weapon/paper/fluff/jobs/cargo/manifest/manifest
/obj/structure/closet/crate/New()
..()
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 011cb6978d..494b35953d 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -132,7 +132,7 @@
else
to_chat(user, "[src] is already in good condition!")
return
- else if(!alert && istype(W,/obj/item/weapon/crowbar) && openable) //Only applies to the lab cage and player made display cases
+ else if(!alert && istype(W, /obj/item/weapon/crowbar) && openable) //Only applies to the lab cage and player made display cases
if(broken)
if(showpiece)
to_chat(user, "Remove the displayed object first.")
diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm
index 064d056cf1..bfd3dea037 100644
--- a/code/game/objects/structures/fireaxe.dm
+++ b/code/game/objects/structures/fireaxe.dm
@@ -12,8 +12,8 @@
max_integrity = 150
integrity_failure = 50
-/obj/structure/fireaxecabinet/New()
- ..()
+/obj/structure/fireaxecabinet/Initialize()
+ . = ..()
update_icon()
/obj/structure/fireaxecabinet/Destroy()
@@ -22,7 +22,7 @@
return ..()
/obj/structure/fireaxecabinet/attackby(obj/item/I, mob/user, params)
- if(iscyborg(user) || istype(I,/obj/item/device/multitool))
+ if(iscyborg(user) || istype(I, /obj/item/device/multitool))
toggle_lock(user)
else if(istype(I, /obj/item/weapon/weldingtool) && user.a_intent == INTENT_HELP && !broken)
var/obj/item/weapon/weldingtool/WT = I
diff --git a/code/game/objects/structures/fireplace.dm b/code/game/objects/structures/fireplace.dm
index f98e24670d..388e140fe5 100644
--- a/code/game/objects/structures/fireplace.dm
+++ b/code/game/objects/structures/fireplace.dm
@@ -38,7 +38,7 @@
return TRUE
/obj/structure/fireplace/attackby(obj/item/T, mob/user)
- if(istype(T,/obj/item/stack/sheet/mineral/wood))
+ if(istype(T, /obj/item/stack/sheet/mineral/wood))
var/obj/item/stack/sheet/mineral/wood/wood = T
var/space_remaining = MAXIMUM_BURN_TIMER - burn_time_remaining()
var/space_for_logs = round(space_remaining / LOG_BURN_TIMER)
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index f152634e38..ed222445af 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -114,7 +114,7 @@
to_chat(user, "There is already a false wall present!")
return
- if(istype(W,/obj/item/stack/rods))
+ if(istype(W, /obj/item/stack/rods))
var/obj/item/stack/rods/S = W
if(state == GIRDER_DISPLACED)
if(S.get_amount() < 2)
@@ -145,11 +145,11 @@
qdel(src)
return
- if(!istype(W,/obj/item/stack/sheet))
+ if(!istype(W, /obj/item/stack/sheet))
return
var/obj/item/stack/sheet/S = W
- if(istype(S,/obj/item/stack/sheet/metal))
+ if(istype(S, /obj/item/stack/sheet/metal))
if(state == GIRDER_DISPLACED)
if(S.get_amount() < 2)
to_chat(user, "You need two sheets of metal to create a false wall!")
@@ -179,7 +179,7 @@
qdel(src)
return
- if(istype(S,/obj/item/stack/sheet/plasteel))
+ if(istype(S, /obj/item/stack/sheet/plasteel))
if(state == GIRDER_DISPLACED)
if(S.get_amount() < 2)
to_chat(user, "You need at least two sheets to create a false wall!")
@@ -282,7 +282,7 @@
/obj/structure/girder/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
- var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
+ var/remains = pick(/obj/item/stack/rods, /obj/item/stack/sheet/metal)
new remains(loc)
qdel(src)
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 8d938c536c..b64a6a0aeb 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -122,7 +122,7 @@
icon_state = initial_state
/obj/structure/mineral_door/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W,/obj/item/weapon/pickaxe))
+ if(istype(W, /obj/item/weapon/pickaxe))
var/obj/item/weapon/pickaxe/digTool = W
to_chat(user, "You start digging the [name]...")
if(do_after(user,digTool.digspeed*(1+round(max_integrity*0.01)), target = src) && src)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 8e1574019f..d7777cc69c 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -138,9 +138,9 @@
icon_state = "morgue4" // Cloneable
break
-/obj/item/weapon/paper/morguereminder
+/obj/item/weapon/paper/guides/jobs/medical/morgue
name = "morgue memo"
- info = "Since this station's medbay never seems to fail to be staffed by the mindless monkeys meant for genetics experiments, I'm leaving a reminder here for anyone handling the pile of cadavers the quacks are sure to leave.
Red lights mean there's a plain ol' dead body inside.
Yellow lights mean there's non-body objects inside. Probably stuff pried off a corpse someone grabbed, or if you're lucky it's stashed booze.
Green lights mean the morgue system detects the body may be able to be cloned. I don't know how that works, but keep it away from the kitchen and go yell at the geneticists.
- Centcom medical inspector"
+ info = "Since this station's medbay never seems to fail to be staffed by the mindless monkeys meant for genetics experiments, I'm leaving a reminder here for anyone handling the pile of cadavers the quacks are sure to leave.
Red lights mean there's a plain ol' dead body inside.
Yellow lights mean there's non-body objects inside. Probably stuff pried off a corpse someone grabbed, or if you're lucky it's stashed booze.
Green lights mean the morgue system detects the body may be able to be cloned. I don't know how that works, but keep it away from the kitchen and go yell at the geneticists.
- CentCom medical inspector"
/*
* Crematorium
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index b57ab68641..2040f86607 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -71,9 +71,11 @@
continue
LAZYADD(hearing_mobs, M)
last_hearcheck = world.time
+
+ var/sound/music_played = sound(soundfile)
for(var/i in hearing_mobs)
var/mob/M = i
- M.playsound_local(source, soundfile, 100, falloff = 5)
+ M.playsound_local(source, null, 100, falloff = 5, S = music_played)
/datum/song/proc/updateDialog(mob/user)
instrumentObj.updateDialog() // assumes it's an object in world, override if otherwise
@@ -172,7 +174,7 @@
if(help)
dat += "Hide Help "
dat += {"
- Lines are a series of chords, separated by commas (,), each with notes seperated by hyphens (-).
+ Lines are a series of chords, separated by commas (,), each with notes separated by hyphens (-).
Every note in a chord will play together, with chord timed by the tempo.
Notes are played by the names of the note, and optionally, the accidental, and/or the octave number.
diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm
index 3936b2770d..0b9745f0d6 100644
--- a/code/game/objects/structures/reflector.dm
+++ b/code/game/objects/structures/reflector.dm
@@ -76,7 +76,7 @@
anchored = 0
to_chat(user, "You cut \the [src] free from the floor.")
//Finishing the frame
- else if(istype(W,/obj/item/stack/sheet))
+ else if(istype(W, /obj/item/stack/sheet))
if(finished)
return
var/obj/item/stack/sheet/S = W
@@ -88,7 +88,7 @@
S.use(5)
new /obj/structure/reflector/single (src.loc)
qdel (src)
- if(istype(W,/obj/item/stack/sheet/rglass))
+ if(istype(W, /obj/item/stack/sheet/rglass))
if(S.get_amount() < 10)
to_chat(user, "You need ten sheets of reinforced glass to create a double reflector!")
return
@@ -148,6 +148,9 @@
buildstacktype = /obj/item/stack/sheet/glass
buildstackamount = 5
+/obj/structure/reflector/single/anchored
+ anchored = TRUE
+
/obj/structure/reflector/single/get_reflection(srcdir,pdir)
var/new_dir = rotations["[srcdir]"]["[pdir]"]
return new_dir
@@ -171,6 +174,9 @@
buildstacktype = /obj/item/stack/sheet/rglass
buildstackamount = 10
+/obj/structure/reflector/double/anchored
+ anchored = TRUE
+
/obj/structure/reflector/double/get_reflection(srcdir,pdir)
var/new_dir = double_rotations["[srcdir]"]["[pdir]"]
return new_dir
@@ -194,6 +200,9 @@
buildstacktype = /obj/item/stack/sheet/mineral/diamond
buildstackamount = 1
+/obj/structure/reflector/box/anchored
+ anchored = TRUE
+
/obj/structure/reflector/box/get_reflection(srcdir,pdir)
var/new_dir = box_rotations["[srcdir]"]["[pdir]"]
return new_dir
diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm
index 4e9d7b896b..5ac194ece3 100644
--- a/code/game/objects/structures/showcase.dm
+++ b/code/game/objects/structures/showcase.dm
@@ -12,7 +12,7 @@
var/deconstruction_state = SHOWCASE_CONSTRUCTED
/obj/structure/showcase/fakeid
- name = "\improper Centcom identification console"
+ name = "\improper CentCom identification console"
desc = "You can use this to change ID's."
icon = 'icons/obj/computer.dmi'
icon_state = "computer"
@@ -23,7 +23,7 @@
add_overlay("id_key")
/obj/structure/showcase/fakesec
- name = "\improper Centcom security records"
+ name = "\improper CentCom security records"
desc = "Used to view and edit personnel's security records"
icon = 'icons/obj/computer.dmi'
icon_state = "computer"
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 9195c243a5..9a25da9019 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -244,6 +244,36 @@
desc = "A sign labelling an area as a place where xenobiological entities are researched."
icon_state = "xenobio"
+/obj/structure/sign/evac
+ name = "\improper EVACUATION"
+ desc = "A sign labelling an area where evacuation procedures take place."
+ icon_state = "evac"
+
+/obj/structure/sign/custodian
+ name = "\improper CUSTODIAN"
+ desc = "A sign labelling an area where the custodian works."
+ icon_state = "custodian"
+
+/obj/structure/sign/engineering
+ name = "\improper ENGINEERING"
+ desc = "A sign labelling an area where engineers work."
+ icon_state = "engine"
+
+/obj/structure/sign/cargo
+ name = "\improper CARGO"
+ desc = "A sign labelling an area where cargo ships dock."
+ icon_state = "cargo"
+
+/obj/structure/sign/security
+ name = "\improper SECURITY"
+ desc = "A sign labelling an area where the law is law."
+ icon_state = "security"
+
+/obj/structure/sign/holy
+ name = "\improper HOLY"
+ desc = "A sign labelling a religious area."
+ icon_state = "holy"
+
/obj/structure/sign/xeno_warning_mining
name = "DANGEROUS ALIEN LIFE"
desc = "A sign that warns would-be travellers of hostile alien life in the vicinity."
@@ -289,3 +319,8 @@
name = "command department"
desc = "A direction sign, pointing out which way the Command department is."
icon_state = "direction_bridge"
+
+/obj/structure/sign/logo
+ name = "station logo"
+ desc = "A sign: SPACE STATION 13."
+ icon_state = "ss13sign-1"
\ No newline at end of file
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 884853b6d8..0be8d40402 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -155,10 +155,10 @@
/obj/structure/statue/plasma/bullet_act(obj/item/projectile/Proj)
var/burn = FALSE
- if(istype(Proj,/obj/item/projectile/beam))
+ if(istype(Proj, /obj/item/projectile/beam))
PlasmaBurn(2500)
burn = TRUE
- else if(istype(Proj,/obj/item/projectile/ion))
+ else if(istype(Proj, /obj/item/projectile/ion))
PlasmaBurn(500)
burn = TRUE
if(burn)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index c481393f2f..29920a6db4 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -266,7 +266,7 @@
frame = /obj/structure/table_frame
framestack = /obj/item/stack/rods
buildstack = /obj/item/stack/tile/carpet
- canSmoothWith = list(/obj/structure/table/wood/fancy,/obj/structure/table/wood/fancy/black)
+ canSmoothWith = list(/obj/structure/table/wood/fancy, /obj/structure/table/wood/fancy/black)
/obj/structure/table/wood/fancy/New()
icon = 'icons/obj/smooth_structures/fancy_table.dmi' //so that the tables place correctly in the map editor
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 8d796904fd..1b8a6635ee 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -222,7 +222,7 @@
if(isliving(G))
var/mob/living/L = G
wash_mob(L)
- else
+ else if(isobj(G)) // Skip the light objects
wash_obj(G)
else
if(isopenturf(loc))
@@ -286,7 +286,7 @@
wash_obj(O)
-/obj/machinery/shower/proc/wash_obj(atom/movable/O)
+/obj/machinery/shower/proc/wash_obj(obj/O)
. = O.clean_blood()
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
if(isitem(O))
diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm
index 0598d88a59..69c6c89870 100644
--- a/code/game/objects/weapons.dm
+++ b/code/game/objects/weapons.dm
@@ -2,8 +2,8 @@
name = "weapon"
icon = 'icons/obj/weapons.dmi'
-/obj/item/weapon/New()
- ..()
+/obj/item/weapon/Initialize()
+ . = ..()
if(!hitsound)
if(damtype == "fire")
hitsound = 'sound/items/welder.ogg'
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 3cbe2893b7..c728071e50 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -1,40 +1,40 @@
-/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff, surround = 1, frequency = null, channel = 0, pressure_affected = TRUE)
-
- soundin = get_sfx(soundin) // same sound for everyone
-
+/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff, frequency = null, channel = 0, pressure_affected = TRUE)
if(isarea(source))
throw EXCEPTION("playsound(): source is an area")
return
- if(isnull(frequency))
- frequency = get_rand_frequency() // Same frequency for everybody
var/turf/turf_source = get_turf(source)
//allocate a channel if necessary now so its the same for everyone
channel = channel || open_sound_channel()
// Looping through the player list has the added bonus of working for mobs inside containers
- for (var/P in GLOB.player_list)
+ var/sound/S = sound(get_sfx(soundin))
+ var/maxdistance = (world.view + extrarange) * 3
+ for(var/P in GLOB.player_list)
var/mob/M = P
if(!M || !M.client)
continue
- if(get_dist(M, turf_source) <= world.view + extrarange)
- var/turf/T = get_turf(M)
- if(T && T.z == turf_source.z)
- M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, surround, channel, pressure_affected)
+ var/distance = get_dist(M, turf_source)
-/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, surround = 1, channel = 0, pressure_affected = TRUE)
+ if(distance <= maxdistance)
+ var/turf/T = get_turf(M)
+
+ if(T && T.z == turf_source.z)
+ M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S)
+
+/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, channel = 0, pressure_affected = TRUE, sound/S)
if(!client || !can_hear())
return
- soundin = get_sfx(soundin)
+ if(!S)
+ S = sound(get_sfx(soundin))
- var/sound/S = sound(soundin)
S.wait = 0 //No queue
S.channel = channel || open_sound_channel()
S.volume = vol
- if (vary)
+ if(vary)
if(frequency)
S.frequency = frequency
else
@@ -43,6 +43,11 @@
if(isturf(turf_source))
var/turf/T = get_turf(src)
+ //sound volume falloff with distance
+ var/distance = get_dist(T, turf_source)
+
+ S.volume -= max(distance - world.view, 0) * 2 //multiplicative falloff to add on top of natural audio falloff.
+
if(pressure_affected)
//Atmosphere affects sound
var/pressure_factor = 1
@@ -56,27 +61,22 @@
else //space
pressure_factor = 0
- var/distance = get_dist(T, turf_source)
if(distance <= 1)
pressure_factor = max(pressure_factor, 0.15) //touching the source of the sound
S.volume *= pressure_factor
//End Atmosphere affecting sound
- if(S.volume <= 0)
- return //No sound
-
- // 3D sounds, the technology is here!
- if (surround)
- var/dx = turf_source.x - T.x // Hearing from the right/left
- S.x = round(max(-SURROUND_CAP, min(SURROUND_CAP, dx)), 1)
-
- var/dz = turf_source.y - T.y // Hearing from infront/behind
- S.z = round(max(-SURROUND_CAP, min(SURROUND_CAP, dz)), 1)
+ if(S.volume <= 0)
+ return //No sound
+ var/dx = turf_source.x - T.x // Hearing from the right/left
+ S.x = dx
+ var/dz = turf_source.y - T.y // Hearing from infront/behind
+ S.z = dz
// The y value is for above your head, but there is no ceiling in 2d spessmens.
S.y = 1
- S.falloff = falloff || FALLOFF_SOUNDS
+ S.falloff = (falloff ? falloff : FALLOFF_SOUNDS)
src << S
@@ -85,7 +85,7 @@
for(var/M in GLOB.player_list)
if(ismob(M) && !isnewplayer(M))
var/mob/MO = M
- MO.playsound_local(get_turf(MO), sound, volume, vary, pressure_affected = FALSE)
+ MO.playsound_local(MO, sound, volume, vary, pressure_affected = FALSE)
/proc/open_sound_channel()
var/static/next_channel = 1 //loop through the available 1024 - (the ones we reserve) channels and pray that its not still being used
@@ -176,6 +176,6 @@
'sound/vore/prey/death_10.ogg')
return soundin
-/proc/playsound_global(file, repeat=0, wait, channel, volume)
+/proc/playsound_global(file, repeat = 0, wait, channel, volume)
for(var/V in GLOB.clients)
V << sound(file, repeat, wait, channel, volume)
diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm
index 0b87c28f8f..2ea3ffe7fc 100644
--- a/code/game/turfs/closed.dm
+++ b/code/game/turfs/closed.dm
@@ -75,7 +75,7 @@
underlays += mutable_appearance('icons/turf/floors.dmi', "plating") //add the plating underlay, below the grille
/turf/closed/indestructible/fakedoor
- name = "Centcom Access"
+ name = "CentCom Access"
icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi'
icon_state = "fake_door"
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index 82ff907a04..a990530056 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -18,6 +18,7 @@
var/sound
/turf/open/indestructible/sound/Entered(var/mob/AM)
+ ..()
if(istype(AM))
playsound(src,sound,50,1)
diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm
index 968e782984..a51240c969 100644
--- a/code/game/turfs/simulated/chasm.dm
+++ b/code/game/turfs/simulated/chasm.dm
@@ -22,6 +22,7 @@
return
/turf/open/chasm/Entered(atom/movable/AM)
+ ..()
START_PROCESSING(SSobj, src)
drop_stuff(AM)
diff --git a/code/game/turfs/simulated/dirtystation.dm b/code/game/turfs/simulated/dirtystation.dm
index 1c59cd2999..7be9b6cd34 100644
--- a/code/game/turfs/simulated/dirtystation.dm
+++ b/code/game/turfs/simulated/dirtystation.dm
@@ -32,7 +32,7 @@
if(prob(80)) //mid dirt - 1/15
return
- if(istype(A, /area/engine) || istype(A, /area/crew_quarters/heads/chief) || istype(A,/area/assembly) || istype(A, /area/science/robotics) || istype(A,/area/maintenance) || istype(A,/area/construction))
+ if(istype(A, /area/engine) || istype(A, /area/crew_quarters/heads/chief) || istype(A, /area/assembly) || istype(A, /area/science/robotics) || istype(A, /area/maintenance) || istype(A, /area/construction))
//Blood, sweat, and oil. Oh, and dirt.
if(prob(3))
new /obj/effect/decal/cleanable/blood/old(src)
diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm
index 49da7959ab..f3f8fc5959 100644
--- a/code/game/turfs/simulated/floor/light_floor.dm
+++ b/code/game/turfs/simulated/floor/light_floor.dm
@@ -67,7 +67,7 @@
/turf/open/floor/light/attackby(obj/item/C, mob/user, params)
if(..())
return
- if(istype(C,/obj/item/weapon/light/bulb)) //only for light tiles
+ if(istype(C, /obj/item/weapon/light/bulb)) //only for light tiles
if(state && user.drop_item())
qdel(C)
state = 0 //fixing it by bashing it with a light bulb, fun eh?
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index 810a77fc42..89af274e58 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -49,6 +49,9 @@
/turf/open/floor/circuit/telecomms
initial_gas_mix = "n2=100;TEMP=80"
+/turf/open/floor/circuit/telecomms/mainframe
+ name = "Mainframe Base"
+
/turf/open/floor/circuit/green
icon_state = "gcircuit"
icon_normal = "gcircuit"
@@ -70,6 +73,9 @@
/turf/open/floor/circuit/green/telecomms
initial_gas_mix = "n2=100;TEMP=80"
+/turf/open/floor/circuit/green/telecomms/mainframe
+ name = "Mainframe Base"
+
/turf/open/floor/circuit/red
icon_state = "rcircuit"
icon_normal = "rcircuit"
@@ -265,4 +271,4 @@
//Do this *after* the turf has changed as qdel in spacevines will call changeturf again if it hasn't
for(var/obj/structure/spacevine/SV in src)
if(!QDESTROYING(SV))//Helps avoid recursive loops
- qdel(SV)
+ qdel(SV)
\ No newline at end of file
diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm
index 039d278baf..23471ccd5f 100644
--- a/code/game/turfs/simulated/floor/plasteel_floor.dm
+++ b/code/game/turfs/simulated/floor/plasteel_floor.dm
@@ -17,6 +17,10 @@
/turf/open/floor/plasteel/black
icon_state = "dark"
+/turf/open/floor/plasteel/black/telecomms
+ initial_gas_mix = "n2=100;TEMP=80"
+/turf/open/floor/plasteel/black/telecomms/mainframe
+ name = "Mainframe Floor"
/turf/open/floor/plasteel/airless/black
icon_state = "dark"
/turf/open/floor/plasteel/black/side
@@ -43,6 +47,10 @@
/turf/open/floor/plasteel/brown
icon_state = "brown"
+/turf/open/floor/plasteel/brown/telecomms
+ initial_gas_mix = "n2=100;TEMP=80"
+/turf/open/floor/plasteel/brown/telecomms/mainframe
+ name = "Mainframe Floor"
/turf/open/floor/plasteel/brown/corner
icon_state = "browncorner"
@@ -59,6 +67,8 @@
icon_state = "greenfull"
/turf/open/floor/plasteel/green/side
icon_state = "green"
+/turf/open/floor/plasteel/green/side/telecomms
+ initial_gas_mix = "n2=100;TEMP=80"
/turf/open/floor/plasteel/green/corner
icon_state = "greencorner"
@@ -66,6 +76,8 @@
icon_state = "darkgreenfull"
/turf/open/floor/plasteel/darkgreen/side
icon_state = "darkgreen"
+/turf/open/floor/plasteel/darkgreen/side/telecomms
+ initial_gas_mix = "n2=100;TEMP=80"
/turf/open/floor/plasteel/darkgreen/corner
icon_state = "darkgreencorners"
@@ -89,6 +101,8 @@
icon_state = "darkredfull"
/turf/open/floor/plasteel/darkred/side
icon_state = "darkred"
+/turf/open/floor/plasteel/darkred/side/telecomms
+ initial_gas_mix = "n2=100;TEMP=80"
/turf/open/floor/plasteel/darkred/corner
icon_state = "darkredcorners"
@@ -112,6 +126,8 @@
icon_state = "darkbluefull"
/turf/open/floor/plasteel/darkblue/side
icon_state = "darkblue"
+/turf/open/floor/plasteel/darkblue/side/telecomms
+ initial_gas_mix = "n2=100;TEMP=80"
/turf/open/floor/plasteel/darkblue/corner
icon_state = "darkbluecorners"
@@ -119,6 +135,8 @@
icon_state = "whitebluefull"
/turf/open/floor/plasteel/whiteblue/side
icon_state = "whiteblue"
+/turf/open/floor/plasteel/whiteblue/side/telecomms
+ initial_gas_mix = "n2=100;TEMP=80"
/turf/open/floor/plasteel/whiteblue/corner
icon_state = "whitebluecorner"
@@ -135,6 +153,8 @@
icon_state = "darkyellowfull"
/turf/open/floor/plasteel/darkyellow/side
icon_state = "darkyellow"
+/turf/open/floor/plasteel/darkyellow/side/telecomms
+ initial_gas_mix = "n2=100;TEMP=80"
/turf/open/floor/plasteel/darkyellow/corner
icon_state = "darkyellowcorners"
@@ -158,6 +178,8 @@
icon_state = "darkpurplefull"
/turf/open/floor/plasteel/darkpurple/side
icon_state = "darkpurple"
+/turf/open/floor/plasteel/darkpurple/side/telecomms
+ initial_gas_mix = "n2=100;TEMP=80"
/turf/open/floor/plasteel/darkpurple/corner
icon_state = "darkpurplecorners"
@@ -165,6 +187,8 @@
icon_state = "whitepurplefull"
/turf/open/floor/plasteel/whitepurple/side
icon_state = "whitepurple"
+/turf/open/floor/plasteel/whitepurple/side/telecomms
+ initial_gas_mix = "n2=100;TEMP=80"
/turf/open/floor/plasteel/whitepurple/corner
icon_state = "whitepurplecorner"
@@ -181,6 +205,8 @@
icon_state = "neutralfull"
/turf/open/floor/plasteel/neutral/side
icon_state = "neutral"
+/turf/open/floor/plasteel/neutral/side/telecomms
+ initial_gas_mix = "n2=100;TEMP=80"
/turf/open/floor/plasteel/neutral/corner
icon_state = "neutralcorner"
@@ -325,6 +351,10 @@
/turf/open/floor/plasteel/vault
icon_state = "vault"
+/turf/open/floor/plasteel/vault/telecomms
+ initial_gas_mix = "n2=100;TEMP=80"
+/turf/open/floor/plasteel/vault/telecomms/mainframe
+ name = "Mainframe Floor"
/turf/open/floor/plasteel/cult
icon_state = "cult"
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 3ca061b2c9..c961b9243c 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -53,7 +53,7 @@
if(!W.use(1))
return
var/turf/open/floor/T = ChangeTurf(W.turf_type)
- if(istype(W,/obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow
+ if(istype(W, /obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow
var/obj/item/stack/tile/light/L = W
var/turf/open/floor/light/F = T
F.state = L.state
diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm
index c48a282fb1..ec84bff35d 100644
--- a/code/game/turfs/simulated/floor/plating/asteroid.dm
+++ b/code/game/turfs/simulated/floor/plating/asteroid.dm
@@ -17,7 +17,7 @@
/turf/open/floor/plating/asteroid/Initialize()
var/proper_name = name
- ..()
+ . = ..()
name = proper_name
if(prob(floor_variance))
icon_state = "[environment_type][rand(0,12)]"
@@ -71,7 +71,7 @@
gets_dug()
SSblackbox.add_details("pick_used_mining","[W.type]")
- if(istype(W,/obj/item/weapon/storage/bag/ore))
+ if(istype(W, /obj/item/weapon/storage/bag/ore))
var/obj/item/weapon/storage/bag/ore/S = W
if(S.collection_mode == 1)
for(var/obj/item/weapon/ore/O in src.contents)
@@ -83,7 +83,7 @@
if(!Z.use(1))
return
var/turf/open/floor/T = ChangeTurf(Z.turf_type)
- if(istype(Z,/obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow
+ if(istype(Z, /obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow
var/obj/item/stack/tile/light/L = Z
var/turf/open/floor/light/F = T
F.state = L.state
@@ -124,7 +124,7 @@
initial_gas_mix = "TEMP=2.7"
/turf/open/floor/plating/asteroid/basalt/Initialize()
- ..()
+ . = ..()
set_basalt_light(src)
/proc/set_basalt_light(turf/open/floor/B)
diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm
index cf0ec5531c..9a6d5eb467 100644
--- a/code/game/turfs/simulated/floor/plating/misc_plating.dm
+++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm
@@ -8,7 +8,7 @@
icon_state = "alienpod1"
/turf/open/floor/plating/abductor/Initialize()
- ..()
+ . = ..()
icon_state = "alienpod[rand(1,9)]"
@@ -46,7 +46,7 @@
pixel_y = -4
pixel_x = -4
icon = smooth_icon
- ..()
+ . = ..()
/turf/open/floor/plating/ashplanet/break_tile()
return
@@ -74,7 +74,7 @@
/turf/open/floor/plating/ashplanet/wateryrock/Initialize()
icon_state = "[icon_state][rand(1, 9)]"
- ..()
+ . = ..()
/turf/open/floor/plating/beach
@@ -114,7 +114,7 @@
desc = "Like sand, but more metal."
/turf/open/floor/plating/ironsand/Initialize()
- ..()
+ . = ..()
icon_state = "ironsand[rand(1,15)]"
/turf/open/floor/plating/ironsand/burn_tile()
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index e558e2ea3f..0c9b8259ad 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -108,12 +108,12 @@
return
else if(iscyborg(AM))
var/mob/living/silicon/robot/R = AM
- if(istype(R.module_active,/obj/item/weapon/pickaxe))
+ if(istype(R.module_active, /obj/item/weapon/pickaxe))
src.attackby(R.module_active,R)
return
-/* else if(istype(AM,/obj/mecha))
+/* else if(istype(AM, /obj/mecha))
var/obj/mecha/M = AM
- if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/drill))
+ if(istype(M.selected, /obj/item/mecha_parts/mecha_equipment/drill))
src.attackby(M.selected,M)
return*/
//Aparantly mechs are just TOO COOL to call Collide())
diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm
index a122131942..7e1181413e 100644
--- a/code/game/turfs/simulated/wall/mineral_walls.dm
+++ b/code/game/turfs/simulated/wall/mineral_walls.dm
@@ -122,9 +122,9 @@
PlasmaBurn(exposed_temperature)
/turf/closed/wall/mineral/plasma/bullet_act(var/obj/item/projectile/Proj)
- if(istype(Proj,/obj/item/projectile/beam))
+ if(istype(Proj, /obj/item/projectile/beam))
PlasmaBurn(2500)
- else if(istype(Proj,/obj/item/projectile/ion))
+ else if(istype(Proj, /obj/item/projectile/ion))
PlasmaBurn(500)
..()
diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm
index 64a03cef44..d0eaad34e3 100644
--- a/code/game/turfs/simulated/wall/misc_walls.dm
+++ b/code/game/turfs/simulated/wall/misc_walls.dm
@@ -106,7 +106,7 @@
ChangeTurf(/turf/open/floor/clockwork)
for(var/obj/O in src) //Eject contents!
- if(istype(O,/obj/structure/sign/poster))
+ if(istype(O, /obj/structure/sign/poster))
var/obj/structure/sign/poster/P = O
P.roll_and_drop(src)
else
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index bea9841ee7..c343e68922 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -52,7 +52,7 @@
transfer_fingerprints_to(newgirder)
for(var/obj/O in src.contents) //Eject contents!
- if(istype(O,/obj/structure/sign/poster))
+ if(istype(O, /obj/structure/sign/poster))
var/obj/structure/sign/poster/P = O
P.roll_and_drop(src)
@@ -167,13 +167,13 @@
/turf/closed/wall/proc/try_wallmount(obj/item/weapon/W, mob/user, turf/T)
//check for wall mounted frames
- if(istype(W,/obj/item/wallframe))
+ if(istype(W, /obj/item/wallframe))
var/obj/item/wallframe/F = W
if(F.try_build(src, user))
F.attach(src, user)
return 1
//Poster stuff
- else if(istype(W,/obj/item/weapon/poster))
+ else if(istype(W, /obj/item/weapon/poster))
place_poster(W,user)
return 1
diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm
index c7e6973c4d..b877fa9eac 100644
--- a/code/game/turfs/space/transit.dm
+++ b/code/game/turfs/space/transit.dm
@@ -25,6 +25,7 @@
dir = EAST
/turf/open/space/transit/Entered(atom/movable/AM, atom/OldLoc)
+ ..()
if(!locate(/obj/structure/lattice) in src)
throw_atom(AM)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 22a0e64155..4342d12714 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -9,7 +9,7 @@
var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed
var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to
- var/blocks_air = 0
+ var/blocks_air = FALSE
flags = CAN_BE_DIRTY
@@ -77,6 +77,7 @@
return
SSair.remove_from_active(src)
visibilityChanged()
+ QDEL_LIST(blueprint_data)
initialized = FALSE
requires_activation = FALSE
..()
@@ -84,16 +85,28 @@
/turf/attack_hand(mob/user)
user.Move_Pulled(src)
+/turf/proc/handleRCL(obj/item/weapon/twohanded/rcl/C, mob/user)
+ if(C.loaded)
+ for(var/obj/structure/cable/LC in src)
+ if(!LC.d1 || !LC.d2)
+ LC.handlecable(C, user)
+ return
+ C.loaded.place_turf(src, user)
+ C.is_empty(user)
+
/turf/attackby(obj/item/C, mob/user, params)
if(can_lay_cable() && istype(C, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/coil = C
for(var/obj/structure/cable/LC in src)
- if((LC.d1==0)||(LC.d2==0))
+ if(!LC.d1 || !LC.d2)
LC.attackby(C,user)
return
coil.place_turf(src, user)
return TRUE
+ else if(istype(C, /obj/item/weapon/twohanded/rcl))
+ handleRCL(C, user)
+
return FALSE
/turf/CanPass(atom/movable/mover, turf/target)
@@ -117,7 +130,7 @@
return FALSE
var/list/large_dense = list()
-
+
//Next, check objects to block entry that are on the border
for(var/atom/movable/border_obstacle in src)
if(border_obstacle.flags & ON_BORDER)
@@ -134,7 +147,7 @@
//Finally, check objects/mobs to block entry that are not on the border
var/atom/movable/tompost_bump
- var/top_layer = 0
+ var/top_layer = FALSE
for(var/atom/movable/obstacle in large_dense)
if(!obstacle.CanPass(mover, mover.loc, 1) && (forget != obstacle))
if(obstacle.layer > top_layer)
@@ -147,13 +160,14 @@
return TRUE //Nothing found to block so return success!
/turf/Entered(atom/movable/AM)
+ ..()
if(explosion_level && AM.ex_check(explosion_id))
AM.ex_act(explosion_level)
/turf/open/Entered(atom/movable/AM)
..()
//slipping
- if (istype(AM,/mob/living/carbon))
+ if (istype(AM, /mob/living/carbon))
var/mob/living/carbon/M = AM
if(M.movement_type & FLYING)
return
@@ -197,18 +211,30 @@
qdel(L)
//wrapper for ChangeTurf()s that you want to prevent/affect without overriding ChangeTurf() itself
-/turf/proc/TerraformTurf(path, new_baseturf, defer_change = FALSE, ignore_air = FALSE)
- return ChangeTurf(path, new_baseturf, defer_change, ignore_air)
+/turf/proc/TerraformTurf(path, new_baseturf, defer_change = FALSE, ignore_air = FALSE, forceop = FALSE)
+ return ChangeTurf(path, new_baseturf, defer_change, ignore_air, forceop)
//Creates a new turf
-/turf/proc/ChangeTurf(path, new_baseturf, defer_change = FALSE, ignore_air = FALSE)
+/turf/proc/ChangeTurf(path, new_baseturf, defer_change = FALSE, ignore_air = FALSE, forceop = FALSE)
if(!path)
return
- if(!GLOB.use_preloader && path == type) // Don't no-op if the map loader requires it to be reconstructed
+ if(!GLOB.use_preloader && path == type && !forceop) // Don't no-op if the map loader requires it to be reconstructed
return src
+ var/old_opacity = opacity
+ var/old_dynamic_lighting = dynamic_lighting
+ var/old_affecting_lights = affecting_lights
+ var/old_lighting_object = lighting_object
+ var/old_corners = corners
+
+ var/old_exl = explosion_level
+ var/old_exi = explosion_id
+ var/old_bp = blueprint_data
+ blueprint_data = null
+
var/old_baseturf = baseturf
changing_turf = TRUE
+
qdel(src) //Just get the side effects and call Destroy
var/turf/W = new path(src)
@@ -217,9 +243,31 @@
else
W.baseturf = old_baseturf
+ W.explosion_id = old_exi
+ W.explosion_level = old_exl
+
if(!defer_change)
W.AfterChange(ignore_air)
+ W.blueprint_data = old_bp
+
+ if(SSlighting.initialized)
+ recalc_atom_opacity()
+ lighting_object = old_lighting_object
+ affecting_lights = old_affecting_lights
+ corners = old_corners
+ if (old_opacity != opacity || dynamic_lighting != old_dynamic_lighting)
+ reconsider_lights()
+
+ if (dynamic_lighting != old_dynamic_lighting)
+ if (IS_DYNAMIC_LIGHTING(src))
+ lighting_build_overlay()
+ else
+ lighting_clear_overlay()
+
+ for(var/turf/open/space/S in RANGE_TURFS(1, src)) //RANGE_TURFS is in code\__HELPERS\game.dm
+ S.update_starlight()
+
return W
/turf/proc/AfterChange(ignore_air = FALSE) //called after a turf has been replaced in ChangeTurf()
@@ -338,8 +386,7 @@
return can_have_cabling() & !intact
/turf/proc/visibilityChanged()
- if(SSticker)
- GLOB.cameranet.updateVisibility(src)
+ GLOB.cameranet.updateVisibility(src)
/turf/proc/burn_tile()
@@ -398,25 +445,23 @@
I.setDir(AM.dir)
I.alpha = 128
- if(!blueprint_data)
- blueprint_data = list()
- blueprint_data += I
+ LAZYADD(blueprint_data, I)
/turf/proc/add_blueprints_preround(atom/movable/AM)
if(!SSticker.HasRoundStarted())
add_blueprints(AM)
-/turf/proc/empty(turf_type=/turf/open/space, baseturf_type)
+/turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, forceop = FALSE)
// Remove all atoms except observers, landmarks, docking ports
var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object))
- var/list/allowed_contents = typecache_filter_list(GetAllContents(),ignored_atoms,reversed=TRUE)
+ var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(ignore_typecache), ignored_atoms)
allowed_contents -= src
for(var/i in 1 to allowed_contents.len)
var/thing = allowed_contents[i]
qdel(thing, force=TRUE)
- var/turf/newT = ChangeTurf(turf_type, baseturf_type, FALSE, FALSE)
+ var/turf/newT = ChangeTurf(turf_type, baseturf_type, FALSE, FALSE, forceop = forceop)
SSair.remove_from_active(newT)
newT.CalculateAdjacentTurfs()
@@ -425,13 +470,12 @@
/turf/proc/is_transition_turf()
return
-
/turf/acid_act(acidpwr, acid_volume)
. = 1
var/acid_type = /obj/effect/acid
if(acidpwr >= 200) //alien acid power
acid_type = /obj/effect/acid/alien
- var/has_acid_effect = 0
+ var/has_acid_effect = FALSE
for(var/obj/O in src)
if(intact && O.level == 1) //hidden under the floor
continue
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 4bc6bd6794..7c20421d3c 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -181,9 +181,9 @@
set name = "Access Newscaster Network"
set desc = "Allows you to view, add and edit news feeds."
- if (!istype(src,/datum/admins))
+ if (!istype(src, /datum/admins))
src = usr.client.holder
- if (!istype(src,/datum/admins))
+ if (!istype(src, /datum/admins))
to_chat(usr, "Error: you are not an admin!")
return
var/dat
@@ -641,7 +641,7 @@
var/chosen = pick_closest_path(object)
if(!chosen)
return
- if(ispath(chosen,/turf))
+ if(ispath(chosen, /turf))
var/turf/T = get_turf(usr.loc)
T.ChangeTurf(chosen)
else
@@ -735,34 +735,33 @@
var/dat = "Manage Free Slots"
var/count = 0
- if(SSticker && !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert(usr, "You cannot manage jobs before the round starts!")
return
- if(SSjob)
- for(var/datum/job/job in SSjob.occupations)
- count++
- var/J_title = html_encode(job.title)
- var/J_opPos = html_encode(job.total_positions - (job.total_positions - job.current_positions))
- var/J_totPos = html_encode(job.total_positions)
- if(job.total_positions < 0)
- dat += "[J_title]: [J_opPos] (unlimited)"
- else
- dat += "[J_title]: [J_opPos]/[J_totPos]"
+ for(var/datum/job/job in SSjob.occupations)
+ count++
+ var/J_title = html_encode(job.title)
+ var/J_opPos = html_encode(job.total_positions - (job.total_positions - job.current_positions))
+ var/J_totPos = html_encode(job.total_positions)
+ if(job.total_positions < 0)
+ dat += "[J_title]: [J_opPos] (unlimited)"
+ else
+ dat += "[J_title]: [J_opPos]/[J_totPos]"
- if(job.title == "AI" || job.title == "Cyborg")
- dat += " (Cannot Late Join) "
- continue
- if(job.total_positions >= 0)
- dat += " Add | "
- if(job.total_positions > job.current_positions)
- dat += "Remove | "
- else
- dat += "Remove | "
- dat += "Unlimit"
+ if(job.title == "AI" || job.title == "Cyborg")
+ dat += " (Cannot Late Join) "
+ continue
+ if(job.total_positions >= 0)
+ dat += " Add | "
+ if(job.total_positions > job.current_positions)
+ dat += "Remove | "
else
- dat += " Limit"
- dat += " "
+ dat += "Remove | "
+ dat += "Unlimit"
+ else
+ dat += " Limit"
+ dat += " "
dat += ""
var/winheight = 100 + (count * 20)
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index a9e75c6028..73c2d8067e 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -119,7 +119,7 @@ GLOBAL_PROTECT(admin_ranks)
if(config.admin_legacy_system)
var/previous_rights = 0
- //load text from file and process each line seperately
+ //load text from file and process each line separately
for(var/line in world.file2list("config/admin_ranks.txt"))
if(!line)
continue
@@ -195,7 +195,7 @@ GLOBAL_PROTECT(admin_ranks)
//load text from file
var/list/lines = world.file2list("config/admins.txt")
- //process each line seperately
+ //process each line separately
for(var/line in lines)
if(!length(line))
continue
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index ac3d4cb21e..a839b35b3c 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -13,10 +13,11 @@ GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault())
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/secrets,
/client/proc/reload_admins,
- /client/proc/reestablish_db_connection,/*reattempt a connection to the database*/
+ /client/proc/reestablish_db_connection, /*reattempt a connection to the database*/
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
/client/proc/cmd_admin_ticket_panel,
+ /client/proc/panicbunker,
/client/proc/stop_sounds
)
GLOBAL_PROTECT(admin_verbs_admin)
@@ -33,7 +34,7 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
/datum/admins/proc/toggleenter, /*toggles whether people can join the current game*/
/datum/admins/proc/toggleguests, /*toggles whether guests can join the current game*/
/datum/admins/proc/announce, /*priority announce something to all clients.*/
- /datum/admins/proc/set_admin_notice,/*announcement all clients see when joining the server.*/
+ /datum/admins/proc/set_admin_notice, /*announcement all clients see when joining the server.*/
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
/client/proc/toggle_view_range, /*changes how far we can see*/
/datum/admins/proc/view_txt_log, /*shows the server log (world_game_log) for today*/
@@ -70,9 +71,9 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
/client/proc/respawn_character
)
GLOBAL_PROTECT(admin_verbs_ban)
-GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel,/client/proc/DB_ban_panel,/client/proc/stickybanpanel))
+GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/DB_ban_panel, /client/proc/stickybanpanel))
GLOBAL_PROTECT(admin_verbs_sounds)
-GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound,/client/proc/play_sound,/client/proc/set_round_end_sound))
+GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound, /client/proc/play_sound, /client/proc/set_round_end_sound))
GLOBAL_PROTECT(admin_verbs_fun)
GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/cmd_admin_dress,
@@ -97,7 +98,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/smite
))
GLOBAL_PROTECT(admin_verbs_spawn)
-GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom,/client/proc/respawn_character))
+GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /client/proc/respawn_character))
GLOBAL_PROTECT(admin_verbs_server)
GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
/world/proc/AVerbsServer()
@@ -114,7 +115,6 @@ GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
/client/proc/toggle_random_events,
/client/proc/forcerandomrotate,
/client/proc/adminchangemap,
- /client/proc/panicbunker,
/client/proc/toggle_hub
)
GLOBAL_PROTECT(admin_verbs_debug)
@@ -156,7 +156,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug())
/client/proc/cmd_display_init_log
)
GLOBAL_PROTECT(admin_verbs_possess)
-GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess,/proc/release))
+GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release))
GLOBAL_PROTECT(admin_verbs_permissions)
GLOBAL_LIST_INIT(admin_verbs_permissions, list(/client/proc/edit_admin_permissions))
GLOBAL_PROTECT(admin_verbs_poll)
@@ -296,7 +296,8 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/startSinglo,
/client/proc/set_server_fps,
/client/proc/cmd_admin_grantfullaccess,
- /client/proc/cmd_admin_areatest,
+ /client/proc/cmd_admin_areatest_all,
+ /client/proc/cmd_admin_areatest_station,
/client/proc/readmin
)
if(holder)
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index c04e3c91ad..05d97be6ad 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -598,7 +598,7 @@
if(istype(SSticker.mode, /datum/game_mode/blob) || blob_minds.len)
dat += "
"
- for(var/datum/job/job in SSjob.occupations)
- if(!job)
- continue
- dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions] "
- usr << browse(dat, "window=jobdebug;size=600x500")
+ for(var/line in SSjob.job_debug)
+ dat += "[line] "
+ dat+= "*******
"
+ for(var/datum/job/job in SSjob.occupations)
+ if(!job)
+ continue
+ dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions] "
+ usr << browse(dat, "window=jobdebug;size=600x500")
if("show_admins")
var/dat = "Current admins:"
@@ -138,7 +137,7 @@
for(var/mob/living/mob in thunderdome)
qdel(mob) //Clear mobs
for(var/obj/obj in thunderdome)
- if(!istype(obj,/obj/machinery/camera))
+ if(!istype(obj, /obj/machinery/camera))
qdel(obj) //Clear objects
var/area/template = locate(/area/tdome/arena_source)
@@ -149,8 +148,9 @@
var/choice = input("Are you sure you want to cure all disease?") in list("Yes", "Cancel")
if(choice == "Yes")
message_admins("[key_name_admin(usr)] has cured all diseases.")
- for(var/datum/disease/D in SSdisease.processing)
- D.cure(D)
+ for(var/thing in SSdisease.active_diseases)
+ var/datum/disease/D = thing
+ D.cure(0)
if("set_name")
if(!check_rights(R_ADMIN))
return
@@ -214,7 +214,7 @@
if("moveferry")
if(!check_rights(R_ADMIN))
return
- SSblackbox.add_details("admin_secrets_fun_used","Send Centcom Ferry")
+ SSblackbox.add_details("admin_secrets_fun_used","Send CentCom Ferry")
if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away"))
message_admins("[key_name_admin(usr)] moved the centcom ferry")
log_admin("[key_name(usr)] moved the centcom ferry")
@@ -457,7 +457,7 @@
if(W.z == ZLEVEL_STATION && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
W.req_access = list()
message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
- priority_announce("Centcom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/ai/commandreport.ogg')
+ priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/ai/commandreport.ogg')
if("guns")
if(!check_rights(R_FUN))
@@ -517,14 +517,14 @@
return
SSblackbox.add_details("admin_secrets_fun_used","There Can Be Only One")
usr.client.only_one()
- send_to_playing_players('sound/misc/highlander.ogg')
+ sound_to_playing_players('sound/misc/highlander.ogg')
if("delayed_onlyone")
if(!check_rights(R_FUN))
return
SSblackbox.add_details("admin_secrets_fun_used","There Can Be Only One")
usr.client.only_one_delayed()
- send_to_playing_players('sound/misc/highlander_delayed.ogg')
+ sound_to_playing_players('sound/misc/highlander_delayed.ogg')
if("onlyme")
if(!check_rights(R_FUN))
diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm
index fc64eb2cf8..9ac85e49fa 100644
--- a/code/modules/admin/stickyban.dm
+++ b/code/modules/admin/stickyban.dm
@@ -233,7 +233,7 @@
. -= "reverting"
//storing these can sometimes cause sticky bans to start matching everybody
- // and isn't even needed for sticky ban matching, as the hub tracks these seperately
+ // and isn't even needed for sticky ban matching, as the hub tracks these separately
. -= "IP"
. -= "computer_id"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 1f41b17421..81925756fb 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -6,7 +6,7 @@
log_admin("[key_name(usr)] tried to use the admin panel without authorization.")
return
if(href_list["ahelp"])
- if(!check_rights(R_ADMIN))
+ if(!check_rights(R_ADMIN, TRUE))
return
var/ahelp_ref = href_list["ahelp"]
@@ -102,13 +102,13 @@
message_admins("[key_name(usr)] tried to create gangs. Unfortunately, there were not enough candidates available.")
log_admin("[key_name(usr)] failed create gangs.")
if("centcom")
- message_admins("[key_name(usr)] is creating a Centcom response team...")
+ message_admins("[key_name(usr)] is creating a CentCom response team...")
if(src.makeEmergencyresponseteam())
- message_admins("[key_name(usr)] created a Centcom response team.")
- log_admin("[key_name(usr)] created a Centcom response team.")
+ message_admins("[key_name(usr)] created a CentCom response team.")
+ log_admin("[key_name(usr)] created a CentCom response team.")
else
- message_admins("[key_name_admin(usr)] tried to create a Centcom response team. Unfortunately, there were not enough candidates available.")
- log_admin("[key_name(usr)] failed to create a Centcom response team.")
+ message_admins("[key_name_admin(usr)] tried to create a CentCom response team. Unfortunately, there were not enough candidates available.")
+ log_admin("[key_name(usr)] failed to create a CentCom response team.")
if("abductors")
message_admins("[key_name(usr)] is creating an abductor team...")
if(src.makeAbductorTeam())
@@ -1710,8 +1710,8 @@
usr.client.smite(H)
- else if(href_list["CentcommReply"])
- var/mob/living/carbon/human/H = locate(href_list["CentcommReply"]) in GLOB.mob_list
+ else if(href_list["CentComReply"])
+ var/mob/living/carbon/human/H = locate(href_list["CentComReply"]) in GLOB.mob_list
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
@@ -1719,15 +1719,15 @@
to_chat(usr, "The person you are trying to contact is not wearing a headset.")
return
- message_admins("[src.owner] has started answering [key_name(H)]'s Centcomm request.")
- var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from Centcom", "")
+ message_admins("[src.owner] has started answering [key_name(H)]'s CentCom request.")
+ var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from CentCom", "")
if(!input)
- message_admins("[src.owner] decided not to answer [key_name(H)]'s Centcomm request.")
+ message_admins("[src.owner] decided not to answer [key_name(H)]'s CentCom request.")
return
to_chat(src.owner, "You sent [input] to [H] via a secure channel.")
- log_admin("[src.owner] replied to [key_name(H)]'s Centcom message with the message [input].")
- message_admins("[src.owner] replied to [key_name(H)]'s Centcom message with: \"[input]\"")
+ log_admin("[src.owner] replied to [key_name(H)]'s CentCom message with the message [input].")
+ message_admins("[src.owner] replied to [key_name(H)]'s CentCom message with: \"[input]\"")
to_chat(H, "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows. [input]. Message ends.\"")
else if(href_list["SyndicateReply"])
@@ -1917,7 +1917,7 @@
if(!marked_datum)
to_chat(usr, "You don't have any object marked. Abandoning spawn.")
return
- else if(!istype(marked_datum,/atom))
+ else if(!istype(marked_datum, /atom))
to_chat(usr, "The object you have marked cannot be used as a target. Target must be of type /atom. Abandoning spawn.")
return
else
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 0177798e25..44755c46fc 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -194,7 +194,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
AddInteraction("[key_name_admin(usr)] PM'd [LinkedReplyName()]")
message_admins("Ticket [TicketHref("#[id]")] created")
else
- MessageNoRecipient(parsed_message)
+ MessageNoRecipient(msg, parsed_message)
//send it to irc if nobody is on and tell us how many were on
var/admin_number_present = send2irc_adminless_only(initiator_ckey, "Ticket #[id]: [name]")
@@ -249,18 +249,19 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
//message from the initiator without a target, all admins will see this
//won't bug irc
-/datum/admin_help/proc/MessageNoRecipient(msg)
+/datum/admin_help/proc/MessageNoRecipient(msg, parsed_msg)
var/ref_src = "\ref[src]"
- var/chat_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [msg]"
+ //Message to be sent to all admins
+ var/admin_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [parsed_msg]"
AddInteraction("[LinkedReplyName(ref_src)]: [msg]")
+
//send this msg to all admins
-
for(var/client/X in GLOB.admins)
if(X.prefs.toggles & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
window_flash(X, ignorepref = TRUE)
- to_chat(X, chat_msg)
+ to_chat(X, admin_msg)
//show it to the person adminhelping too
to_chat(initiator, "PM to-Admins: [msg]")
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index caa2d2c7cb..31fb08da36 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -44,7 +44,7 @@
if(cmptext(copytext(whom,1,2),"@"))
whom = findStealthKey(whom)
C = GLOB.directory[whom]
- else if(istype(whom,/client))
+ else if(istype(whom, /client))
C = whom
if(!C)
if(holder)
@@ -82,7 +82,7 @@
irc = 1
else
recipient = GLOB.directory[whom]
- else if(istype(whom,/client))
+ else if(istype(whom, /client))
recipient = whom
diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm
index 5df7ee8c78..922e15e8b4 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -101,6 +101,7 @@
stored = null
for(var/button in buttons)
qdel(button)
+ return ..()
/datum/buildmode/proc/create_buttons()
buttons += new /obj/screen/buildmode/mode(src)
@@ -171,7 +172,7 @@
objholder = /obj/structure/closet
alert("That path is not allowed.")
else
- if(ispath(objholder,/mob) && !check_rights(R_DEBUG,0))
+ if(ispath(objholder, /mob) && !check_rights(R_DEBUG,0))
objholder = /obj/structure/closet
if(VAR_BUILDMODE)
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine")
@@ -194,11 +195,14 @@
valueholder = input(user,"Enter variable value:" ,"Value") as turf in world
if(AREA_BUILDMODE)
var/list/gen_paths = subtypesof(/datum/mapGenerator)
-
- var/type = input(user,"Select Generator Type","Type") as null|anything in gen_paths
+ var/list/options = list()
+ for(var/path in gen_paths)
+ var/datum/mapGenerator/MP = path
+ options[initial(MP.buildmode_name)] = path
+ var/type = input(user,"Select Generator Type","Type") as null|anything in options
if(!type) return
- generator_path = type
+ generator_path = options[type]
cornerA = null
cornerB = null
@@ -224,7 +228,7 @@
set name = "Toggle Build Mode"
set category = "Special Verbs"
if(M.client)
- if(istype(M.client.click_intercept,/datum/buildmode))
+ if(istype(M.client.click_intercept, /datum/buildmode))
var/datum/buildmode/B = M.client.click_intercept
B.quit()
log_admin("[key_name(usr)] has left build mode.")
@@ -262,7 +266,7 @@
else if(isfloorturf(object))
var/turf/T = object
T.ChangeTurf(/turf/open/space)
- else if(istype(object,/turf/closed/wall/r_wall))
+ else if(istype(object, /turf/closed/wall/r_wall))
var/turf/T = object
T.ChangeTurf(/turf/closed/wall)
else if(isobj(object))
@@ -291,7 +295,7 @@
log_admin("Build Mode: [key_name(user)] built a window at ([object.x],[object.y],[object.z])")
if(ADV_BUILDMODE)
if(left_click)
- if(ispath(objholder,/turf))
+ if(ispath(objholder, /turf))
var/turf/T = get_turf(object)
log_admin("Build Mode: [key_name(user)] modified [T] ([T.x],[T.y],[T.z]) to [objholder]")
T.ChangeTurf(objholder)
@@ -342,7 +346,12 @@
if(cornerA && cornerB)
if(!generator_path)
to_chat(user, "Select generator type first.")
+ return
var/datum/mapGenerator/G = new generator_path
+ if(istype(G, /datum/mapGenerator/repair/reload_station_map))
+ if(GLOB.reloading_map)
+ to_chat(user, "You are already reloading an area! Please wait for it to fully finish loading before trying to load another!")
+ return
G.defineRegion(cornerA,cornerB,1)
G.generate()
cornerA = null
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 0f07f31b85..c69628c625 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -460,10 +460,10 @@ GLOBAL_PROTECT(AdminProcCallCount)
id.update_label()
if(worn)
- if(istype(worn,/obj/item/device/pda))
+ if(istype(worn, /obj/item/device/pda))
worn:id = id
id.loc = worn
- else if(istype(worn,/obj/item/weapon/storage/wallet))
+ else if(istype(worn, /obj/item/weapon/storage/wallet))
worn:front_id = id
id.loc = worn
worn.update_icon()
@@ -495,9 +495,9 @@ GLOBAL_PROTECT(AdminProcCallCount)
qdel(adminmob)
SSblackbox.add_details("admin_verb","Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/cmd_admin_areatest()
+/client/proc/cmd_admin_areatest(on_station)
set category = "Mapping"
- set name = "Test areas"
+ set name = "Test Areas"
var/list/areas_all = list()
var/list/areas_with_APC = list()
@@ -509,11 +509,16 @@ GLOBAL_PROTECT(AdminProcCallCount)
var/list/areas_with_camera = list()
for(var/area/A in world)
- if(!(A.type in areas_all))
+ if(on_station)
+ var/turf/picked = safepick(get_area_turfs(A.type))
+ if(picked && (picked.z == ZLEVEL_STATION))
+ if(!(A.type in areas_all))
+ areas_all.Add(A.type)
+ else if(!(A.type in areas_all))
areas_all.Add(A.type)
for(var/obj/machinery/power/apc/APC in GLOB.apcs_list)
- var/area/A = get_area(APC)
+ var/area/A = APC.area
if(!(A.type in areas_with_APC))
areas_with_APC.Add(A.type)
@@ -583,6 +588,16 @@ GLOBAL_PROTECT(AdminProcCallCount)
for(var/areatype in areas_without_camera)
to_chat(world, "* [areatype]")
+/client/proc/cmd_admin_areatest_station()
+ set category = "Mapping"
+ set name = "Test Areas (STATION Z)"
+ cmd_admin_areatest(TRUE)
+
+/client/proc/cmd_admin_areatest_all()
+ set category = "Mapping"
+ set name = "Test Areas (ALL)"
+ cmd_admin_areatest(FALSE)
+
/client/proc/cmd_admin_dress(mob/living/carbon/human/M in GLOB.mob_list)
set category = "Fun"
set name = "Select equipment"
diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm
index fe3fe61b3f..9f08eb5e0e 100644
--- a/code/modules/admin/verbs/getlogs.dm
+++ b/code/modules/admin/verbs/getlogs.dm
@@ -13,7 +13,17 @@
return
message_admins("[key_name_admin(src)] accessed file: [path]")
- src << ftp(file(path))
+ //this is copypasta because making it a proc would mean locking out adminproccalls,
+ // and that system is buggy enough with false positives that I don't want to risk locking admins out of legit calls.
+ switch(alert("View (in game), Open (in your system's text editor), or Download file [path]?", "Log File Opening", "View", "Open", "Download"))
+ if ("View")
+ src << browse("
[html_encode(file2text(file(path)))]
", list2params(list("window" = "viewfile.[path]")))
+ if ("Open")
+ src << run(file(path))
+ if ("Download")
+ src << ftp(file(path))
+ else
+ return
to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.")
return
@@ -27,7 +37,15 @@
set desc = "Shows server log for this round."
if(fexists("[GLOB.world_game_log]"))
- src << ftp(GLOB.world_game_log)
+ switch(alert("View (in game), Open (in your system's text editor), or Download file [GLOB.world_game_log]?", "Log File Opening", "View", "Open", "Download"))
+ if ("View")
+ src << browse("
[html_encode(file2text(GLOB.world_game_log))]
", list2params(list("window" = "viewfile.[GLOB.world_game_log]")))
+ if ("Open")
+ src << run(GLOB.world_game_log)
+ if ("Download")
+ src << ftp(GLOB.world_game_log)
+ else
+ return
else
to_chat(src, "Server log not found, try using .getserverlog.")
return
@@ -41,7 +59,15 @@
set desc = "Shows server attack log for this round."
if(fexists("[GLOB.world_attack_log]"))
- src << ftp(GLOB.world_attack_log)
+ switch(alert("View (in game), Open (in your system's text editor), or Download file [GLOB.world_attack_log]?", "Log File Opening", "View", "Open", "Download"))
+ if ("View")
+ src << browse("
[html_encode(file2text(GLOB.world_attack_log))]
", list2params(list("window" = "viewfile.[GLOB.world_attack_log]")))
+ if ("Open")
+ src << run(GLOB.world_attack_log)
+ if ("Download")
+ src << ftp(GLOB.world_attack_log)
+ else
+ return
else
to_chat(src, "Server attack log not found, try using .getserverlog.")
return
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index c42eb6a05e..6283201b41 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -34,7 +34,8 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list(
/client/proc/startSinglo,
/client/proc/set_server_fps, //allows you to set the ticklag.
/client/proc/cmd_admin_grantfullaccess,
- /client/proc/cmd_admin_areatest,
+ /client/proc/cmd_admin_areatest_all,
+ /client/proc/cmd_admin_areatest_station,
/client/proc/cmd_admin_rejuvenate,
/datum/admins/proc/show_traitor_panel,
/client/proc/disable_communication,
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index 28a65f4e7d..2a0575eb28 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -30,7 +30,7 @@ GLOBAL_PROTECT(VVpixelmovement)
else if (isloc(var_value))
. = VV_ATOM_REFERENCE
- else if (istype(var_value,/client))
+ else if (istype(var_value, /client))
. = VV_CLIENT
else if (istype(var_value, /datum))
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 2bf7842c1c..c8df7f56f1 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -20,7 +20,7 @@
Make Gangsters Make Wizard (Requires Ghosts) Make Nuke Team (Requires Ghosts)
- Make Centcom Response Team (Requires Ghosts)
+ Make CentCom Response Team (Requires Ghosts) Make Abductor Team (Requires Ghosts) Make Revenant (Requires Ghost)
"}
@@ -397,7 +397,7 @@
/datum/admins/proc/makeOfficial()
var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.")
- var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered to be a Centcom Official?", "deathsquad")
+ var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered to be a CentCom Official?", "deathsquad")
if(candidates.len)
var/mob/dead/observer/chosen_candidate = pick(candidates)
@@ -408,7 +408,7 @@
newmob.real_name = newmob.dna.species.random_name(newmob.gender,1)
newmob.dna.update_dna_identity()
newmob.key = chosen_candidate.key
- newmob.mind.assigned_role = "Centcom Official"
+ newmob.mind.assigned_role = "CentCom Official"
newmob.equipOutfit(/datum/outfit/centcom_official)
//Assign antag status and the mission
@@ -424,12 +424,12 @@
newmob.set_species(/datum/species/human)
//Greet the official
- to_chat(newmob, "You are a Centcom Official.")
+ to_chat(newmob, "You are a CentCom Official.")
to_chat(newmob, " Central Command is sending you to [station_name()] with the task: [mission]")
//Logging and cleanup
- message_admins("Centcom Official [key_name_admin(newmob)] has spawned with the task: [mission]")
- log_game("[key_name(newmob)] has been selected as a Centcom Official")
+ message_admins("CentCom Official [key_name_admin(newmob)] has spawned with the task: [mission]")
+ log_game("[key_name(newmob)] has been selected as a CentCom Official")
return 1
@@ -437,7 +437,7 @@
// CENTCOM RESPONSE TEAM
/datum/admins/proc/makeEmergencyresponseteam()
- var/alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: Centcom Official", "Blue: Light ERT (No Armoury Access)", "Amber: Full ERT (Armoury Access)", "Red: Elite ERT (Armoury Access + Pulse Weapons)", "Delta: Deathsquad")
+ var/alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: CentCom Official", "Blue: Light ERT (No Armoury Access)", "Amber: Full ERT (Armoury Access)", "Red: Elite ERT (Armoury Access + Pulse Weapons)", "Delta: Deathsquad")
if(!alert)
return
switch(alert)
@@ -449,7 +449,7 @@
alert = "Amber"
if("Blue: Light ERT (No Armoury Access)")
alert = "Blue"
- if("Green: Centcom Official")
+ if("Green: CentCom Official")
return makeOfficial()
var/teamcheck = input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num
if(isnull(teamcheck))
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index a385e68560..1b2fa82e20 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -46,7 +46,7 @@
SSblackbox.add_details("admin_verb","Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//log_admin("HELP: [key_name(src)]: [msg]")
-/proc/Centcomm_announce(text , mob/Sender)
+/proc/CentCom_announce(text , mob/Sender)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
msg = "CENTCOM:[ADMIN_FULLMONTY(Sender)] [ADMIN_CENTCOM_REPLY(Sender)]: [msg]"
to_chat(GLOB.admins, msg)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 551321e893..1429c700aa 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -615,7 +615,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]")
if(isobserver(M))
- new /obj/effect/gibspawner/generic(M.loc, M.viruses)
+ new /obj/effect/gibspawner/generic(get_turf(M))
return
if(confirm == "Yes")
M.gib()
@@ -649,9 +649,9 @@ Traitors and the like can also be revived with the previous role mostly intact.
set desc = "switches between 1x and custom views"
if(view == world.view)
- view = input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,128)
+ change_view(input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,128))
else
- view = world.view
+ change_view(world.view)
log_admin("[key_name(usr)] changed their view range to [view].")
//message_admins("\blue [key_name_admin(usr)] changed their view range to [view].") //why? removed by order of XSI
@@ -1208,6 +1208,6 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
if(!message)
return
- message_admins("[key_name_admin(usr)] triggered a Centcom recall, with the admiral message of: [message]")
- log_game("[key_name(usr)] triggered a Centcom recall, with the message of: [message]")
+ message_admins("[key_name_admin(usr)] triggered a CentCom recall, with the admiral message of: [message]")
+ log_game("[key_name(usr)] triggered a CentCom recall, with the message of: [message]")
SSshuttle.centcom_recall(SSshuttle.emergency.timer, message)
diff --git a/code/modules/admin/verbs/reestablish_db_connection.dm b/code/modules/admin/verbs/reestablish_db_connection.dm
index 133a39185e..3578e98b1b 100644
--- a/code/modules/admin/verbs/reestablish_db_connection.dm
+++ b/code/modules/admin/verbs/reestablish_db_connection.dm
@@ -5,7 +5,7 @@
to_chat(usr, "The Database is not enabled!")
return
- if (SSdbcore && SSdbcore.IsConnected())
+ if (SSdbcore.IsConnected())
if (!check_rights(R_DEBUG,0))
alert("The database is already connected! (Only those with +debug can force a reconnection)", "The database is already connected!")
return
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index 672f91c11b..2853fefcbf 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -2,6 +2,8 @@
name = "bomb"
icon = 'icons/obj/tank.dmi'
item_state = "assembly"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
throwforce = 5
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 2
diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm
index 5c4e308770..f356dfd78c 100644
--- a/code/modules/assembly/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -3,6 +3,8 @@
desc = "A powerful and versatile flashbulb device, with applications ranging from disorienting attackers to acting as visual receptors in robot production."
icon_state = "flash"
item_state = "flashtool"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
throwforce = 0
w_class = WEIGHT_CLASS_TINY
materials = list(MAT_METAL = 300, MAT_GLASS = 300)
@@ -225,6 +227,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "flashshield"
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
force = 10
throwforce = 5
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index 8a434a6f81..d1ac4c782d 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -3,6 +3,8 @@
icon = 'icons/obj/assemblies/new_assemblies.dmi'
icon_state = "holder"
item_state = "assembly"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags = CONDUCT
throwforce = 5
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index c0d4e45ade..b3f25ac8cf 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -3,6 +3,8 @@
desc = "Used to remotely activate devices. Allows for syncing when using a secure signaler on another."
icon_state = "signaller"
item_state = "signaler"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
materials = list(MAT_METAL=400, MAT_GLASS=120)
origin_tech = "magnets=1;bluespace=1"
wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE
@@ -20,8 +22,7 @@
/obj/item/device/assembly/signaler/Destroy()
- if(SSradio)
- SSradio.remove_object(src,frequency)
+ SSradio.remove_object(src,frequency)
return ..()
/obj/item/device/assembly/signaler/activate()
@@ -183,6 +184,8 @@ Code:
desc = "The neutralized core of an anomaly. It'd probably be valuable for research."
icon_state = "anomaly core"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
/obj/item/device/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
if(!signal)
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 26882d0a81..4371bd5986 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -113,6 +113,19 @@
"water_vapor" = new/datum/tlv(-1, -1, 0.2, 0.5)
)
+/obj/machinery/airalarm/engine
+ name = "engine air alarm"
+ locked = FALSE
+ req_access = null
+ req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_ENGINE)
+
+/obj/machinery/airalarm/all_access
+ name = "all-access air alarm"
+ desc = "This particular atmos control unit appears to have no access restrictions."
+ locked = FALSE
+ req_access = null
+ req_one_access = null
+
//all air alarms in area are connected via magic
/area
var/list/air_vent_names = list()
@@ -139,8 +152,7 @@
update_icon()
/obj/machinery/airalarm/Destroy()
- if(SSradio)
- SSradio.remove_object(src, frequency)
+ SSradio.remove_object(src, frequency)
qdel(wires)
wires = null
return ..()
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
index aa13433376..1ef52cc787 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
@@ -37,8 +37,7 @@ Acts like a normal vent, but has an input AND output.
icon_state = "dpvent_map_on"
/obj/machinery/atmospherics/components/binary/dp_vent_pump/Destroy()
- if(SSradio)
- SSradio.remove_object(src, frequency)
+ SSradio.remove_object(src, frequency)
return ..()
/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
index e52c4bee3d..d2e6a3ae72 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
@@ -22,8 +22,7 @@ Passive gate is similar to the regular pump except:
var/datum/radio_frequency/radio_connection
/obj/machinery/atmospherics/components/binary/passive_gate/Destroy()
- if(SSradio)
- SSradio.remove_object(src,frequency)
+ SSradio.remove_object(src,frequency)
return ..()
/obj/machinery/atmospherics/components/binary/passive_gate/update_icon_nopipes()
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
index 77f98ac4df..0ec1b57a2e 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
@@ -30,8 +30,7 @@ Thus, the two variables affect pump operation are set in New():
on = TRUE
/obj/machinery/atmospherics/components/binary/pump/Destroy()
- if(SSradio)
- SSradio.remove_object(src,frequency)
+ SSradio.remove_object(src,frequency)
if(radio_connection)
radio_connection = null
return ..()
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
index b9debc4d43..4d3cf733fb 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
@@ -27,8 +27,7 @@ Thus, the two variables affect pump operation are set in New():
var/datum/radio_frequency/radio_connection
/obj/machinery/atmospherics/components/binary/volume_pump/Destroy()
- if(SSradio)
- SSradio.remove_object(src,frequency)
+ SSradio.remove_object(src,frequency)
return ..()
/obj/machinery/atmospherics/components/binary/volume_pump/on
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index 25f80352a4..87edfe8d11 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -28,8 +28,7 @@
radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA)
/obj/machinery/atmospherics/components/trinary/filter/Destroy()
- if(SSradio)
- SSradio.remove_object(src,frequency)
+ SSradio.remove_object(src,frequency)
return ..()
/obj/machinery/atmospherics/components/trinary/filter/update_icon()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
index 763c405429..0bf467f234 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
@@ -19,8 +19,7 @@
layer = GAS_SCRUBBER_LAYER
/obj/machinery/atmospherics/components/unary/outlet_injector/Destroy()
- if(SSradio)
- SSradio.remove_object(src,frequency)
+ SSradio.remove_object(src,frequency)
return ..()
/obj/machinery/atmospherics/components/unary/outlet_injector/on
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
index b19569be26..69560bc18b 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -56,8 +56,7 @@
A.air_vent_names -= id_tag
A.air_vent_info -= id_tag
- if(SSradio)
- SSradio.remove_object(src,frequency)
+ SSradio.remove_object(src,frequency)
radio_connection = null
return ..()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
index e76856bb66..113d029c0b 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
@@ -49,8 +49,7 @@
A.air_scrub_names -= id_tag
A.air_scrub_info -= id_tag
- if(SSradio)
- SSradio.remove_object(src,frequency)
+ SSradio.remove_object(src,frequency)
radio_connection = null
for(var/I in adjacent_turfs)
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index d733dfc3fb..a45536430a 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -189,8 +189,9 @@
#define CONNECTED 2
#define EMPTY 4
#define LOW 8
-#define FULL 16
-#define DANGER 32
+#define MEDIUM 16
+#define FULL 32
+#define DANGER 64
/obj/machinery/portable_atmospherics/canister/update_icon()
if(stat & BROKEN)
cut_overlays()
@@ -207,9 +208,11 @@
var/pressure = air_contents.return_pressure()
if(pressure < 10)
update |= EMPTY
- else if(pressure < ONE_ATMOSPHERE)
+ else if(pressure < 5 * ONE_ATMOSPHERE)
update |= LOW
- else if(pressure < 15 * ONE_ATMOSPHERE)
+ else if(pressure < 10 * ONE_ATMOSPHERE)
+ update |= MEDIUM
+ else if(pressure < 40 * ONE_ATMOSPHERE)
update |= FULL
else
update |= DANGER
@@ -222,9 +225,9 @@
add_overlay("can-open")
if(update & CONNECTED)
add_overlay("can-connector")
- if(update & EMPTY)
+ if(update & LOW)
add_overlay("can-o0")
- else if(update & LOW)
+ else if(update & MEDIUM)
add_overlay("can-o1")
else if(update & FULL)
add_overlay("can-o2")
@@ -234,6 +237,7 @@
#undef CONNECTED
#undef EMPTY
#undef LOW
+#undef MEDIUM
#undef FULL
#undef DANGER
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index f824bf0c56..22d92b54be 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -13,6 +13,8 @@
icon = 'icons/obj/items.dmi'
icon_state = "banner"
item_state = "banner"
+ lefthand_file = 'icons/mob/inhands/equipment/banners_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/banners_righthand.dmi'
desc = "A banner with Nanotrasen's logo on it."
slowdown = 2
throw_speed = 0
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index 1eaeb4a82b..e533d625cc 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -161,7 +161,7 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
return
/obj/machinery/gateway/centeraway/attackby(obj/item/device/W, mob/user, params)
- if(istype(W,/obj/item/device/multitool))
+ if(istype(W, /obj/item/device/multitool))
if(calibrated)
to_chat(user, "\black The gate is already calibrated, there is no work for you to do here.")
return
@@ -238,3 +238,8 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
var/mob/M = AM
if (M.client)
M.client.move_delay = max(world.time + 5, M.client.move_delay)
+
+
+/obj/item/weapon/paper/fluff/gateway
+ info = "Congratulations,
Your station has been selected to carry out the Gateway Project.
The equipment will be shipped to you at the start of the next quarter. You are to prepare a secure location to house the equipment as outlined in the attached documents.
--Nanotrasen Blue Space Research"
+ name = "Confidential Correspondence, Pg 1"
\ No newline at end of file
diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm
index 0dc7eea3c6..27208a1a4b 100644
--- a/code/modules/awaymissions/mission_code/Academy.dm
+++ b/code/modules/awaymissions/mission_code/Academy.dm
@@ -1,6 +1,36 @@
//Academy Items
+/obj/item/weapon/paper/fluff/awaymissions/academy/console_maint
+ name = "Console Maintenance"
+ info = "We're upgrading to the latest mainframes for our consoles, the shipment should be in before spring break is over!"
+
+/obj/item/weapon/paper/fluff/awaymissions/academy/class/automotive
+ name = "Automotive Repair 101"
+
+/obj/item/weapon/paper/fluff/awaymissions/academy/class/pyromancy
+ name = "Pyromancy 250"
+
+/obj/item/weapon/paper/fluff/awaymissions/academy/class/biology
+ name = "Biology Lab"
+
+/obj/item/weapon/paper/fluff/awaymissions/academy/grade/aplus
+ name = "Summoning Midterm Exam"
+ info = "Grade: A+ Educator's Notes: Excellent form."
+
+/obj/item/weapon/paper/fluff/awaymissions/academy/grade/bminus
+ name = "Summoning Midterm Exam"
+ info = "Grade: B- Educator's Notes: Keep applying yourself, you're showing improvement."
+
+/obj/item/weapon/paper/fluff/awaymissions/academy/grade/dminus
+ name = "Summoning Midterm Exam"
+ info = "Grade: D- Educator's Notes: SEE ME AFTER CLASS."
+
+/obj/item/weapon/paper/fluff/awaymissions/academy/grade/failure
+ name = "Pyromancy Evaluation"
+ info = "Current Grade: F. Educator's Notes: No improvement shown despite multiple private lessons. Suggest additional tutilage."
+
+
/obj/singularity/academy
dissipate = 0
move_self = 0
diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm
index c3590277d5..f38e672128 100644
--- a/code/modules/awaymissions/mission_code/Cabin.dm
+++ b/code/modules/awaymissions/mission_code/Cabin.dm
@@ -86,7 +86,7 @@
/datum/mapGeneratorModule/snow/bunnies)
/datum/mapGeneratorModule/snow/checkPlaceAtom(turf/T)
- if(istype(T,/turf/open/floor/plating/asteroid/snow))
+ if(istype(T, /turf/open/floor/plating/asteroid/snow))
return ..(T)
return 0
diff --git a/code/modules/awaymissions/mission_code/caves.dm b/code/modules/awaymissions/mission_code/caves.dm
new file mode 100644
index 0000000000..0965851056
--- /dev/null
+++ b/code/modules/awaymissions/mission_code/caves.dm
@@ -0,0 +1,31 @@
+//caves papers
+
+/obj/item/weapon/paper/crumpled/awaymissions/caves/unsafe_area
+ info = "
WARNING
Majority of this area is consitered 'unsafe' past this point. Theres an outpost directly south of here where you can get your bearing and travel further down if needed. Traveling in groups is HIGHLY advised, the shit out there can be extremely deadly if you're alone.
"
+
+/obj/item/weapon/paper/fluff/awaymissions/caves/omega
+ name = "Subject Omega Notes"
+ info = "
Testing Notes
Subject appears unresponsive to most interactions, refusing to move away from the corners or face any scientists. Subject appears to move between the two back corners every observation. A strange humming can be heard from inside the cell, appears to be originating from the subject itself, further testing is necessary to confirm or deny this.
"
+
+/obj/item/weapon/paper/fluff/awaymissions/caves/magma
+ info = "
Mining is hell down here, you can feel the heat of the magma no matter how thick the suit is. Conditions are barely managble as is, restless nights and horrid work conditions. The ore maybe rich down here, but we've already lost a few men to the faults shifting, god knows how much longer till it all just collapses down and consumes everyone with it.
"
+
+/obj/item/weapon/paper/fluff/awaymissions/caves/work_notice
+ name = "work notice"
+ info = "
Survival Info For Miners
The caves are an unforgiving place, the only thing you'll have to traverse is the supplies in your locker and your own wit. Travel in packs when mining and try to shut down the monster dens before they overwhelm you. The job is dangerous but the haul is good, so remember this infomation and hopefully we'll all go home alive.
"
+
+/obj/item/weapon/paper/fluff/awaymissions/caves/shipment_notice
+ name = "shipment notice"
+ info = "
We were suppose to get a shipment of these special laser rifles and a couple 'nades to help combat the wildlife down here, but its been weeks since we last heard from the caravan carrying the shit down here. At this point we can only assume they fell victim to one of the monster nests or the dumbasses managed to trip into the lava. So much for that shipment, I guess.
"
+
+/obj/item/weapon/paper/fluff/awaymissions/caves/saftey_notice
+ name = "safety notice"
+ info = "
Some of the miners have gone to laying some mine traps among the lower levels of the mine to keep the monsters at bay. This probably isn't the smartest idea in a cavern like this but the boys seem to get a chuckle out of every distant blast they hear go off, so I guess it works
"
+
+/obj/item/weapon/paper/fluff/awaymissions/caves/shipment_receipt
+ name = "Shipment Receipt"
+ info = "
Although you may seem indestructible in a mech, remember, THIS SHIT ISN'T LAVA PROOF!! The boys have already had to deal with loosing the last two to salvage because the dumbass thought he could just wade through the lower lakes like it was nothing. The fact he even managed to get back without being fused with what was left of the mech is a miracle in itself. They're built to be resistant against extreme heat, not heat PROOF!
Robotics Team"
diff --git a/code/modules/awaymissions/mission_code/centcomAway.dm b/code/modules/awaymissions/mission_code/centcomAway.dm
index 2508283cc3..b5107ecd67 100644
--- a/code/modules/awaymissions/mission_code/centcomAway.dm
+++ b/code/modules/awaymissions/mission_code/centcomAway.dm
@@ -2,7 +2,7 @@
//centcomAway items
-/obj/item/weapon/paper/pamphlet/ccaInfo
+/obj/item/weapon/paper/pamphlet/centcom/visitor_info
name = "Visitor Info Pamphlet"
info = " XCC-P5831 Visitor Information \
Greetings, visitor, to XCC-P5831! As you may know, this outpost was once \
@@ -14,7 +14,7 @@
and the thrilling pay-per-view broadcasts of PLASTEEL CHEF and THUNDERDOME LIVE. \
We hope you enjoy your stay!"
-/obj/item/weapon/paper/ccaMemo
+/obj/item/weapon/paper/fluff/awaymissions/centcom/gateway_memo
name = "Memo to XCC-P5831 QM"
info = "From: XCC-P5831 Management Office \
To: Rolf Ingram, XCC-P5831 Quartermaster \
diff --git a/code/modules/awaymissions/mission_code/moonoutpost19.dm b/code/modules/awaymissions/mission_code/moonoutpost19.dm
new file mode 100644
index 0000000000..20973d242f
--- /dev/null
+++ b/code/modules/awaymissions/mission_code/moonoutpost19.dm
@@ -0,0 +1,83 @@
+/////////// moonoutpost19 papers
+
+/obj/item/weapon/paper/crumpled/awaymissions/moonoutpost19/hastey_note
+ name = "Hastily Written Note"
+ info = "19 06 2554
I fucking knew it. There was a major breach, that idiotic force field failed and the xenomorphs rushed out and took out the scientists. I've managed to make it to my office and closed the blast doors. I can hear them trying to pry open the doors. Probably don't have long. I have no clue what has happened to the rest of the crew, for all I know they've been killed to produce more of the fucks."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/larva_social
+ name = "Larva Xenomorph Social Interactions & Capturing Procedure"
+ info = "Researcher: Dr. Sakuma Sano Date: 04/06/2554
Report: As expected, all that is left of the monkeys we sent in earlier is a group of xenomorph larvae. It is quite clear that the facehuggers are not selective in their hosts, and so far the gestation process has been shown to have a 100% success rate.
The larvae themselves have been behaving very differently from the lone larva we first observed, and despite shying away from humans they are clearly comfortable with others of their kind. Our previous suspicions on larvae have been confirmed with their demonstration of playfulness: they are not nearly as aggressive or violent when young, before molting to adulthood.
The majority of the play we observed involved a sort of hide-and-seek, and occasionally wrestling by tangling themselves and struggling out of it. While normally we would write these off as instinctual play for honing their skills when they molt, their growth period is so incredibly fast and they are still such adept killers that it would serve no practical purpose. The only explanation for this is perhaps to create bonds and friendships with each other, if that is even possible for such an incredibly hostile race. It may be that they are much more reasonable with each other than other life forms.
It had become clear that now was the best time to extract a xenomorph for dissecting, as these were all still larvae and the queen was still attached to its ovipositor and would be immobile. With the approval of the research director, we sent in our medical robot that had been dubbed 'Head Surgeon' into the containment pen, dropping the shields for only a fraction of a second to allow it entry. The larvae were cautious, but the curiosity of one had him within grabbing range of our robot. It was brought out and quickly euthanized through lethal injection, courtesy of our mechanical doctor."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/xeno_queen
+ name = "Queen Xenomorph Physiology & Behavior Observation"
+ info = "Researcher: Dr. Sakuma Sano Date: 04/06/2554
Report: I have studied many interesting and diverse life-forms as a xenobiologist ranging from creatures as large as cows, to specimens too small see with the naked eye. This is by far the largest alien I have ever seen. The alien we were previously studying has molted and has become an absolutely enormous creature. Standing at over 15 feet tall and weighing in at likely two tons or more, the xenomorph queen is an absolutely breathtakingly large and cruel monster. Its behavior has changed drastically from when it was a drone, having become far more comfortable with sitting and staring at us, rather than smashing at the windows.
The queen, physiologically speaking, is fairly similar to the other xenomorphs, with a few key differences. Its enormous size demands large legs, while the back seems to be always hunched forward. The dorsal tubes on the back have changed to several large spikes, and we observed the alien now sports a second pair of smaller arms on its chest. The purpose of these secondary arms is still unknown. Finally, the queen's crown has become incredibly large, with what seems to be a retractable slot to hide its head in. The dome appears to be extremely thick near the front, and will likely be able to resist a lot of trauma. Despite the enormous size it has grown to, it is not that much slower than it used to be.
After two hours of doing relatively nothing but staring, the queen began to produce an unusually large amount of resin and weeds, quickly shaping up a large nest that it then hid behind. It then proceeded to smash out all the lights, leaving us with very little to see with our cameras. When we looked through the back cameras, we had discovered that it had grown a large ovipositor, and was releasing large eggs onto the ground. This had us all in agreement that this stage of the life cycle was the queen.
Over the next few hours, the eggs grew to their full sizes, and we provided the subject with new monkey hosts. When they approached the eggs, they opened to release more facehuggers. It seems that we have observed the full cycle of reproduction for this species. We can expect more larvae in the next few hours."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/xeno_adult
+ name = "Adult Xenomorph Physiology & Behavior Observation"
+ info = "Researcher: Dr. Sakuma Sano Date: 03/06/2554
Report: The other scientists and I can hardly believe our eyes. The snake-like larva has molted into a 7 foot tall insectoid nightmare in just a few hours. It's obvious now as to why such heavy duty containment was needed. It immediately tried to escape however by flinging itself at the window in a flurry of swipes and stabs. It seems its behavior has returned to a state that is very similar to the facehugger, though I doubt with the same intent! Thankfully, our glass and shields have shown to be more than sturdy enough for such a violent creature, and so far, any attempts at the creature escaping have been in vain.
As for its physiology, the creature has an elongated head with what appears to be have an exoskeleton resembling an external rib-cage on the torso. The alien is also fairly skinny with a lean body. The little amount of meat on the alien appears to be entirely muscle. We assume this makes it deceptively strong, while remaining agile at the same time. One of the most interesting things we have seen is its pharyngeal jaw. It has some what of an inner mouth capable of being fired externally at extremely high speeds. It has already caused many dents in the walls and a few small cracks in the window with it. The alien also has a couple of dorsal tubes on its back, their purpose unknown. Finally, this monster sports a long ridged tail, complete with a large and extremely sharp blade at the tip.
Normally I would be absolutely terrified of something like this, but I'm putting my trust in Nanotrasen with the containment. After all, they wouldn't build a cell that could fail to contain its subject, would they?"
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/larva_psych
+ name = "Larva Xenomorph Physiology & Behavior Observation"
+ info = "Researcher: Dr. Sakuma Sano Date: 03/06/2554
Report: When the larva first emerged from the chest of the monkey, it seemed very curious. It would wander around aimlessly for awhile and then sit still. We are unable to determine the gender of the larva, or even determine if it has a gender. After some time had passed, it seemed to lose interest in its surroundings and sat mostly still while occasionally wagging its tail. We decided to throw in a live mouse to see if it would consume it. The larva quickly attacked and ate the mouse and seemed to get larger very suddenly, this suggests that the larvae are capable of metabolizing and directing all the energy towards growth at previously thought impossible speeds. It is a shame that we cannot observe the process more closely, as we do not currently know how dangerous or violent this creature is or will become as it matures fully.
It is tempting to imagine the possibilities of utilizing such a mechanism. The capability of skipping years of growth time for children, repairing bodily damage in a matter of moments, even its usage in existing cloning technology."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/facehugger
+ name = "'Facehugger' Xenomorph Physiology & Behavior Observation"
+ info = "Researcher: Dr. Sakuma Sano Date: 03/06/2554
Report: The test subject we were provided with truly is alien. It is a small spider-like creature with bony legs leading to a smooth body. It has a long tail connected to it, and it has shown extremely aggressive behavior by flinging its entire body at the glass and shields to no avail. While doing so, we noticed there was a small pink hole in the middle of the body.
When we sent in a monkey through the crude but effective disposal tube, the alien immediately jumped at its face and latched on. The monkey was quickly suffocated by its constricting tail, unable to pry off the fingers. The monkey at first seemed to be dead, but was observed to be breathing. The recently named alien 'facehugger' fell off dead and curled its legs up like a spider moments after it had finished with the monkey's body.
While the monkey appeared to be unharmed, we kept it in the cell for a couple more hours until we were horrified to discover it screaming out in pain as a snake-like creature erupted from the monkey's chest! It appears that the 'facehugger' is only the start of this life cycle. The impregnation cycle involving the creatures growing inside the chests of their hosts seems to only be the beginning."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/xeno_hivemind
+ name = "The Hivemind Hypothesis"
+ info = "Researcher: Dr. Mark Douglas Date: 17/06/2554
Report: Earlier today we have observed a new phenomenon with our subjects. While feeding them our last monkey subject and throwing out the box, the aliens merely looked at us instead of infecting the monkey right away. They looked to be collectively distressed as they would no longer be given hosts, where instead we would move to the next phase of the experiment. When I glanced at the gas tanks and piping leading to their cell, I looked back to see all of them were up against the glass, even the queen! It was as if they all understood what was going to happen, even though we knew only the queen had the cognitive capability to do so.
The only explanation for this is a form of communication between the aliens, but we have seen no such action take place anywhere in the cell until now. We also know that regular drone and hunter xenomorphs have no personality or instinct to survive by themselves. Perhaps the queen has a direct link to them? A form of a commander or overseer that controls their every move? A hivemind?"
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/xeno_behavior
+ name = "A Preliminary Study of Alien Behavior"
+ info = "Researcher: Dr. Sakuma Sano Date: 08/06/2554
Report: The xenomorphs we have come to study here are a remarkable species. They are almost universally aggressive across all castes, showing no remorse or guilt or pause before or after acts of violence. They appear to be a species entirely designed to kill. Oddly enough, even their method of reproduction is a brutal two-for-one method of birthing a new xenomorph and killing its host.
The lone xenomorph we studied only five days ago showed little sign of intelligence. Only a simple drone that flung itself at the safety glass and shields repeatedly and thankfully without success. Once the drone molted into a queen, it became much more calm and calculating, merely looking at us and waiting while building its nest. As the hive grew in size and in numbers, so too did the intelligence of the common hunter and drone. We are still researching how they can communicate with one another and the relationship between the different castes and the queen. We will continue to update our research as we learn more about the species."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/xeno_castes
+ name = "The Xenomorph 'Castes'"
+ info = "Researcher: Dr. Mark Douglas Date: 06/06/2554
Report: While observing the growing number of aliens in the containment cell, we began to notice subtle differences that were consistently repeating. Like ants, these creatures clearly have different specialized variations that determine their roles in the hive. We have dubbed the three currently observed castes as Hunters, Drones, and Sentinels.
Hunters have been observed to be by far the most aggressive and agile of the three, constantly running on every surface and frequently swiping at the windows. They are also remarkably good at camouflaging themselves in darkness and on their resin structures, appearing almost invisible to the unwary observer. They are always the first to reach the monkeys we send in leading us to believe that this caste is primarily used for finding and retrieving hosts.
Drones on the other hand are much more docile and seem more shy by comparison, though not any less aggressive than the other castes. They have been observed to have a much wider head and lack dorsal tubes. They have shown to be less agile and visibly more fragile than any other caste. The drone however has never been observed to interact with the monkeys directly and instead preferring maintenance of the hive by building walls of resin and moving eggs around the nest. As far as we know, we have only ever observed a drone become a queen, and we have no way of knowing if the other castes have that capability.
Lastly, we have the Sentinels, which appear at first glance to be the guards of the hive. They have so far been only observed to remain near the queen and the eggs, frequently curled up against the walls. We have only observed one instance where they have interacted with a monkey who strayed too closely to the queen, and was pounced and held down immediately until it was applied with a facehugger. Their lack of movement makes it difficult to determine their exact purpose as guards, sentries, or other role."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy
+ name = "Larva Xenomorph Autopsy Report"
+ info = "Researcher: Dr. Mark Douglas Date: 04/06/2554
Report: After an extremely dangerous, time consuming and costly dissection, we have managed to record and identify several of the organs inside of the first stage of the xenomorph cycle: the larva. This procedure took an extensive amount of time because these creatures have incredibly, almost-comically acidic blood that can melt through almost anything in a few moments. We had to use over a dozen scalpels and retractors to complete the autopsy.
The larva seems to possess far fewer and quite different organs than that of a human. There is a stomach, with no digestive tract, a heart, which seems to lack any blood-oxygen circulation purpose, and an elongated brain, even though its as dumb as any large cat. It also lacks any liver, kidneys, or other basic organs.
We can't determine the exact nature of how these creatures grow, nor if they gain organs as they become adults. The larger breeds of xenomorph are too dangerous to kill and capture to give us an accurate answer to these questions. All that we can conclude is that being able to function with so little and yet be so deadly means that these creatures are highly evolved and likely to be extremely durable to various hazards that would otherwise be lethal to humans."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/research/evacuation
+ name = "Evacuation Procedure"
+ info = "
In The Event of Xenobiology Breach: Evacuate staff, Lock down Xenobiology, Notify on-site superiors and/or Central Command immediatly.
Current Xenobiology Containment Level:Secure RUN
"
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/log/personal
+ name = "Personal Log"
+ info = "Log 1: We got our promised supply drop today. We were only meant to get it, what, a week ago? This bloody gateway keeps desyncing itself, and that means subsisting off recycled water and carb packs. No clue where the damn thing connects to on its off days, and HQ say we are 'not to touch it if it isn't linking to command.' We dumped off the assload of crates Jim filled, got our boxes of oxygen, food and drink, and closed the portal.
Log 2: Damn thing is acting up again. Three days no contact this time. I thought I heard clanking noises from it yesterday. Jim is going on about the NT base or some shit. We've been over this before - They don't know we're here, that engineer was too drunk to recognise his suit, especially since I had it painted orange. He's starting to get annoying. We're safe.
Log 3: Gateway synced itself up automatically today. I opened it for an instant to spy through it, got a glimpse of the inside of a transport container. Either HQ's redecorating or something, or there's more than two of these things."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/log/personal_2
+ name = "Personal Log"
+ info = "Log 1: While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station, looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.
Log 2: Really dumb of me but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't then we might have to pull out before they come looking for us.
Log 3: That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/engineering
+ name = "Engineering Instructions"
+ info = "Alright, listen up. If you're reading this, I'm either taking a shit or I've been recalled back to Command. Either way, you'll need to know how to restore power. We've stolen this stuff from Nanotrasen, so all the equipment is jury-rigged. We have generators that work on both plasma and uranium, about 50 sheets should power the outpost for quite a while. If the generators aren't working, which is very likely, take the power cell on the desk and put it into the APC in the hallway. That should get the place running, at least for a little while."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/log/kenneth
+ name = "Personal Log - Kenneth Cunningham"
+ info = "Entry One - 27/05/2554: I just arrived, and already I hate my job. I'm stuck on this shithole of an outpost, trying to avoid these damn eggheads running all over the place preparing for god knows what. There's no crimes to stop, no syndies to kill, and I'm not even allowed to beat the fuckin' assistant senseless! They said I was transferred from Space Station 13 for 'good behavior', but this feels more like a punishment than a reward. All I know is that if I don't get some action soon, I'm going to go insane.
Entry Two - 03/06/2554: Okay, so get this: we got a fuckin' deathsquad coming in today! I thought the day I saw one of them would be the day my employment was 'terminated', if you get my drift. They're escorting some sort of weird alien creature for the eggheads to study. I heard one of the docs telling the chef that this thing killed a whole security force before it was captured. I sure as hell hope that I don't have to fight it.
Entry Three - 08/06/2554: My first real bit of 'action' today, if you could call it that. Crazy Ivan got in a fight with Kuester today about his Booze-O-Mat. Apparently one of the crewmembers had stolen a couple bottles of booze from the machine after Ivan disabled the ID lock. Tell you the truth, I don't blame the thief. Everyone is going a little stir-crazy in here, and the bartender is being damn stingy with the alcohol. Either way, once they started to pick a fight, I had to take them down. It's a damn shame that we don't have a brig, though. I had to lock Ivan in a fuckin' freezer, for god's sake. Let's hope that we can keep our sanity together, at least for a while.
Entry Four - 10/06/2554: Jesus fucking Christ riding on a motorbike. These things the scientists are studying are terrifying! Fucking great huge purple bug things as tall as the ceiling, with blades for arms and drooling at the mouth. I don't think my taser will do jack shit against these damn things, but the eggheads say that they're safely contained. If they do, I have a feeling that it's only a matter of time before we're all screwed. These bastards look like walking death.
Entry Five - 18/06/2554: Finally caught who stole the booze from Kuester. It was that fuckin' loser assistant Steve! He was in the dorms, chugging his worries away. I took one of the bottles back to the barkeep, but no one has to know about this second one. I think I'm gonna enjoy this while watching tomorrow's Thunderdome match.
Entry Six - 19/06/2554: Oh, great. The chef is still sleeping, so we get Ivan's gruel for breakfast today. I overheard Sano and Douglas saying something about the aliens being restless, so we might get some action today. As long as it happens after the big game, I'm fine with it. I still got one beer to drink before I'm ready to die."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/log/ivan
+ name = "Personal Log - Ivan Volodin"
+ info = "Ivan Volodin Stories:
Entry Won - 28/05/2554: Hello. I am Crazy Ivan. Boss say I must write. I do good job fixing outpost. Is very good job. Much better than mines. Many nice people. I cause no trouble.
Entry Too - 05/06/2554: I am finding problem with Booze-O-Mat. Is not problem. I solve very easy. Use yellow tool to make purple light go off. I am good engineer! Bartender will be very happy.
Entry Tree - 08/06/2554: Bartender is not happy. Security man is not happy. Cannot feel legs, is very cold in freezer. Is not good. Table is jammed into door, have no tools. Is very not good. But, on bright side, found meat! Shall chew to keep spirits up.
Entry Fore - 12/06/2554: Big nasty purple bug looked at me today. Make nervous. Blue wall wire can be broken, then bad thing happens. Very very bad thing. Man in orange spacesuit wave at me today too. He seem nice. Wonder who was?
Entry Fiv - 15/06/2554: I eat cornflakes today. Is good day. Sun shine for a while. Was nice. I also take ride on disposals chute. Was fun, but tiny. Get clog out of pipes, was vodka bottle. Is empty. This make many sads.
Entry Sex: 19/06/2554: Purple bugs jumpy today. When waved, get hiss. Maybe very bad. Maybe just ill. Do not know. Is science problem, is not engineer problem. I eat sandwich. Is glorious job. Wish to never end."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/log/gerald
+ name = "Personal Log - Gerald Rosswell"
+ info = "Personal Log for Research Director Gerald Rosswell
Entry One - 17/05/2554: You know, I can't believe I took this position so suddenly. I saw that corporate needed a research director for one of it's outposts and thought it would be a cakewalk, there isn't going to be a lot of research to be done on a tiny outpost. Mainly just running scans on the gas giant we are orbiting or some basic RnD. However, they conveniently forgot to tell me that me and my science staff would have to pull double duty as medical staff and that there is no one higher up on the chain of command here, so I get to pull triple duty as acting captain as well! This shit is probably allowed in some 3 point fine print buried underneath the literally thousands of pages of contracts. Well, at least the research will be easy work.
Entry Two - 25/05/2554: Well, we all expected it at the outpost, CentCom has decided to completely change what research we are doing. They've decided that we should be research the species known as 'xenomporphs'. They announced this change 4 days ago and along with it, sadly, the termination of our current science staff barring me. Not to mention the constant noise made by the construction detail they sent to staple on an xenobiology lab ensuring no one has been able to sleep decently ever since they announced the shift. To make matters worse our current security guard actually died of a heart attack today. Just goes to show that 75 year old men shouldn't be security guards. Still can't believe that they decided to do this major change less than a month after the outpost was established.
Entry Three - 27/05/2554: The new security guard arrived today. Apparently transferred here from the research station that also is orbiting the gas giant. He seems to be rather angry about his transfer. Considering the rumors I've heard about the research station he's probably caught off guard by the fact that Steve hasn't tried to force an IED down his throat.
Entry Four - 06/06/2554: My requests for additional security and containment measures for the 'xenomorph' has been denied. Does Central Command not notice how dangerous these creatures are? The only thing keeping them in is a force field, a minor problem with the power grid and the entire hive is loose. What would stop them then, the lone security guard with a dinky little taser? Kenneth can barely handle a short-tempered engineer. We are under equipped and under staffed, we are inevitably going to be destroyed unless we get the equipment and staff we need.
Entry Five - 10/06/2554: Cunningham got a good look at the xenomorph in containment. He was frightened for the rest of the day, rather amusing if it wasn't for the fact that we are all trapped on this scrap heap with naught but a force field keeping those xenomorphs in.
Entry Six - 17/06/2554: The reactions from the specimens today has shown that they possess strange mental properties. Mark hypothesizes that they possibly have a sort of hive mind, while nothing is certain this would explain how xenomorphs seem to have vastly increased intellect when a 'queen' is present. Of course, to test this hypothesis would require many complicated procedures which we will not be able to undertake. But we do not know the full extend of the xenomorph mind, it may or may not be able to find a way to circumvent our containment system. I will resend my request for additional security measures along with this new found information."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/food_specials
+ name = "Specials This Week"
+ info = "
I Can't Believe It's Not Pasta: Half off on Wednesdays
Burger night every Friday 6PM-10PM, free drinks with purchase of meal!
Premiering Tonight: The comedy stylings of Shoe Snatching Willy! 11AM-7PM
"
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/welcome
+ name = "Welcome Notice"
+ info = "
Welcome to Moon Outpost 19! Property of Nanotrasen Inc.
Staff Roster: -Dr. Gerald Rosswell: Research Director & Acting Captain -Dr. Sakuma Sano: Xenobiologist -Dr. Mark Douglas: Xenobiologist -Kenneth Cunningham: Security Officer-Ivan Volodin: Engineer -Mathias Kuester: Bartender -Sven Edling: Chef -Steve: Assistant
Please enjoy your stay, and report any abnormalities to an officer."
+
+/obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/goodbye_note
+ name = "Note"
+ info = "Bugs break out. I run to here and lock door. I hear door next to me break open and screams. All nice people here dead now. I no want to be eaten, and bottle always said to be coward way out, but person who say that is stupid. Mira, there is no escape for me, tell Alexis and Elena that father will never come home, and that I love you all."
+
+
diff --git a/code/modules/awaymissions/mission_code/research.dm b/code/modules/awaymissions/mission_code/research.dm
new file mode 100644
index 0000000000..982a958812
--- /dev/null
+++ b/code/modules/awaymissions/mission_code/research.dm
@@ -0,0 +1,5 @@
+//research papers
+
+/obj/item/weapon/paper/crumpled/awaymissions/research/sensitive_info
+ info = "Theres a lot of sensitive info on these disks, try and keep them secure! If these backup copies get into the wrong hands, god knows what they could do with the genetic research on these disk.."
+
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index b1dadcdf32..fbbbd2c2fd 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -1,24 +1,27 @@
+/////////// papers
-//notes for lore or treasure hints wow//--
-
-/obj/item/weapon/paper/crumpled/snowdin/snowdingatewaynotice
+/obj/item/weapon/paper/crumpled/ruins/snowdin/snowdingatewaynotice
name = "scribbled note"
info = {"The gateway has been inactive for months, engineers think it's due to the recent drop in tempature fucking with the
circuitry or something. Without a constant supply of resources from central command, our stock is getting awfully low. Some of the security members have taken to
using the sparse rifle ammo left to hunting some of the wildlife to try and keep our food supply from emptying. God forbid if the heating goes out, I don't want to
die as a fucking popsicle down here."}
-/obj/item/weapon/paper/crumpled/snowdin/misc1
+/obj/item/weapon/paper/crumpled/ruins/snowdin/misc1
name = "Mission Prologue"
info = {"Holy shit, what a rush! Those Nanotrasen bastards didn't even know what hit 'em! All five of us dropped in right on the captain, didn't even have time to yell! We were in and out with that disk in mere minutes!
Crew didn't even know what was happening till the delta alert went down and by then were were already gone. We got a case to drink on the way home to celebrate, fuckin' job well done!"}
-/obj/item/weapon/paper/crumpled/snowdin/keys
+/obj/item/weapon/paper/crumpled/ruins/snowdin/keys
name = "scribbled note"
info = {"As a notice for anyone looking to borrow an ATV, some asshat lost the key set for all the vehicles. Nobody has yet to actually come forward about the potential where-abouts, either due to embarrassment or fear of
reprecussions. I hope they enjoy walking through that shit snow during the next shipment because I sure as hell ain't."}
-/obj/item/weapon/paper/snowdin/snowdinlog
+/obj/item/weapon/paper/fluff/awaymissions/snowdin/saw_usage
+ name = "SAW Usage"
+ info = "YOU SEEN IVAN, WHEN YOU HOLD SAAW LIKE PEESTOL, YOU STRONGER THAN RECOIL FOR FEAR OF HITTING FACE!"
+
+/obj/item/weapon/paper/fluff/awaymissions/snowdin/log
name = "Activity Log"
info = {"
ACTIVITY LOG
June 3rd We've moved to the main base in the valley finally, apparently establishing a listening system on a planet
that never stops fucking snowing is a great idea. There's a few outposts further south we'll be supplying from the main gateway. The summer months are enough already, I can only imagine how bad it'll be during winter.
August 23rd
@@ -30,7 +33,7 @@
December 10th Signal has gotten much stronger, it almost seems like it's coming from under us according to what the researcher managed to decypher. We're waiting from the go from central before investigating.
The rest of the paper seems to be a mixture of scribbles and smudged ink. "}
-/obj/item/weapon/paper/snowdin/snowdinlog2
+/obj/item/weapon/paper/fluff/awaymissions/snowdin/log2
name = "Activity Log"
info = {"
ACTIVITY LOG
June 14th Movement to the second post is finally done. We're located on the southernmost area of the valley with a similar objective as the northern post.
There are two mid-way stops on the eastern and western sides of the valley so movement in between bases isn't horrible. Not too big of a fan of relying on the northern base for
@@ -40,35 +43,38 @@
shipment of supplies. The snow has really kicked up recently, shits almost like a constant blizzard right now. Maybe it'll drop down soon so we can get a word in.
The rest of the paper seems to be a mixture of scribbles and smudged ink. "}
-/obj/item/weapon/paper/snowdin/secnotice
+/obj/item/weapon/paper/fluff/awaymissions/snowdin/secnotice
name = "Security Notice"
info = {"You have been assigned a position on a listening outpost. Here you'll be watching over several crewmembers assigned to watching signals of the general area.
- As not much is expected in terms of issues, we've only assigned one guard per outpost. Crewmembers are expected to keep to their regulated work schedules and may be
- disciplined properly if found slacking. Food hoarding is heavily discouraged as all outposts will be sharing from the same shipment every 2-3 months. Hoarding of supplies
- should be punished severely as to prevent future incidients. Mutiny and/or rioting should be reported to central and dealt with swiftly. You're here to secure and protect
- Nanotrasen assets, not be a police officer. Do what you must, but make sure it's not messy."}
+ As not much is expected in terms of issues, we've only assigned one guard per outpost. Crewmembers are expected to keep to their regulated work schedules and may be
+ disciplined properly if found slacking. Food hoarding is heavily discouraged as all outposts will be sharing from the same shipment every 2-3 months. Hoarding of supplies
+ should be punished severely as to prevent future incidients. Mutiny and/or rioting should be reported to central and dealt with swiftly. You're here to secure and protect
+ Nanotrasen assets, not be a police officer. Do what you must, but make sure it's not messy."}
-/obj/item/weapon/paper/snowdin/syndienotice
+/obj/item/weapon/paper/fluff/awaymissions/snowdin/syndienotice
name = "Assignment Notice"
info = {"You've been assigned as an agent to listen in on Nanotrasen activities from passing ships and nearby stations. The outpost you've been assigned to is under lays of solid
ice and we've supplied you with a scrambler to help avoid Nanotrasen discovery, as they've recently built a listening post of their own aboveground. Get aquainted with your new
crewmates, because you're gonna be here for awhile. Enjoy the free syndicakes."}
-/obj/item/weapon/paper/crumpled/snowdin/syndielava
+/obj/item/weapon/paper/crumpled/ruins/snowdin/syndielava
name = "scribbled note"
info = {"Some cracks in the ice nearby have exposed some sort of hidden magma stream under all this shit ice. I don't know whats worse at this point honestly; freezing to death or
burning alive."}
-/obj/item/weapon/paper/crumpled/snowdin/lootstructures
+/obj/item/weapon/paper/crumpled/ruins/snowdin/lootstructures
name = "scribbled note"
info = {"From what we've seen so far, theres a ton of iced-over ruins down here in the caves. We sent a few men out to check things out and they never came back, so we decided to
border up majority of the ruins. We've heard some weird shit coming out of these caves and I'm not gonna find out the hard way myself."}
-/obj/item/weapon/paper/crumpled/snowdin/shovel
+/obj/item/weapon/paper/crumpled/ruins/snowdin/shovel
name = "shoveling duties"
info = {"Snow piles up bad here all-year round, even worse during the winter months. Keeping a constant rotation of shoveling that shit out of the way of the airlocks and keeping the paths decently clear
is a good step towards not getting stuck walking through knee-deep snow."}
+
+
+
//lootspawners//--
/obj/effect/spawner/lootdrop/snowdin
@@ -201,8 +207,8 @@
death = FALSE
faction = "syndicate"
outfit = /datum/outfit/snowsyndie
- flavour_text = {"You are a syndicate operative recently awoken from cyrostatis in an underground outpost. Monitor Nanotrasen communications and record infomation. All intruders should be
- disposed of swirfly to assure no gathered infomation is stolen or lost. Try not to wander too far from the outpost as the caves can be a deadly place even for a trained operative such as yourself."}
+ flavour_text = {"You are a syndicate operative recently awoken from cyrostatis in an underground outpost. Monitor Nanotrasen communications and record information. All intruders should be
+ disposed of swirfly to assure no gathered information is stolen or lost. Try not to wander too far from the outpost as the caves can be a deadly place even for a trained operative such as yourself."}
/datum/outfit/snowsyndie
name = "Syndicate Snow Operative"
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index 5fb373fbe7..59023dfa8c 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -28,7 +28,7 @@
B.deity_name = "Narsie"
B.icon_state = "melted"
B.item_state = "melted"
- new /obj/item/weapon/paper/sc_safehint_paper_bible(B)
+ new /obj/item/weapon/paper/fluff/awaymissions/stationcollision/safehint_paper_bible(B)
new /obj/item/weapon/pen(B)
qdel(src)
@@ -79,30 +79,30 @@ GLOBAL_VAR_INIT(sc_safecode4, "[rand(0,9)]")
GLOBAL_VAR_INIT(sc_safecode5, "[rand(0,9)]")
//Pieces of paper actually containing the hints
-/obj/item/weapon/paper/sc_safehint_paper_prison
+/obj/item/weapon/paper/fluff/awaymissions/stationcollision/safehint_paper_prison
name = "smudged paper"
-/obj/item/weapon/paper/sc_safehint_paper_prison/New()
+/obj/item/weapon/paper/fluff/awaymissions/stationcollision/safehint_paper_prison/New()
info = "The ink is smudged, you can only make out a couple numbers: '[GLOB.sc_safecode1]**[GLOB.sc_safecode4]*'"
-/obj/item/weapon/paper/sc_safehint_paper_hydro
+/obj/item/weapon/paper/fluff/awaymissions/stationcollision/safehint_paper_hydro
name = "shredded paper"
-/obj/item/weapon/paper/sc_safehint_paper_hydro/New()
+/obj/item/weapon/paper/fluff/awaymissions/stationcollision/safehint_paper_hydro/New()
info = "Although the paper is shredded, you can clearly see the number: '[GLOB.sc_safecode2]'"
-/obj/item/weapon/paper/sc_safehint_paper_caf
+/obj/item/weapon/paper/fluff/awaymissions/stationcollision/safehint_paper_caf
name = "blood-soaked paper"
//This does not have to be in New() because it is a constant. There are no variables in it i.e. [sc_safcode]
info = "This paper is soaked in blood, it is impossible to read any text."
-/obj/item/weapon/paper/sc_safehint_paper_bible
+/obj/item/weapon/paper/fluff/awaymissions/stationcollision/safehint_paper_bible
name = "hidden paper"
-/obj/item/weapon/paper/sc_safehint_paper_bible/New()
+/obj/item/weapon/paper/fluff/awaymissions/stationcollision/safehint_paper_bible/New()
info = {"It would appear that the pen hidden with the paper had leaked ink over the paper.
However you can make out the last three digits:'[GLOB.sc_safecode3][GLOB.sc_safecode4][GLOB.sc_safecode5]'
"}
-/obj/item/weapon/paper/sc_safehint_paper_shuttle
+/obj/item/weapon/paper/fluff/awaymissions/stationcollision/safehint_paper_shuttle
info = {"Target: Research-station Epsilon Objective: Prototype weaponry. The captain likely keeps them locked in her safe.
@@ -154,7 +154,7 @@ GLOBAL_VAR_INIT(sc_safecode5, "[rand(0,9)]")
if(isliving(A))
var/mob/living/L = A
L.gib()
- else if(istype(A,/obj/))
+ else if(istype(A, /obj/))
var/obj/O = A
O.ex_act(EXPLODE_DEVASTATE)
if(O) qdel(O)
diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm
index 95cf0d718c..2416fb83c3 100644
--- a/code/modules/awaymissions/mission_code/wildwest.dm
+++ b/code/modules/awaymissions/mission_code/wildwest.dm
@@ -4,6 +4,28 @@
* Meat Grinder
*/
+ ////////// wildwest papers
+
+/obj/item/weapon/paper/fluff/awaymissions/wildwest/grinder
+ info = "meat grinder requires sacri"
+
+
+/obj/item/weapon/paper/fluff/awaymissions/wildwest/journal/page1
+ name = "Planer Saul's Journal: Page 1"
+ info = "We've discovered something floating in space. We can't really tell how old it is, but it is scraped and bent to hell. There object is the size of about a room with double doors that we have yet to break into. It is a lot sturdier than we could have imagined. We have decided to call it 'The Vault' "
+
+/obj/item/weapon/paper/fluff/awaymissions/wildwest/journal/page4
+ name = "Planer Saul's Journal: Page 4"
+ info = " The miners in the town have become sick and almost all production has stopped. They, in a fit of delusion, tossed all of their mining equipment into the furnaces. They all claimed the same thing. A voice beckoning them to lay down their arms. Stupid miners."
+
+/obj/item/weapon/paper/fluff/awaymissions/wildwest/journal/page7
+ name = "Planer Sauls' Journal: Page 7"
+ info = "The Vault...it just keeps growing and growing. I went on my daily walk through the garden and now its just right outside the mansion... a few days ago it was only barely visible. But whatever is inside...its calling to me."
+
+/obj/item/weapon/paper/fluff/awaymissions/wildwest/journal/page8
+ name = "Planer Saul's Journal: Page 8"
+ info = "The syndicate have invaded. Their ships appeared out of nowhere and now they likely intend to kill us all and take everything. On the off-chance that the Vault may grant us sanctuary, many of us have decided to force our way inside and bolt the door, taking as many provisions with us as we can carry. In case you find this, send for help immediately and open the Vault. Find us inside."
+
/*
* Wish Granter
diff --git a/code/modules/awaymissions/pamphlet.dm b/code/modules/awaymissions/pamphlet.dm
index 76166a97af..2174fec852 100644
--- a/code/modules/awaymissions/pamphlet.dm
+++ b/code/modules/awaymissions/pamphlet.dm
@@ -1,6 +1,8 @@
/obj/item/weapon/paper/pamphlet
name = "pamphlet"
icon_state = "pamphlet"
+
+/obj/item/weapon/paper/pamphlet/gateway
info = "Welcome to the Nanotrasen Gateway project... \
Congratulations! If you're reading this, you and your superiors have decided that you're \
ready to commit to a life spent colonising the rolling hills of far away worlds. You \
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
index e21f9b7ed2..15117c1cbb 100644
--- a/code/modules/cargo/console.dm
+++ b/code/modules/cargo/console.dm
@@ -122,7 +122,7 @@
return
else
SSshuttle.shuttle_loan.loan_shuttle()
- say("The supply shuttle has been loaned to Centcom.")
+ say("The supply shuttle has been loaned to CentCom.")
. = TRUE
if("add")
var/id = text2path(params["id"])
diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm
index b8e18769db..d1fdf27306 100644
--- a/code/modules/cargo/export_scanner.dm
+++ b/code/modules/cargo/export_scanner.dm
@@ -3,6 +3,8 @@
desc = "A device used to check objects against Nanotrasen exports database."
icon_state = "export_scanner"
item_state = "radio"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags = NOBLUDGEON
w_class = WEIGHT_CLASS_SMALL
siemens_coefficient = 1
diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm
index 36a667bc23..8a36f178a4 100644
--- a/code/modules/cargo/exports.dm
+++ b/code/modules/cargo/exports.dm
@@ -1,5 +1,5 @@
/* How it works:
- The shuttle arrives at Centcom dock and calls sell(), which recursively loops through all the shuttle contents that are unanchored.
+ The shuttle arrives at CentCom dock and calls sell(), which recursively loops through all the shuttle contents that are unanchored.
The loop only checks contents of storage types, see supply.dm shuttle code.
Each object in the loop is checked for applies_to() of various export datums, except the invalid ones.
@@ -126,7 +126,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
var/the_cost = get_cost(O)
var/amount = get_amount(O)
total_cost += the_cost
- if(istype(O,/datum/export/material))
+ if(istype(O, /datum/export/material))
total_amount += amount*MINERAL_MATERIAL_AMOUNT
else
total_amount += amount
diff --git a/code/modules/cargo/exports/manifest.dm b/code/modules/cargo/exports/manifest.dm
index a2af0151b1..41af132eaf 100644
--- a/code/modules/cargo/exports/manifest.dm
+++ b/code/modules/cargo/exports/manifest.dm
@@ -4,13 +4,13 @@
cost = 200
k_elasticity = 0
unit_name = "approved manifest"
- export_types = list(/obj/item/weapon/paper/manifest)
+ export_types = list(/obj/item/weapon/paper/fluff/jobs/cargo/manifest)
/datum/export/manifest_correct/applies_to(obj/O)
if(!..())
return FALSE
- var/obj/item/weapon/paper/manifest/M = O
+ var/obj/item/weapon/paper/fluff/jobs/cargo/manifest/M = O
if(M.is_approved() && !M.errors)
return TRUE
return FALSE
@@ -21,19 +21,19 @@
cost = -500
k_elasticity = 0
unit_name = "correctly denied manifest"
- export_types = list(/obj/item/weapon/paper/manifest)
+ export_types = list(/obj/item/weapon/paper/fluff/jobs/cargo/manifest)
/datum/export/manifest_error_denied/applies_to(obj/O)
if(!..())
return FALSE
- var/obj/item/weapon/paper/manifest/M = O
+ var/obj/item/weapon/paper/fluff/jobs/cargo/manifest/M = O
if(M.is_denied() && M.errors)
return TRUE
return FALSE
/datum/export/manifest_error_denied/get_cost(obj/O)
- var/obj/item/weapon/paper/manifest/M = O
+ var/obj/item/weapon/paper/fluff/jobs/cargo/manifest/M = O
return ..() + M.order_cost
@@ -41,19 +41,19 @@
// Substracts the package cost.
/datum/export/manifest_error
unit_name = "erroneously approved manifest"
- export_types = list(/obj/item/weapon/paper/manifest)
+ export_types = list(/obj/item/weapon/paper/fluff/jobs/cargo/manifest)
/datum/export/manifest_error/applies_to(obj/O)
if(!..())
return FALSE
- var/obj/item/weapon/paper/manifest/M = O
+ var/obj/item/weapon/paper/fluff/jobs/cargo/manifest/M = O
if(M.is_approved() && M.errors)
return TRUE
return FALSE
/datum/export/manifest_error/get_cost(obj/O)
- var/obj/item/weapon/paper/manifest/M = O
+ var/obj/item/weapon/paper/fluff/jobs/cargo/manifest/M = O
return -M.order_cost
@@ -62,17 +62,17 @@
/datum/export/manifest_correct_denied
cost = 500
unit_name = "erroneously denied manifest"
- export_types = list(/obj/item/weapon/paper/manifest)
+ export_types = list(/obj/item/weapon/paper/fluff/jobs/cargo/manifest)
/datum/export/manifest_correct_denied/applies_to(obj/O)
if(!..())
return FALSE
- var/obj/item/weapon/paper/manifest/M = O
+ var/obj/item/weapon/paper/fluff/jobs/cargo/manifest/M = O
if(M.is_denied() && !M.errors)
return TRUE
return FALSE
/datum/export/manifest_correct_denied/get_cost(obj/O)
- var/obj/item/weapon/paper/manifest/M = O
+ var/obj/item/weapon/paper/fluff/jobs/cargo/manifest/M = O
return ..() - M.order_cost
diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm
index 8abc78ac0e..a73529850d 100644
--- a/code/modules/cargo/exports/sheets.dm
+++ b/code/modules/cargo/exports/sheets.dm
@@ -79,8 +79,7 @@
message = "of reinforced glass"
export_types = list(/obj/item/stack/sheet/rglass)
-// Bluespace Polycrystals. About as common on the asteroid as
-
+// Bluespace Polycrystals. Uncommon.
/datum/export/stack/bscrystal
cost = 750
message = "of bluespace crystals"
diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm
index 19ccc71495..35668e738a 100644
--- a/code/modules/cargo/order.dm
+++ b/code/modules/cargo/order.dm
@@ -1,9 +1,9 @@
-/obj/item/weapon/paper/manifest
+/obj/item/weapon/paper/fluff/jobs/cargo/manifest
var/order_cost = 0
var/order_id = 0
var/errors = 0
-/obj/item/weapon/paper/manifest/New(atom/A, id, cost)
+/obj/item/weapon/paper/fluff/jobs/cargo/manifest/New(atom/A, id, cost)
..()
order_id = id
order_cost = cost
@@ -15,10 +15,10 @@
if(prob(MANIFEST_ERROR_CHANCE))
errors |= MANIFEST_ERROR_ITEM
-/obj/item/weapon/paper/manifest/proc/is_approved()
+/obj/item/weapon/paper/fluff/jobs/cargo/manifest/proc/is_approved()
return stamped && stamped.len && !is_denied()
-/obj/item/weapon/paper/manifest/proc/is_denied()
+/obj/item/weapon/paper/fluff/jobs/cargo/manifest/proc/is_denied()
return stamped && ("stamp-deny" in stamped)
/datum/supply_order
@@ -54,7 +54,7 @@
return P
/datum/supply_order/proc/generateManifest(obj/structure/closet/crate/C)
- var/obj/item/weapon/paper/manifest/P = new(C, id, pack.cost)
+ var/obj/item/weapon/paper/fluff/jobs/cargo/manifest/P = new(C, id, pack.cost)
var/station_name = (P.errors & MANIFEST_ERROR_NAME) ? new_station_name() : station_name()
@@ -85,7 +85,7 @@
/datum/supply_order/proc/generate(turf/T)
var/obj/structure/closet/crate/C = pack.generate(T)
- var/obj/item/weapon/paper/manifest/M = generateManifest(C)
+ var/obj/item/weapon/paper/fluff/jobs/cargo/manifest/M = generateManifest(C)
if(M.errors & MANIFEST_ERROR_ITEM)
if(istype(C, /obj/structure/closet/crate/secure) || istype(C, /obj/structure/closet/crate/large))
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 0982808557..263b5c5d30 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -546,7 +546,7 @@
/datum/supply_pack/engineering/inducers
name = "NT-75 Electromagnetic Power Inducers Crate"
cost = 2000
- contains = list(/obj/item/weapon/inducer/sci {cell_type = /obj/item/weapon/stock_parts/cell/{maxcharge = 5000; charge = 5000};opened = 0},/obj/item/weapon/inducer/sci {cell_type = /obj/item/weapon/stock_parts/cell/{maxcharge = 5000; charge = 5000};opened = 0}) //FALSE doesn't work in modified type paths apparently.
+ contains = list(/obj/item/weapon/inducer/sci {cell_type = /obj/item/weapon/stock_parts/cell/{maxcharge = 5000; charge = 5000};opened = 0}, /obj/item/weapon/inducer/sci {cell_type = /obj/item/weapon/stock_parts/cell/{maxcharge = 5000; charge = 5000};opened = 0}) //FALSE doesn't work in modified type paths apparently.
crate_name = "inducer crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
@@ -620,7 +620,7 @@
/obj/item/solar_assembly,
/obj/item/weapon/circuitboard/computer/solar_control,
/obj/item/weapon/electronics/tracker,
- /obj/item/weapon/paper/solar)
+ /obj/item/weapon/paper/guides/jobs/engi/solars)
crate_name = "solar panel crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
@@ -1336,7 +1336,7 @@
/obj/item/conveyor_construct,
/obj/item/conveyor_construct,
/obj/item/conveyor_switch_construct,
- /obj/item/weapon/paper/conveyor)
+ /obj/item/weapon/paper/guides/conveyor)
crate_name = "conveyor assembly crate"
/datum/supply_pack/misc/watertank
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 06e921399e..5dfd9ecd4b 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -48,7 +48,7 @@
preload_rsc = PRELOAD_RSC
- var/global/obj/screen/click_catcher/void
+ var/obj/screen/click_catcher/void
// Used by html_interface module.
var/hi_last_pos
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index aa54bb224e..4455af7ca9 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -301,10 +301,8 @@ GLOBAL_LIST(external_rsc_urls)
send_resources()
- if(!void)
- void = new()
-
- screen += void
+ generate_clickcatcher()
+ apply_clickcatcher()
if(prefs.lastchangelog != GLOB.changelog_hash) //bolds the changelog button on the interface so we know there are updates.
to_chat(src, "You have unread updates in the changelog.")
@@ -667,6 +665,16 @@ GLOBAL_LIST(external_rsc_urls)
CRASH("change_view called without argument.")
view = new_size
+ apply_clickcatcher()
+
+/client/proc/generate_clickcatcher()
+ if(!void)
+ void = new()
+ screen += void
+
+/client/proc/apply_clickcatcher()
+ generate_clickcatcher()
+ void.UpdateGreed(view,view)
/client/proc/AnnouncePR(announcement)
if(prefs && prefs.chat_toggles & CHAT_PULLR)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 484e09c5ad..4c23db3f86 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -19,8 +19,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//game-preferences
var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
var/ooccolor = null
- var/enable_tips = TRUE
- var/tip_delay = 500 //tip delay in milliseconds
+ var/enable_tips = TRUE
+ var/tip_delay = 500 //tip delay in milliseconds
//Antag preferences
var/list/be_special = list() //Special role selection
@@ -30,7 +30,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/UI_style = "Midnight"
- var/buttons_locked = FALSE
+ var/buttons_locked = FALSE
var/hotkeys = FALSE
var/tgui_fancy = TRUE
var/tgui_lock = TRUE
@@ -130,7 +130,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"womb_cum_rate" = CUM_RATE,
"womb_cum_mult" = CUM_RATE_MULT,
"womb_efficiency" = CUM_EFFICIENCY,
- "womb_fluid" = "femcum"
+ "womb_fluid" = "femcum",
+ "flavor_text" = ""
)//MAKE SURE TO UPDATE THE LIST IN MOBS.DM IF YOU'RE GOING TO ADD TO THIS LIST, OTHERWISE THINGS MIGHT GET FUCKEY
var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
@@ -175,7 +176,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//citadel code
var/arousable = TRUE //Allows players to disable arousal from the character creation menu
- var/flavor_text = ""
/datum/preferences/New(client/C)
parent = C
@@ -279,7 +279,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "
"
dat += "Set Flavor Text "
- if(lentext(flavor_text) <= 40)
- if(!lentext(flavor_text))
+ if(lentext(features["flavor_text"]) <= 40)
+ if(!lentext(features["flavor_text"]))
dat += "\[...\]"
else
- dat += "[flavor_text]"
+ dat += "[features["flavor_text"]]"
else
- dat += "[TextPreview(flavor_text)]... "
+ dat += "[TextPreview(features["flavor_text"])]... "
if(config.mutant_races)//really don't need this check, but fuck un-tabbing all those lines
dat += "
Body
"
dat += "Gender:[gender == MALE ? "Male" : "Female"] "
@@ -916,11 +916,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
if("flavor_text")
- var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message
+ var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(features["flavor_text"])) as message
if(msg != null)
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
msg = html_encode(msg)
- flavor_text = msg
+ features["flavor_text"] = msg
if("metadata")
var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null
@@ -1499,8 +1499,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("hotkeys")
hotkeys = !hotkeys
- if("action_buttons")
- buttons_locked = !buttons_locked
+ if("action_buttons")
+ buttons_locked = !buttons_locked
if("tgui_fancy")
tgui_fancy = !tgui_fancy
if("tgui_lock")
@@ -1628,7 +1628,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.backbag = backbag
- character.dna.features = features.Copy()
+ character.dna.features = features.Copy() //Flavor text is now a DNA feature
character.dna.real_name = character.real_name
var/datum/species/chosen_species
if(pref_species != /datum/species/human && config.mutant_races)
@@ -1639,10 +1639,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//citadel code
character.give_genitals()
- character.flavor_text = flavor_text
+ character.flavor_text = features["flavor_text"] //Let's update their flavor_text at least initially
character.canbearoused = arousable
if(icon_updates)
character.update_body()
character.update_hair()
character.update_body_parts()
+ character.update_genitals()
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index c52767f1d9..f846f52625 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -342,9 +342,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["job_engsec_med"] >> job_engsec_med
S["job_engsec_low"] >> job_engsec_low
-
//Citadel code
- S["flavor_text"] >> flavor_text
S["feature_exhibitionist"] >> features["exhibitionist"]
S["feature_mcolor2"] >> features["mcolor2"]
S["feature_mcolor3"] >> features["mcolor3"]
@@ -382,6 +380,17 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_vag_color"] >> features["vag_color"]
//womb features
S["feature_has_womb"] >> features["has_womb"]
+ //flavor text
+ //Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts:
+ if((S["flavor_text"] != "") && (S["flavor_text"] != null) && S["flavor_text"]) //If old text isn't null and isn't "" but still exists.
+ S["flavor_text"] >> features["flavor_text"] //Load old flavortext as current dna-based flavortext
+
+ S["feature_flavor_text"] << features["flavor_text"] //Save it in our new type of flavor-text
+ S["flavor_text"] << "" //Remove old flavortext, completing the cut-and-paste into the new format.
+
+ else //We have no old flavortext, default to new
+ S["feature_flavor_text"] >> features["flavor_text"]
+
//try to fix any outdated data if necessary
if(needs_update >= 0)
@@ -441,7 +450,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low))
//Citadel
- flavor_text = sanitize_text(flavor_text, initial(flavor_text))
+ features["flavor_text"] = sanitize_text(features["flavor_text"], initial(features["flavor_text"]))
if(!features["mcolor2"] || features["mcolor"] == "#000")
features["mcolor2"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
if(!features["mcolor3"] || features["mcolor"] == "#000")
@@ -510,7 +519,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["job_engsec_low"] << job_engsec_low
//Citadel
- S["flavor_text"] << flavor_text
S["feature_exhibitionist"] << features["exhibitionist"]
S["feature_mcolor2"] << features["mcolor2"]
S["feature_mcolor3"] << features["mcolor3"]
@@ -548,7 +556,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_vag_color"] << features["vag_color"]
//womb features
S["feature_has_womb"] << features["has_womb"]
-
+ //flavor text
+ S["feature_flavor_text"] << features["flavor_text"]
return 1
#undef SAVEFILE_VERSION_MAX
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 943999aecc..d56b6e0619 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -174,8 +174,8 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, Toggle_Soundscape)()
to_chat(usr, "You will now hear ambient sounds.")
else
to_chat(usr, "You will no longer hear ambient sounds.")
- usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
- usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
+ usr.stop_sound_channel(CHANNEL_AMBIENCE)
+ usr.stop_sound_channel(CHANNEL_BUZZ)
SSblackbox.add_details("preferences_verb","Toggle Ambience|[usr.client.prefs.toggles & SOUND_AMBIENCE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/verbs/menu/Settings/Sound/Toggle_Soundscape/Get_checked(client/C)
return C.prefs.toggles & SOUND_AMBIENCE
@@ -191,7 +191,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_ship_ambience)()
to_chat(usr, "You will now hear ship ambience.")
else
to_chat(usr, "You will no longer hear ship ambience.")
- usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
+ usr.stop_sound_channel(CHANNEL_BUZZ)
usr.client.ambience_playing = 0
SSblackbox.add_details("preferences_verb", "Toggle Ship Ambience|[usr.client.prefs.toggles & SOUND_SHIP_AMBIENCE]") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^)
/datum/verbs/menu/Settings/Sound/toggle_ship_ambience/Get_checked(client/C)
diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
index f082c4971c..aeb1a7fdcf 100644
--- a/code/modules/client/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -9,9 +9,19 @@
if(!mob)
return
- if(IsGuestKey(key))
- to_chat(src, "Guests may not use OOC.")
- return
+ if(!holder)
+ if(!GLOB.ooc_allowed)
+ to_chat(src, "OOC is globally muted.")
+ return
+ if(!GLOB.dooc_allowed && (mob.stat == DEAD))
+ to_chat(usr, "OOC for dead mobs has been turned off.")
+ return
+ if(prefs.muted & MUTE_OOC)
+ to_chat(src, "You cannot use OOC (muted).")
+ return
+ if(jobban_isbanned(src.mob, "OOC"))
+ to_chat(src, "You have been banned from OOC.")
+ return
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
var/raw_msg = msg
@@ -25,24 +35,7 @@
if(alert("Your message \"[raw_msg]\" looks like it was meant for in game communication, say it in OOC?", "Meant for OOC?", "No", "Yes") != "Yes")
return
- if(!(prefs.chat_toggles & CHAT_OOC))
- to_chat(src, "You have OOC muted.")
- return
-
if(!holder)
- if(!GLOB.ooc_allowed)
- to_chat(src, "OOC is globally muted.")
- return
- if(!GLOB.dooc_allowed && (mob.stat == DEAD))
- to_chat(usr, "OOC for dead mobs has been turned off.")
- return
- if(prefs.muted & MUTE_OOC)
- to_chat(src, "You cannot use OOC (muted).")
- return
- if(src.mob)
- if(jobban_isbanned(src.mob, "OOC"))
- to_chat(src, "You have been banned from OOC.")
- return
if(handle_spam_prevention(msg,MUTE_OOC))
return
if(findtext(msg, "byond://"))
@@ -51,6 +44,11 @@
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return
+ if(!(prefs.chat_toggles & CHAT_OOC))
+ to_chat(src, "You have OOC muted.")
+ return
+
+
log_talk(mob,"[key_name(src)] : [raw_msg]",LOGOOC)
mob.log_message("[key]: [raw_msg]", INDIVIDUAL_OOC_LOG)
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index 32d6b1fc4b..e798a0c0ad 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -2,6 +2,7 @@
/datum/action/item_action/chameleon/drone/randomise
name = "Randomise Headgear"
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "random"
/datum/action/item_action/chameleon/drone/randomise/Trigger()
@@ -21,6 +22,7 @@
/datum/action/item_action/chameleon/drone/togglehatmask
name = "Toggle Headgear Mode"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
/datum/action/item_action/chameleon/drone/togglehatmask/New()
..()
@@ -50,9 +52,9 @@
var/obj/old_headgear = target
var/obj/new_headgear
- if(istype(old_headgear,/obj/item/clothing/head/chameleon/drone))
+ if(istype(old_headgear, /obj/item/clothing/head/chameleon/drone))
new_headgear = new /obj/item/clothing/mask/chameleon/drone()
- else if(istype(old_headgear,/obj/item/clothing/mask/chameleon/drone))
+ else if(istype(old_headgear, /obj/item/clothing/mask/chameleon/drone))
new_headgear = new /obj/item/clothing/head/chameleon/drone()
else
to_chat(owner, "You shouldn't be able to toggle a camogear helmetmask if you're not wearing it")
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index afbd8c7654..bd6ffe5f67 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -6,7 +6,7 @@
var/damaged_clothes = 0 //similar to machine's BROKEN stat and structure's broken var
var/flash_protect = 0 //What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS
var/tint = 0 //Sets the item's level of visual impairment tint, normally set to the same as flash_protect
- var/up = 0 //but seperated to allow items to protect but not impair vision, like space helmets
+ var/up = 0 //but separated to allow items to protect but not impair vision, like space helmets
var/visor_flags = 0 //flags that are added/removed when an item is adjusted up/down
var/visor_flags_inv = 0 //same as visor_flags, but for flags_inv
var/visor_flags_cover = 0 //same as above, but for flags_cover
@@ -49,7 +49,7 @@
if(pockets && over_object == M)
return pockets.MouseDrop(over_object)
- if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
+ if(istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech
return
if(!M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand))
@@ -483,6 +483,7 @@ BLIND // can't see anything
equip_delay_other = 50
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = 0
+ dog_fashion = null
/obj/item/clothing/suit/space
name = "space suit"
@@ -494,7 +495,7 @@ BLIND // can't see anything
permeability_coefficient = 0.02
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals)
slowdown = 1
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50, fire = 80, acid = 70)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -537,13 +538,15 @@ BLIND // can't see anything
if(accessory_overlay)
. += accessory_overlay
-/obj/item/clothing/under/attackby(obj/item/W, mob/user, params)
- if((has_sensor == BROKEN_SENSORS) && istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = W
+/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
+ if((has_sensor == BROKEN_SENSORS) && istype(I, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = I
C.use(1)
has_sensor = HAS_SENSORS
to_chat(user,"You repair the suit sensors on [src] with [C].")
return 1
+ if(!attach_accessory(I, user))
+ return ..()
/obj/item/clothing/under/update_clothes_damaged_state(damaging = TRUE)
..()
@@ -590,10 +593,6 @@ BLIND // can't see anything
..()
-/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
- if(!attach_accessory(I, user))
- ..()
-
/obj/item/clothing/under/proc/attach_accessory(obj/item/I, mob/user, notifyAttach = 1)
. = FALSE
if(istype(I, /obj/item/clothing/accessory))
diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm
index 906bde2a87..4061c4db03 100644
--- a/code/modules/clothing/ears/ears.dm
+++ b/code/modules/clothing/ears/ears.dm
@@ -47,4 +47,4 @@
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."]")
+ 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/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm
index 012a446b1d..7908964b1c 100644
--- a/code/modules/clothing/glasses/engine_goggles.dm
+++ b/code/modules/clothing/glasses/engine_goggles.dm
@@ -90,7 +90,7 @@
/obj/item/clothing/glasses/meson/engine/update_icon()
icon_state = mesons_on ? "trayson-meson" : "trayson-tray"
- if(istype(loc,/mob/living/carbon/human/))
+ if(istype(loc, /mob/living/carbon/human/))
var/mob/living/carbon/human/user = loc
if(user.glasses == src)
user.update_inv_glasses()
@@ -116,7 +116,7 @@
/obj/item/clothing/glasses/meson/engine/tray/update_icon()
icon_state = "trayson-tray[on ? "" : "_off"]"
- if(istype(loc,/mob/living/carbon/human/))
+ if(istype(loc, /mob/living/carbon/human/))
var/mob/living/carbon/human/user = loc
if(user.glasses == src)
user.update_inv_glasses()
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 1713830c6c..2c972ccc70 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -1,7 +1,7 @@
/obj/item/clothing/head/centhat
- name = "\improper Centcom hat"
+ name = "\improper CentCom hat"
icon_state = "centcom"
desc = "It's good to be emperor."
item_state = "that"
@@ -246,7 +246,7 @@
/obj/item/clothing/head/jester
name = "jester hat"
- desc = "A hat with bells, to add some merryness to the suit."
+ desc = "A hat with bells, to add some merriness to the suit."
icon_state = "jester_hat"
/obj/item/clothing/head/rice_hat
@@ -296,5 +296,5 @@
/obj/item/clothing/head/jester/alt
name = "jester hat"
- desc = "A hat with bells, to add some merryness to the suit."
+ desc = "A hat with bells, to add some merriness to the suit."
icon_state = "jester_hat2"
\ No newline at end of file
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index cd2b4c18d5..f3c6690ce4 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -161,7 +161,7 @@
/datum/outfit/centcom_official
- name = "Centcom Official"
+ name = "CentCom Official"
uniform = /obj/item/clothing/under/rank/centcom_officer
shoes = /obj/item/clothing/shoes/sneakers/black
@@ -181,13 +181,13 @@
var/obj/item/device/pda/heads/pda = H.r_store
pda.owner = H.real_name
- pda.ownjob = "Centcom Official"
+ pda.ownjob = "CentCom Official"
pda.update_label()
var/obj/item/weapon/card/id/W = H.wear_id
W.icon_state = "centcom"
- W.access = get_centcom_access("Centcom Official")
+ W.access = get_centcom_access("CentCom Official")
W.access += ACCESS_WEAPONS
- W.assignment = "Centcom Official"
+ W.assignment = "CentCom Official"
W.registered_name = H.real_name
W.update_label()
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index a16226bda5..66b62d3a67 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -182,7 +182,7 @@
W.update_label(H.real_name)
/datum/outfit/centcom_commander
- name = "Centcom Commander"
+ name = "CentCom Commander"
uniform = /obj/item/clothing/under/rank/centcom_commander
suit = /obj/item/clothing/suit/armor/bulletproof
@@ -205,8 +205,8 @@
var/obj/item/weapon/card/id/W = H.wear_id
W.icon_state = "centcom"
W.access = get_all_accesses()
- W.access += get_centcom_access("Centcom Commander")
- W.assignment = "Centcom Commander"
+ W.access += get_centcom_access("CentCom Commander")
+ W.assignment = "CentCom Commander"
W.registered_name = H.real_name
W.update_label()
@@ -374,7 +374,7 @@
var/obj/item/weapon/card/id/W = H.wear_id
W.icon_state = "centcom"
W.access = get_all_accesses()//They get full station access.
- W.access += get_centcom_access("Death Commando")//Let's add their alloted Centcom access.
+ W.access += get_centcom_access("Death Commando")//Let's add their alloted CentCom access.
W.assignment = "Death Commando"
W.registered_name = H.real_name
W.update_label(W.registered_name, W.assignment)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 3be1bfbbf0..01410d4222 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -17,6 +17,8 @@
desc = "High speed, low drag combat boots."
icon_state = "jackboots"
item_state = "jackboots"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 10, rad = 0, fire = 70, acid = 50)
strip_delay = 70
resistance_flags = 0
@@ -97,6 +99,8 @@
desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
icon_state = "jackboots"
item_state = "jackboots"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
item_color = "hosred"
strip_delay = 50
equip_delay_other = 50
@@ -122,6 +126,8 @@
desc = "Nanotrasen-issue Engineering lace-up work boots for the especially blue-collar."
icon_state = "workboots"
item_state = "jackboots"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
strip_delay = 40
equip_delay_other = 40
pockets = /obj/item/weapon/storage/internal/pocket/shoes
@@ -206,7 +212,7 @@
jumping = TRUE
playsound(src.loc, 'sound/effects/stealthoff.ogg', 50, 1, 1)
- usr.visible_message("[usr] dashes foward into the air!")
+ usr.visible_message("[usr] dashes forward into the air!")
usr.throw_at(target, jumpdistance, jumpspeed, spin=0, diagonals_first = 1, callback = CALLBACK(src, .proc/hop_end))
/obj/item/clothing/shoes/bhop/proc/hop_end()
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 45b7ccb61f..23ea5bc5ff 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -320,6 +320,7 @@
/datum/action/innate/chrono_teleport
name = "Teleport Now"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "chrono_phase"
check_flags = AB_CHECK_CONSCIOUS //|AB_CHECK_INSIDE
var/obj/item/clothing/suit/space/chronos/chronosuit = null
diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm
index ac82faba2d..9888be0494 100644
--- a/code/modules/clothing/spacesuits/flightsuit.dm
+++ b/code/modules/clothing/spacesuits/flightsuit.dm
@@ -906,8 +906,8 @@
jetpack = null
var/flightpack
var/flight = FALSE
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
- actions_types = list(/datum/action/item_action/flightsuit/toggle_helmet,/datum/action/item_action/flightsuit/toggle_boots,/datum/action/item_action/flightsuit/toggle_flightpack,/datum/action/item_action/flightsuit/lock_suit)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/gun, /obj/item/weapon/reagent_containers/spray/pepper, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs)
+ actions_types = list(/datum/action/item_action/flightsuit/toggle_helmet, /datum/action/item_action/flightsuit/toggle_boots, /datum/action/item_action/flightsuit/toggle_flightpack, /datum/action/item_action/flightsuit/lock_suit)
armor = list(melee = 20, bullet = 20, laser = 20, energy = 10, bomb = 30, bio = 100, rad = 75, fire = 100, acid = 100)
var/maint_panel = FALSE
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
@@ -1219,7 +1219,7 @@
//FLIGHT HELMET----------------------------------------------------------------------------------------------------------------------------------------------------
/obj/item/clothing/head/helmet/space/hardsuit/flightsuit
name = "flight helmet"
- desc = "A sealed helmet attached to a flight suit for EVA usage scenerios. Its visor contains an information uplink HUD."
+ desc = "A sealed helmet attached to a flight suit for EVA usage scenarios. Its visor contains an information uplink HUD."
icon_state = "flighthelmet"
item_state = "flighthelmet"
item_color = "flight"
@@ -1266,6 +1266,9 @@
//ITEM actionS------------------------------------------------------------------------------------------------------------------------------------------------------
//TODO: TOGGLED BUTTON SPRITES
+/datum/action/item_action/flightsuit
+ icon_icon = 'icons/mob/actions/actions_flightsuit.dmi'
+
/datum/action/item_action/flightsuit/toggle_boots
name = "Toggle Boots"
button_icon_state = "flightsuit_shoes"
@@ -1286,6 +1289,9 @@
button_icon_state = "flightsuit_lock"
background_icon_state = "bg_tech"
+/datum/action/item_action/flightpack
+ icon_icon = 'icons/mob/actions/actions_flightsuit.dmi'
+
/datum/action/item_action/flightpack/toggle_flight
name = "Toggle Flight"
button_icon_state = "flightpack_fly"
@@ -1313,5 +1319,7 @@
/datum/action/item_action/flightpack/zoom
name = "Helmet Smart Zoom"
+ icon_icon = 'icons/mob/actions.dmi'
background_icon_state = "bg_tech_blue"
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "sniper_zoom"
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 6d13145626..00f622b751 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -65,7 +65,7 @@
item_state = "eng_hardsuit"
max_integrity = 300
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 50, acid = 75)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/device/t_scanner, /obj/item/weapon/construction/rcd, /obj/item/weapon/pipe_dispenser)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/device/t_scanner, /obj/item/weapon/construction/rcd, /obj/item/weapon/pipe_dispenser)
siemens_coefficient = 0
var/obj/item/clothing/head/helmet/space/hardsuit/helmet
actions_types = list(/datum/action/item_action/toggle_helmet)
@@ -203,7 +203,7 @@
heat_protection = CHEST|GROIN|LEGS|ARMS
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 75)
brightness_on = 7
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator)
/obj/item/clothing/suit/space/hardsuit/mining
@@ -214,7 +214,7 @@
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 75)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/pickaxe)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/storage/bag/ore, /obj/item/weapon/pickaxe)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining
//Syndicate hardsuit
@@ -304,7 +304,7 @@
item_color = "syndi"
w_class = WEIGHT_CLASS_NORMAL
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50, fire = 50, acid = 90)
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/transforming/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
+ allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/melee/transforming/energy/sword/saber, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi
jetpack = /obj/item/weapon/tank/jetpack/suit
@@ -378,7 +378,7 @@
w_class = WEIGHT_CLASS_NORMAL
resistance_flags = FIRE_PROOF | ACID_PROOF
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50, fire = 100, acid = 100)
- allowed = list(/obj/item/weapon/teleportation_scroll,/obj/item/weapon/tank/internals)
+ allowed = list(/obj/item/weapon/teleportation_scroll, /obj/item/weapon/tank/internals)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/wizard
@@ -400,7 +400,7 @@
name = "medical hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Built with lightweight materials for easier movement."
item_state = "medical_hardsuit"
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/storage/firstaid, /obj/item/device/healthanalyzer, /obj/item/stack/medical)
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50, fire = 75, acid = 75)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/medical
@@ -444,7 +444,7 @@
item_state = "hardsuit-rd"
resistance_flags = ACID_PROOF | FIRE_PROOF
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT //Same as an emergency firesuit. Not ideal for extended exposure.
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/gun/energy/wormhole_projector,
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/gun/energy/wormhole_projector,
/obj/item/weapon/hand_tele, /obj/item/device/aicard)
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 100, bio = 100, rad = 60, fire = 60, acid = 80)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/rd
@@ -466,7 +466,7 @@
name = "security hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
item_state = "sec_hardsuit"
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/ballistic,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/gun/energy, /obj/item/weapon/reagent_containers/spray/pepper, /obj/item/weapon/gun/ballistic, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs)
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50, fire = 75, acid = 75)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security
@@ -508,7 +508,7 @@
desc = "A MK.II SWAT suit with streamlined joints and armor made out of superior materials, insulated against intense heat. The most advanced tactical armor available Usually reserved for heavy hitter corporate security, this one has a regal finish in Nanotrasen company colors. Better not let the assistants get a hold of it."
icon_state = "caparmor"
item_state = "capspacesuit"
- allowed = list(/obj/item/weapon/tank/internals, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/ballistic, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
+ allowed = list(/obj/item/weapon/tank/internals, /obj/item/device/flashlight, /obj/item/weapon/gun/energy, /obj/item/weapon/gun/ballistic, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs)
armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -579,7 +579,7 @@
desc = "A hardsuit with built in energy shielding. Will rapidly recharge when not under fire."
icon_state = "hardsuit-hos"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/gun, /obj/item/weapon/reagent_containers/spray/pepper, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs)
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50, fire = 100, acid = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
var/current_charges = 3
@@ -698,7 +698,7 @@
item_state = "syndie_hardsuit"
item_color = "syndi"
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50, fire = 100, acid = 100)
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/transforming/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
+ allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/melee/transforming/energy/sword/saber, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
slowdown = 0
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index ce31dd7995..f4b99baad7 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -34,7 +34,7 @@ Contains:
desc = "A prototype designed to replace the ageing MK.II SWAT suit. Based on the streamlined MK.II model, the traditional ceramic and graphene plate construction was replaced with plasteel, allowing superior armor against most threats. There's room for some kind of energy projection device on the back."
icon_state = "deathsquad"
item_state = "swat_suit"
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/kitchen/knife/combat)
+ allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/tank/internals, /obj/item/weapon/kitchen/knife/combat)
armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
@@ -48,7 +48,7 @@ Contains:
desc = "A tactical space suit first developed in a joint effort by the defunct IS-ERI and Nanotrasen in 20XX for military space operations. A tried and true workhorse, it is very difficult to move in but offers robust protection against all threats!"
icon_state = "heavy"
item_state = "swat_suit"
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/kitchen/knife/combat)
+ allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/tank/internals, /obj/item/weapon/kitchen/knife/combat)
armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 50, bio = 90, rad = 20, fire = 100, acid = 100)
strip_delay = 120
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -73,7 +73,7 @@ Contains:
slowdown = 0
flags_inv = 0
w_class = WEIGHT_CLASS_NORMAL
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
+ allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/tank/internals)
armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
@@ -82,7 +82,7 @@ Contains:
//NASA Voidsuit
/obj/item/clothing/head/helmet/space/nasavoid
name = "NASA Void Helmet"
- desc = "An old, NASA Centcom branch designed, dark red space suit helmet."
+ desc = "An old, NASA CentCom branch designed, dark red space suit helmet."
icon_state = "void"
item_state = "void"
@@ -90,12 +90,12 @@ Contains:
name = "NASA Voidsuit"
icon_state = "void"
item_state = "void"
- desc = "An old, NASA Centcom branch designed, dark red space suit."
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/device/multitool)
+ desc = "An old, NASA CentCom branch designed, dark red space suit."
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/device/multitool)
/obj/item/clothing/head/helmet/space/nasavoid/old
name = "Engineering Void Helmet"
- desc = "A Centcom engineering dark red space suit helmet. While old and dusty, it still gets the job done."
+ desc = "A CentCom engineering dark red space suit helmet. While old and dusty, it still gets the job done."
icon_state = "void"
item_state = "void"
@@ -103,9 +103,9 @@ Contains:
name = "Engineering Voidsuit"
icon_state = "void"
item_state = "void"
- desc = "A Centcom engineering dark red space suit. Age has degraded the suit making is difficult to move around in."
+ desc = "A CentCom engineering dark red space suit. Age has degraded the suit making is difficult to move around in."
slowdown = 4
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/device/multitool)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/device/multitool)
//Space santa outfit suit
/obj/item/clothing/head/helmet/space/santahat
@@ -146,7 +146,7 @@ Contains:
item_state = "pirate"
w_class = WEIGHT_CLASS_NORMAL
flags_inv = 0
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals, /obj/item/weapon/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/weapon/reagent_containers/food/drinks/bottle/rum)
+ allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/tank/internals, /obj/item/weapon/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/weapon/reagent_containers/food/drinks/bottle/rum)
slowdown = 0
armor = list(melee = 30, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 60, acid = 75)
strip_delay = 40
@@ -170,7 +170,7 @@ Contains:
icon_state = "ert_command"
item_state = "ert_command"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
+ allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/tank/internals)
armor = list(melee = 30, bullet = 50, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100, fire = 0, acid = 95)
slowdown = 0
strip_delay = 130
@@ -242,10 +242,10 @@ Contains:
/obj/item/clothing/suit/space/freedom
name = "eagle suit"
- desc = "An advanced, light suit, fabricated from a mixture of synthetic feathers and space-resistant material. A gun holster appears to be intergrated into the suit and the wings appear to be stuck in 'freedom' mode."
+ desc = "An advanced, light suit, fabricated from a mixture of synthetic feathers and space-resistant material. A gun holster appears to be integrated into the suit and the wings appear to be stuck in 'freedom' mode."
icon_state = "freedom"
item_state = "freedom"
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
+ allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/tank/internals)
armor = list(melee = 20, bullet = 40, laser = 30,energy = 25, bomb = 100, bio = 100, rad = 100, fire = 80, acid = 80)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 35fb43f87b..b2a70cd548 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -4,7 +4,7 @@
/obj/item/clothing/suit/space/eva/plasmaman
name = "EVA plasma envirosuit"
desc = "A special plasma containment suit designed to be space-worthy, as well as worn over other clothing. Like it's smaller counterpart, it can automatically extinguish the wearer in a crisis, and holds twice as many charges."
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/transforming/energy/sword,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
+ allowed = list(/obj/item/weapon/gun, /obj/item/ammo_casing, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/melee/transforming/energy/sword, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/tank)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0, fire = 100, acid = 75)
resistance_flags = FIRE_PROOF
icon_state = "plasmaman_suit"
diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm
index 5c64764813..993510839a 100644
--- a/code/modules/clothing/spacesuits/syndi.dm
+++ b/code/modules/clothing/spacesuits/syndi.dm
@@ -1,147 +1,147 @@
-//Regular syndicate space suit
-/obj/item/clothing/head/helmet/space/syndicate
- name = "red space helmet"
- icon_state = "syndicate"
- item_state = "syndicate"
- desc = "Has a tag on it: Totally not property of an enemy corporation, honest!"
- armor = list(melee = 40, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 80, acid = 85)
-
-/obj/item/clothing/suit/space/syndicate
- name = "red space suit"
- icon_state = "syndicate"
- item_state = "space_suit_syndicate"
- desc = "Has a tag on it: Totally not property of an enemy corporation, honest!"
- w_class = WEIGHT_CLASS_NORMAL
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/transforming/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 40, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 80, acid = 85)
-
-
-//Green syndicate space suit
-/obj/item/clothing/head/helmet/space/syndicate/green
- name = "green space helmet"
- icon_state = "syndicate-helm-green"
- item_state = "syndicate-helm-green"
-
-/obj/item/clothing/suit/space/syndicate/green
- name = "green space suit"
- icon_state = "syndicate-green"
- item_state = "syndicate-green"
-
-
-//Dark green syndicate space suit
-/obj/item/clothing/head/helmet/space/syndicate/green/dark
- name = "dark green space helmet"
- icon_state = "syndicate-helm-green-dark"
- item_state = "syndicate-helm-green-dark"
-
-/obj/item/clothing/suit/space/syndicate/green/dark
- name = "dark green space suit"
- icon_state = "syndicate-green-dark"
- item_state = "syndicate-green-dark"
-
-
-//Orange syndicate space suit
-/obj/item/clothing/head/helmet/space/syndicate/orange
- name = "orange space helmet"
- icon_state = "syndicate-helm-orange"
- item_state = "syndicate-helm-orange"
-
-/obj/item/clothing/suit/space/syndicate/orange
- name = "orange space suit"
- icon_state = "syndicate-orange"
- item_state = "syndicate-orange"
-
-//Blue syndicate space suit
-/obj/item/clothing/head/helmet/space/syndicate/blue
- name = "blue space helmet"
- icon_state = "syndicate-helm-blue"
- item_state = "syndicate-helm-blue"
-
-/obj/item/clothing/suit/space/syndicate/blue
- name = "blue space suit"
- icon_state = "syndicate-blue"
- item_state = "syndicate-blue"
-
-
-//Black syndicate space suit
-/obj/item/clothing/head/helmet/space/syndicate/black
- name = "black space helmet"
- icon_state = "syndicate-helm-black"
- item_state = "syndicate-helm-black"
-
-/obj/item/clothing/suit/space/syndicate/black
- name = "black space suit"
- icon_state = "syndicate-black"
- item_state = "syndicate-black"
-
-
-//Black-green syndicate space suit
-/obj/item/clothing/head/helmet/space/syndicate/black/green
- name = "black space helmet"
- icon_state = "syndicate-helm-black-green"
- item_state = "syndicate-helm-black-green"
-
-/obj/item/clothing/suit/space/syndicate/black/green
- name = "black and green space suit"
- icon_state = "syndicate-black-green"
- item_state = "syndicate-black-green"
-
-
-//Black-blue syndicate space suit
-/obj/item/clothing/head/helmet/space/syndicate/black/blue
- name = "black space helmet"
- icon_state = "syndicate-helm-black-blue"
- item_state = "syndicate-helm-black-blue"
-
-/obj/item/clothing/suit/space/syndicate/black/blue
- name = "black and blue space suit"
- icon_state = "syndicate-black-blue"
- item_state = "syndicate-black-blue"
-
-
-//Black medical syndicate space suit
-/obj/item/clothing/head/helmet/space/syndicate/black/med
- name = "black space helmet"
- icon_state = "syndicate-helm-black-med"
- item_state = "syndicate-helm-black"
-
-/obj/item/clothing/suit/space/syndicate/black/med
- name = "green space suit"
- icon_state = "syndicate-black-med"
- item_state = "syndicate-black"
-
-
-//Black-orange syndicate space suit
-/obj/item/clothing/head/helmet/space/syndicate/black/orange
- name = "black space helmet"
- icon_state = "syndicate-helm-black-orange"
- item_state = "syndicate-helm-black"
-
-/obj/item/clothing/suit/space/syndicate/black/orange
- name = "black and orange space suit"
- icon_state = "syndicate-black-orange"
- item_state = "syndicate-black"
-
-
-//Black-red syndicate space suit
-/obj/item/clothing/head/helmet/space/syndicate/black/red
- name = "black space helmet"
- icon_state = "syndicate-helm-black-red"
- item_state = "syndicate-helm-black-red"
-
-/obj/item/clothing/suit/space/syndicate/black/red
- name = "black and red space suit"
- icon_state = "syndicate-black-red"
- item_state = "syndicate-black-red"
-
-
-//Black with yellow/red engineering syndicate space suit
-/obj/item/clothing/head/helmet/space/syndicate/black/engie
- name = "black space helmet"
- icon_state = "syndicate-helm-black-engie"
- item_state = "syndicate-helm-black"
-
-/obj/item/clothing/suit/space/syndicate/black/engie
- name = "black engineering space suit"
- icon_state = "syndicate-black-engie"
- item_state = "syndicate-black"
+//Regular syndicate space suit
+/obj/item/clothing/head/helmet/space/syndicate
+ name = "red space helmet"
+ icon_state = "syndicate"
+ item_state = "syndicate"
+ desc = "Has a tag on it: Totally not property of an enemy corporation, honest!"
+ armor = list(melee = 40, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 80, acid = 85)
+
+/obj/item/clothing/suit/space/syndicate
+ name = "red space suit"
+ icon_state = "syndicate"
+ item_state = "space_suit_syndicate"
+ desc = "Has a tag on it: Totally not property of an enemy corporation, honest!"
+ w_class = WEIGHT_CLASS_NORMAL
+ allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/melee/transforming/energy/sword/saber, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/tank/internals)
+ armor = list(melee = 40, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 80, acid = 85)
+
+
+//Green syndicate space suit
+/obj/item/clothing/head/helmet/space/syndicate/green
+ name = "green space helmet"
+ icon_state = "syndicate-helm-green"
+ item_state = "syndicate-helm-green"
+
+/obj/item/clothing/suit/space/syndicate/green
+ name = "green space suit"
+ icon_state = "syndicate-green"
+ item_state = "syndicate-green"
+
+
+//Dark green syndicate space suit
+/obj/item/clothing/head/helmet/space/syndicate/green/dark
+ name = "dark green space helmet"
+ icon_state = "syndicate-helm-green-dark"
+ item_state = "syndicate-helm-green-dark"
+
+/obj/item/clothing/suit/space/syndicate/green/dark
+ name = "dark green space suit"
+ icon_state = "syndicate-green-dark"
+ item_state = "syndicate-green-dark"
+
+
+//Orange syndicate space suit
+/obj/item/clothing/head/helmet/space/syndicate/orange
+ name = "orange space helmet"
+ icon_state = "syndicate-helm-orange"
+ item_state = "syndicate-helm-orange"
+
+/obj/item/clothing/suit/space/syndicate/orange
+ name = "orange space suit"
+ icon_state = "syndicate-orange"
+ item_state = "syndicate-orange"
+
+//Blue syndicate space suit
+/obj/item/clothing/head/helmet/space/syndicate/blue
+ name = "blue space helmet"
+ icon_state = "syndicate-helm-blue"
+ item_state = "syndicate-helm-blue"
+
+/obj/item/clothing/suit/space/syndicate/blue
+ name = "blue space suit"
+ icon_state = "syndicate-blue"
+ item_state = "syndicate-blue"
+
+
+//Black syndicate space suit
+/obj/item/clothing/head/helmet/space/syndicate/black
+ name = "black space helmet"
+ icon_state = "syndicate-helm-black"
+ item_state = "syndicate-helm-black"
+
+/obj/item/clothing/suit/space/syndicate/black
+ name = "black space suit"
+ icon_state = "syndicate-black"
+ item_state = "syndicate-black"
+
+
+//Black-green syndicate space suit
+/obj/item/clothing/head/helmet/space/syndicate/black/green
+ name = "black space helmet"
+ icon_state = "syndicate-helm-black-green"
+ item_state = "syndicate-helm-black-green"
+
+/obj/item/clothing/suit/space/syndicate/black/green
+ name = "black and green space suit"
+ icon_state = "syndicate-black-green"
+ item_state = "syndicate-black-green"
+
+
+//Black-blue syndicate space suit
+/obj/item/clothing/head/helmet/space/syndicate/black/blue
+ name = "black space helmet"
+ icon_state = "syndicate-helm-black-blue"
+ item_state = "syndicate-helm-black-blue"
+
+/obj/item/clothing/suit/space/syndicate/black/blue
+ name = "black and blue space suit"
+ icon_state = "syndicate-black-blue"
+ item_state = "syndicate-black-blue"
+
+
+//Black medical syndicate space suit
+/obj/item/clothing/head/helmet/space/syndicate/black/med
+ name = "black space helmet"
+ icon_state = "syndicate-helm-black-med"
+ item_state = "syndicate-helm-black"
+
+/obj/item/clothing/suit/space/syndicate/black/med
+ name = "green space suit"
+ icon_state = "syndicate-black-med"
+ item_state = "syndicate-black"
+
+
+//Black-orange syndicate space suit
+/obj/item/clothing/head/helmet/space/syndicate/black/orange
+ name = "black space helmet"
+ icon_state = "syndicate-helm-black-orange"
+ item_state = "syndicate-helm-black"
+
+/obj/item/clothing/suit/space/syndicate/black/orange
+ name = "black and orange space suit"
+ icon_state = "syndicate-black-orange"
+ item_state = "syndicate-black"
+
+
+//Black-red syndicate space suit
+/obj/item/clothing/head/helmet/space/syndicate/black/red
+ name = "black space helmet"
+ icon_state = "syndicate-helm-black-red"
+ item_state = "syndicate-helm-black-red"
+
+/obj/item/clothing/suit/space/syndicate/black/red
+ name = "black and red space suit"
+ icon_state = "syndicate-black-red"
+ item_state = "syndicate-black-red"
+
+
+//Black with yellow/red engineering syndicate space suit
+/obj/item/clothing/head/helmet/space/syndicate/black/engie
+ name = "black space helmet"
+ icon_state = "syndicate-helm-black-engie"
+ item_state = "syndicate-helm-black"
+
+/obj/item/clothing/suit/space/syndicate/black/engie
+ name = "black engineering space suit"
+ icon_state = "syndicate-black-engie"
+ item_state = "syndicate-black"
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 1f8784217d..aada779689 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -1,5 +1,5 @@
/obj/item/clothing/suit/armor
- allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/ballistic,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/tank/internals/emergency_oxygen)
+ allowed = list(/obj/item/weapon/gun/energy, /obj/item/weapon/reagent_containers/spray/pepper, /obj/item/weapon/gun/ballistic, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/device/flashlight/seclite, /obj/item/weapon/melee/classic_baton/telescopic, /obj/item/weapon/kitchen/knife/combat, /obj/item/weapon/tank/internals/emergency_oxygen)
body_parts_covered = CHEST
cold_protection = CHEST|GROIN
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
@@ -153,7 +153,7 @@
name = "detective's armor vest"
desc = "An armored vest with a detective's badge on it."
icon_state = "detective-armor"
- allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/ballistic,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/weapon/melee/classic_baton)
+ allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/weapon/reagent_containers/spray/pepper, /obj/item/device/flashlight, /obj/item/weapon/gun/energy, /obj/item/weapon/gun/ballistic, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/lighter, /obj/item/device/detective_scanner, /obj/item/device/taperecorder, /obj/item/weapon/melee/classic_baton)
resistance_flags = FLAMMABLE
dog_fashion = null
@@ -197,7 +197,7 @@
//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 seperated our Research Director from his own head!"
+ desc = "Someone separated our Research Director from his own head!"
var/tele_range = 6
var/rad_amount= 15
reactivearmor_cooldown_duration = 100
@@ -341,13 +341,13 @@
//All of the armor below is mostly unused
/obj/item/clothing/suit/armor/centcom
- name = "\improper Centcom armor"
+ name = "\improper CentCom armor"
desc = "A suit that protects against some damage."
icon_state = "centcom"
item_state = "centcom"
w_class = WEIGHT_CLASS_BULKY
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals/emergency_oxygen)
+ allowed = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/tank/internals/emergency_oxygen)
flags = THICKMATERIAL
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 50757bb364..f2251c5ce0 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -21,7 +21,7 @@
flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
slowdown = 1
- allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray)
+ allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/weapon/pen, /obj/item/device/flashlight/pen, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20, fire = 30, acid = 100)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
strip_delay = 70
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index bcf2e49426..a9b667a5aa 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -76,7 +76,7 @@
name = "drake armour"
icon_state = "dragon"
desc = "A suit of armour fashioned from the remains of an ash drake. "
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe, /obj/item/weapon/twohanded/spear)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe, /obj/item/weapon/twohanded/spear)
armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50, fire = 100, acid = 100)
hoodtype = /obj/item/clothing/head/hooded/cloakhood/drake
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 6774bf3f9e..e752090141 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -10,7 +10,7 @@
item_state = "apron"
blood_overlay_type = "armor"
body_parts_covered = CHEST|GROIN
- allowed = list(/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/cultivator,/obj/item/weapon/reagent_containers/spray/pestspray,/obj/item/weapon/hatchet,/obj/item/weapon/storage/bag/plants)
+ allowed = list(/obj/item/weapon/reagent_containers/spray/plantbgone, /obj/item/device/plant_analyzer, /obj/item/seeds, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/cultivator, /obj/item/weapon/reagent_containers/spray/pestspray, /obj/item/weapon/hatchet, /obj/item/weapon/storage/bag/plants)
//Captain
/obj/item/clothing/suit/captunic
@@ -94,7 +94,7 @@
item_state = "det_suit"
blood_overlay_type = "coat"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/ballistic,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/weapon/melee/classic_baton)
+ allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/weapon/reagent_containers/spray/pepper, /obj/item/device/flashlight, /obj/item/weapon/gun/energy, /obj/item/weapon/gun/ballistic, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/lighter, /obj/item/device/detective_scanner, /obj/item/device/taperecorder, /obj/item/weapon/melee/classic_baton)
armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 45)
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
@@ -112,7 +112,7 @@
icon_state = "hazard"
item_state = "hazard"
blood_overlay_type = "armor"
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner,/obj/item/device/radio)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/device/t_scanner, /obj/item/device/radio)
resistance_flags = 0
//Lawyer
/obj/item/clothing/suit/toggle/lawyer
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index c4d2678650..f980504cfe 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -5,7 +5,7 @@
item_state = "labcoat"
blood_overlay_type = "coat"
body_parts_covered = CHEST|ARMS
- allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/soap,/obj/item/device/sensor_device,/obj/item/weapon/tank/internals/emergency_oxygen)
+ allowed = list(/obj/item/device/analyzer, /obj/item/stack/medical, /obj/item/weapon/dnainjector, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray, /obj/item/device/healthanalyzer, /obj/item/device/flashlight/pen, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/pill, /obj/item/weapon/storage/pill_bottle, /obj/item/weapon/paper, /obj/item/weapon/melee/classic_baton/telescopic, /obj/item/weapon/soap, /obj/item/device/sensor_device, /obj/item/weapon/tank/internals/emergency_oxygen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0, fire = 50, acid = 50)
togglename = "buttons"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 873f15f346..d6c019c60a 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -69,7 +69,7 @@
icon_state = "judge"
item_state = "judge"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/weapon/storage/fancy/cigarettes,/obj/item/stack/spacecash)
+ allowed = list(/obj/item/weapon/storage/fancy/cigarettes, /obj/item/stack/spacecash)
flags_inv = HIDEJUMPSUIT
@@ -87,7 +87,7 @@
item_state = "syndicate-black-red"
desc = "A plastic replica of the Syndicate space suit. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!"
w_class = WEIGHT_CLASS_NORMAL
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/toy)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
resistance_flags = 0
@@ -134,7 +134,7 @@
item_state = "owl_wings"
togglename = "wings"
body_parts_covered = ARMS|CHEST
- allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/ballistic,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic)
+ allowed = list(/obj/item/weapon/gun/energy, /obj/item/weapon/reagent_containers/spray/pepper, /obj/item/weapon/gun/ballistic, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/device/flashlight/seclite, /obj/item/weapon/melee/classic_baton/telescopic)
actions_types = list(/datum/action/item_action/toggle_wings)
/obj/item/clothing/suit/toggle/owlwings/griffinwings
@@ -210,7 +210,7 @@
/obj/item/clothing/suit/poncho/ponchoshame
name = "poncho of shame"
- desc = "Forced to live on your shameful acting as a fake Mexican, you and your poncho have grown inseperable. Literally."
+ desc = "Forced to live on your shameful acting as a fake Mexican, you and your poncho have grown inseparable. Literally."
icon_state = "ponchoshame"
item_state = "ponchoshame"
flags = NODROP
@@ -345,7 +345,7 @@
desc = "Aviators not included."
icon_state = "bomberjacket"
item_state = "brownjsuit"
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/radio)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/lighter, /obj/item/device/radio)
body_parts_covered = CHEST|GROIN|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
@@ -357,7 +357,7 @@
item_state = "hostrench"
resistance_flags = 0
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/weapon/gun/ballistic/automatic/pistol,/obj/item/weapon/gun/ballistic/revolver,/obj/item/weapon/gun/ballistic/revolver/detective,/obj/item/device/radio)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/lighter, /obj/item/weapon/gun/ballistic/automatic/pistol, /obj/item/weapon/gun/ballistic/revolver, /obj/item/weapon/gun/ballistic/revolver/detective, /obj/item/device/radio)
/obj/item/clothing/suit/jacket/leather/overcoat
name = "leather overcoat"
@@ -387,7 +387,7 @@
desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable."
icon_state = "militaryjacket"
item_state = "militaryjacket"
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/weapon/gun/ballistic/automatic/pistol,/obj/item/weapon/gun/ballistic/revolver,/obj/item/weapon/gun/ballistic/revolver/detective,/obj/item/device/radio)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/lighter, /obj/item/weapon/gun/ballistic/automatic/pistol, /obj/item/weapon/gun/ballistic/revolver, /obj/item/weapon/gun/ballistic/revolver/detective, /obj/item/device/radio)
/obj/item/clothing/suit/jacket/letterman
name = "letterman jacket"
@@ -434,7 +434,7 @@
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/lighter)
/obj/item/clothing/head/hooded/winterhood
name = "winter hood"
@@ -450,7 +450,7 @@
icon_state = "coatcaptain"
item_state = "coatcaptain"
armor = list(melee = 25, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
- allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/ballistic,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/melee/classic_baton/telescopic)
+ allowed = list(/obj/item/weapon/gun/energy, /obj/item/weapon/reagent_containers/spray/pepper, /obj/item/weapon/gun/ballistic, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/device/flashlight/seclite, /obj/item/weapon/melee/classic_baton/telescopic)
hoodtype = /obj/item/clothing/head/hooded/winterhood/captain
/obj/item/clothing/head/hooded/winterhood/captain
@@ -461,7 +461,7 @@
icon_state = "coatsecurity"
item_state = "coatsecurity"
armor = list(melee = 25, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 45)
- allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/ballistic,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight,/obj/item/weapon/melee/classic_baton/telescopic)
+ allowed = list(/obj/item/weapon/gun/energy, /obj/item/weapon/reagent_containers/spray/pepper, /obj/item/weapon/gun/ballistic, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/device/flashlight/seclite, /obj/item/weapon/melee/classic_baton/telescopic)
hoodtype = /obj/item/clothing/head/hooded/winterhood/security
/obj/item/clothing/head/hooded/winterhood/security
@@ -471,7 +471,7 @@
name = "medical winter coat"
icon_state = "coatmedical"
item_state = "coatmedical"
- allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper,/obj/item/weapon/melee/classic_baton/telescopic)
+ allowed = list(/obj/item/device/analyzer, /obj/item/stack/medical, /obj/item/weapon/dnainjector, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray, /obj/item/device/healthanalyzer, /obj/item/device/flashlight/pen, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/pill, /obj/item/weapon/storage/pill_bottle, /obj/item/weapon/paper, /obj/item/weapon/melee/classic_baton/telescopic)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0, fire = 0, acid = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/medical
@@ -482,7 +482,7 @@
name = "science winter coat"
icon_state = "coatscience"
item_state = "coatscience"
- allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper,/obj/item/weapon/melee/classic_baton/telescopic)
+ allowed = list(/obj/item/device/analyzer, /obj/item/stack/medical, /obj/item/weapon/dnainjector, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray, /obj/item/device/healthanalyzer, /obj/item/device/flashlight/pen, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/pill, /obj/item/weapon/storage/pill_bottle, /obj/item/weapon/paper, /obj/item/weapon/melee/classic_baton/telescopic)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0, fire = 0, acid = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/science
@@ -494,7 +494,7 @@
icon_state = "coatengineer"
item_state = "coatengineer"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20, fire = 30, acid = 45)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner, /obj/item/weapon/construction/rcd, /obj/item/weapon/pipe_dispenser)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/device/t_scanner, /obj/item/weapon/construction/rcd, /obj/item/weapon/pipe_dispenser)
hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering
/obj/item/clothing/head/hooded/winterhood/engineering
@@ -513,7 +513,7 @@
name = "hydroponics winter coat"
icon_state = "coathydro"
item_state = "coathydro"
- allowed = list(/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/cultivator,/obj/item/weapon/reagent_containers/spray/pestspray,/obj/item/weapon/hatchet,/obj/item/weapon/storage/bag/plants)
+ allowed = list(/obj/item/weapon/reagent_containers/spray/plantbgone, /obj/item/device/plant_analyzer, /obj/item/seeds, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/cultivator, /obj/item/weapon/reagent_containers/spray/pestspray, /obj/item/weapon/hatchet, /obj/item/weapon/storage/bag/plants)
hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro
/obj/item/clothing/head/hooded/winterhood/hydro
@@ -532,7 +532,7 @@
name = "mining winter coat"
icon_state = "coatminer"
item_state = "coatminer"
- allowed = list(/obj/item/weapon/pickaxe,/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
+ allowed = list(/obj/item/weapon/pickaxe, /obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/lighter)
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/miner
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 64f30acc53..95d6db5d4a 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -18,7 +18,7 @@
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/extinguisher, /obj/item/weapon/crowbar)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/weapon/extinguisher, /obj/item/weapon/crowbar)
slowdown = 1
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
@@ -99,7 +99,7 @@
/obj/item/clothing/suit/bomb_suit/security
icon_state = "bombsuitsec"
item_state = "bombsuitsec"
- allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
+ allowed = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs)
/*
* Radiation protection
@@ -126,7 +126,7 @@
permeability_coefficient = 0.50
flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/geiger_counter)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/device/geiger_counter)
slowdown = 1.5
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100, fire = 30, acid = 30)
strip_delay = 60
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 0345bb336b..0327b24fe0 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -182,7 +182,7 @@
/obj/item/clothing/accessory/medal/gold/heroism
name = "medal of exceptional heroism"
- desc = "An extremely rare golden medal awarded only by Centcom. To receive such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders."
+ desc = "An extremely rare golden medal awarded only by CentCom. To receive such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders."
/obj/item/clothing/accessory/medal/plasma
name = "plasma medal"
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 062f15b5b2..9194ec0b20 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -104,16 +104,16 @@
can_adjust = 0
/obj/item/clothing/under/rank/centcom_officer
- desc = "It's a jumpsuit worn by Centcom Officers."
- name = "\improper Centcom officer's jumpsuit"
+ desc = "It's a jumpsuit worn by CentCom Officers."
+ name = "\improper CentCom officer's jumpsuit"
icon_state = "officer"
item_state = "g_suit"
item_color = "officer"
alt_covers_chest = 1
/obj/item/clothing/under/rank/centcom_commander
- desc = "It's a jumpsuit worn by Centcom's highest-tier Commanders."
- name = "\improper Centcom officer's jumpsuit"
+ desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders."
+ name = "\improper CentCom officer's jumpsuit"
icon_state = "centcom"
item_state = "dg_suit"
item_color = "centcom"
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index f6337e886a..f363ea98e1 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -229,7 +229,7 @@
/datum/crafting_recipe/dragonsbreath
name = "Dragonsbreath Shell"
result = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,/datum/reagent/phosphorus = 5)
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 5)
tools = list(/obj/item/weapon/screwdriver)
time = 5
category = CAT_WEAPONRY
@@ -394,7 +394,7 @@
name = "Paper Frames"
result = /obj/item/stack/sheet/paperframes/five
time = 10
- reqs = list(/obj/item/stack/sheet/mineral/wood = 5,/obj/item/weapon/paper = 20)
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 5, /obj/item/weapon/paper = 20)
category = CAT_MISC
/datum/crafting_recipe/naturalpaper
@@ -557,3 +557,12 @@
time = 5
reqs = list(/obj/item/stack/sheet/plasteel = 1, /obj/item/stack/tile/plasteel = 1, /obj/item/stack/cable_coil = 2)
category = CAT_MISC
+
+
+/datum/crafting_recipe/rcl
+ name = "Makeshift Rapid Cable Layer"
+ result = /obj/item/weapon/twohanded/rcl/ghetto
+ time = 40
+ tools = list(/obj/item/weapon/weldingtool, /obj/item/weapon/screwdriver, /obj/item/weapon/wrench)
+ reqs = list(/obj/item/stack/sheet/metal = 15)
+ category = CAT_MISC
diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm
index 57e4664bf7..1ab499fcb5 100644
--- a/code/modules/detectivework/detective_work.dm
+++ b/code/modules/detectivework/detective_work.dm
@@ -3,7 +3,7 @@
/atom/var/list/suit_fibers
/atom/proc/add_fibers(mob/living/carbon/human/M)
- if(M.gloves && istype(M.gloves,/obj/item/clothing/))
+ if(M.gloves && istype(M.gloves, /obj/item/clothing/))
var/obj/item/clothing/gloves/G = M.gloves
if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects
if(add_blood(G.blood_DNA)) //only reduces the bloodiness of our gloves if the item wasn't already bloody
diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm
index dbfc2caee2..4c0e4b253b 100644
--- a/code/modules/detectivework/evidence.dm
+++ b/code/modules/detectivework/evidence.dm
@@ -34,7 +34,7 @@
return
if(!isturf(I.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up.
- if(istype(I.loc,/obj/item/weapon/storage)) //in a container.
+ if(istype(I.loc, /obj/item/weapon/storage)) //in a container.
var/obj/item/weapon/storage/U = I.loc
U.remove_from_storage(I, src)
if(user.is_holding(I))
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
index c3d58ee67d..d7d9ac93ff 100644
--- a/code/modules/detectivework/scanner.dm
+++ b/code/modules/detectivework/scanner.dm
@@ -8,6 +8,8 @@
icon_state = "forensicnew"
w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags = CONDUCT | NOBLUDGEON
slot_flags = SLOT_BELT
var/scanning = 0
diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm
index a4dec416bf..79e99a1931 100644
--- a/code/modules/events/_event.dm
+++ b/code/modules/events/_event.dm
@@ -56,7 +56,7 @@
return TRUE
/datum/round_event_control/proc/preRunEvent()
- if(!ispath(typepath,/datum/round_event))
+ if(!ispath(typepath, /datum/round_event))
return EVENT_CANT_RUN
triggering = TRUE
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index fc86356adf..dbac242321 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -27,11 +27,17 @@
continue
if(T.z != ZLEVEL_STATION)
continue
- var/foundAlready = 0 // don't infect someone that already has the virus
- for(var/datum/disease/D in H.viruses)
- foundAlready = 1
+ if(!H.client)
+ continue
+ if(H.stat == DEAD)
+ continue
+ if(VIRUSIMMUNE in H.dna.species.species_traits) //Don't pick someone who's virus immune, only for it to not do anything.
+ continue
+ var/foundAlready = FALSE // don't infect someone that already has a disease
+ for(var/thing in H.viruses)
+ foundAlready = TRUE
break
- if(H.stat == DEAD || foundAlready)
+ if(foundAlready)
continue
var/datum/disease/D
@@ -45,6 +51,6 @@
DS.strain_data["SE"] = H.dna.struc_enzymes
else
D = new virus_type()
- D.carrier = 1
+ D.carrier = TRUE
H.AddDisease(D)
break
\ No newline at end of file
diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm
index 0e4970ef6a..3636c3e320 100644
--- a/code/modules/events/false_alarm.dm
+++ b/code/modules/events/false_alarm.dm
@@ -26,7 +26,7 @@
/proc/gather_false_events(players_amt, gamemode)
. = list()
for(var/datum/round_event_control/E in SSevents.control)
- if(istype(E,/datum/round_event_control/falsealarm))
+ if(istype(E, /datum/round_event_control/falsealarm))
continue
if(!E.canSpawnEvent(players_amt, gamemode))
continue
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index aa1d09b636..f3a21445d3 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -39,8 +39,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
/obj/effect/immovablerod/New(atom/start, atom/end)
..()
- if(SSaugury)
- SSaugury.register_doom(src, 2000)
+ SSaugury.register_doom(src, 2000)
z_original = z
destination = end
if(notify)
diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm
index 724b03d325..c9b1436f39 100644
--- a/code/modules/events/prison_break.dm
+++ b/code/modules/events/prison_break.dm
@@ -44,16 +44,16 @@
/datum/round_event/grey_tide/end()
for(var/area/A in areasToOpen)
for(var/obj/O in A)
- if(istype(O,/obj/machinery/power/apc))
+ if(istype(O, /obj/machinery/power/apc))
var/obj/machinery/power/apc/temp = O
temp.overload_lighting()
- else if(istype(O,/obj/structure/closet/secure_closet))
+ else if(istype(O, /obj/structure/closet/secure_closet))
var/obj/structure/closet/secure_closet/temp = O
temp.locked = FALSE
temp.update_icon()
- else if(istype(O,/obj/machinery/door/airlock))
+ else if(istype(O, /obj/machinery/door/airlock))
var/obj/machinery/door/airlock/temp = O
temp.prison_open()
- else if(istype(O,/obj/machinery/door_timer))
+ else if(istype(O, /obj/machinery/door_timer))
var/obj/machinery/door_timer/temp = O
temp.timer_end(forced = TRUE)
\ No newline at end of file
diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm
index b9f108c50d..2600aa98a2 100644
--- a/code/modules/events/shuttle_loan.dm
+++ b/code/modules/events/shuttle_loan.dm
@@ -27,22 +27,22 @@
SSshuttle.shuttle_loan = src
switch(dispatch_type)
if(HIJACK_SYNDIE)
- priority_announce("Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache.","Centcom Counter Intelligence")
+ priority_announce("Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache.","CentCom Counter Intelligence")
if(RUSKY_PARTY)
- priority_announce("Cargo: A group of angry russians want to have a party, can you send them your cargo shuttle then make them disappear?","Centcom Russian Outreach Program")
+ priority_announce("Cargo: A group of angry russians want to have a party, can you send them your cargo shuttle then make them disappear?","CentCom Russian Outreach Program")
if(SPIDER_GIFT)
- priority_announce("Cargo: The Spider Clan has sent us a mysterious gift, can we ship it to you to see what's inside?","Centcom Diplomatic Corps")
+ priority_announce("Cargo: The Spider Clan has sent us a mysterious gift, can we ship it to you to see what's inside?","CentCom Diplomatic Corps")
if(DEPARTMENT_RESUPPLY)
- priority_announce("Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?","Centcom Supply Department")
+ priority_announce("Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?","CentCom Supply Department")
thanks_msg = "The cargo shuttle should return in 5 minutes."
bonus_points = 0
if(ANTIDOTE_NEEDED)
- priority_announce("Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples.", "Centcom Research Initiatives")
+ priority_announce("Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples.", "CentCom Research Initiatives")
if (PIZZA_DELIVERY)
- priority_announce("Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead", "Centcom Spacepizza Division")
+ priority_announce("Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead", "CentCom Spacepizza Division")
/datum/round_event/shuttle_loan/proc/loan_shuttle()
- priority_announce(thanks_msg, "Cargo shuttle commandeered by Centcom.")
+ priority_announce(thanks_msg, "Cargo shuttle commandeered by CentCom.")
dispatched = 1
SSshuttle.points += bonus_points
@@ -135,7 +135,7 @@
new /obj/structure/spider/stickyweb(T)
if(ANTIDOTE_NEEDED)
- var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/fluspanish)
+ var/obj/item/weapon/reagent_containers/glass/bottle/virus_type = pick(/obj/item/weapon/reagent_containers/glass/bottle/beesease, /obj/item/weapon/reagent_containers/glass/bottle/brainrot, /obj/item/weapon/reagent_containers/glass/bottle/fluspanish)
var/turf/T
for(var/i=0, i<10, i++)
if(prob(15))
@@ -145,11 +145,7 @@
else if(prob(25))
shuttle_spawns.Add(/obj/item/weapon/shard)
T = pick_n_take(empty_shuttle_turfs)
- var/obj/effect/decal/cleanable/blood/b = new(T)
- var/datum/disease/D = new virus_type()
- D.longevity = 1000
- b.viruses += D
- D.holder = b
+ new virus_type(T)
shuttle_spawns.Add(/obj/structure/closet/crate)
shuttle_spawns.Add(/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat)
shuttle_spawns.Add(/obj/item/weapon/reagent_containers/glass/bottle/magnitis)
diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm
index eb66be3038..a441210432 100644
--- a/code/modules/events/spontaneous_appendicitis.dm
+++ b/code/modules/events/spontaneous_appendicitis.dm
@@ -8,10 +8,17 @@
/datum/round_event/spontaneous_appendicitis/start()
for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list))
- var/foundAlready = 0 //don't infect someone that already has the virus
- for(var/datum/disease/D in H.viruses)
- foundAlready = 1
- if(H.stat == 2 || foundAlready)
+ if(!H.client)
+ continue
+ if(H.stat == DEAD)
+ continue
+ if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured
+ continue
+ var/foundAlready = FALSE //don't infect someone that already has appendicitis
+ for(var/datum/disease/appendicitis/A in H.viruses)
+ foundAlready = TRUE
+ break
+ if(foundAlready)
continue
var/datum/disease/D = new /datum/disease/appendicitis
diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm
index 98ae7ba6aa..5a38a439ed 100644
--- a/code/modules/events/wizard/rpgloot.dm
+++ b/code/modules/events/wizard/rpgloot.dm
@@ -11,7 +11,7 @@
if(!istype(I.rpg_loot))
I.rpg_loot = new(I)
- if(istype(I,/obj/item/weapon/storage))
+ if(istype(I, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = I
if(prob(upgrade_scroll_chance) && S.contents.len < S.storage_slots && !S.invisibility)
var/obj/item/upgradescroll/scroll = new
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 30245589d4..46f04a524f 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -6,6 +6,8 @@
desc = "yummy"
icon = 'icons/obj/drinks.dmi'
icon_state = null
+ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
container_type = OPENCONTAINER
var/gulp_size = 5 //This is now officially broken ... need to think of a nice way to fix it.
possible_transfer_amounts = list(5,10,15,20,25,30,50)
@@ -328,6 +330,8 @@
/obj/item/weapon/reagent_containers/food/drinks/soda_cans
name = "soda can"
+ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
container_type = 0
spillable = FALSE
@@ -398,7 +402,7 @@
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/thirteenloko
name = "Thirteen Loko"
- desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkeness, or even death. Please Drink Responsibly."
+ desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkenness, or even death. Please Drink Responsibly."
icon_state = "thirteen_loko"
list_reagents = list("thirteenloko" = 30)
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index b8e85915b8..dd9d914f18 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -9,6 +9,8 @@
volume = 100
throwforce = 15
item_state = "broken_beer" //Generic held-item sprite until unique ones are made.
+ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
var/const/duration = 13 //Directly relates to the 'knockdown' duration. Lowered by armor (i.e. helmets)
var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it
@@ -304,6 +306,8 @@
desc = "Full of vitamins and deliciousness!"
icon_state = "orangejuice"
item_state = "carton"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
isGlass = 0
list_reagents = list("orangejuice" = 100)
@@ -312,6 +316,8 @@
desc = "It's cream. Made from milk. What else did you think you'd find in there?"
icon_state = "cream"
item_state = "carton"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
isGlass = 0
list_reagents = list("cream" = 100)
@@ -320,6 +326,8 @@
desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness."
icon_state = "tomatojuice"
item_state = "carton"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
isGlass = 0
list_reagents = list("tomatojuice" = 100)
@@ -328,6 +336,8 @@
desc = "Sweet-sour goodness."
icon_state = "limejuice"
item_state = "carton"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
isGlass = 0
list_reagents = list("limejuice" = 100)
@@ -338,8 +348,8 @@
desc = "A throwing weapon used to ignite things, typically filled with an accelerant. Recommended highly by rioters and revolutionaries. Light and toss."
icon_state = "vodkabottle"
list_reagents = list()
- var/list/accelerants = list( /datum/reagent/consumable/ethanol,/datum/reagent/fuel,/datum/reagent/clf3,/datum/reagent/phlogiston,
- /datum/reagent/napalm,/datum/reagent/hellwater,/datum/reagent/toxin/plasma,/datum/reagent/toxin/spore_burning)
+ var/list/accelerants = list( /datum/reagent/consumable/ethanol, /datum/reagent/fuel, /datum/reagent/clf3, /datum/reagent/phlogiston,
+ /datum/reagent/napalm, /datum/reagent/hellwater, /datum/reagent/toxin/plasma, /datum/reagent/toxin/spore_burning)
var/active = 0
/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/CheckParts(list/parts_list)
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index 0dffc93704..2ca15f7b97 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -34,7 +34,7 @@
// The format for shots is the exact same as iconstates for the drinking glass, except you use a shot glass instead. //
// If it's a new drink, remember to add it to Chemistry-Reagents.dm and Chemistry-Recipes.dm as well. //
// You can only mix the ported-over drinks in shot glasses for now (they'll mix in a shaker, but the sprite won't change for glasses). //
-// This is on a case-by-case basis, and you can even make a seperate sprite for shot glasses if you want. //
+// This is on a case-by-case basis, and you can even make a separate sprite for shot glasses if you want. //
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass
name = "shot glass"
@@ -91,7 +91,7 @@
list_reagents = list("nuka_cola" = 50)
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/attackby(obj/item/I, mob/user, params)
- if(istype(I,/obj/item/weapon/reagent_containers/food/snacks/egg)) //breaking eggs
+ if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/egg)) //breaking eggs
var/obj/item/weapon/reagent_containers/food/snacks/egg/E = I
if(reagents)
if(reagents.total_volume >= reagents.maximum_volume)
diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
index baa804a4de..477d4913c8 100644
--- a/code/modules/food_and_drinks/food/condiment.dm
+++ b/code/modules/food_and_drinks/food/condiment.dm
@@ -115,7 +115,7 @@
desc = "Tasty spacey sugar!"
list_reagents = list("sugar" = 50)
-/obj/item/weapon/reagent_containers/food/condiment/saltshaker //Seperate from above since it's a small shaker rather then
+/obj/item/weapon/reagent_containers/food/condiment/saltshaker //Separate from above since it's a small shaker rather then
name = "salt shaker" // a large one.
desc = "Salt. From space oceans, presumably."
icon_state = "saltshakersmall"
@@ -174,6 +174,8 @@
desc = "It's milk. White and nutritious goodness!"
icon_state = "milk"
item_state = "carton"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
list_reagents = list("milk" = 50)
possible_states = list()
@@ -190,6 +192,8 @@
desc = "It's soy milk. White and nutritious goodness!"
icon_state = "soymilk"
item_state = "carton"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
list_reagents = list("soymilk" = 50)
possible_states = list()
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index 7a1682aedd..f2047ac092 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -37,7 +37,7 @@
to_chat(user, "It contains [ingredients.len?"[ingredients_listed]":"no ingredient, "]making a [size]-sized [initial(name)].")
/obj/item/weapon/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user, params)
- if(!istype(I, /obj/item/weapon/reagent_containers/food/snacks/customizable) && istype(I,/obj/item/weapon/reagent_containers/food/snacks))
+ if(!istype(I, /obj/item/weapon/reagent_containers/food/snacks/customizable) && istype(I, /obj/item/weapon/reagent_containers/food/snacks))
var/obj/item/weapon/reagent_containers/food/snacks/S = I
if(I.w_class > WEIGHT_CLASS_SMALL)
to_chat(user, "The ingredient is too big for [src]!")
@@ -78,7 +78,7 @@
name = "[customname] [initial(name)]"
/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/initialize_custom_food(obj/item/BASE, obj/item/I, mob/user)
- if(istype(BASE,/obj/item/weapon/reagent_containers))
+ if(istype(BASE, /obj/item/weapon/reagent_containers))
var/obj/item/weapon/reagent_containers/RC = BASE
RC.reagents.trans_to(src,RC.reagents.total_volume)
for(var/obj/O in BASE.contents)
@@ -288,7 +288,7 @@
w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/reagent_containers/glass/bowl/attackby(obj/item/I,mob/user, params)
- if(istype(I,/obj/item/weapon/reagent_containers/food/snacks))
+ if(istype(I, /obj/item/weapon/reagent_containers/food/snacks))
var/obj/item/weapon/reagent_containers/food/snacks/S = I
if(I.w_class > WEIGHT_CLASS_SMALL)
to_chat(user, "The ingredient is too big for [src]!")
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index fe726211dc..8964e7ebaa 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -3,6 +3,8 @@
desc = "Yummy."
icon = 'icons/obj/food/food.dmi'
icon_state = null
+ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
unique_rename = 1
var/bitesize = 2
var/bitecount = 0
@@ -132,10 +134,10 @@
/obj/item/weapon/reagent_containers/food/snacks/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W,/obj/item/weapon/storage))
+ if(istype(W, /obj/item/weapon/storage))
..() // -> item/attackby()
return 0
- if(istype(W,/obj/item/weapon/reagent_containers/food/snacks))
+ if(istype(W, /obj/item/weapon/reagent_containers/food/snacks))
var/obj/item/weapon/reagent_containers/food/snacks/S = W
if(custom_food_type && ispath(custom_food_type))
if(S.w_class > WEIGHT_CLASS_SMALL)
diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm
index ce18a40f2a..a0b2b34740 100644
--- a/code/modules/food_and_drinks/food/snacks_egg.dm
+++ b/code/modules/food_and_drinks/food/snacks_egg.dm
@@ -112,7 +112,7 @@
tastes = list("egg" = 1, "cheese" = 1)
/obj/item/weapon/reagent_containers/food/snacks/omelette/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W,/obj/item/weapon/kitchen/fork))
+ if(istype(W, /obj/item/weapon/kitchen/fork))
var/obj/item/weapon/kitchen/fork/F = W
if(F.forkload)
to_chat(user, "You already have omelette on your fork!")
diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm
index 94c8e54f15..13f22851b1 100644
--- a/code/modules/food_and_drinks/food/snacks_pie.dm
+++ b/code/modules/food_and_drinks/food/snacks_pie.dm
@@ -26,24 +26,29 @@
tastes = list("pie" = 1)
/obj/item/weapon/reagent_containers/food/snacks/pie/cream/throw_impact(atom/hit_atom)
- if(!..()) //was it caught by a mob?
- var/turf/T = get_turf(hit_atom)
- new/obj/effect/decal/cleanable/pie_smudge(T)
- reagents.reaction(hit_atom, TOUCH)
+ . = ..()
+ if(!.) //if we're not being caught
+ splat(hit_atom)
- if(ishuman(hit_atom))
- var/mob/living/carbon/human/H = hit_atom
- var/mutable_appearance/creamoverlay = mutable_appearance('icons/effects/creampie.dmi')
- if(H.dna.species.id == "lizard")
- creamoverlay.icon_state = "creampie_lizard"
- else
- creamoverlay.icon_state = "creampie_human"
- H.Knockdown(20) //splat!
- H.adjust_blurriness(1)
- visible_message("[H] was creamed by [src]!!")
- H.add_overlay(creamoverlay)
-
- qdel(src)
+/obj/item/weapon/reagent_containers/food/snacks/pie/cream/proc/splat(atom/movable/hit_atom)
+ if(isliving(loc)) //someone caught us!
+ return
+ var/turf/T = get_turf(hit_atom)
+ new/obj/effect/decal/cleanable/pie_smudge(T)
+ reagents.reaction(hit_atom, TOUCH)
+ if(ishuman(hit_atom))
+ var/mob/living/carbon/human/H = hit_atom
+ var/mutable_appearance/creamoverlay = mutable_appearance('icons/effects/creampie.dmi')
+ if(H.dna.species.limbs_id == "lizard")
+ creamoverlay.icon_state = "creampie_lizard"
+ else
+ creamoverlay.icon_state = "creampie_human"
+ H.Knockdown(20) //splat!
+ H.adjust_blurriness(1)
+ H.visible_message("[H] is creamed by [src]!", "You've been creamed by [src]!")
+ playsound(H, "desceration", 50, TRUE)
+ H.add_overlay(creamoverlay)
+ qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/pie/berryclafoutis
diff --git a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
index 9dd314e18c..c8430a39c3 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
@@ -41,8 +41,8 @@
/obj/machinery/juicer/attackby(obj/item/O, mob/user, params)
if(default_unfasten_wrench(user, O))
return
- if (istype(O,/obj/item/weapon/reagent_containers/glass) || \
- istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass))
+ if (istype(O, /obj/item/weapon/reagent_containers/glass) || \
+ istype(O, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass))
if (beaker)
return 1
else
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index 6df7ce9e44..d726a106e7 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -149,7 +149,7 @@
to_chat(user, "You insert [loaded] items into [src].")
- else if(O.w_class <= WEIGHT_CLASS_NORMAL && !istype(O,/obj/item/weapon/storage) && user.a_intent == INTENT_HELP)
+ else if(O.w_class <= WEIGHT_CLASS_NORMAL && !istype(O, /obj/item/weapon/storage) && user.a_intent == INTENT_HELP)
if (contents.len>=max_n_of_items)
to_chat(user, "[src] is full, you can't put anything in!")
return 1
@@ -271,7 +271,7 @@
/obj/machinery/microwave/proc/has_extra_item()
for (var/obj/O in contents)
if ( \
- !istype(O,/obj/item/weapon/reagent_containers/food) && \
+ !istype(O, /obj/item/weapon/reagent_containers/food) && \
!istype(O, /obj/item/weapon/grown) \
)
return 1
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index 09a0560357..71f8d727fc 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -33,7 +33,7 @@
build_path = /obj/machinery/processor
/obj/item/weapon/circuitboard/machine/processor/attackby(obj/item/I, mob/user, params)
- if(istype(I,/obj/item/weapon/screwdriver))
+ if(istype(I, /obj/item/weapon/screwdriver))
if(build_path == /obj/machinery/processor)
name = "Slime Processor (Machine Board)"
build_path = /obj/machinery/processor/slime
@@ -162,7 +162,8 @@
//set reagent data
B.data["donor"] = O
- for(var/datum/disease/D in O.viruses)
+ for(var/thing in O.viruses)
+ var/datum/disease/D = thing
if(!(D.spread_flags & SPECIAL))
B.data["viruses"] += D.Copy()
if(O.has_dna())
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index ecacc6d1c6..2cb0631cb2 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -149,7 +149,7 @@
/obj/machinery/smartfridge/proc/accept_check(obj/item/O)
- if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/) || istype(O,/obj/item/weapon/grown/))
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O, /obj/item/seeds/) || istype(O, /obj/item/weapon/grown/))
return TRUE
return FALSE
@@ -160,7 +160,7 @@
to_chat(usr, "\the [O] is stuck to your hand, you cannot put it in \the [src]!")
return
else
- if(istype(O.loc,/obj/item/weapon/storage))
+ if(istype(O.loc, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = O.loc
S.remove_from_storage(O,src)
O.forceMove(src)
@@ -315,11 +315,11 @@
update_icon()
/obj/machinery/smartfridge/drying_rack/accept_check(obj/item/O)
- if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/))
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/))
var/obj/item/weapon/reagent_containers/food/snacks/S = O
if(S.dried_type)
return TRUE
- if(istype(O,/obj/item/stack/sheet/wetleather/))
+ if(istype(O, /obj/item/stack/sheet/wetleather/))
return TRUE
return FALSE
@@ -363,9 +363,9 @@
desc = "A refrigerated storage unit for tasty tasty alcohol."
/obj/machinery/smartfridge/drinks/accept_check(obj/item/O)
- if(!istype(O,/obj/item/weapon/reagent_containers) || !O.reagents || !O.reagents.reagent_list.len)
+ if(!istype(O, /obj/item/weapon/reagent_containers) || !O.reagents || !O.reagents.reagent_list.len)
return FALSE
- if(istype(O,/obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks) || istype(O,/obj/item/weapon/reagent_containers/food/condiment))
+ if(istype(O, /obj/item/weapon/reagent_containers/glass) || istype(O, /obj/item/weapon/reagent_containers/food/drinks) || istype(O, /obj/item/weapon/reagent_containers/food/condiment))
return TRUE
// ----------------------------
@@ -375,7 +375,7 @@
desc = "A refrigerated storage unit for food."
/obj/machinery/smartfridge/food/accept_check(obj/item/O)
- if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/))
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/))
return TRUE
return FALSE
@@ -387,9 +387,9 @@
desc = "A refrigerated storage unit for slime extracts."
/obj/machinery/smartfridge/extract/accept_check(obj/item/O)
- if(istype(O,/obj/item/slime_extract))
+ if(istype(O, /obj/item/slime_extract))
return TRUE
- if(istype(O,/obj/item/device/slime_scanner))
+ if(istype(O, /obj/item/device/slime_scanner))
return TRUE
return FALSE
@@ -404,20 +404,20 @@
desc = "A refrigerated storage unit for medicine storage."
/obj/machinery/smartfridge/chemistry/accept_check(obj/item/O)
- if(istype(O,/obj/item/weapon/storage/pill_bottle))
+ if(istype(O, /obj/item/weapon/storage/pill_bottle))
if(O.contents.len)
for(var/obj/item/I in O)
if(!accept_check(I))
return FALSE
return TRUE
return FALSE
- if(!istype(O,/obj/item/weapon/reagent_containers))
+ if(!istype(O, /obj/item/weapon/reagent_containers))
return FALSE
- if(istype(O,/obj/item/weapon/reagent_containers/pill)) // empty pill prank ok
+ if(istype(O, /obj/item/weapon/reagent_containers/pill)) // empty pill prank ok
return TRUE
if(!O.reagents || !O.reagents.reagent_list.len) // other empty containers not accepted
return FALSE
- if(istype(O,/obj/item/weapon/reagent_containers/syringe) || istype(O,/obj/item/weapon/reagent_containers/glass/bottle) || istype(O,/obj/item/weapon/reagent_containers/glass/beaker) || istype(O,/obj/item/weapon/reagent_containers/spray))
+ if(istype(O, /obj/item/weapon/reagent_containers/syringe) || istype(O, /obj/item/weapon/reagent_containers/glass/bottle) || istype(O, /obj/item/weapon/reagent_containers/glass/beaker) || istype(O, /obj/item/weapon/reagent_containers/spray))
return TRUE
return FALSE
@@ -453,7 +453,7 @@
desc = "A machine capable of storing a variety of disks. Denoted by most as the DSU (disk storage unit)."
/obj/machinery/smartfridge/disks/accept_check(obj/item/O)
- if(istype(O,/obj/item/weapon/disk/))
+ if(istype(O, /obj/item/weapon/disk/))
return TRUE
else
return FALSE
diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
index 71c0bf2f1c..cde68b86e2 100644
--- a/code/modules/food_and_drinks/pizzabox.dm
+++ b/code/modules/food_and_drinks/pizzabox.dm
@@ -4,6 +4,8 @@
desc = "Special delivery!"
icon_state = "pizzabomb_inactive"
item_state = "eshield0"
+ lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
origin_tech = "syndicate=3;engineering=3"
/obj/item/pizzabox
@@ -12,6 +14,8 @@
icon = 'icons/obj/food/containers.dmi'
icon_state = "pizzabox"
item_state = "pizzabox"
+ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
var/open = FALSE
var/boxtag = ""
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index 4e6f4c734e..5a0b217efb 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -56,7 +56,7 @@
src.cards.Add(card)
/obj/item/weapon/deck/attackby(obj/O, mob/user)
- if (istype(O,/obj/item/weapon/hand))
+ if (istype(O, /obj/item/weapon/hand))
var/obj/item/weapon/hand/H = O
for (var/datum/playingcard/P in H.cards) src.cards.Add(P)
@@ -152,7 +152,7 @@
return
P.name = cardtext
blank = 0
- else if(istype(O,/obj/item/weapon/hand))
+ else if(istype(O, /obj/item/weapon/hand))
var/obj/item/weapon/hand/H = O
for(var/datum/playingcard/P in src.cards) H.cards.Add(P)
diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm
index 407c6c2846..7b236ea56f 100644
--- a/code/modules/goonchat/browserOutput.dm
+++ b/code/modules/goonchat/browserOutput.dm
@@ -180,21 +180,24 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic
/proc/bicon(thing)
if (!thing)
return
-
+ var/static/list/bicon_cache = list()
if (isicon(thing))
- //Icons get pooled constantly, references are no good here.
- /*if (!bicon_cache["\ref[obj]"]) // Doesn't exist yet, make it.
- bicon_cache["\ref[obj]"] = icon2base64(obj)
- return ""*/
- return ""
+ var/icon/I = thing
+ var/icon_md5 = md5(I)
+ if (!bicon_cache[icon_md5]) // Doesn't exist yet, make it.
+ I = icon(I) //copy it
+ I.Scale(16,16) //scale it
+ bicon_cache[icon_md5] = icon2base64(thing) //base64 it
+ return ""
// Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with.
var/atom/A = thing
var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]"
- var/static/list/bicon_cache = list()
+
if (!bicon_cache[key]) // Doesn't exist, make it.
var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1)
+ I.Scale(16,16)
if (ishuman(thing)) // Shitty workaround for a BYOND issue.
var/icon/temp = I
I = icon()
diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js
index 0df1c9a44e..59b152ab3b 100644
--- a/code/modules/goonchat/browserassets/js/browserOutput.js
+++ b/code/modules/goonchat/browserassets/js/browserOutput.js
@@ -133,7 +133,8 @@ function highlightTerms(el) {
newWord = words[w].replace("<", "<").replace(new RegExp(opts.highlightTerms[i], 'gi'), addHighlightMarkup);
break;
}
- console.log(newWord)
+ if (window.console)
+ console.log(newWord)
}
newText += newWord || words[w].replace("<", "<");
newText += w >= words.length ? '' : ' ';
@@ -874,4 +875,4 @@ $(function() {
}
$('#userBar').show();
opts.priorChatHeight = $(window).height();
-});
\ No newline at end of file
+});
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
index 2cf4ac77a9..8d4f2e0147 100644
--- a/code/modules/holiday/easter.dm
+++ b/code/modules/holiday/easter.dm
@@ -69,7 +69,7 @@
name = "Easter Basket"
icon = 'icons/mob/easter.dmi'
icon_state = "basket"
- can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/egg,/obj/item/weapon/reagent_containers/food/snacks/chocolateegg,/obj/item/weapon/reagent_containers/food/snacks/boiledegg)
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/egg, /obj/item/weapon/reagent_containers/food/snacks/chocolateegg, /obj/item/weapon/reagent_containers/food/snacks/boiledegg)
/obj/item/weapon/storage/bag/easterbasket/proc/countEggs()
cut_overlays()
diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm
index ffae5026d4..3991878127 100644
--- a/code/modules/holiday/halloween.dm
+++ b/code/modules/holiday/halloween.dm
@@ -234,7 +234,7 @@
playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1)
/mob/living/simple_animal/hostile/retaliate/clown/insane/attackby(obj/item/O, mob/user)
- if(istype(O,/obj/item/weapon/nullrod))
+ if(istype(O, /obj/item/weapon/nullrod))
if(prob(5))
visible_message("[src] finally found the peace it deserves. You hear honks echoing off into the distance.")
playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1)
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
index 8bd178ead0..546e42d371 100644
--- a/code/modules/holiday/holidays.dm
+++ b/code/modules/holiday/holidays.dm
@@ -150,11 +150,10 @@
begin_month = APRIL
/datum/holiday/april_fools/celebrate()
- if(SSticker)
- SSticker.login_music = 'sound/ambience/clown.ogg'
- for(var/mob/dead/new_player/P in GLOB.mob_list)
- if(P.client)
- P.client.playtitlemusic()
+ SSticker.login_music = 'sound/ambience/clown.ogg'
+ for(var/mob/dead/new_player/P in GLOB.mob_list)
+ if(P.client)
+ P.client.playtitlemusic()
/datum/holiday/fourtwenty
name = "Four-Twenty"
diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm
index dc93ef15ca..70dc073c3b 100644
--- a/code/modules/holodeck/area_copy.dm
+++ b/code/modules/holodeck/area_copy.dm
@@ -16,7 +16,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list("tag","area","type","loc","locs",
if(islist(original.vars[V]))
var/list/L = original.vars[V]
O.vars[V] = L.Copy()
- else if(istype(original.vars[V],/datum))
+ else if(istype(original.vars[V], /datum))
continue // this would reference the original's object, that will break when it is used or deleted.
else
O.vars[V] = original.vars[V]
@@ -31,7 +31,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list("tag","area","type","loc","locs",
I.damtype = STAMINA // thou shalt not
N.update_icon()
- if(istype(O,/obj/machinery))
+ if(istype(O, /obj/machinery))
var/obj/machinery/M = O
M.power_change()
diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm
index b03c55e97a..ea71e664de 100644
--- a/code/modules/holodeck/computer.dm
+++ b/code/modules/holodeck/computer.dm
@@ -50,7 +50,7 @@
/obj/machinery/computer/holodeck/LateInitialize()
if(ispath(holodeck_type, /area))
linked = pop(get_areas(holodeck_type, FALSE))
- if(ispath(offline_program,/area))
+ if(ispath(offline_program, /area))
offline_program = pop(get_areas(offline_program), FALSE)
// the following is necessary for power reasons
if(!linked || !offline_program)
diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm
index 8fd69096c3..793266b165 100644
--- a/code/modules/holodeck/items.dm
+++ b/code/modules/holodeck/items.dm
@@ -14,6 +14,8 @@
name = "holographic energy sword"
desc = "May the force be with you. Sorta"
icon_state = "sword0"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
force = 3.0
throw_speed = 2
throw_range = 5
@@ -216,6 +218,10 @@
else
return ..()
-/obj/item/weapon/paper/trek_diploma
+/obj/item/weapon/paper/fluff/holodeck/trek_diploma
name = "paper - Starfleet Academy Diploma"
info = {"
Starfleet Academy
Official Diploma
"}
+
+/obj/item/weapon/paper/fluff/holodeck/disclaimer
+ name = "Holodeck Disclaimer"
+ info = "Brusies sustained in the holodeck can be healed simply by sleeping."
diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm
index 38ce9c70f1..6f28702892 100644
--- a/code/modules/holodeck/turfs.dm
+++ b/code/modules/holodeck/turfs.dm
@@ -44,14 +44,14 @@
/turf/open/floor/holofloor/asteroid/Initialize()
icon_state = "asteroid[rand(0, 12)]"
- ..()
+ . = ..()
/turf/open/floor/holofloor/basalt
name = "basalt"
icon_state = "basalt0"
/turf/open/floor/holofloor/basalt/Initialize()
- ..()
+ . = ..()
if(prob(15))
icon_state = "basalt[rand(0, 12)]"
set_basalt_light(src)
@@ -63,7 +63,7 @@
/turf/open/floor/holofloor/space/Initialize()
icon_state = SPACE_ICON_STATE // so realistic
- ..()
+ . = ..()
/turf/open/floor/holofloor/hyperspace
name = "hyperspace"
@@ -72,10 +72,10 @@
/turf/open/floor/holofloor/hyperspace/Initialize()
icon_state = "speedspace_ns_[(x + 5*y + (y%2+1)*7)%15+1]"
- ..()
+ . = ..()
/turf/open/floor/holofloor/hyperspace/ns/Initialize()
- ..()
+ . = ..()
icon_state = "speedspace_ns_[(x + 5*y + (y%2+1)*7)%15+1]"
/turf/open/floor/holofloor/carpet
@@ -89,7 +89,7 @@
canSmoothWith = null
/turf/open/floor/holofloor/carpet/Initialize()
- ..()
+ . = ..()
addtimer(CALLBACK(src, .proc/update_icon), 1)
/turf/open/floor/holofloor/carpet/update_icon()
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index 169812042f..eebf578340 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -33,6 +33,8 @@
desc = "It's probably not wise to touch it with bare hands..."
icon = 'icons/obj/weapons.dmi'
icon_state = "nettle"
+ lefthand_file = 'icons/mob/inhands/weapons/plants_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/plants_righthand.dmi'
damtype = "fire"
force = 15
hitsound = 'sound/weapons/bladeslice.ogg'
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index 1a98a4715d..0a39c70146 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -23,7 +23,7 @@
var/contains_sample = 0
/obj/item/seeds/replicapod/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W,/obj/item/weapon/reagent_containers/syringe))
+ if(istype(W, /obj/item/weapon/reagent_containers/syringe))
if(!contains_sample)
for(var/datum/reagent/blood/bloodSample in W.reagents.reagent_list)
if(bloodSample.data["mind"] && bloodSample.data["cloneable"] == 1)
@@ -99,7 +99,7 @@
podman.faction |= factions
if(!features["mcolor"])
features["mcolor"] = "#59CE00"
- podman.hardset_dna(null,null,podman.real_name,blood_type,/datum/species/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
+ podman.hardset_dna(null,null,podman.real_name,blood_type, /datum/species/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
podman.set_cloned_appearance()
else //else, one packet of seeds. maybe two
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index bb53c093c3..dc72c1adbe 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -5,6 +5,8 @@
icon = 'icons/obj/device.dmi'
icon_state = "hydro"
item_state = "analyzer"
+ 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
origin_tech = "magnets=2;biotech=2"
@@ -42,6 +44,8 @@
name = "pest spray"
icon_state = "pestspray"
item_state = "plantbgone"
+ lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
volume = 100
container_type = OPENCONTAINER
slot_flags = SLOT_BELT
@@ -64,6 +68,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "cultivator"
item_state = "cultivator"
+ lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
origin_tech = "engineering=2;biotech=2"
flags = CONDUCT
force = 5
@@ -78,6 +84,9 @@
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
icon = 'icons/obj/weapons.dmi'
icon_state = "hatchet"
+ item_state = "hatchet"
+ lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
flags = CONDUCT
force = 12
w_class = WEIGHT_CLASS_TINY
@@ -97,6 +106,8 @@
/obj/item/weapon/scythe
icon_state = "scythe0"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
name = "scythe"
desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow."
force = 13
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 232cea53ac..499fc4bd64 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -110,9 +110,9 @@
/obj/machinery/hydroponics/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
if(!myseed)
return ..()
- if(istype(Proj ,/obj/item/projectile/energy/floramut))
+ if(istype(Proj , /obj/item/projectile/energy/floramut))
mutate()
- else if(istype(Proj ,/obj/item/projectile/energy/florayield))
+ else if(istype(Proj , /obj/item/projectile/energy/florayield))
return myseed.bullet_act(Proj)
else
return ..()
@@ -877,7 +877,7 @@
/obj/machinery/hydroponics/proc/update_tray(mob/user = usr)
harvest = 0
lastproduce = age
- if(istype(myseed,/obj/item/seeds/replicapod))
+ if(istype(myseed, /obj/item/seeds/replicapod))
to_chat(user, "You harvest from the [myseed.plantname].")
else if(myseed.getYield() <= 0)
to_chat(user, "You fail to harvest anything useful!")
diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm
index 733c5cc716..65fa87c658 100644
--- a/code/modules/hydroponics/seed_extractor.dm
+++ b/code/modules/hydroponics/seed_extractor.dm
@@ -84,7 +84,7 @@
if(default_deconstruction_crowbar(O))
return
- if (istype(O,/obj/item/weapon/storage/bag/plants))
+ if (istype(O, /obj/item/weapon/storage/bag/plants))
var/obj/item/weapon/storage/P = O
var/loaded = 0
for(var/obj/item/seeds/G in P.contents)
@@ -101,7 +101,7 @@
else if(seedify(O,-1, src, user))
to_chat(user, "You extract some seeds.")
return
- else if (istype(O,/obj/item/seeds))
+ else if (istype(O, /obj/item/seeds))
if(add_seed(O))
to_chat(user, "You add [O] to [src.name].")
updateUsrDialog()
@@ -195,7 +195,7 @@
var/mob/M = O.loc
if(!M.drop_item())
return 0
- else if(istype(O.loc,/obj/item/weapon/storage))
+ else if(istype(O.loc, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = O.loc
S.remove_from_storage(O,src)
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 4b83485fa5..42d7cd1239 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -23,7 +23,7 @@
var/yield = 3 // Amount of growns created per harvest. If is -1, the plant/shroom/weed is never meant to be harvested.
var/potency = 10 // The 'power' of a plant. Generally effects the amount of reagent in a plant, also used in other ways.
var/growthstages = 6 // Amount of growth sprites the plant has.
- var/rarity = 0 // How rare the plant is. Used for giving points to cargo when shipping off to Centcom.
+ var/rarity = 0 // How rare the plant is. Used for giving points to cargo when shipping off to CentCom.
var/list/mutatelist = list() // The type of plants that this plant can mutate into.
var/list/genes = list() // Plant genes are stored here, see plant_genes.dm for more info.
var/list/reagents_add = list()
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index 387519a8e8..8b3deb1a8c 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -111,7 +111,7 @@
return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE)
if("Thunderdome Overseer")
return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER)
- if("Centcom Official")
+ if("CentCom Official")
return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING)
if("Medical Officer")
return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_MEDICAL)
@@ -123,7 +123,7 @@
return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE)
if("Admiral")
return get_all_centcom_access()
- if("Centcom Commander")
+ if("CentCom Commander")
return get_all_centcom_access()
if("Emergency Response Team Commander")
return get_ert_access("commander")
@@ -133,7 +133,7 @@
return get_ert_access("eng")
if("Medical Response Officer")
return get_ert_access("med")
- if("Centcom Bartender")
+ if("CentCom Bartender")
return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_BAR)
/proc/get_all_accesses()
@@ -370,7 +370,7 @@
return get_all_jobs() + list("Prisoner")
/proc/get_all_centcom_jobs()
- return list("VIP Guest","Custodian","Thunderdome Overseer","Centcom Official","Medical Officer","Death Commando","Research Officer","Special Ops Officer","Admiral","Centcom Commander","Emergency Response Team Commander","Security Response Officer","Engineer Response Officer", "Medical Response Officer","Centcom Bartender")
+ return list("VIP Guest","Custodian","Thunderdome Overseer","CentCom Official","Medical Officer","Death Commando","Research Officer","Special Ops Officer","Admiral","CentCom Commander","Emergency Response Team Commander","Security Response Officer","Engineer Response Officer", "Medical Response Officer","CentCom Bartender")
/obj/item/proc/GetJobName() //Used in secHUD icon generation
var/obj/item/weapon/card/id/I = GetID()
@@ -379,6 +379,6 @@
var/jobName = I.assignment
if(jobName in get_all_job_icons()) //Check if the job has a hud icon
return jobName
- if(jobName in get_all_centcom_jobs()) //Return with the NT logo if it is a Centcom job
- return "Centcom"
+ if(jobName in get_all_centcom_jobs()) //Return with the NT logo if it is a CentCom job
+ return "CentCom"
return "Unknown" //Return unknown if none of the above apply
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index a6b6f25aea..b9d01b7c02 100755
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -4,7 +4,7 @@ Captain
/datum/job/captain
title = "Captain"
flag = CAPTAIN
- department_head = list("Centcom")
+ department_head = list("CentCom")
department_flag = ENGSEC
faction = "Station"
total_positions = 1
diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm
index eb84051ff9..3a281081ab 100644
--- a/code/modules/jobs/job_types/civilian_chaplain.dm
+++ b/code/modules/jobs/job_types/civilian_chaplain.dm
@@ -74,11 +74,9 @@ Chaplain
else
B.name = "The Holy Book of [new_religion]"
-
- if(SSreligion)
- SSreligion.religion = new_religion
- SSreligion.bible_name = B.name
- SSreligion.deity = B.deity_name
+ SSreligion.religion = new_religion
+ SSreligion.bible_name = B.name
+ SSreligion.deity = B.deity_name
H.equip_to_slot_or_del(B, slot_in_backpack)
diff --git a/code/modules/jobs/job_types/engineering.dm b/code/modules/jobs/job_types/engineering.dm
index a71874205c..40800998c0 100644
--- a/code/modules/jobs/job_types/engineering.dm
+++ b/code/modules/jobs/job_types/engineering.dm
@@ -39,7 +39,7 @@ Chief Engineer
head = /obj/item/clothing/head/hardhat/white
gloves = /obj/item/clothing/gloves/color/black/ce
accessory = /obj/item/clothing/accessory/pocketprotector/full
- backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1,/obj/item/device/modular_computer/tablet/preset/advanced=1)
+ backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1, /obj/item/device/modular_computer/tablet/preset/advanced=1)
backpack = /obj/item/weapon/storage/backpack/industrial
satchel = /obj/item/weapon/storage/backpack/satchel/eng
diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm
index 932bdd47ac..aa9dd1b179 100644
--- a/code/modules/jobs/job_types/science.dm
+++ b/code/modules/jobs/job_types/science.dm
@@ -41,7 +41,7 @@ Research Director
l_hand = /obj/item/weapon/clipboard
l_pocket = /obj/item/device/laser_pointer
accessory = /obj/item/clothing/accessory/pocketprotector/full
- backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1,/obj/item/device/modular_computer/tablet/preset/advanced=1)
+ backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1, /obj/item/device/modular_computer/tablet/preset/advanced=1)
backpack = /obj/item/weapon/storage/backpack/science
satchel = /obj/item/weapon/storage/backpack/satchel/tox
diff --git a/code/modules/library/random_books.dm b/code/modules/library/random_books.dm
index 4e82216513..1143dbf9a7 100644
--- a/code/modules/library/random_books.dm
+++ b/code/modules/library/random_books.dm
@@ -1,6 +1,6 @@
/obj/item/weapon/book/manual/random/Initialize()
- ..()
- var/static/banned_books = list(/obj/item/weapon/book/manual/random,/obj/item/weapon/book/manual/nuclear,/obj/item/weapon/book/manual/wiki)
+ . = ..()
+ var/static/banned_books = list(/obj/item/weapon/book/manual/random, /obj/item/weapon/book/manual/nuclear, /obj/item/weapon/book/manual/wiki)
var/newtype = pick(subtypesof(/obj/item/weapon/book/manual) - banned_books)
new newtype(loc)
qdel(src)
@@ -10,7 +10,7 @@
var/category = null
/obj/item/weapon/book/random/Initialize()
- ..()
+ . = ..()
create_random_books(amount, src.loc, TRUE, category)
qdel(src)
@@ -24,7 +24,7 @@
state = 2
/obj/structure/bookcase/random/Initialize(mapload)
- ..()
+ . = ..()
if(!book_count || !isnum(book_count))
update_icon()
return
@@ -77,7 +77,7 @@
var/ref_book_prob = 20
/obj/structure/bookcase/random/reference/Initialize(mapload)
- ..()
+ . = ..()
while(book_count > 0 && prob(ref_book_prob))
book_count--
new /obj/item/weapon/book/manual/random(src)
diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm
index 26c88883df..cd069ec44d 100644
--- a/code/modules/library/soapstone.dm
+++ b/code/modules/library/soapstone.dm
@@ -1,6 +1,6 @@
/obj/item/soapstone
name = "soapstone"
- desc = "Leave informative messages for the crew, including the crew of future shifts!\nEven if out of uses, it can still be used to remove messages.\n(Not suitable for engraving on shuttles, off station or on cats. Side effects may include beatings, bannings and orbital bombardment.)"
+ desc = "Leave informative messages for the crew, including the crew of future shifts!\nEven if out of uses, it can still be used to remove messages.\n(Not suitable for engraving on shuttles, off station or on cats. Side effects may include prompt beatings, psychotic clown incursions, and/or orbital bombardment.)"
icon = 'icons/obj/items.dmi'
icon_state = "soapstone"
throw_speed = 3
diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm
index 92a7a25eac..3aca57c4bf 100644
--- a/code/modules/lighting/lighting_turf.dm
+++ b/code/modules/lighting/lighting_turf.dm
@@ -142,30 +142,3 @@
corners[i] = new/datum/lighting_corner(src, GLOB.LIGHTING_CORNER_DIAGONAL[i])
-/turf/ChangeTurf(path)
- if (!path || (!GLOB.use_preloader && path == type) || !SSlighting.initialized)
- return ..()
-
- var/old_opacity = opacity
- var/old_dynamic_lighting = dynamic_lighting
- var/old_affecting_lights = affecting_lights
- var/old_lighting_object = lighting_object
- var/old_corners = corners
-
- . = ..() //At this point the turf has changed
-
- recalc_atom_opacity()
- lighting_object = old_lighting_object
- affecting_lights = old_affecting_lights
- corners = old_corners
- if (old_opacity != opacity || dynamic_lighting != old_dynamic_lighting)
- reconsider_lights()
-
- if (dynamic_lighting != old_dynamic_lighting)
- if (IS_DYNAMIC_LIGHTING(src))
- lighting_build_overlay()
- else
- lighting_clear_overlay()
-
- for(var/turf/open/space/S in RANGE_TURFS(1, src)) //RANGE_TURFS is in code\__HELPERS\game.dm
- S.update_starlight()
\ No newline at end of file
diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm
index 373a937be2..c8ef0ebe2a 100644
--- a/code/modules/mapping/map_template.dm
+++ b/code/modules/mapping/map_template.dm
@@ -32,10 +32,10 @@
atoms += B
for(var/A in B)
atoms += A
- if(istype(A,/obj/structure/cable))
+ if(istype(A, /obj/structure/cable))
cables += A
continue
- if(istype(A,/obj/machinery/atmospherics))
+ if(istype(A, /obj/machinery/atmospherics))
atmos_machines += A
SSatoms.InitializeAtoms(atoms)
diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm
index 26c311813f..51e3463782 100644
--- a/code/modules/mapping/reader.dm
+++ b/code/modules/mapping/reader.dm
@@ -29,21 +29,21 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
* 2) Read the map line by line, parsing the result (using parse_grid)
*
*/
-/dmm_suite/load_map(dmm_file as file, x_offset as num, y_offset as num, z_offset as num, cropMap as num, measureOnly as num, no_changeturf as num)
+/dmm_suite/load_map(dmm_file as file, x_offset as num, y_offset as num, z_offset as num, cropMap as num, measureOnly as num, no_changeturf as num, lower_crop_x as num, lower_crop_y as num, upper_crop_x as num, upper_crop_y as num)
//How I wish for RAII
Master.StartLoadingMap()
space_key = null
#ifdef TESTING
turfsSkipped = 0
#endif
- . = load_map_impl(dmm_file, x_offset, y_offset, z_offset, cropMap, measureOnly, no_changeturf)
+ . = load_map_impl(dmm_file, x_offset, y_offset, z_offset, cropMap, measureOnly, no_changeturf, lower_crop_x, upper_crop_x, lower_crop_y, upper_crop_y)
#ifdef TESTING
if(turfsSkipped)
testing("Skipped loading [turfsSkipped] default turfs")
#endif
Master.StopLoadingMap()
-/dmm_suite/proc/load_map_impl(dmm_file, x_offset, y_offset, z_offset, cropMap, measureOnly, no_changeturf)
+/dmm_suite/proc/load_map_impl(dmm_file, x_offset, y_offset, z_offset, cropMap, measureOnly, no_changeturf, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY)
var/tfile = dmm_file//the map file we're creating
if(isfile(tfile))
tfile = file2text(tfile)
@@ -60,6 +60,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
var/key_len = 0
var/stored_index = 1
+
while(dmmRegex.Find(tfile, stored_index))
stored_index = dmmRegex.next
@@ -81,7 +82,12 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
if(!key_len)
throw EXCEPTION("Coords before model definition in DMM")
- var/xcrdStart = text2num(dmmRegex.group[3]) + x_offset - 1
+ var/curr_x = text2num(dmmRegex.group[3])
+
+ if(curr_x < x_lower || curr_x > x_upper)
+ continue
+
+ var/xcrdStart = curr_x + x_offset - 1
//position of the currently processed square
var/xcrd
var/ycrd = text2num(dmmRegex.group[4]) + y_offset - 1
@@ -96,7 +102,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
if(!no_changeturf)
WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems when /turf/AfterChange is called")
- bounds[MAP_MINX] = min(bounds[MAP_MINX], xcrdStart)
+ bounds[MAP_MINX] = min(bounds[MAP_MINX], Clamp(xcrdStart, x_lower, x_upper))
bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd)
bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd)
@@ -113,15 +119,15 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
if(gridLines.len && gridLines[gridLines.len] == "")
gridLines.Cut(gridLines.len) // Remove only one blank line at the end.
- bounds[MAP_MINY] = min(bounds[MAP_MINY], ycrd)
+ bounds[MAP_MINY] = min(bounds[MAP_MINY], Clamp(ycrd, y_lower, y_upper))
ycrd += gridLines.len - 1 // Start at the top and work down
if(!cropMap && ycrd > world.maxy)
if(!measureOnly)
world.maxy = ycrd // Expand Y here. X is expanded in the loop below
- bounds[MAP_MAXY] = max(bounds[MAP_MAXY], ycrd)
+ bounds[MAP_MAXY] = max(bounds[MAP_MAXY], Clamp(ycrd, y_lower, y_upper))
else
- bounds[MAP_MAXY] = max(bounds[MAP_MAXY], min(ycrd, world.maxy))
+ bounds[MAP_MAXY] = max(bounds[MAP_MAXY], Clamp(min(ycrd, world.maxy), y_lower, y_upper))
var/maxx = xcrdStart
if(measureOnly)
@@ -129,9 +135,15 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
maxx = max(maxx, xcrdStart + length(line) / key_len - 1)
else
for(var/line in gridLines)
+ if((ycrd - y_offset + 1) < y_lower || (ycrd - y_offset + 1) > y_upper) //Reverse operation and check if it is out of bounds of cropping.
+ --ycrd
+ continue
if(ycrd <= world.maxy && ycrd >= 1)
xcrd = xcrdStart
for(var/tpos = 1 to length(line) - key_len + 1 step key_len)
+ if((xcrd - x_offset + 1) < x_lower || (xcrd - x_offset + 1) > x_upper) //Same as above.
+ ++xcrd
+ continue //X cropping.
if(xcrd > world.maxx)
if(cropMap)
break
@@ -154,7 +166,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
++xcrd
--ycrd
- bounds[MAP_MAXX] = max(bounds[MAP_MAXX], cropMap ? min(maxx, world.maxx) : maxx)
+ bounds[MAP_MAXX] = Clamp(max(bounds[MAP_MAXX], cropMap ? min(maxx, world.maxx) : maxx), x_lower, x_upper)
CHECK_TICK
@@ -171,7 +183,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
/**
* Fill a given tile with its area/turf/objects/mobs
- * Variable model is one full map line (e.g /turf/unsimulated/wall{icon_state = "rock"},/area/mine/explored)
+ * Variable model is one full map line (e.g /turf/unsimulated/wall{icon_state = "rock"}, /area/mine/explored)
*
* WORKING :
*
@@ -292,7 +304,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
//then instance the /turf and, if multiple tiles are presents, simulates the DMM underlays piling effect
var/first_turf_index = 1
- while(!ispath(members[first_turf_index],/turf)) //find first /turf object in members
+ while(!ispath(members[first_turf_index], /turf)) //find first /turf object in members
first_turf_index++
//turn off base new Initialization until the whole thing is loaded
@@ -343,7 +355,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
/dmm_suite/proc/create_atom(path, crds)
set waitfor = FALSE
. = new path (crds)
-
+
//text trimming (both directions) helper proc
//optionally removes quotes before and after the text (for variable name)
/dmm_suite/proc/trim_text(what as text,trim_quotes=0)
diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm
index 4f07bbbc48..90248bce2e 100644
--- a/code/modules/mining/aux_base.dm
+++ b/code/modules/mining/aux_base.dm
@@ -177,6 +177,8 @@ interface with the mining shuttle at the landing site if a mobile beacon is also
name = "Landing Field Designator"
icon_state = "gangtool-purple"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
icon = 'icons/obj/device.dmi'
desc = "Deploy to designate the landing zone of the auxillary base."
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
index 0f4d5915f4..62702fc202 100644
--- a/code/modules/mining/aux_base_camera.dm
+++ b/code/modules/mining/aux_base_camera.dm
@@ -27,7 +27,7 @@
delay_mod = 0.5
/obj/machinery/computer/camera_advanced/base_construction
- name = "base contruction console"
+ name = "base construction console"
desc = "An industrial computer integrated with a camera-assisted rapid construction drone."
networks = list("SS13")
var/obj/item/weapon/construction/rcd/internal/RCD //Internal RCD. The computer passes user commands to this in order to avoid massive copypaste.
@@ -128,6 +128,7 @@
eyeobj.invisibility = INVISIBILITY_MAXIMUM //Hide the eye when not in use.
/datum/action/innate/aux_base //Parent aux base action
+ icon_icon = 'icons/mob/actions/actions_construction.dmi'
var/mob/living/C //Mob using the action
var/mob/camera/aiEye/remote/base_construction/remote_eye //Console's eye mob
var/obj/machinery/computer/camera_advanced/base_construction/B //Console itself
@@ -267,7 +268,7 @@ datum/action/innate/aux_base/install_turret/Activate()
var/turf/turret_turf = get_turf(remote_eye)
if(is_blocked_turf(turret_turf))
- to_chat(owner, "Location is obtructed by something. Please clear the location and try again.")
+ to_chat(owner, "Location is obstructed by something. Please clear the location and try again.")
return
var/obj/machinery/porta_turret/aux_base/T = new /obj/machinery/porta_turret/aux_base(turret_turf)
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index e4acea1cf0..5f8830139c 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -11,7 +11,7 @@
heat_protection = CHEST|GROIN|LEGS|ARMS
hoodtype = /obj/item/clothing/head/hooded/explorer
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe)
resistance_flags = FIRE_PROOF
/obj/item/clothing/head/hooded/explorer
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index cd600d64fb..a1251381b4 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -3,6 +3,8 @@
icon = 'icons/obj/mining.dmi'
icon_state = "mining_hammer1"
item_state = "mining_hammer1"
+ lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
name = "proto-kinetic crusher"
desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club. \
While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna."
diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm
index 1ff774bb61..98e621bb2e 100644
--- a/code/modules/mining/equipment/lazarus_injector.dm
+++ b/code/modules/mining/equipment/lazarus_injector.dm
@@ -5,6 +5,8 @@
icon = 'icons/obj/syringe.dmi'
icon_state = "lazarus_hypo"
item_state = "hypo"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm
index dc1de44176..f052e809e6 100644
--- a/code/modules/mining/equipment/marker_beacons.dm
+++ b/code/modules/mining/equipment/marker_beacons.dm
@@ -1,6 +1,6 @@
/*****************Marker Beacons**************************/
GLOBAL_LIST_INIT(marker_beacon_colors, list(
-"Random" = FALSE,//not a true color, will pick a random color
+"Random" = FALSE, //not a true color, will pick a random color
"Burgundy" = LIGHT_COLOR_FLARE,
"Bronze" = LIGHT_COLOR_ORANGE,
"Yellow" = LIGHT_COLOR_YELLOW,
diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm
index 4f76c98a28..85dc278735 100644
--- a/code/modules/mining/equipment/mineral_scanner.dm
+++ b/code/modules/mining/equipment/mineral_scanner.dm
@@ -4,6 +4,8 @@
name = "manual mining scanner"
icon_state = "mining1"
item_state = "analyzer"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -32,6 +34,8 @@
name = "advanced automatic mining scanner"
icon_state = "mining0"
item_state = "analyzer"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm
index 7c31360a6b..a3ffa82114 100644
--- a/code/modules/mining/equipment/mining_tools.dm
+++ b/code/modules/mining/equipment/mining_tools.dm
@@ -8,6 +8,8 @@
force = 15
throwforce = 10
item_state = "pickaxe"
+ lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
var/digspeed = 40
@@ -89,6 +91,8 @@
desc = "A large tool for digging and moving dirt."
icon = 'icons/obj/mining.dmi'
icon_state = "shovel"
+ lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BELT
force = 8
@@ -106,6 +110,8 @@
desc = "A small tool for digging and moving dirt."
icon_state = "spade"
item_state = "spade"
+ lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
force = 5
throwforce = 7
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm
index 5c110d09bf..7685f6a1f6 100644
--- a/code/modules/mining/equipment/resonator.dm
+++ b/code/modules/mining/equipment/resonator.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/mining.dmi'
icon_state = "resonator"
item_state = "resonator"
+ lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi'
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It does increased damage in low pressure."
w_class = WEIGHT_CLASS_NORMAL
force = 15
diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm
index ea64b9181b..00fdbfb561 100644
--- a/code/modules/mining/equipment/wormhole_jaunter.dm
+++ b/code/modules/mining/equipment/wormhole_jaunter.dm
@@ -5,6 +5,8 @@
icon = 'icons/obj/mining.dmi'
icon_state = "Jaunter"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index d4e8496e1c..e9961d7b3b 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -131,7 +131,7 @@
/obj/machinery/mineral/stacking_machine/laborstacker
var/points = 0 //The unclaimed value of ore stacked. Value for each ore loosely relative to its rarity.
- var/list/ore_values = list("glass" = 1, "metal" = 2, "solid plasma" = 20, "plasteel" = 23, "reinforced glass" = 4, "gold" = 20, "silver" = 20, "uranium" = 20, "diamond" = 25, "bananium" = 50)
+ var/list/ore_values = list("glass" = 1, "metal" = 2, "reinforced glass" = 4, "gold" = 20, "silver" = 20, "uranium" = 20, "titanium" = 20, "solid plasma" = 20, "plasteel" = 23, "plasma glass" = 23, "diamond" = 25, "bluespace polycrystal" = 30, "plastitanium" = 45, "bananium" = 50)
/obj/machinery/mineral/stacking_machine/laborstacker/process_sheet(obj/item/stack/sheet/inp)
if(istype(inp))
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index e58d0a3c06..b2e474957c 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -141,6 +141,9 @@
desc = "This lantern gives off no light, but is home to a friendly wisp."
icon = 'icons/obj/lighting.dmi'
icon_state = "lantern-blue"
+ item_state = "lantern"
+ lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi'
var/obj/effect/wisp/wisp
/obj/item/device/wisp_lantern/attack_self(mob/user)
@@ -258,6 +261,8 @@
ammo_type = /obj/item/ammo_casing/magic/hook
icon_state = "hook"
item_state = "chain"
+ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
fire_sound = 'sound/weapons/batonextend.ogg'
max_charges = 1
flags = NOBLUDGEON
@@ -425,7 +430,7 @@
if(!over_object)
return
- if (istype(usr.loc,/obj/mecha))
+ if (istype(usr.loc, /obj/mecha))
return
if(!M.incapacitated())
@@ -683,6 +688,8 @@
desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly."
icon_state = "spectral"
item_state = "spectral"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
flags = CONDUCT
sharpness = IS_SHARP
w_class = WEIGHT_CLASS_BULKY
@@ -785,7 +792,7 @@
switch(random)
if(1)
- to_chat(user, "Your appearence morphs to that of a very small humanoid ash dragon! You get to look like a freak without the cool abilities.")
+ to_chat(user, "Your appearance morphs to that of a very small humanoid ash dragon! You get to look like a freak without the cool abilities.")
H.dna.features = list("mcolor" = "A02720", "tail_lizard" = "Dark Tiger", "tail_human" = "None", "snout" = "Sharp", "horns" = "Curled", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "Long", "body_markings" = "Dark Tiger Body", "legs" = "Digitigrade Legs")
H.eye_color = "fee5a3"
H.set_species(/datum/species/lizard)
@@ -814,7 +821,7 @@
severity = BIOHAZARD
visibility_flags = 0
stage1 = list("Your bones ache.")
- stage2 = list("Your skin feels scaley.")
+ stage2 = list("Your skin feels scaly.")
stage3 = list("You have an overwhelming urge to terrorize some peasants.", "Your teeth feel sharper.")
stage4 = list("Your blood burns.")
stage5 = list("You're a fucking dragon. However, any previous allegiances you held still apply. It'd be incredibly rude to eat your still human friends for no reason.")
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index 1792b2eb3b..0232da4e83 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -173,7 +173,7 @@
if(!powered())
return
- if(istype(W,/obj/item/weapon/card/id))
+ if(istype(W, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/I = user.get_active_held_item()
if(istype(I) && !istype(inserted_id))
if(!user.drop_item())
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 6b13a9fd0f..875380aea8 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -26,7 +26,7 @@
new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/weapon/storage/belt/mining, 500),
new /datum/data/mining_equipment("Survival Medipen", /obj/item/weapon/reagent_containers/hypospray/medipen/survival, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
- new /datum/data/mining_equipment("Tracking Implant Kit",/obj/item/weapon/storage/box/minertracker, 600),
+ new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/weapon/storage/box/minertracker, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 750),
new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/weapon/twohanded/required/kinetic_crusher, 750),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 750),
@@ -46,13 +46,13 @@
new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
- new /datum/data/mining_equipment("KA Cooldown Decrease",/obj/item/borg/upgrade/modkit/cooldown, 1000),
+ new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card, 500),
new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone, 800),
new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/device/mine_bot_ugprade, 400),
- new /datum/data/mining_equipment("Drone Health Upgrade",/obj/item/device/mine_bot_ugprade/health, 400),
- new /datum/data/mining_equipment("Drone Ranged Upgrade",/obj/item/device/mine_bot_ugprade/cooldown, 600),
+ new /datum/data/mining_equipment("Drone Health Upgrade", /obj/item/device/mine_bot_ugprade/health, 400),
+ new /datum/data/mining_equipment("Drone Ranged Upgrade", /obj/item/device/mine_bot_ugprade/cooldown, 600),
new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
)
@@ -143,7 +143,7 @@
SSblackbox.add_details("mining_equipment_bought",
"[src.type]|[prize.equipment_path]")
// Add src.type to keep track of free golem purchases
- // seperately.
+ // separately.
updateUsrDialog()
return
@@ -151,7 +151,7 @@
if(istype(I, /obj/item/weapon/mining_voucher))
RedeemVoucher(I, user)
return
- if(istype(I,/obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = usr.get_active_held_item()
if(istype(C) && !istype(inserted_id))
if(!usr.drop_item())
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index d6ef4a3885..b2fe66cb0b 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -37,6 +37,9 @@
icon_state = "mining"
req_access = list(ACCESS_MINING)
+/obj/structure/closet/secure_closet/miner/unlocked
+ locked = FALSE
+
/obj/structure/closet/secure_closet/miner/PopulateContents()
..()
new /obj/item/stack/sheet/mineral/sandbags(src, 5)
@@ -77,4 +80,4 @@
/obj/structure/closet/crate/miningcar
desc = "A mining car. This one doesn't work on rails, but has to be dragged."
name = "Mining car (not for rails)"
- icon_state = "miningcar"
+ icon_state = "miningcar"
\ No newline at end of file
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index 25aa9fb8e8..8029cc1416 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -170,6 +170,7 @@
/datum/action/innate/minedrone
check_flags = AB_CHECK_CONSCIOUS
+ icon_icon = 'icons/mob/actions/actions_mecha.dmi'
background_icon_state = "bg_default"
/datum/action/innate/minedrone/toggle_light
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 68fc7d5ef8..03d75717ab 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -30,48 +30,39 @@
show_message = FALSE
break
var/obj/item/weapon/storage/bag/ore/OB
- if(istype(loc, /turf/open/floor/plating/asteroid))
- if(ishuman(AM))
- var/mob/living/carbon/human/H = AM
- for(var/thing in H.get_storage_slots())
- if(istype(thing, /obj/item/weapon/storage/bag/ore))
- OB = thing
- break
- for(var/thing in H.held_items)
- if(istype(thing, /obj/item/weapon/storage/bag/ore))
- OB = thing
- break
- else if(iscyborg(AM))
- var/mob/living/silicon/robot/R = AM
- for(var/thing in R.module_active)
- if(istype(thing, /obj/item/weapon/storage/bag/ore))
- OB = thing
- break
- if(OB)
- var/obj/structure/ore_box/box
- if(!OB.can_be_inserted(src, TRUE, AM))
- if(!OB.spam_protection)
- to_chat(AM, "Your [OB.name] is full and can't hold any more ore!")
- OB.spam_protection = TRUE
- sleep(1)
- OB.spam_protection = FALSE
+ if(ishuman(AM))
+ var/mob/living/carbon/human/H = AM
+ OB = locate(/obj/item/weapon/storage/bag/ore) in H.get_storage_slots()
+ if(!OB)
+ OB = locate(/obj/item/weapon/storage/bag/ore) in H.held_items
+ else if(iscyborg(AM))
+ var/mob/living/silicon/robot/R = AM
+ OB = locate(/obj/item/weapon/storage/bag/ore) in R.held_items
+ if(OB)
+ var/obj/structure/ore_box/box
+ if(!OB.can_be_inserted(src, TRUE, AM))
+ if(!OB.spam_protection)
+ to_chat(AM, "Your [OB.name] is full and can't hold any more ore!")
+ OB.spam_protection = TRUE
+ sleep(1)
+ OB.spam_protection = FALSE
+ else
+ OB.handle_item_insertion(src, TRUE, AM)
+ // Then, if the user is dragging an ore box, empty the satchel
+ // into the box.
+ var/mob/living/L = AM
+ if(istype(L.pulling, /obj/structure/ore_box))
+ box = L.pulling
+ for(var/obj/item/weapon/ore/O in OB)
+ OB.remove_from_storage(src, box)
+ if(show_message)
+ playsound(L, "rustle", 50, TRUE)
+ if(box)
+ L.visible_message("[L] offloads the ores into [box].", \
+ "You offload the ores beneath you into your [box.name].")
else
- OB.handle_item_insertion(src, TRUE, AM)
- // Then, if the user is dragging an ore box, empty the satchel
- // into the box.
- var/mob/living/L = AM
- if(istype(L.pulling, /obj/structure/ore_box))
- box = L.pulling
- for(var/obj/item/weapon/ore/O in OB)
- OB.remove_from_storage(src, box)
- if(show_message)
- playsound(L, "rustle", 50, TRUE)
- if(box)
- L.visible_message("[L] offloads the ores into [box].", \
- "You offload the ores beneath you into your [box.name].")
- else
- L.visible_message("[L] scoops up the ores beneath them.", \
- "You scoop up the ores beneath you with your [OB.name].")
+ L.visible_message("[L] scoops up the ores beneath them.", \
+ "You scoop up the ores beneath you with your [OB.name].")
return ..()
/obj/item/weapon/ore/uranium
@@ -432,7 +423,7 @@
to_chat(user, "You need one length of cable to attach a string to the coin!")
return
- else if(istype(W,/obj/item/weapon/wirecutters))
+ else if(istype(W, /obj/item/weapon/wirecutters))
if(!string_attached)
..()
return
diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm
index d902c34584..a8b4eab8d2 100644
--- a/code/modules/mining/shelters.dm
+++ b/code/modules/mining/shelters.dm
@@ -47,7 +47,7 @@
/datum/map_template/shelter/beta
name = "Shelter Beta"
shelter_id = "shelter_beta"
- description = "An extremly luxurious shelter, containing all \
+ description = "An extremely luxurious shelter, containing all \
the amenities of home, including carpeted floors, hot and cold \
running water, a gourmet three course meal, cooking facilities, \
and a deluxe companion to keep you from getting lonely during \
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 54eec1dc8a..2cea8e32f2 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -32,7 +32,7 @@
/mob/dead/new_player/proc/new_player_panel()
var/output = "
\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | Not Ready | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]
"
@@ -107,18 +107,17 @@
return 1
if(href_list["ready"])
- if(SSticker)
- var/tready = text2num(href_list["ready"])
- //Avoid updating ready if we're after PREGAME (they should use latejoin instead)
- //This is likely not an actual issue but I don't have time to prove that this
- //no longer is required
- if(SSticker.current_state <= GAME_STATE_PREGAME)
- ready = tready
- //if it's post initialisation and they're trying to observe we do the needful
- if(!SSticker.current_state < GAME_STATE_PREGAME && tready == PLAYER_READY_TO_OBSERVE)
- ready = tready
- make_me_an_observer()
- return
+ var/tready = text2num(href_list["ready"])
+ //Avoid updating ready if we're after PREGAME (they should use latejoin instead)
+ //This is likely not an actual issue but I don't have time to prove that this
+ //no longer is required
+ if(SSticker.current_state <= GAME_STATE_PREGAME)
+ ready = tready
+ //if it's post initialisation and they're trying to observe we do the needful
+ if(!SSticker.current_state < GAME_STATE_PREGAME && tready == PLAYER_READY_TO_OBSERVE)
+ ready = tready
+ make_me_an_observer()
+ return
if(href_list["refresh"])
src << browse(null, "window=playersetup") //closes the player setup window
diff --git a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm
index a784bd7d03..9808923e33 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm
@@ -31,6 +31,16 @@
color_src = 0
icon = 'icons/mob/mam_bodyparts.dmi'
+/datum/sprite_accessory/tails/human/bear
+ name = "Bear"
+ icon_state = "bear"
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
+/datum/sprite_accessory/ears/human/bear
+ name = "Bear"
+ icon_state = "bear"
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
/datum/sprite_accessory/tails/human/catbig
name = "Cat, Big"
icon_state = "catbig"
@@ -153,6 +163,18 @@
icon_state = "wolf"
icon = 'icons/mob/mam_bodyparts.dmi'
+/datum/sprite_accessory/tails/human/rabbit
+ name = "Rabbit"
+ icon_state = "rabbit"
+ color_src = 0
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
+/datum/sprite_accessory/ears/human/rabbit
+ name = "Rabbit"
+ icon_state = "rabbit"
+ hasinner= 1
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
/******************************************
*************** Body Parts ****************
*******************************************/
@@ -222,6 +244,16 @@
extra = 1
extra_color_src = MUTCOLORS2
+/datum/sprite_accessory/mam_tails/bear
+ name = "Bear"
+ icon_state = "bear"
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
+/datum/sprite_accessory/mam_ears/bear
+ name = "Bear"
+ icon_state = "bear"
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
/datum/sprite_accessory/mam_ears/catbig
name = "Cat, Big"
icon_state = "cat"
@@ -429,6 +461,18 @@
icon_state = "guilmon"
icon = 'icons/mob/mam_bodyparts.dmi'
+/datum/sprite_accessory/mam_tails/rabbit
+ name = "Rabbit"
+ icon_state = "rabbit"
+ color_src = 0
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
+/datum/sprite_accessory/mam_ears/rabbit
+ name = "Rabbit"
+ icon_state = "rabbit"
+ hasinner= 1
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
/******************************************
************ Body Markings ****************
*******************************************/
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 430ee65179..2ede4c360e 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -326,7 +326,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients
to_chat(usr, "Another consciousness is in your body...It is resisting you.")
return
- client.view = world.view
+ client.change_view(world.view)
SStgui.on_transfer(src, mind.current) // Transfer NanoUIs.
mind.current.key = key
return 1
@@ -468,16 +468,16 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
views |= i
var/new_view = input("Choose your new view", "Modify view range", 7) as null|anything in views
if(new_view)
- client.view = Clamp(new_view, 1, max_view)
+ client.change_view(Clamp(new_view, 1, max_view))
else
- client.view = world.view
+ client.change_view(world.view)
/mob/dead/observer/verb/add_view_range(input as num)
set name = "Add View Range"
set hidden = TRUE
var/max_view = client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT
if(input)
- client.view = Clamp(client.view + input, 1, max_view)
+ client.change_view(Clamp(client.view + input, 1, max_view))
/mob/dead/observer/verb/boo()
set category = "Ghost"
@@ -680,7 +680,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, "Data HUDs enabled.")
data_huds_on = 1
-/mob/dead/observer/verb/restore_ghost_apperance()
+/mob/dead/observer/verb/restore_ghost_appearance()
set name = "Restore Ghost Character"
set desc = "Sets your deadchat name and ghost appearance to your \
roundstart character."
@@ -781,8 +781,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/proc/register_pai()
if(isobserver(src))
- if(SSpai)
- SSpai.recruitWindow(src)
+ SSpai.recruitWindow(src)
else
to_chat(usr, "Can't become a pAI candidate while not dead!")
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index 69eacbb69e..8e547eeb12 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -137,7 +137,8 @@
if(blood_id == C.get_blood_id())//both mobs have the same blood substance
if(blood_id == "blood") //normal blood
if(blood_data["viruses"])
- for(var/datum/disease/D in blood_data["viruses"])
+ for(var/thing in blood_data["viruses"])
+ var/datum/disease/D = thing
if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS))
continue
C.ForceContractDisease(D)
@@ -162,7 +163,8 @@
blood_data["donor"] = src
blood_data["viruses"] = list()
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
blood_data["viruses"] += D.Copy()
blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0)
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
index 9cad58c201..8e919491bb 100644
--- a/code/modules/mob/living/brain/MMI.dm
+++ b/code/modules/mob/living/brain/MMI.dm
@@ -16,7 +16,7 @@
/obj/item/device/mmi/update_icon()
if(brain)
- if(istype(brain,/obj/item/organ/brain/alien))
+ if(istype(brain, /obj/item/organ/brain/alien))
if(brainmob && brainmob.stat == DEAD)
icon_state = "mmi_alien_dead"
else
@@ -39,7 +39,7 @@
/obj/item/device/mmi/attackby(obj/item/O, mob/user, params)
user.changeNext_move(CLICK_CD_MELEE)
- if(istype(O,/obj/item/organ/brain)) //Time to stick a brain in it --NEO
+ if(istype(O, /obj/item/organ/brain)) //Time to stick a brain in it --NEO
var/obj/item/organ/brain/newbrain = O
if(brain)
to_chat(user, "There's already a brain in the MMI!")
diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm
index 6f39718acf..5161f94808 100644
--- a/code/modules/mob/living/brain/brain.dm
+++ b/code/modules/mob/living/brain/brain.dm
@@ -66,7 +66,7 @@
/mob/living/brain/ClickOn(atom/A, params)
..()
- if(istype(loc,/obj/item/device/mmi))
+ if(istype(loc, /obj/item/device/mmi))
var/obj/item/device/mmi/MMI = loc
var/obj/mecha/M = MMI.mecha
if((src == MMI.brainmob) && istype(M))
diff --git a/code/modules/mob/living/brain/death.dm b/code/modules/mob/living/brain/death.dm
index e98859b90f..9366f4d423 100644
--- a/code/modules/mob/living/brain/death.dm
+++ b/code/modules/mob/living/brain/death.dm
@@ -15,6 +15,6 @@
if(container)
qdel(container)//Gets rid of the MMI if there is one
if(loc)
- if(istype(loc,/obj/item/organ/brain))
+ if(istype(loc, /obj/item/organ/brain))
qdel(loc)//Gets rid of the brain item
..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm
index 46facdc454..a31dba9fa9 100644
--- a/code/modules/mob/living/carbon/alien/death.dm
+++ b/code/modules/mob/living/carbon/alien/death.dm
@@ -1,8 +1,8 @@
/mob/living/carbon/alien/spawn_gibs(with_bodyparts)
if(with_bodyparts)
- new /obj/effect/gibspawner/xeno(loc,viruses)
+ new /obj/effect/gibspawner/xeno(get_turf(src))
else
- new /obj/effect/gibspawner/xenobodypartless(loc,viruses)
+ new /obj/effect/gibspawner/xenobodypartless(get_turf(src))
/mob/living/carbon/alien/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a")
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index 83971dac05..e6a5f58d69 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -13,7 +13,7 @@ Doesn't work on other aliens/AI.*/
var/check_turf = 0
var/has_action = 1
var/datum/action/spell_action/alien/action = null
- var/action_icon = 'icons/mob/actions.dmi'
+ var/action_icon = 'icons/mob/actions/actions_xeno.dmi'
var/action_icon_state = "spell_default"
var/action_background_icon_state = "bg_alien"
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 2957124ac6..9e3212ec6e 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -72,7 +72,7 @@
var/blocked = FALSE
if(ishuman(A))
var/mob/living/carbon/human/H = A
- if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK))
+ if(H.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK))
blocked = TRUE
if(!blocked)
L.visible_message("[src] pounces on [L]!", "[src] pounces on you!")
diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm
index 585e5779c6..f49e545dfa 100644
--- a/code/modules/mob/living/carbon/alien/larva/death.dm
+++ b/code/modules/mob/living/carbon/alien/larva/death.dm
@@ -8,9 +8,9 @@
/mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts)
if(with_bodyparts)
- new /obj/effect/gibspawner/larva(loc,viruses)
+ new /obj/effect/gibspawner/larva(get_turf(src))
else
- new /obj/effect/gibspawner/larvabodypartless(loc,viruses)
+ new /obj/effect/gibspawner/larvabodypartless(get_turf(src))
/mob/living/carbon/alien/larva/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l")
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index cd5f179dd7..9179221137 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -51,7 +51,7 @@
var/obj/item/item_in_hand = src.get_active_held_item()
if(item_in_hand) //this segment checks if the item in your hand is twohanded.
- if(istype(item_in_hand,/obj/item/weapon/twohanded))
+ if(istype(item_in_hand, /obj/item/weapon/twohanded))
if(item_in_hand:wielded == 1)
to_chat(usr, "Your other hand is too busy holding the [item_in_hand.name]")
return
@@ -722,8 +722,9 @@
var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain)
if(B)
B.damaged_brain = 0
- for(var/datum/disease/D in viruses)
- if (D.severity != NONTHREAT)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
+ if(D.severity != NONTHREAT)
D.cure(0)
if(admin_revive)
regenerate_limbs()
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 2e17b466f1..8bf10c39ba 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -111,11 +111,13 @@
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
if(D.IsSpreadByTouch())
user.ContractDisease(D)
- for(var/datum/disease/D in user.viruses)
+ for(var/thing in user.viruses)
+ var/datum/disease/D = thing
if(D.IsSpreadByTouch())
ContractDisease(D)
@@ -128,11 +130,13 @@
/mob/living/carbon/attack_paw(mob/living/carbon/monkey/M)
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
if(D.IsSpreadByTouch())
M.ContractDisease(D)
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
if(D.IsSpreadByTouch())
ContractDisease(D)
@@ -141,7 +145,8 @@
return 0
if(..()) //successful monkey bite.
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
ForceContractDisease(D)
return 1
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index f980ed149c..ebf1d6284d 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -36,6 +36,8 @@
adjustCloneLoss(damage * hit_percent)
if(STAMINA)
adjustStaminaLoss(damage * hit_percent)
+ if(BRAIN)
+ adjustBrainLoss(damage * hit_percent)
//citadel code
if(AROUSAL)
adjustArousalLoss(damage * hit_percent)
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index c6c7196755..1deeaeeb17 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -9,7 +9,7 @@
emote("deathgasp")
. = ..()
- if(SSticker && SSticker.mode)
+ if(SSticker.mode)
SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts)
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 4547390f56..a1b67fbee1 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -6,9 +6,9 @@
/mob/living/carbon/human/spawn_gibs(with_bodyparts)
if(with_bodyparts)
- new /obj/effect/gibspawner/human(loc, viruses, dna)
+ new /obj/effect/gibspawner/human(get_turf(src), dna)
else
- new /obj/effect/gibspawner/humanbodypartless(loc, viruses, dna)
+ new /obj/effect/gibspawner/humanbodypartless(get_turf(src), dna)
/mob/living/carbon/human/spawn_dust(just_ash = FALSE)
if(just_ash)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index bf578d6b0b..94732a349d 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -16,7 +16,7 @@
if(w_uniform && !(slot_w_uniform in obscured))
//accessory
var/accessory_msg
- if(istype(w_uniform,/obj/item/clothing/under))
+ if(istype(w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = w_uniform
if(U.attached_accessory)
accessory_msg += " with [bicon(U.attached_accessory)] \a [U.attached_accessory]"
@@ -273,7 +273,7 @@
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
if(getorgan(/obj/item/organ/brain))
- if(istype(src,/mob/living/carbon/human/interactive))
+ if(istype(src, /mob/living/carbon/human/interactive))
var/mob/living/carbon/human/interactive/auto = src
if(auto.showexaminetext)
msg += "[t_He] [t_is] appears to be some sort of sick automaton, [t_his] eyes are glazed over and [t_his] mouth is slightly agape.\n"
@@ -300,7 +300,7 @@
msg += "Rank: [R.fields["rank"]] "
msg += "\[Front photo\] "
msg += "\[Side photo\] "
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH,/obj/item/organ/cyberimp/eyes/hud/medical))
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/medical))
var/cyberimp_detect
for(var/obj/item/organ/cyberimp/CI in internal_organs)
if(CI.status == ORGAN_ROBOTIC)
@@ -318,7 +318,7 @@
msg += "\[Medical evaluation\] "
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(CIH,/obj/item/organ/cyberimp/eyes/hud/security))
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/security))
if(!user.stat && user != src)
//|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at.
var/criminal = "None"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 49a645b7c1..4424e80ce8 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -9,11 +9,11 @@
real_name = "Test Dummy"
status_flags = GODMODE|CANPUSH
-/mob/living/carbon/human/dummy/New(loc)
+INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
+
+/mob/living/carbon/human/dummy/Destroy()
..()
- if(!initialized)
- args[1] = FALSE
- Initialize(arglist(args))
+ return QDEL_HINT_QUEUE
/mob/living/carbon/human/dummy/Life()
return
@@ -131,7 +131,8 @@
//Virsuses
if(viruses.len)
stat("Viruses:", null)
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
stat("*", "[D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]")
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 7cc7c2f7fc..238e9d53ce 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -25,7 +25,7 @@
for(var/bp in body_parts)
if(!bp)
continue
- if(bp && istype(bp ,/obj/item/clothing))
+ if(bp && istype(bp , /obj/item/clothing))
var/obj/item/clothing/C = bp
if(C.body_parts_covered & def_zone.body_part)
protection += C.armor[d_type]
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 29e82efe6b..69b581995b 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -35,7 +35,7 @@
return pda.owner
return if_no_id
-//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere
+//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a separate proc as it'll be useful elsewhere
/mob/living/carbon/human/get_visible_name()
var/face_name = get_face_name("")
var/id_name = get_id_name("")
diff --git a/code/modules/mob/living/carbon/human/interactive.dm b/code/modules/mob/living/carbon/human/interactive.dm
index 59676238e7..e439f8ef9e 100644
--- a/code/modules/mob/living/carbon/human/interactive.dm
+++ b/code/modules/mob/living/carbon/human/interactive.dm
@@ -154,7 +154,7 @@
return
if(A)
- if(!istype(A,/mob/living/carbon/human/interactive))
+ if(!istype(A, /mob/living/carbon/human/interactive))
return
var/mob/living/carbon/human/interactive/T = A
if(T)
@@ -171,7 +171,7 @@
return
if(A)
- if(!istype(A,/mob/living/carbon/human/interactive))
+ if(!istype(A, /mob/living/carbon/human/interactive))
return
var/mob/living/carbon/human/interactive/T = A
@@ -286,7 +286,7 @@
if("Assistant")
favoured_types = list(/obj/item/clothing, /obj/item/weapon)
if("Captain","Head of Personnel")
- favoured_types = list(/obj/item/clothing, /obj/item/weapon/stamp/captain,/obj/item/weapon/disk/nuclear)
+ favoured_types = list(/obj/item/clothing, /obj/item/weapon/stamp/captain, /obj/item/weapon/disk/nuclear)
if("Cook")
favoured_types = list(/obj/item/weapon/reagent_containers/food, /obj/item/weapon/kitchen)
functions += "souschef"
@@ -308,7 +308,7 @@
favoured_types = list(/obj/item/weapon/mop, /obj/item/weapon/reagent_containers/glass/bucket, /obj/item/weapon/reagent_containers/spray/cleaner, /obj/effect/decal/cleanable)
functions += "dojanitor"
if("Clown")
- favoured_types = list(/obj/item/weapon/soap, /obj/item/weapon/reagent_containers/food/snacks/grown/banana,/obj/item/weapon/grown/bananapeel)
+ favoured_types = list(/obj/item/weapon/soap, /obj/item/weapon/reagent_containers/food/snacks/grown/banana, /obj/item/weapon/grown/bananapeel)
functions += "clowning"
if("Mime")
functions -= "chatter"
@@ -354,7 +354,7 @@
var/datum/objective_item/steal/S = new A
traitorTarget = locate(S.targetitem) in world
if(SNPC_MARTYR) // MY LIFE FOR SPESZUL
- var/targetType = pick(/obj/machinery/gravity_generator/main/station,/obj/machinery/power/smes/engineering,/obj/machinery/telecomms/hub)
+ var/targetType = pick(/obj/machinery/gravity_generator/main/station, /obj/machinery/power/smes/engineering, /obj/machinery/telecomms/hub)
traitorTarget = locate(targetType) in GLOB.machines
if(SNPC_PSYCHO) // YOU'RE LIKE A FLESH BICYLE AND I WANT TO DISMANTLE YOU
traitorTarget = null
@@ -549,8 +549,8 @@
var/turf/T = get_step(src,dir)
if(T)
for(var/obj/machinery/door/D in T.contents)
- if(!istype(D,/obj/machinery/door/poddoor) && D.density)
- if(istype(D,/obj/machinery/door/airlock))
+ if(!istype(D, /obj/machinery/door/poddoor) && D.density)
+ if(istype(D, /obj/machinery/door/airlock))
var/obj/machinery/door/airlock/AL = D
if(!AL.CanAStarPass(RPID)) // only crack open doors we can't get through
inactivity_period = 20
@@ -623,7 +623,7 @@
//--------DOORS
if(istype(TARGET, /obj/machinery/door))
var/obj/machinery/door/D = TARGET
- if(D.check_access(MYID) && !istype(D,/obj/machinery/door/poddoor))
+ if(D.check_access(MYID) && !istype(D, /obj/machinery/door/poddoor))
inactivity_period = 10
D.open()
var/turf/T = get_step(get_step(D.loc,dir),dir) //recursion yo
@@ -646,7 +646,7 @@
else
insert_into_backpack()
//---------FASHION
- if(istype(TARGET,/obj/item/clothing))
+ if(istype(TARGET, /obj/item/clothing))
drop_item()
dressup(TARGET)
update_hands = 1
@@ -657,7 +657,7 @@
equip_to_appropriate_slot(MYID)
//THIEVING SKILLS END
//-------------TOUCH ME
- if(istype(TARGET,/obj/structure))
+ if(istype(TARGET, /obj/structure))
var/obj/structure/STR = TARGET
if(main_hand)
var/obj/item/weapon/W = main_hand
@@ -815,7 +815,7 @@
if(T.title == "Botanist")
return /area/hydroponics
else
- return pick(/area/hallway,/area/crew_quarters/locker)
+ return pick(/area/hallway, /area/crew_quarters/locker)
/mob/living/carbon/human/interactive/proc/target_filter(target)
var/list/filtered_targets = list(/area, /turf, /obj/machinery/door, /atom/movable/light, /obj/structure/cable, /obj/machinery/atmospherics)
@@ -1115,7 +1115,7 @@
if(retal && TARGET)
for(var/obj/item/I in allContents)
- if(istype(I,/obj/item/weapon/restraints))
+ if(istype(I, /obj/item/weapon/restraints))
I.attack(TARGET,src) // go go bluespace restraint launcher!
inactivity_period = 25
break
@@ -1139,7 +1139,7 @@
var/pranksNearby = 100
for(var/turf/open/T in orange(1,C))
for(var/obj/item/A in T)
- if(istype(A,/obj/item/weapon/soap) || istype(A,/obj/item/weapon/reagent_containers/food/snacks/grown/banana) || istype(A,/obj/item/weapon/grown/bananapeel))
+ if(istype(A, /obj/item/weapon/soap) || istype(A, /obj/item/weapon/reagent_containers/food/snacks/grown/banana) || istype(A, /obj/item/weapon/grown/bananapeel))
pranksNearby--
if(T.wet)
pranksNearby -= 10
@@ -1159,13 +1159,13 @@
var/hasPranked = 0
for(var/A in allContents)
if(prob(smartness/2) && !hasPranked)
- if(istype(A,/obj/item/weapon/soap))
+ if(istype(A, /obj/item/weapon/soap))
npcDrop(A)
hasPranked = 1
- if(istype(A,/obj/item/weapon/reagent_containers/food/snacks/grown/banana))
+ if(istype(A, /obj/item/weapon/reagent_containers/food/snacks/grown/banana))
var/obj/item/weapon/reagent_containers/food/snacks/B = A
B.attack(src, src)
- if(istype(A,/obj/item/weapon/grown/bananapeel))
+ if(istype(A, /obj/item/weapon/grown/bananapeel))
npcDrop(A)
hasPranked = 1
if(!hasPranked)
@@ -1181,7 +1181,7 @@
var/list/allContents = getAllContents()
for(var/A in allContents)
- if(istype(A,/obj/item/stack/medical))
+ if(istype(A, /obj/item/stack/medical))
shouldTryHeal = 1
M = A
@@ -1281,7 +1281,7 @@
var/list/rangeCheck = view(6,src)
//Make some basic custom food
- var/list/customableTypes = list(/obj/item/weapon/reagent_containers/food/snacks/customizable,/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain,/obj/item/weapon/reagent_containers/food/snacks/pizzabread,/obj/item/weapon/reagent_containers/food/snacks/bun,/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain,/obj/item/weapon/reagent_containers/food/snacks/pie/plain,/obj/item/weapon/reagent_containers/food/snacks/pastrybase)
+ var/list/customableTypes = list(/obj/item/weapon/reagent_containers/food/snacks/customizable, /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain, /obj/item/weapon/reagent_containers/food/snacks/pizzabread, /obj/item/weapon/reagent_containers/food/snacks/bun, /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain, /obj/item/weapon/reagent_containers/food/snacks/pie/plain, /obj/item/weapon/reagent_containers/food/snacks/pastrybase)
var/foundCustom
@@ -1379,7 +1379,7 @@
var/list/finishedList = list()
for(var/obj/item/weapon/reagent_containers/food/snacks/toDisplay in allContents)
- if(!toDisplay.cooked_type && !istype(toDisplay,/obj/item/weapon/reagent_containers/food/snacks/grown)) // dont display our ingredients
+ if(!toDisplay.cooked_type && !istype(toDisplay, /obj/item/weapon/reagent_containers/food/snacks/grown)) // dont display our ingredients
finishedList += toDisplay
for(var/obj/item/weapon/reagent_containers/food/snacks/toGrab in rangeCheck)
@@ -1410,7 +1410,7 @@
RT.attackby(toPlop,src)
if(!foundCookable)
- var/list/allTypes = list(/obj/item/weapon/reagent_containers/food/snacks/piedough,/obj/item/weapon/reagent_containers/food/snacks/cakebatter,/obj/item/weapon/reagent_containers/food/snacks/dough,/obj/item/weapon/reagent_containers/food/snacks/flatdough)
+ var/list/allTypes = list(/obj/item/weapon/reagent_containers/food/snacks/piedough, /obj/item/weapon/reagent_containers/food/snacks/cakebatter, /obj/item/weapon/reagent_containers/food/snacks/dough, /obj/item/weapon/reagent_containers/food/snacks/flatdough)
for(var/A in typesof(/obj/item/weapon/reagent_containers/food/snacks))
var/obj/item/weapon/reagent_containers/food/snacks/O = A
@@ -1473,7 +1473,7 @@
foundFav = 1
return
if(!foundFav)
- if(istype(test,/obj/item/weapon))
+ if(istype(test, /obj/item/weapon))
var/obj/item/weapon/R = test
if(R.force > 2) // make sure we don't equip any non-weaponlike items, ie bags and stuff
if(!best)
@@ -1481,7 +1481,7 @@
else
if(best.force < R.force)
best = R
- if(istype(R,/obj/item/weapon/gun))
+ if(istype(R, /obj/item/weapon/gun))
var/obj/item/weapon/gun/G = R
if(G.can_shoot())
best = R
@@ -1495,15 +1495,15 @@
if(M.health > 1)
//THROWING OBJECTS
for(var/A in allContents)
- if(istype(A,/obj/item/weapon/gun)) // guns are for shooting, not throwing.
+ if(istype(A, /obj/item/weapon/gun)) // guns are for shooting, not throwing.
continue
if(prob(robustness))
- if(istype(A,/obj/item/weapon))
+ if(istype(A, /obj/item/weapon))
var/obj/item/weapon/W = A
if(W.throwforce > 19) // Only throw worthwile stuff, no more lobbing wrenches at wenches
npcDrop(W,1)
throw_item(TARGET)
- if(istype(A,/obj/item/weapon/grenade)) // Allahu ackbar! ALLAHU ACKBARR!!
+ if(istype(A, /obj/item/weapon/grenade)) // Allahu ackbar! ALLAHU ACKBARR!!
var/obj/item/weapon/grenade/G = A
G.attack_self(src)
if(prob(smartness))
@@ -1516,10 +1516,10 @@
swap_hands()
if(main_hand)
if(main_hand.force != 0)
- if(istype(main_hand,/obj/item/weapon/gun))
+ if(istype(main_hand, /obj/item/weapon/gun))
var/obj/item/weapon/gun/G = main_hand
if(G.can_trigger_gun(src))
- if(istype(main_hand,/obj/item/weapon/gun/ballistic))
+ if(istype(main_hand, /obj/item/weapon/gun/ballistic))
var/obj/item/weapon/gun/ballistic/P = main_hand
if(!P.chambered)
P.chamber_round()
@@ -1529,11 +1529,11 @@
npcDrop(P,1)
else
P.afterattack(TARGET, src)
- else if(istype(main_hand,/obj/item/weapon/gun/energy))
+ else if(istype(main_hand, /obj/item/weapon/gun/energy))
var/obj/item/weapon/gun/energy/P = main_hand
var/stunning = 0
for(var/A in P.ammo_type)
- if(ispath(A,/obj/item/ammo_casing/energy/electrode))
+ if(ispath(A, /obj/item/ammo_casing/energy/electrode))
stunning = 1
var/shouldFire = 1
var/mob/living/stunCheck = TARGET
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index d9f1acf879..da99954f29 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -63,6 +63,7 @@
return list(
head,
wear_mask,
+ wear_neck,
glasses,
ears,
)
@@ -171,7 +172,7 @@
dropItemToGround(belt)
w_uniform = null
update_suit_sensors()
- if(!QDELETED(src))
+ if(!QDELETED(src))
update_inv_w_uniform()
else if(I == gloves)
gloves = null
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index cefb77e248..3bed38cf69 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -103,15 +103,17 @@
var/datum/species/S = dna.species
if(S.breathid == "o2")
- throw_alert("oxy", /obj/screen/alert/oxy)
+ throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
else if(S.breathid == "tox")
throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
else if(S.breathid == "co2")
throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
+ else if(S.breathid == "n2")
+ throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro)
return 0
else
- if(istype(L,/obj/item/organ/lungs))
+ if(istype(L, /obj/item/organ/lungs))
var/obj/item/organ/lungs/lun = L
lun.check_breath(breath,src)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 5d78b9c4e0..6f01593933 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1506,6 +1506,8 @@
H.adjustCloneLoss(damage * hit_percent)
if(STAMINA)
H.adjustStaminaLoss(damage * hit_percent)
+ if(BRAIN)
+ H.adjustBrainLoss(damage * hit_percent)
return 1
/datum/species/proc/on_hit(obj/item/projectile/P, mob/living/carbon/human/H)
diff --git a/code/modules/mob/living/carbon/human/species.dm.rej b/code/modules/mob/living/carbon/human/species.dm.rej
deleted file mode 100644
index e10962105a..0000000000
--- a/code/modules/mob/living/carbon/human/species.dm.rej
+++ /dev/null
@@ -1,12 +0,0 @@
-diff a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm (rejected hunks)
-@@ -71,8 +71,8 @@
- var/obj/item/mutanthands = null
- var/obj/item/organ/tongue/mutanttongue = /obj/item/organ/tongue
-
-- var/obj/item/organ/liver/mutantliver = null
-- var/obj/item/organ/stomach/mutantstomach = null
-+ var/obj/item/organ/liver/mutantliver
-+ var/obj/item/organ/stomach/mutantstomach
-
- ///////////
- // PROCS //
diff --git a/code/modules/mob/living/carbon/human/species_types/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm
index 7247509557..7c58ecbf86 100644
--- a/code/modules/mob/living/carbon/human/species_types/angel.dm
+++ b/code/modules/mob/living/carbon/human/species_types/angel.dm
@@ -66,6 +66,7 @@
/datum/action/innate/flight
name = "Toggle Flight"
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_STUN
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "flight"
/datum/action/innate/flight/Activate()
diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
index 6331d15789..804f9bf3a2 100644
--- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
@@ -15,7 +15,7 @@
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
- if(istype(chem,/datum/reagent/consumable))
+ if(istype(chem, /datum/reagent/consumable))
var/datum/reagent/consumable/nutri_check = chem
if(nutri_check.nutriment_factor > 0)
var/turf/pos = get_turf(H)
@@ -26,6 +26,6 @@
..()
/datum/species/fly/check_weakness(obj/item/weapon, mob/living/attacker)
- if(istype(weapon,/obj/item/weapon/melee/flyswatter))
+ if(istype(weapon, /obj/item/weapon/melee/flyswatter))
return 29 //Flyswatters deal 30x damage to flypeople.
return 0
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index 2f5b0b8b93..7cd296e4f1 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -44,7 +44,7 @@
var/mob/dead/observe = M
if(observe.client)
observe.client.screen -= I
- I.loc = src
+ I.forceMove(src)
I.layer = ABOVE_HUD_LAYER
I.plane = ABOVE_HUD_PLANE
I.appearance_flags |= NO_CLIENT_COLOR
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 6bacfdd807..c52d9862ad 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -113,7 +113,7 @@
return
adjustOxyLoss(1)
failed_last_breath = 1
- throw_alert("oxy", /obj/screen/alert/oxy)
+ throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
return 0
var/safe_oxy_min = 16
@@ -144,14 +144,14 @@
else
adjustOxyLoss(3)
failed_last_breath = 1
- throw_alert("oxy", /obj/screen/alert/oxy)
+ throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
else //Enough oxygen
failed_last_breath = 0
if(oxyloss)
adjustOxyLoss(-5)
oxygen_used = breath_gases["o2"][MOLES]
- clear_alert("oxy")
+ clear_alert("not_enough_oxy")
breath_gases["o2"][MOLES] -= oxygen_used
breath_gases["co2"][MOLES] += oxygen_used
@@ -174,11 +174,10 @@
//TOXINS/PLASMA
if(Toxins_partialpressure > safe_tox_max)
var/ratio = (breath_gases["plasma"][MOLES]/safe_tox_max) * 10
- if(reagents)
- reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
- throw_alert("tox_in_air", /obj/screen/alert/tox_in_air)
+ adjustToxLoss(Clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE))
+ throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
- clear_alert("tox_in_air")
+ clear_alert("too_much_tox")
//NITROUS OXIDE
if(breath_gases["n2o"])
@@ -225,6 +224,15 @@
/mob/living/carbon/proc/handle_blood()
return
+/mob/living/carbon/handle_diseases()
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
+ if(prob(D.infectivity))
+ D.spread()
+
+ if(stat != DEAD)
+ D.stage_act()
+
/mob/living/carbon/proc/handle_changeling()
if(mind && hud_used && hud_used.lingchemdisplay)
if(mind.changeling)
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm
index 92528de148..4b8454fcde 100644
--- a/code/modules/mob/living/carbon/monkey/combat.dm
+++ b/code/modules/mob/living/carbon/monkey/combat.dm
@@ -85,7 +85,7 @@
return TRUE
// CLOTHING
- else if(istype(I,/obj/item/clothing))
+ else if(istype(I, /obj/item/clothing))
var/obj/item/clothing/C = I
monkeyDrop(C)
addtimer(CALLBACK(src, .proc/pickup_and_wear, C), 5)
@@ -445,7 +445,7 @@
retaliate(user)
/mob/living/carbon/monkey/bullet_act(obj/item/projectile/Proj)
- if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
+ if(istype(Proj , /obj/item/projectile/beam)||istype(Proj, /obj/item/projectile/bullet))
if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
if(!Proj.nodamage && Proj.damage < src.health)
retaliate(Proj.firer)
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 922febe423..fccb3ab8dd 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -1,286 +1,294 @@
-
-/*
- apply_damage(a,b,c)
- args
- a:damage - How much damage to take
- b:damage_type - What type of damage to take, brute, burn
- c:def_zone - Where to take the damage if its brute or burn
- Returns
- standard 0 if fail
-*/
+
+/*
+ apply_damage(a,b,c)
+ args
+ a:damage - How much damage to take
+ b:damage_type - What type of damage to take, brute, burn
+ c:def_zone - Where to take the damage if its brute or burn
+ Returns
+ standard 0 if fail
+*/
/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE)
- var/hit_percent = (100-blocked)/100
- if(!damage || (hit_percent <= 0))
- return 0
- switch(damagetype)
- if(BRUTE)
- adjustBruteLoss(damage * hit_percent)
- if(BURN)
- adjustFireLoss(damage * hit_percent)
- if(TOX)
- adjustToxLoss(damage * hit_percent)
- if(OXY)
- adjustOxyLoss(damage * hit_percent)
- if(CLONE)
- adjustCloneLoss(damage * hit_percent)
- if(STAMINA)
- adjustStaminaLoss(damage * hit_percent)
- //citadel code
- if(AROUSAL)
- adjustArousalLoss(damage * hit_percent)
- return 1
-
-/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs
- switch(damagetype)
- if(BRUTE)
- return adjustBruteLoss(damage)
- if(BURN)
- return adjustFireLoss(damage)
- if(TOX)
- return adjustToxLoss(damage)
- if(OXY)
- return adjustOxyLoss(damage)
- if(CLONE)
- return adjustCloneLoss(damage)
- if(STAMINA)
- return adjustStaminaLoss(damage)
- //citadel code
- if(AROUSAL)
- return adjustArousalLoss(damage)
-
-/mob/living/proc/get_damage_amount(damagetype = BRUTE)
- switch(damagetype)
- if(BRUTE)
- return getBruteLoss()
- if(BURN)
- return getFireLoss()
- if(TOX)
- return getToxLoss()
- if(OXY)
- return getOxyLoss()
- if(CLONE)
- return getCloneLoss()
- if(STAMINA)
- return getStaminaLoss()
- //citadel code
- if(AROUSAL)
- return getArousalLoss()
-
-
-/mob/living/proc/apply_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = 0, stamina = 0, arousal = 0)
- if(blocked >= 100)
- return 0
- if(brute)
- apply_damage(brute, BRUTE, def_zone, blocked)
- if(burn)
- apply_damage(burn, BURN, def_zone, blocked)
- if(tox)
- apply_damage(tox, TOX, def_zone, blocked)
- if(oxy)
- apply_damage(oxy, OXY, def_zone, blocked)
- if(clone)
- apply_damage(clone, CLONE, def_zone, blocked)
- if(stamina)
- apply_damage(stamina, STAMINA, def_zone, blocked)
- //citadel code
- if(arousal)
- apply_damage(arousal, AROUSAL, def_zone, blocked)
- return 1
-
-
-
+ var/hit_percent = (100-blocked)/100
+ if(!damage || (hit_percent <= 0))
+ return 0
+ switch(damagetype)
+ if(BRUTE)
+ adjustBruteLoss(damage * hit_percent)
+ if(BURN)
+ adjustFireLoss(damage * hit_percent)
+ if(TOX)
+ adjustToxLoss(damage * hit_percent)
+ if(OXY)
+ adjustOxyLoss(damage * hit_percent)
+ if(CLONE)
+ adjustCloneLoss(damage * hit_percent)
+ if(STAMINA)
+ adjustStaminaLoss(damage * hit_percent)
+ if(BRAIN)
+ adjustBrainLoss(damage * hit_percent)
+ //citadel code
+ if(AROUSAL)
+ adjustArousalLoss(damage * hit_percent)
+ return 1
+
+/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs
+ switch(damagetype)
+ if(BRUTE)
+ return adjustBruteLoss(damage)
+ if(BURN)
+ return adjustFireLoss(damage)
+ if(TOX)
+ return adjustToxLoss(damage)
+ if(OXY)
+ return adjustOxyLoss(damage)
+ if(CLONE)
+ return adjustCloneLoss(damage)
+ if(STAMINA)
+ return adjustStaminaLoss(damage)
+ if(BRAIN)
+ return adjustBrainLoss(damage)
+ //citadel code
+ if(AROUSAL)
+ return adjustArousalLoss(damage)
+
+/mob/living/proc/get_damage_amount(damagetype = BRUTE)
+ switch(damagetype)
+ if(BRUTE)
+ return getBruteLoss()
+ if(BURN)
+ return getFireLoss()
+ if(TOX)
+ return getToxLoss()
+ if(OXY)
+ return getOxyLoss()
+ if(CLONE)
+ return getCloneLoss()
+ if(STAMINA)
+ return getStaminaLoss()
+ if(BRAIN)
+ return getBrainLoss()
+ //citadel code
+ if(AROUSAL)
+ return getArousalLoss()
+
+
+/mob/living/proc/apply_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = FALSE, stamina = 0, arousal = 0, brain = 0)
+ if(blocked >= 100)
+ return 0
+ if(brute)
+ apply_damage(brute, BRUTE, def_zone, blocked)
+ if(burn)
+ apply_damage(burn, BURN, def_zone, blocked)
+ if(tox)
+ apply_damage(tox, TOX, def_zone, blocked)
+ if(oxy)
+ apply_damage(oxy, OXY, def_zone, blocked)
+ if(clone)
+ apply_damage(clone, CLONE, def_zone, blocked)
+ if(stamina)
+ apply_damage(stamina, STAMINA, def_zone, blocked)
+ if(brain)
+ apply_damage(brain, BRAIN, def_zone, blocked)
+ //citadel code
+ if(arousal)
+ apply_damage(arousal, AROUSAL, def_zone, blocked)
+ return 1
+
+
+
/mob/living/proc/apply_effect(effect = 0,effecttype = STUN, blocked = FALSE)
- var/hit_percent = (100-blocked)/100
- if(!effect || (hit_percent <= 0))
- return 0
- switch(effecttype)
- if(STUN)
- Stun(effect * hit_percent)
- if(KNOCKDOWN)
- Knockdown(effect * hit_percent)
- if(UNCONSCIOUS)
- Unconscious(effect * hit_percent)
- if(IRRADIATE)
- radiation += max(effect * hit_percent, 0)
- if(SLUR)
- slurring = max(slurring,(effect * hit_percent))
- if(STUTTER)
- if(status_flags & CANSTUN) // stun is usually associated with stutter
- stuttering = max(stuttering,(effect * hit_percent))
- if(EYE_BLUR)
- blur_eyes(effect * hit_percent)
- if(DROWSY)
- drowsyness = max(drowsyness,(effect * hit_percent))
- if(JITTER)
- if(status_flags & CANSTUN)
- jitteriness = max(jitteriness,(effect * hit_percent))
- return 1
-
-
+ var/hit_percent = (100-blocked)/100
+ if(!effect || (hit_percent <= 0))
+ return 0
+ switch(effecttype)
+ if(STUN)
+ Stun(effect * hit_percent)
+ if(KNOCKDOWN)
+ Knockdown(effect * hit_percent)
+ if(UNCONSCIOUS)
+ Unconscious(effect * hit_percent)
+ if(IRRADIATE)
+ radiation += max(effect * hit_percent, 0)
+ if(SLUR)
+ slurring = max(slurring,(effect * hit_percent))
+ if(STUTTER)
+ if(status_flags & CANSTUN) // stun is usually associated with stutter
+ stuttering = max(stuttering,(effect * hit_percent))
+ if(EYE_BLUR)
+ blur_eyes(effect * hit_percent)
+ if(DROWSY)
+ drowsyness = max(drowsyness,(effect * hit_percent))
+ if(JITTER)
+ if(status_flags & CANSTUN)
+ jitteriness = max(jitteriness,(effect * hit_percent))
+ return 1
+
+
/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0)
- if(blocked >= 100)
- return 0
- if(stun)
- apply_effect(stun, STUN, blocked)
- if(knockdown)
- apply_effect(knockdown, KNOCKDOWN, blocked)
- if(unconscious)
- apply_effect(unconscious, UNCONSCIOUS, blocked)
- if(irradiate)
- apply_effect(irradiate, IRRADIATE, blocked)
- if(slur)
- apply_effect(slur, SLUR, blocked)
- if(stutter)
- apply_effect(stutter, STUTTER, blocked)
- if(eyeblur)
- apply_effect(eyeblur, EYE_BLUR, blocked)
- if(drowsy)
- apply_effect(drowsy, DROWSY, blocked)
- if(stamina)
- apply_damage(stamina, STAMINA, null, blocked)
- if(jitter)
- apply_effect(jitter, JITTER, blocked)
- return 1
-
-
-/mob/living/proc/getBruteLoss()
- return bruteloss
-
-/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)
- if(!forced && (status_flags & GODMODE))
- return FALSE
- bruteloss = Clamp((bruteloss + (amount * config.damage_multiplier)), 0, maxHealth*2)
- if(updating_health)
- updatehealth()
- return amount
-
-/mob/living/proc/getOxyLoss()
- return oxyloss
-
-/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE)
- if(!forced && (status_flags & GODMODE))
- return FALSE
- oxyloss = Clamp((oxyloss + (amount * config.damage_multiplier)), 0, maxHealth*2)
- if(updating_health)
- updatehealth()
- return amount
-
-/mob/living/proc/setOxyLoss(amount, updating_health = TRUE, forced = FALSE)
- if(status_flags & GODMODE)
- return 0
- oxyloss = amount
- if(updating_health)
- updatehealth()
- return amount
-
-/mob/living/proc/getToxLoss()
- return toxloss
-
-/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE)
- if(!forced && (status_flags & GODMODE))
- return FALSE
- toxloss = Clamp((toxloss + (amount * config.damage_multiplier)), 0, maxHealth*2)
- if(updating_health)
- updatehealth()
- return amount
-
-/mob/living/proc/setToxLoss(amount, updating_health = TRUE, forced = FALSE)
- if(!forced && (status_flags & GODMODE))
- return FALSE
- toxloss = amount
- if(updating_health)
- updatehealth()
- return amount
-
-/mob/living/proc/getFireLoss()
- return fireloss
-
-/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE)
- if(!forced && (status_flags & GODMODE))
- return FALSE
- fireloss = Clamp((fireloss + (amount * config.damage_multiplier)), 0, maxHealth*2)
- if(updating_health)
- updatehealth()
- return amount
-
-/mob/living/proc/getCloneLoss()
- return cloneloss
-
-/mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE)
- if(!forced && (status_flags & GODMODE))
- return FALSE
- cloneloss = Clamp((cloneloss + (amount * config.damage_multiplier)), 0, maxHealth*2)
- if(updating_health)
- updatehealth()
- return amount
-
-/mob/living/proc/setCloneLoss(amount, updating_health = TRUE, forced = FALSE)
- if(!forced && (status_flags & GODMODE))
- return FALSE
- cloneloss = amount
- if(updating_health)
- updatehealth()
- return amount
-
-/mob/living/proc/getBrainLoss()
- return brainloss
-
-/mob/living/proc/adjustBrainLoss(amount)
- if(status_flags & GODMODE)
- return 0
- brainloss = Clamp((brainloss + (amount * config.damage_multiplier)), 0, maxHealth*2)
-
-/mob/living/proc/setBrainLoss(amount)
- if(status_flags & GODMODE)
- return 0
- brainloss = amount
-
-/mob/living/proc/getStaminaLoss()
- return staminaloss
-
-/mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE)
- return
-
-/mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE)
- return
-
-
-// heal ONE external organ, organ gets randomly selected from damaged ones.
-/mob/living/proc/heal_bodypart_damage(brute, burn, updating_health = 1)
- adjustBruteLoss(-brute, 0) //zero as argument for no instant health update
- adjustFireLoss(-burn, 0)
- if(updating_health)
- updatehealth()
-
-// damage ONE external organ, organ gets randomly selected from damaged ones.
-/mob/living/proc/take_bodypart_damage(brute, burn, updating_health = 1)
- adjustBruteLoss(brute, 0) //zero as argument for no instant health update
- adjustFireLoss(burn, 0)
- if(updating_health)
- updatehealth()
-
-// heal MANY bodyparts, in random order
-/mob/living/proc/heal_overall_damage(brute, burn, only_robotic = 0, only_organic = 1, updating_health = 1)
- adjustBruteLoss(-brute, 0) //zero as argument for no instant health update
- adjustFireLoss(-burn, 0)
- if(updating_health)
- updatehealth()
-
-// damage MANY bodyparts, in random order
-/mob/living/proc/take_overall_damage(brute, burn, updating_health = 1)
- adjustBruteLoss(brute, 0) //zero as argument for no instant health update
- adjustFireLoss(burn, 0)
- if(updating_health)
- updatehealth()
-
-//heal up to amount damage, in a given order
-/mob/living/proc/heal_ordered_damage(amount, list/damage_types)
- . = amount //we'll return the amount of damage healed
- for(var/i in damage_types)
- var/amount_to_heal = min(amount, get_damage_amount(i)) //heal only up to the amount of damage we have
- if(amount_to_heal)
- apply_damage_type(-amount_to_heal, i)
- amount -= amount_to_heal //remove what we healed from our current amount
- if(!amount)
- break
- . -= amount //if there's leftover healing, remove it from what we return
+ if(blocked >= 100)
+ return 0
+ if(stun)
+ apply_effect(stun, STUN, blocked)
+ if(knockdown)
+ apply_effect(knockdown, KNOCKDOWN, blocked)
+ if(unconscious)
+ apply_effect(unconscious, UNCONSCIOUS, blocked)
+ if(irradiate)
+ apply_effect(irradiate, IRRADIATE, blocked)
+ if(slur)
+ apply_effect(slur, SLUR, blocked)
+ if(stutter)
+ apply_effect(stutter, STUTTER, blocked)
+ if(eyeblur)
+ apply_effect(eyeblur, EYE_BLUR, blocked)
+ if(drowsy)
+ apply_effect(drowsy, DROWSY, blocked)
+ if(stamina)
+ apply_damage(stamina, STAMINA, null, blocked)
+ if(jitter)
+ apply_effect(jitter, JITTER, blocked)
+ return 1
+
+
+/mob/living/proc/getBruteLoss()
+ return bruteloss
+
+/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)
+ if(!forced && (status_flags & GODMODE))
+ return FALSE
+ bruteloss = Clamp((bruteloss + (amount * config.damage_multiplier)), 0, maxHealth*2)
+ if(updating_health)
+ updatehealth()
+ return amount
+
+/mob/living/proc/getOxyLoss()
+ return oxyloss
+
+/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE)
+ if(!forced && (status_flags & GODMODE))
+ return FALSE
+ oxyloss = Clamp((oxyloss + (amount * config.damage_multiplier)), 0, maxHealth*2)
+ if(updating_health)
+ updatehealth()
+ return amount
+
+/mob/living/proc/setOxyLoss(amount, updating_health = TRUE, forced = FALSE)
+ if(status_flags & GODMODE)
+ return 0
+ oxyloss = amount
+ if(updating_health)
+ updatehealth()
+ return amount
+
+/mob/living/proc/getToxLoss()
+ return toxloss
+
+/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE)
+ if(!forced && (status_flags & GODMODE))
+ return FALSE
+ toxloss = Clamp((toxloss + (amount * config.damage_multiplier)), 0, maxHealth*2)
+ if(updating_health)
+ updatehealth()
+ return amount
+
+/mob/living/proc/setToxLoss(amount, updating_health = TRUE, forced = FALSE)
+ if(!forced && (status_flags & GODMODE))
+ return FALSE
+ toxloss = amount
+ if(updating_health)
+ updatehealth()
+ return amount
+
+/mob/living/proc/getFireLoss()
+ return fireloss
+
+/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE)
+ if(!forced && (status_flags & GODMODE))
+ return FALSE
+ fireloss = Clamp((fireloss + (amount * config.damage_multiplier)), 0, maxHealth*2)
+ if(updating_health)
+ updatehealth()
+ return amount
+
+/mob/living/proc/getCloneLoss()
+ return cloneloss
+
+/mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE)
+ if(!forced && (status_flags & GODMODE))
+ return FALSE
+ cloneloss = Clamp((cloneloss + (amount * config.damage_multiplier)), 0, maxHealth*2)
+ if(updating_health)
+ updatehealth()
+ return amount
+
+/mob/living/proc/setCloneLoss(amount, updating_health = TRUE, forced = FALSE)
+ if(!forced && (status_flags & GODMODE))
+ return FALSE
+ cloneloss = amount
+ if(updating_health)
+ updatehealth()
+ return amount
+
+/mob/living/proc/getBrainLoss()
+ return brainloss
+
+/mob/living/proc/adjustBrainLoss(amount)
+ if(status_flags & GODMODE)
+ return 0
+ brainloss = Clamp((brainloss + (amount * config.damage_multiplier)), 0, maxHealth*2)
+
+/mob/living/proc/setBrainLoss(amount)
+ if(status_flags & GODMODE)
+ return 0
+ brainloss = amount
+
+/mob/living/proc/getStaminaLoss()
+ return staminaloss
+
+/mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE)
+ return
+
+/mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE)
+ return
+
+
+// heal ONE external organ, organ gets randomly selected from damaged ones.
+/mob/living/proc/heal_bodypart_damage(brute, burn, updating_health = 1)
+ adjustBruteLoss(-brute, 0) //zero as argument for no instant health update
+ adjustFireLoss(-burn, 0)
+ if(updating_health)
+ updatehealth()
+
+// damage ONE external organ, organ gets randomly selected from damaged ones.
+/mob/living/proc/take_bodypart_damage(brute, burn, updating_health = 1)
+ adjustBruteLoss(brute, 0) //zero as argument for no instant health update
+ adjustFireLoss(burn, 0)
+ if(updating_health)
+ updatehealth()
+
+// heal MANY bodyparts, in random order
+/mob/living/proc/heal_overall_damage(brute, burn, only_robotic = 0, only_organic = 1, updating_health = 1)
+ adjustBruteLoss(-brute, 0) //zero as argument for no instant health update
+ adjustFireLoss(-burn, 0)
+ if(updating_health)
+ updatehealth()
+
+// damage MANY bodyparts, in random order
+/mob/living/proc/take_overall_damage(brute, burn, updating_health = 1)
+ adjustBruteLoss(brute, 0) //zero as argument for no instant health update
+ adjustFireLoss(burn, 0)
+ if(updating_health)
+ updatehealth()
+
+//heal up to amount damage, in a given order
+/mob/living/proc/heal_ordered_damage(amount, list/damage_types)
+ . = amount //we'll return the amount of damage healed
+ for(var/i in damage_types)
+ var/amount_to_heal = min(amount, get_damage_amount(i)) //heal only up to the amount of damage we have
+ if(amount_to_heal)
+ apply_damage_type(-amount_to_heal, i)
+ amount -= amount_to_heal //remove what we healed from our current amount
+ if(!amount)
+ break
+ . -= amount //if there's leftover healing, remove it from what we return
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index eb96d09bde..0fd86ed02e 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -18,7 +18,7 @@
return
/mob/living/proc/spawn_gibs()
- new /obj/effect/gibspawner/generic(loc, viruses)
+ new /obj/effect/gibspawner/generic(get_turf(src))
/mob/living/proc/spill_organs()
return
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 8bdcf30f66..ff37b85800 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -326,7 +326,7 @@
/datum/emote/living/surrender
key = "surrender"
key_third_person = "surrenders"
- message = "puts their hands on their head and falls to the ground, they surrender%s!"
+ message = "puts their hands on their head and falls to the ground, they surrender!"
emote_type = EMOTE_AUDIBLE
/datum/emote/living/surrender/run_emote(mob/user, params)
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 28a6bb5dd4..66ca8bf8e2 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -18,12 +18,16 @@
return
var/datum/gas_mixture/environment = loc.return_air()
- if(stat != DEAD)
- //Breathing, if applicable
- handle_breathing(times_fired)
if(stat != DEAD)
//Mutations and radiation
handle_mutations_and_radiation()
+
+ if(stat != DEAD)
+ //Breathing, if applicable
+ handle_breathing(times_fired)
+
+ handle_diseases() // DEAD check is in the proc itself; we want it to spread even if the mob is dead, but to handle its disease-y properties only if you're not.
+
if(stat != DEAD)
//Random events (vomiting etc)
handle_random_events()
@@ -60,6 +64,9 @@
radiation = 0 //so radiation don't accumulate in simple animals
return
+/mob/living/proc/handle_diseases()
+ return
+
/mob/living/proc/handle_diginvis()
if(!digitaldisguise)
src.digitaldisguise = image(loc = src)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 829b031d21..b58fb0ec13 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -135,7 +135,7 @@
//the puller can always swap with its victim if on grab intent
if(M.pulledby == src && a_intent == INTENT_GRAB)
mob_swap = 1
- //restrained people act if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
+ //restrained people act if they were on 'help' intent to prevent a person being pulled from being separated from their puller
else if((M.restrained() || M.a_intent == INTENT_HELP) && (restrained() || a_intent == INTENT_HELP))
mob_swap = 1
if(mob_swap)
@@ -357,7 +357,7 @@
updatehealth() //then we check if the mob should wake up.
update_canmove()
update_sight()
- clear_alert("oxy")
+ clear_alert("not_enough_oxy")
reload_fullscreen()
. = 1
if(mind)
@@ -412,7 +412,7 @@
if(client)
to_chat(src, "[src]'s Metainfo: [client.prefs.metadata]")
else
- to_chat(src, "[src] does not have any stored infomation!")
+ to_chat(src, "[src] does not have any stored information!")
else
to_chat(src, "OOC Metadata is not supported by this server!")
@@ -754,7 +754,7 @@
var/turf/T = get_turf(src)
if(!T)
return 0
- if(T.z == ZLEVEL_CENTCOM) //dont detect mobs on centcomm
+ if(T.z == ZLEVEL_CENTCOM) //dont detect mobs on centcom
return 0
if(T.z >= ZLEVEL_SPACEMAX)
return 0
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index b670f4c181..0c693b4749 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -67,7 +67,7 @@
var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest
var/dtype = BRUTE
var/volume = I.get_volume_by_throwforce_and_or_w_class()
- if(istype(I,/obj/item/weapon)) //If the item is a weapon...
+ if(istype(I, /obj/item/weapon)) //If the item is a weapon...
var/obj/item/weapon/W = I
dtype = W.damtype
diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm
index bcd7c77f1d..a3479aac89 100644
--- a/code/modules/mob/living/logout.dm
+++ b/code/modules/mob/living/logout.dm
@@ -2,5 +2,5 @@
if(ranged_ability && client)
ranged_ability.remove_mousepointer(client)
..()
- if(!key && mind) //key and mind have become seperated.
+ if(!key && mind) //key and mind have become separated.
mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
\ No newline at end of file
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index dcc9e0a58c..68e2b150f3 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -18,7 +18,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
// Faction
"t" = "Syndicate",
- "y" = "Centcom",
+ "y" = "CentCom",
// Species
"b" = "binary",
@@ -53,7 +53,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
// Faction
"" = "Syndicate",
- "" = "Centcom",
+ "" = "CentCom",
// Species
"" = "binary",
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 97bd12b996..35c107b532 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -79,8 +79,6 @@
var/cooldown = 0
var/acceleration = 1
- var/obj/machinery/camera/portable/builtInCamera
-
var/obj/structure/AIcore/deactivated/linked_core //For exosuit control
var/mob/living/silicon/robot/deployed_shell = null //For shell control
var/datum/action/innate/deploy_shell/deploy_action = new
@@ -151,7 +149,7 @@
GLOB.ai_list += src
GLOB.shuttle_caller_list += src
- builtInCamera = new /obj/machinery/camera/portable(src)
+ builtInCamera = new (src)
builtInCamera.network = list("SS13")
@@ -877,7 +875,7 @@
/mob/living/silicon/ai/reset_perspective(atom/A)
if(camera_light_on)
light_cameras()
- if(istype(A,/obj/machinery/camera))
+ if(istype(A, /obj/machinery/camera))
current = A
if(client)
if(ismovableatom(A))
@@ -963,6 +961,7 @@
/datum/action/innate/deploy_shell
name = "Deploy to AI Shell"
desc = "Wirelessly control a specialized cyborg shell."
+ icon_icon = 'icons/mob/actions/actions_AI.dmi'
button_icon_state = "ai_shell"
/datum/action/innate/deploy_shell/Trigger()
@@ -974,6 +973,7 @@
/datum/action/innate/deploy_last_shell
name = "Reconnect to shell"
desc = "Reconnect to the most recently used AI shell."
+ icon_icon = 'icons/mob/actions/actions_AI.dmi'
button_icon_state = "ai_last_shell"
var/mob/living/silicon/robot/last_used_shell
diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm
index ca93c95f48..7537697d71 100644
--- a/code/modules/mob/living/silicon/death.dm
+++ b/code/modules/mob/living/silicon/death.dm
@@ -1,5 +1,5 @@
/mob/living/silicon/spawn_gibs()
- new /obj/effect/gibspawner/robot(loc,viruses)
+ new /obj/effect/gibspawner/robot(get_turf(src))
/mob/living/silicon/spawn_dust()
new /obj/effect/decal/remains/robot(loc)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index e1aab0d1be..c6dd372532 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -161,6 +161,7 @@
/datum/action/innate/pai
name = "PAI Action"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
var/mob/living/silicon/pai/P
/datum/action/innate/pai/Trigger()
@@ -197,8 +198,10 @@
/datum/action/innate/pai/rest/Trigger()
..()
P.lay_down()
+
/datum/action/innate/pai/light
name = "Toggle Integrated Lights"
+ icon_icon = 'icons/mob/actions/actions_spells.dmi'
button_icon_state = "emp"
background_icon_state = "bg_tech"
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index a4f8638c4a..77874ad403 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -331,7 +331,7 @@
/mob/living/silicon/pai/proc/downloadSoftware()
var/dat = ""
- dat += "
Centcom pAI Module Subversion Network
"
+ dat += "
CentCom pAI Module Subversion Network
"
dat += "
Remaining Available Memory: [src.ram]
"
dat += "
Trunks available for checkout "
@@ -513,7 +513,8 @@
Structural Integrity: [M.getBruteLoss() > 50 ? "" : ""][M.getBruteLoss()]
Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)
"}
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
dat += {"
Infection Detected.
Name: [D.name]
Type: [D.spread_text]
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index c8c57dc602..7eb241e01f 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -22,8 +22,8 @@
locked = FALSE //unlock cover
update_canmove()
- if(camera && camera.status)
- camera.toggle_cam(src,0)
+ if(!QDELETED(builtInCamera) && builtInCamera.status)
+ builtInCamera.toggle_cam(src,0)
update_headlamp(1) //So borg lights are disabled when killed.
uneq_all() // particularly to ensure sight modes are cleared
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index c45a32a9be..ef42a85632 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -12,7 +12,7 @@
if(!O)
return 0
O.mouse_opacity = 2
- if(istype(O,/obj/item/borg/sight))
+ if(istype(O, /obj/item/borg/sight))
var/obj/item/borg/sight/S = O
sight_mode &= ~S.sight_mode
update_sight()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index c6960e6d07..520a060e9e 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -42,7 +42,6 @@
var/mob/living/silicon/ai/connected_ai = null
var/obj/item/weapon/stock_parts/cell/cell = null
- var/obj/machinery/camera/camera = null
var/opened = 0
var/emagged = FALSE
@@ -76,7 +75,6 @@
var/lamp_recharging = 0 //Flag for if the lamp is on cooldown after being forcibly disabled.
var/sight_mode = 0
- var/updating = 0 //portable camera camerachunk update
hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD)
var/list/upgrades = list()
@@ -93,6 +91,8 @@
/obj/item/clothing/head/sombrero,
/obj/item/clothing/head/witchunter_hat)
+ var/remote_range = 7 //How far can you interact with machines.
+
can_buckle = TRUE
buckle_lying = FALSE
can_ride_typecache = list(/mob/living/carbon/human)
@@ -125,16 +125,16 @@
lawupdate = FALSE
radio = new /obj/item/device/radio/borg(src)
- if(!scrambledcodes && !camera)
- camera = new /obj/machinery/camera(src)
- camera.c_tag = real_name
- camera.network = list("SS13")
+ if(!scrambledcodes && !builtInCamera)
+ builtInCamera = new (src)
+ builtInCamera.c_tag = real_name
+ builtInCamera.network = list("SS13")
if(wires.is_cut(WIRE_CAMERA))
- camera.status = 0
+ builtInCamera.status = 0
module = new /obj/item/weapon/robot_module(src)
module.rebuild_modules()
update_icons()
- ..()
+ . = ..()
//If this body is meant to be a borg controlled by the AI player
if(shell)
@@ -189,7 +189,6 @@
wires = null
module = null
eye_lights = null
- camera = null
cell = null
return ..()
@@ -236,8 +235,8 @@
real_name = changed_name
name = real_name
- if(camera)
- camera.c_tag = real_name //update the camera name too
+ if(!QDELETED(builtInCamera))
+ builtInCamera.c_tag = real_name //update the camera name too
/mob/living/silicon/robot/proc/get_standard_name()
return "[(designation ? "[designation] " : "")][mmi.braintype]-[ident]"
@@ -656,29 +655,6 @@
add_overlay(head_overlay)
update_fire()
-#define BORG_CAMERA_BUFFER 30
-
-/mob/living/silicon/robot/proc/do_camera_update(oldLoc)
- if(oldLoc != src.loc)
- GLOB.cameranet.updatePortableCamera(src.camera)
- updating = 0
-
-/mob/living/silicon/robot/Move(a, b, flag)
- var/oldLoc = src.loc
- . = ..()
- if(.)
- if(src.camera)
- if(!updating)
- updating = 1
- addtimer(CALLBACK(src, .proc/do_camera_update, oldLoc), BORG_CAMERA_BUFFER)
- if(module)
- if(istype(module, /obj/item/weapon/robot_module/miner))
- if(istype(loc, /turf/open/floor/plating/asteroid))
- for(var/obj/item/I in held_items)
- if(istype(I,/obj/item/weapon/storage/bag/ore))
- loc.attackby(I, src)
-#undef BORG_CAMERA_BUFFER
-
/mob/living/silicon/robot/proc/self_destruct()
if(emagged)
if(mmi)
@@ -697,9 +673,8 @@
canmove = 1
scrambledcodes = 1
//Disconnect it's camera so it's not so easily tracked.
- if(src.camera)
- qdel(src.camera)
- src.camera = null
+ if(!QDELETED(builtInCamera))
+ QDEL_NULL(builtInCamera)
// I'm trying to get the Cyborg to not be listed in the camera list
// Instead of being listed as "deactivated". The downside is that I'm going
// to have to check if every camera is null or not before doing anything, to prevent runtime errors.
@@ -980,8 +955,8 @@
/mob/living/silicon/robot/revive(full_heal = 0, admin_revive = 0)
if(..()) //successfully ressuscitated from death
- if(camera && !wires.is_cut(WIRE_CAMERA))
- camera.toggle_cam(src,0)
+ if(!QDELETED(builtInCamera) && !wires.is_cut(WIRE_CAMERA))
+ builtInCamera.toggle_cam(src,0)
update_headlamp()
if(admin_revive)
locked = TRUE
@@ -992,8 +967,8 @@
..()
if(oldname != real_name)
notify_ai(RENAME, oldname, newname)
- if(camera)
- camera.c_tag = real_name
+ if(!QDELETED(builtInCamera))
+ builtInCamera.c_tag = real_name
custom_name = newname
@@ -1057,8 +1032,8 @@
name = "[designation] AI Shell [rand(100,999)]"
real_name = name
GLOB.available_ai_shells |= src
- if(camera)
- camera.c_tag = real_name //update the camera name too
+ if(!QDELETED(builtInCamera))
+ builtInCamera.c_tag = real_name //update the camera name too
diag_hud_set_aishell()
notify_ai(AI_SHELL)
@@ -1073,15 +1048,15 @@
GLOB.available_ai_shells -= src
name = "Unformatted Cyborg [rand(100,999)]"
real_name = name
- if(camera)
- camera.c_tag = real_name
+ if(!QDELETED(builtInCamera))
+ builtInCamera.c_tag = real_name
diag_hud_set_aishell()
/mob/living/silicon/robot/proc/deploy_init(var/mob/living/silicon/ai/AI)
- real_name = "[AI.real_name] shell [rand(100, 999)] - [designation]" //Randomizing the name so it shows up seperately in the shells list
+ real_name = "[AI.real_name] shell [rand(100, 999)] - [designation]" //Randomizing the name so it shows up separately in the shells list
name = real_name
- if(camera)
- camera.c_tag = real_name //update the camera name too
+ if(!QDELETED(builtInCamera))
+ builtInCamera.c_tag = real_name //update the camera name too
mainframe = AI
deployed = TRUE
connected_ai = mainframe
@@ -1102,6 +1077,7 @@
/datum/action/innate/undeployment
name = "Disconnect from shell"
desc = "Stop controlling your shell and resume normal core operations."
+ icon_icon = 'icons/mob/actions/actions_AI.dmi'
button_icon_state = "ai_core"
/datum/action/innate/undeployment/Trigger()
@@ -1125,8 +1101,8 @@
undeployment_action.Remove(src)
if(radio) //Return radio to normal
radio.recalculateChannels()
- if(camera)
- camera.c_tag = real_name //update the camera name too
+ if(!QDELETED(builtInCamera))
+ builtInCamera.c_tag = real_name //update the camera name too
diag_hud_set_aishell()
mainframe.diag_hud_set_deployed()
if(mainframe.laws)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 81dd60e3e0..fd7d209604 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -4,6 +4,8 @@
icon_state = "std_module"
w_class = WEIGHT_CLASS_GIGANTIC
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags = CONDUCT
var/list/basic_modules = list() //a list of paths, converted to a list of instances on New()
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 6446debb80..4d3c468191 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -36,9 +36,11 @@
var/d_hud = DATA_HUD_DIAGNOSTIC //There is only one kind of diag hud
var/law_change_counter = 0
+ var/obj/machinery/camera/builtInCamera = null
+ var/updating = FALSE //portable camera camerachunk update
/mob/living/silicon/Initialize()
- ..()
+ . = ..()
GLOB.silicon_mobs += src
var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC]
diag_hud.add_to_hud(src)
@@ -54,6 +56,7 @@
/mob/living/silicon/Destroy()
radio = null
aicamera = null
+ QDEL_NULL(builtInCamera)
GLOB.silicon_mobs -= src
return ..()
diff --git a/code/modules/mob/living/silicon/silicon_movement.dm b/code/modules/mob/living/silicon/silicon_movement.dm
new file mode 100644
index 0000000000..c7267acf76
--- /dev/null
+++ b/code/modules/mob/living/silicon/silicon_movement.dm
@@ -0,0 +1,20 @@
+/mob/living/silicon/Moved(oldLoc, dir)
+ . = ..()
+ update_camera_location(oldLoc)
+
+/mob/living/silicon/forceMove(atom/destination)
+ . = ..()
+ update_camera_location(destination)
+
+/mob/living/silicon/proc/do_camera_update(oldLoc)
+ if(!QDELETED(builtInCamera) && oldLoc != get_turf(src))
+ GLOB.cameranet.updatePortableCamera(builtInCamera)
+ updating = FALSE
+
+#define SILICON_CAMERA_BUFFER 10
+/mob/living/silicon/proc/update_camera_location(oldLoc)
+ oldLoc = get_turf(oldLoc)
+ if(!QDELETED(builtInCamera) && !updating && oldLoc != get_turf(src))
+ updating = TRUE
+ addtimer(CALLBACK(src, .proc/do_camera_update, oldLoc), SILICON_CAMERA_BUFFER)
+#undef SILICON_CAMERA_BUFFER
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 4cc0ab3a62..59cb793b27 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -116,7 +116,7 @@
update_icon()
/mob/living/simple_animal/bot/Initialize()
- ..()
+ . = ..()
access_card = new /obj/item/weapon/card/id(src)
//This access is so bots can be immediately set to patrol and leave Robotics, instead of having to be let out first.
access_card.access += ACCESS_ROBOTICS
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 2957879162..3835394969 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -299,13 +299,13 @@
return
var/obj/item/weapon/firstaid_arm_assembly/A = new /obj/item/weapon/firstaid_arm_assembly
- if(istype(src,/obj/item/weapon/storage/firstaid/fire))
+ if(istype(src, /obj/item/weapon/storage/firstaid/fire))
A.skin = "ointment"
- else if(istype(src,/obj/item/weapon/storage/firstaid/toxin))
+ else if(istype(src, /obj/item/weapon/storage/firstaid/toxin))
A.skin = "tox"
- else if(istype(src,/obj/item/weapon/storage/firstaid/o2))
+ else if(istype(src, /obj/item/weapon/storage/firstaid/o2))
A.skin = "o2"
- else if(istype(src,/obj/item/weapon/storage/firstaid/brute))
+ else if(istype(src, /obj/item/weapon/storage/firstaid/brute))
A.skin = "brute"
qdel(S)
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index b31c5a90ed..bc35799270 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -201,7 +201,7 @@ Auto Patrol[]"},
set_weapon()
/mob/living/simple_animal/bot/ed209/bullet_act(obj/item/projectile/Proj)
- if(istype(Proj ,/obj/item/projectile/beam/laser)||istype(Proj,/obj/item/projectile/bullet))
+ if(istype(Proj , /obj/item/projectile/beam/laser)||istype(Proj, /obj/item/projectile/bullet))
if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
if(!Proj.nodamage && Proj.damage < src.health)
retaliate(Proj.firer)
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index fdb33ff7b8..67f3ed7e38 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -373,7 +373,8 @@
return 1
if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus))
- for(var/datum/disease/D in C.viruses)
+ for(var/thing in C.viruses)
+ var/datum/disease/D = thing
//the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines.
if(!(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) \
&& D.severity != NONTHREAT \
@@ -424,7 +425,8 @@
else
if(treat_virus)
var/virus = 0
- for(var/datum/disease/D in C.viruses)
+ for(var/thing in C.viruses)
+ var/datum/disease/D = thing
//detectable virus
if((!(D.visibility_flags & HIDDEN_SCANNER)) || (!(D.visibility_flags & HIDDEN_PANDEMIC)))
if(D.severity != NONTHREAT) //virus is harmful
@@ -459,6 +461,8 @@
break
if(!reagent_id) //If they don't need any of that they're probably cured!
+ if(C.maxHealth - C.health < heal_threshold)
+ to_chat(src, "[C] is healthy! Your programming prevents you from injecting anyone without at least [heal_threshold] damage of any one type ([heal_threshold + 15] for oxygen damage.)")
var/list/messagevoice = list("All patched up!" = 'sound/voice/mpatchedup.ogg',"An apple a day keeps me away." = 'sound/voice/mapple.ogg',"Feel better soon!" = 'sound/voice/mfeelbetter.ogg')
var/message = pick(messagevoice)
speak(message)
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 79a58917a4..e8936a2863 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -83,7 +83,7 @@
..()
if(open)
on = FALSE
- else if(istype(I,/obj/item/weapon/stock_parts/cell) && open && !cell)
+ else if(istype(I, /obj/item/weapon/stock_parts/cell) && open && !cell)
if(!user.drop_item())
return
var/obj/item/weapon/stock_parts/cell/C = I
@@ -343,7 +343,7 @@
return
var/obj/structure/closet/crate/CRATE
- if(istype(AM,/obj/structure/closet/crate))
+ if(istype(AM, /obj/structure/closet/crate))
CRATE = AM
else
if(!wires.is_cut(WIRE_LOADCHECK))
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 739f72b9e5..bb69af7301 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -44,7 +44,7 @@
desc = "It's Officer Beep O'sky's smaller, just-as aggressive cousin, Pipsqueak."
/mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize()
- ..()
+ . = ..()
resize = 0.8
update_transform()
@@ -63,7 +63,7 @@
radio_channel = "AI Private"
/mob/living/simple_animal/bot/secbot/Initialize()
- ..()
+ . = ..()
icon_state = "secbot[on]"
spawn(3)
var/datum/job/detective/J = new/datum/job/detective
@@ -191,7 +191,7 @@ Auto Patrol: []"},
icon_state = "secbot[on]"
/mob/living/simple_animal/bot/secbot/bullet_act(obj/item/projectile/Proj)
- if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
+ if(istype(Proj , /obj/item/projectile/beam)||istype(Proj, /obj/item/projectile/bullet))
if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
if(!Proj.nodamage && Proj.damage < src.health)
retaliate(Proj.firer)
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index fd31f7537c..74f855bf8c 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -383,6 +383,7 @@
/datum/action/innate/seek_prey
name = "Seek the Harvest"
desc = "None can hide from Nar'Sie, activate to track a survivor attempting to flee the red harvest!"
+ icon_icon = 'icons/mob/actions/actions_cult.dmi'
background_icon_state = "bg_demon"
buttontooltipstyle = "cult"
button_icon_state = "cult_mark"
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index 45fb411876..2b897bfbcb 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -2,7 +2,7 @@
//If someone can do this in a neater way, be my guest-Kor
-//This has to be seperate from the Away Mission corpses, because New() doesn't work for those, and initialize() doesn't work for these.
+//This has to be separate from the Away Mission corpses, because New() doesn't work for those, and initialize() doesn't work for these.
//To do: Allow corpses to appear mangled, bloody, etc. Allow customizing the bodies appearance (they're all bald and white right now).
diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
index 0c153d37e2..07222ade05 100644
--- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm
+++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
@@ -25,6 +25,6 @@
verb_yell = "flutters intensely"
/mob/living/simple_animal/butterfly/Initialize()
- ..()
+ . = ..()
var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255))
- add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
\ No newline at end of file
+ add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
index 2ab1adee23..b49534808a 100644
--- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
@@ -42,7 +42,7 @@
else
visible_message("[src] avoids getting crushed.")
else
- if(istype(AM,/obj/structure))
+ if(istype(AM, /obj/structure))
if(prob(squish_chance))
AM.visible_message("[src] was crushed under [AM].")
adjustBruteLoss(1)
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 0c80c24b15..f80defb32d 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -53,7 +53,7 @@
break
/mob/living/simple_animal/pet/dog/corgi/Initialize()
- ..()
+ . = ..()
regenerate_icons()
@@ -178,13 +178,13 @@
to_chat(usr, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!")
return
- if(istype(item_to_add,/obj/item/weapon/grenade/plastic)) // last thing he ever wears, I guess
+ if(istype(item_to_add, /obj/item/weapon/grenade/plastic)) // last thing he ever wears, I guess
item_to_add.afterattack(src,usr,1)
return
//The objects that corgis can wear on their backs.
var/allowed = FALSE
- if(ispath(item_to_add.dog_fashion,/datum/dog_fashion/back))
+ if(ispath(item_to_add.dog_fashion, /datum/dog_fashion/back))
allowed = TRUE
if(!allowed)
@@ -214,7 +214,7 @@
/mob/living/simple_animal/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/user)
- if(istype(item_to_add,/obj/item/weapon/grenade/plastic)) // last thing he ever wears, I guess
+ if(istype(item_to_add, /obj/item/weapon/grenade/plastic)) // last thing he ever wears, I guess
item_to_add.afterattack(src,user,1)
return
@@ -296,7 +296,7 @@
var/saved_head //path
/mob/living/simple_animal/pet/dog/corgi/Ian/Initialize()
- ..()
+ . = ..()
//parent call must happen first to ensure IAN
//is not in nullspace when child puppies spawn
Read_Memory()
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
index aaad3176e2..b827950d79 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
@@ -196,5 +196,6 @@
/datum/action/generic/drone/select_filter
name = "Select Vision Filter"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "drone_vision"
procname = /mob/living/simple_animal/drone/verb/toggle_statics
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm
index 3741d8cf58..c4e11cc2bd 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm
@@ -22,7 +22,7 @@
devourable = TRUE
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
- var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly,/mob/living/simple_animal/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption.
+ var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption.
/mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target?
if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 48c6484c87..0a36d62dac 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -602,7 +602,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
/obj/item/weapon/guardiancreator/tech/choose/dextrous
possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
-/obj/item/weapon/paper/guardian
+/obj/item/weapon/paper/guides/antag/guardian
name = "Holoparasite Guide"
icon_state = "alienpaper_words"
info = {"A list of Holoparasite Types
@@ -626,10 +626,10 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
"}
-/obj/item/weapon/paper/guardian/update_icon()
+/obj/item/weapon/paper/guides/antag/guardian/update_icon()
return
-/obj/item/weapon/paper/guardian/wizard
+/obj/item/weapon/paper/guides/antag/guardian/wizard
name = "Guardian Guide"
info = {"A list of Guardian Types
@@ -661,7 +661,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
/obj/item/weapon/storage/box/syndie_kit/guardian/Initialize()
..()
new /obj/item/weapon/guardiancreator/tech/choose/traitor(src)
- new /obj/item/weapon/paper/guardian(src)
+ new /obj/item/weapon/paper/guides/antag/guardian(src)
return
/obj/item/weapon/guardiancreator/carp
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 6e60f6b958..d70055779c 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -249,7 +249,7 @@
/obj/item/queen_bee/attackby(obj/item/I, mob/user, params)
- if(istype(I,/obj/item/weapon/reagent_containers/syringe))
+ if(istype(I, /obj/item/weapon/reagent_containers/syringe))
var/obj/item/weapon/reagent_containers/syringe/S = I
if(S.reagents.has_reagent("royal_bee_jelly")) //checked twice, because I really don't want royal bee jelly to be duped
if(S.reagents.has_reagent("royal_bee_jelly",5))
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
index 280ccd6c26..2fa2101aa2 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
@@ -27,6 +27,7 @@
//Lets the wizard summon his art to fight for him
/datum/action/boss/wizard_summon_minions
name = "Summon Minions"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "art_summon"
usage_probability = 40
boss_cost = 30
@@ -54,6 +55,7 @@
//Hitting the wizard himself destroys all decoys
/datum/action/boss/wizard_mimic
name = "Craft Mimicry"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "mimic_summon"
usage_probability = 30
boss_cost = 40
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index cf4f027065..ebc3e79a61 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -155,7 +155,7 @@
if(!busy && prob(30)) //30% chance to stop wandering and do something
//first, check for potential food nearby to cocoon
for(var/mob/living/C in can_see)
- if(C.stat && !istype(C,/mob/living/simple_animal/hostile/poison/giant_spider) && !C.anchored)
+ if(C.stat && !istype(C, /mob/living/simple_animal/hostile/poison/giant_spider) && !C.anchored)
cocoon_target = C
busy = MOVING_TO_TARGET
Goto(C, move_to_delay)
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
index 62279262ba..06f2a56a0e 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
@@ -29,7 +29,7 @@
loot = list(/obj/effect/decal/cleanable/robot_debris)
/mob/living/simple_animal/hostile/hivebot/Initialize()
- ..()
+ . = ..()
deathmessage = "[src] blows apart!"
/mob/living/simple_animal/hostile/hivebot/range
@@ -63,4 +63,4 @@
/mob/living/simple_animal/hostile/hivebot/death(gibbed)
do_sparks(3, TRUE, src)
- ..(1)
\ No newline at end of file
+ ..(1)
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm
index 2e39ab9b82..169a95f157 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm
@@ -585,3 +585,249 @@
#undef MOOK_ATTACK_ACTIVE
#undef MOOK_ATTACK_RECOVERY
#undef ATTACK_INTERMISSION_TIME
+
+////Jungle Seedling////
+
+#define SEEDLING_STATE_NEUTRAL 0
+#define SEEDLING_STATE_WARMUP 1
+#define SEEDLING_STATE_ACTIVE 2
+#define SEEDLING_STATE_RECOVERY 3
+
+
+/mob/living/simple_animal/hostile/jungle/seedling
+ name = "seedling"
+ desc = "This oversized, predatory flower conceals what can only be described as an organic energy cannon, and it will not die until its hidden vital organs are sliced out. \
+ The concentrated streams of energy it sometimes produces require its full attention, attacking it during this time will prevent it from finishing its attack."
+ maxHealth = 100
+ health = 100
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ icon = 'icons/mob/jungle/arachnid.dmi'
+ icon_state = "seedling"
+ icon_living = "seedling"
+ icon_dead = "seedling_dead"
+ pixel_x = -16
+ pixel_y = -14
+ minimum_distance = 3
+ move_to_delay = 20
+ vision_range = 9
+ aggro_vision_range = 15
+ ranged = TRUE
+ ranged_cooldown_time = 10
+ projectiletype = /obj/item/projectile/seedling
+ projectilesound = 'sound/weapons/pierce.ogg'
+ robust_searching = TRUE
+ stat_attack = UNCONSCIOUS
+ anchored = TRUE
+ var/combatant_state = SEEDLING_STATE_NEUTRAL
+ var/obj/seedling_weakpoint/weak_point
+ var/mob/living/beam_debuff_target
+ var/solar_beam_identifier = 0
+
+/obj/item/projectile/seedling
+ name = "solar energy"
+ icon_state = "seedling"
+ damage = 10
+ damage_type = BURN
+ light_range = 2
+ flag = "energy"
+ light_color = LIGHT_COLOR_YELLOW
+ hitsound = 'sound/weapons/sear.ogg'
+ hitsound_wall = 'sound/weapons/effects/searwall.ogg'
+ nondirectional_sprite = TRUE
+
+/obj/item/projectile/seedling/Collide(atom/A)//Stops seedlings from destroying other jungle mobs through FF
+ if(isliving(A))
+ var/mob/living/L = A
+ if("jungle" in L.faction)
+ return FALSE
+ return ..()
+
+/obj/effect/temp_visual/solarbeam_killsat
+ name = "beam of solar energy"
+ icon_state = "solar_beam"
+ icon = 'icons/effects/beam.dmi'
+ layer = LIGHTING_LAYER
+ duration = 5
+ randomdir = FALSE
+
+/datum/status_effect/seedling_beam_indicator
+ id = "seedling beam indicator"
+ duration = 30
+ status_type = STATUS_EFFECT_MULTIPLE
+ alert_type = null
+ tick_interval = 1
+ var/obj/screen/seedling/seedling_screen_object
+ var/atom/target
+
+
+/datum/status_effect/seedling_beam_indicator/on_creation(mob/living/new_owner, target_plant)
+ . = ..()
+ if(.)
+ target = target_plant
+ tick()
+
+/datum/status_effect/seedling_beam_indicator/on_apply()
+ if(owner.client)
+ seedling_screen_object = new /obj/screen/seedling()
+ owner.client.screen += seedling_screen_object
+ tick()
+ return ..()
+
+/datum/status_effect/seedling_beam_indicator/Destroy()
+ if(owner)
+ if(owner.client)
+ owner.client.screen -= seedling_screen_object
+ return ..()
+
+/datum/status_effect/seedling_beam_indicator/tick()
+ var/target_angle = Get_Angle(owner, target)
+ var/matrix/final = matrix()
+ final.Turn(target_angle)
+ seedling_screen_object.transform = final
+
+/obj/screen/seedling
+ icon = 'icons/mob/jungle/arachnid.dmi'
+ icon_state = "seedling_beam_indicator"
+ screen_loc = "CENTER:-16,CENTER:-16"
+
+/mob/living/simple_animal/hostile/jungle/seedling/Goto()
+ if(combatant_state != SEEDLING_STATE_NEUTRAL)
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/seedling/AttackingTarget()
+ if(isliving(target))
+ if(ranged_cooldown <= world.time && combatant_state == SEEDLING_STATE_NEUTRAL)
+ OpenFire(target)
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/seedling/OpenFire()
+ WarmupAttack()
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/WarmupAttack()
+ if(combatant_state == SEEDLING_STATE_NEUTRAL)
+ combatant_state = SEEDLING_STATE_WARMUP
+ walk(src,0)
+ update_icons()
+ var/target_dist = get_dist(src,target)
+ var/living_target_check = isliving(target)
+ if(living_target_check)
+ if(target_dist > 7)//Offscreen check
+ SolarBeamStartup(target)
+ return
+ if(get_dist(src,target) >= 4 && prob(40))
+ SolarBeamStartup(target)
+ return
+ addtimer(CALLBACK(src, .proc/Volley), 5)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/SolarBeamStartup(mob/living/living_target)//It's more like requiem than final spark
+ if(combatant_state == SEEDLING_STATE_WARMUP && target)
+ combatant_state = SEEDLING_STATE_ACTIVE
+ living_target.apply_status_effect(/datum/status_effect/seedling_beam_indicator, src)
+ beam_debuff_target = living_target
+ playsound(src,'sound/effects/seedling_chargeup.ogg', 100, 0)
+ if(get_dist(src,living_target) > 7)
+ playsound(living_target,'sound/effects/seedling_chargeup.ogg', 100, 0)
+ solar_beam_identifier = world.time
+ addtimer(CALLBACK(src, .proc/Beamu, living_target, solar_beam_identifier), 35)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/Beamu(mob/living/living_target, beam_id = 0)
+ if(combatant_state == SEEDLING_STATE_ACTIVE && living_target && beam_id == solar_beam_identifier)
+ if(living_target.z == z)
+ update_icons()
+ var/obj/effect/temp_visual/solarbeam_killsat/S = new (get_turf(src))
+ var/matrix/starting = matrix()
+ starting.Scale(1,32)
+ starting.Translate(0,520)
+ S.transform = starting
+ var/obj/effect/temp_visual/solarbeam_killsat/K = new (get_turf(living_target))
+ var/matrix/final = matrix()
+ final.Scale(1,32)
+ final.Translate(0,512)
+ K.transform = final
+ living_target.adjustFireLoss(30)
+ living_target.adjust_fire_stacks(0.2)//Just here for the showmanship
+ living_target.IgniteMob()
+ playsound(living_target,'sound/weapons/sear.ogg', 50, 1)
+ addtimer(CALLBACK(src, .proc/AttackRecovery), 5)
+ return
+ AttackRecovery()
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/Volley()
+ if(combatant_state == SEEDLING_STATE_WARMUP && target)
+ combatant_state = SEEDLING_STATE_ACTIVE
+ update_icons()
+ var/datum/callback/cb = CALLBACK(src, .proc/InaccurateShot)
+ for(var/i in 1 to 13)
+ addtimer(cb, i)
+ addtimer(CALLBACK(src, .proc/AttackRecovery), 14)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/InaccurateShot()
+ if(!QDELETED(target) && combatant_state == SEEDLING_STATE_ACTIVE && !stat)
+ if(get_dist(src,target) <= 3)//If they're close enough just aim straight at them so we don't miss at point blank ranges
+ Shoot(target)
+ return
+ var/turf/our_turf = get_turf(src)
+ var/obj/item/projectile/seedling/readied_shot = new /obj/item/projectile/seedling(our_turf)
+ readied_shot.current = our_turf
+ readied_shot.starting = our_turf
+ readied_shot.firer = src
+ readied_shot.original = target
+ readied_shot.yo = target.y - our_turf.y + rand(-1,1)
+ readied_shot.xo = target.x - our_turf.x + rand(-1,1)
+ readied_shot.fire()
+ playsound(src, projectilesound, 100, 1)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/AttackRecovery()
+ if(combatant_state == SEEDLING_STATE_ACTIVE)
+ combatant_state = SEEDLING_STATE_RECOVERY
+ update_icons()
+ ranged_cooldown = world.time + ranged_cooldown_time
+ if(target)
+ face_atom(target)
+ addtimer(CALLBACK(src, .proc/ResetNeutral), 10)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/ResetNeutral()
+ combatant_state = SEEDLING_STATE_NEUTRAL
+ if(target && !stat)
+ update_icons()
+ Goto(target, move_to_delay, minimum_distance)
+
+/mob/living/simple_animal/hostile/jungle/seedling/adjustHealth()
+ . = ..()
+ if(combatant_state == SEEDLING_STATE_ACTIVE && beam_debuff_target)
+ beam_debuff_target.remove_status_effect(/datum/status_effect/seedling_beam_indicator)
+ beam_debuff_target = null
+ solar_beam_identifier = 0
+ AttackRecovery()
+
+/mob/living/simple_animal/hostile/jungle/seedling/update_icons()
+ . = ..()
+ if(!stat)
+ switch(combatant_state)
+ if(SEEDLING_STATE_NEUTRAL)
+ icon_state = "seedling"
+ if(SEEDLING_STATE_WARMUP)
+ icon_state = "seedling_charging"
+ if(SEEDLING_STATE_ACTIVE)
+ icon_state = "seedling_fire"
+ if(SEEDLING_STATE_RECOVERY)
+ icon_state = "seedling"
+
+/mob/living/simple_animal/hostile/jungle/seedling/GiveTarget()
+ if(target)
+ if(combatant_state == SEEDLING_STATE_WARMUP || combatant_state == SEEDLING_STATE_ACTIVE)//So it doesn't 180 and blast you in the face while it's firing at someone else
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/seedling/LoseTarget()
+ if(combatant_state == SEEDLING_STATE_WARMUP || combatant_state == SEEDLING_STATE_ACTIVE)
+ return
+ return ..()
+
+#undef SEEDLING_STATE_NEUTRAL
+#undef SEEDLING_STATE_WARMUP
+#undef SEEDLING_STATE_ACTIVE
+#undef SEEDLING_STATE_RECOVERY
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index b5d88fe450..6cebdd9500 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -78,7 +78,7 @@ Difficulty: Very Hard
double_spiral()
else
visible_message("\"Judgement.\"")
- INVOKE_ASYNC(src, .proc/spiral_shoot, rand(0, 1))
+ INVOKE_ASYNC(src, .proc/spiral_shoot, pick(TRUE, FALSE))
else if(prob(20))
ranged_cooldown = world.time + 30
@@ -142,46 +142,11 @@ Difficulty: Very Hard
sleep(10)
INVOKE_ASYNC(src, .proc/spiral_shoot)
- INVOKE_ASYNC(src, .proc/spiral_shoot, 1)
+ INVOKE_ASYNC(src, .proc/spiral_shoot, TRUE)
-/mob/living/simple_animal/hostile/megafauna/colossus/proc/spiral_shoot(negative = 0, counter_start = 1)
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/spiral_shoot(negative = FALSE, counter_start = 8)
var/counter = counter_start
- var/turf/marker
for(var/i in 1 to 80)
- switch(counter)
- if(1)
- marker = locate(x, y - 2, z)
- if(2)
- marker = locate(x - 1, y - 2, z)
- if(3)
- marker = locate(x - 2, y - 2, z)
- if(4)
- marker = locate(x - 2, y - 1, z)
- if(5)
- marker = locate(x - 2, y, z)
- if(6)
- marker = locate(x - 2, y + 1, z)
- if(7)
- marker = locate(x - 2, y + 2, z)
- if(8)
- marker = locate(x - 1, y + 2, z)
- if(9)
- marker = locate(x, y + 2, z)
- if(10)
- marker = locate(x + 1, y + 2, z)
- if(11)
- marker = locate(x + 2, y + 2, z)
- if(12)
- marker = locate(x + 2, y + 1, z)
- if(13)
- marker = locate(x + 2, y, z)
- if(14)
- marker = locate(x + 2, y - 1, z)
- if(15)
- marker = locate(x + 2, y - 2, z)
- if(16)
- marker = locate(x + 1, y - 2, z)
-
if(negative)
counter--
else
@@ -190,25 +155,25 @@ Difficulty: Very Hard
counter = 1
if(counter < 1)
counter = 16
- shoot_projectile(marker)
+ shoot_projectile(null, counter * 22.5)
playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, 1)
sleep(1)
-/mob/living/simple_animal/hostile/megafauna/colossus/proc/shoot_projectile(turf/marker)
- if(!marker || marker == loc)
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/shoot_projectile(turf/marker, set_angle)
+ if(!isnum(set_angle) && (!marker || marker == loc))
return
var/turf/startloc = get_turf(src)
var/obj/item/projectile/P = new /obj/item/projectile/colossus(startloc)
P.current = startloc
P.starting = startloc
P.firer = src
- P.yo = marker.y - startloc.y
- P.xo = marker.x - startloc.x
+ if(marker)
+ P.yo = marker.y - startloc.y
+ P.xo = marker.x - startloc.x
+ P.original = marker
if(target)
P.original = target
- else
- P.original = marker
- P.fire()
+ P.fire(set_angle)
/mob/living/simple_animal/hostile/megafauna/colossus/proc/random_shots()
var/turf/U = get_turf(src)
@@ -217,17 +182,21 @@ Difficulty: Very Hard
if(prob(5))
shoot_projectile(T)
-/mob/living/simple_animal/hostile/megafauna/colossus/proc/blast()
- playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 200, 1, 2)
- var/turf/T = get_turf(target)
- newtonian_move(get_dir(T, targets_from))
- for(var/turf/turf in range(1, T))
- shoot_projectile(turf)
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/blast(set_angle)
+ var/turf/target_turf = get_turf(target)
+ playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 200, 1, 2)
+ newtonian_move(get_dir(target_turf, src))
+ var/angle_to_target = Get_Angle(src, target_turf)
+ if(isnum(set_angle))
+ angle_to_target = set_angle
+ var/static/list/colossus_shotgun_shot_angles = list(12.5, 7.5, 2.5, -2.5, -7.5, -12.5)
+ for(var/i in colossus_shotgun_shot_angles)
+ shoot_projectile(null, angle_to_target + i)
/mob/living/simple_animal/hostile/megafauna/colossus/proc/dir_shots(list/dirs)
if(!islist(dirs))
dirs = GLOB.alldirs.Copy()
- playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 200, 1, 2)
+ playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 200, 1, 2)
for(var/d in dirs)
var/turf/E = get_step(src, d)
shoot_projectile(E)
@@ -235,9 +204,9 @@ Difficulty: Very Hard
/mob/living/simple_animal/hostile/megafauna/colossus/proc/telegraph()
for(var/mob/M in range(10,src))
if(M.client)
- flash_color(M.client, rgb(200, 0, 0), 1)
+ flash_color(M.client, "#C80000", 1)
shake_camera(M, 4, 3)
- playsound(get_turf(src),'sound/magic/clockwork/narsie_attack.ogg', 200, 1)
+ playsound(src, 'sound/magic/clockwork/narsie_attack.ogg', 200, 1)
@@ -785,6 +754,7 @@ Difficulty: Very Hard
range = -1
include_user = 1
selection_type = "view"
+ action_icon = 'icons/mob/actions/actions_spells.dmi'
action_icon_state = "exit_possession"
sound = null
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
index 43c9197edc..f9a6575d1e 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -293,7 +293,7 @@ Difficulty: Medium
animate(src, pixel_z = 0, time = duration)
/obj/effect/temp_visual/target
- icon = 'icons/mob/actions.dmi'
+ icon = 'icons/mob/actions/actions_items.dmi'
icon_state = "sniper_zoom"
layer = BELOW_MOB_LAYER
light_range = 2
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index cce64df983..7f38bebcfb 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -260,9 +260,9 @@
if(prob(20))
suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer = 18, /obj/item/clothing/suit/hooded/cloak/goliath = 2))
if(prob(30))
- r_pocket = pickweight(list(/obj/item/stack/marker_beacon = 20, /obj/item/stack/spacecash/c1000 = 7,/obj/item/weapon/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/damage = 1 ))
+ r_pocket = pickweight(list(/obj/item/stack/marker_beacon = 20, /obj/item/stack/spacecash/c1000 = 7, /obj/item/weapon/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/damage = 1 ))
if(prob(10))
- l_pocket = pickweight(list(/obj/item/stack/spacecash/c1000 = 7,/obj/item/weapon/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/cooldown = 1 ))
+ l_pocket = pickweight(list(/obj/item/stack/spacecash/c1000 = 7, /obj/item/weapon/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/cooldown = 1 ))
if("Ashwalker")
mob_species = /datum/species/lizard/ashwalker
uniform = /obj/item/clothing/under/gladiator/ash_walker
@@ -273,7 +273,7 @@
suit = /obj/item/clothing/suit/armor/bone
gloves = /obj/item/clothing/gloves/bracer
if(prob(5))
- back = pickweight(list(/obj/item/weapon/twohanded/bonespear = 3,/obj/item/weapon/twohanded/fireaxe/boneaxe = 2))
+ back = pickweight(list(/obj/item/weapon/twohanded/bonespear = 3, /obj/item/weapon/twohanded/fireaxe/boneaxe = 2))
if(prob(10))
belt = /obj/item/weapon/storage/belt/mining/primitive
if(prob(30))
@@ -286,7 +286,7 @@
belt = null
backpack_contents = list()
if(prob(70))
- backpack_contents += pick(list(/obj/item/weapon/stamp/clown = 1, /obj/item/weapon/reagent_containers/spray/waterflower = 1,/obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1, /obj/item/device/megaphone/clown = 1,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter = 1,/obj/item/weapon/pneumatic_cannon/pie = 1))
+ backpack_contents += pick(list(/obj/item/weapon/stamp/clown = 1, /obj/item/weapon/reagent_containers/spray/waterflower = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1, /obj/item/device/megaphone/clown = 1, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter = 1, /obj/item/weapon/pneumatic_cannon/pie = 1))
if(prob(30))
backpack_contents += list(/obj/item/stack/sheet/mineral/bananium = pickweight(list( 1 = 3, 2 = 2, 3 = 1)))
if(prob(10))
@@ -296,9 +296,9 @@
if("Golem")
mob_species = pick(list(/datum/species/golem/adamantine, /datum/species/golem/plasma, /datum/species/golem/diamond, /datum/species/golem/gold, /datum/species/golem/silver, /datum/species/golem/plasteel, /datum/species/golem/titanium, /datum/species/golem/plastitanium))
if(prob(30))
- glasses = pickweight(list(/obj/item/clothing/glasses/meson = 2, /obj/item/clothing/glasses/hud/health = 2,/obj/item/clothing/glasses/hud/diagnostic =2, /obj/item/clothing/glasses/science = 2, /obj/item/clothing/glasses/welding = 2, /obj/item/clothing/glasses/night = 1))
+ glasses = pickweight(list(/obj/item/clothing/glasses/meson = 2, /obj/item/clothing/glasses/hud/health = 2, /obj/item/clothing/glasses/hud/diagnostic =2, /obj/item/clothing/glasses/science = 2, /obj/item/clothing/glasses/welding = 2, /obj/item/clothing/glasses/night = 1))
if(prob(10))
- belt = pick(list(/obj/item/weapon/storage/belt/mining/vendor,/obj/item/weapon/storage/belt/utility/full))
+ belt = pick(list(/obj/item/weapon/storage/belt/mining/vendor, /obj/item/weapon/storage/belt/utility/full))
if(prob(50))
neck = /obj/item/weapon/bedsheet/rd/royal_cape
if(prob(10))
diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm
index 15dfd7ad9d..5a9d3a2928 100644
--- a/code/modules/mob/living/simple_animal/hostile/stickman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm
@@ -51,7 +51,7 @@
icon_dead = "stickdog_dead"
/mob/living/simple_animal/hostile/stickman/Initialize(mapload, var/wizard_summoned)
- ..()
+ . = ..()
new /obj/effect/temp_visual/paper_scatter(src)
summoned_by_wizard = wizard_summoned
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index ce2967319a..86bbcfdc45 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -101,7 +101,7 @@
/mob/living/simple_animal/parrot/Initialize()
- ..()
+ . = ..()
if(!ears)
var/headset = pick(/obj/item/device/radio/headset/headset_sec, \
/obj/item/device/radio/headset/headset_eng, \
@@ -323,7 +323,7 @@
//Mobs with objects
/mob/living/simple_animal/parrot/attackby(obj/item/O, mob/living/user, params)
- if(!stat && !client && !istype(O, /obj/item/stack/medical) && !istype(O,/obj/item/weapon/reagent_containers/food/snacks/cracker))
+ if(!stat && !client && !istype(O, /obj/item/stack/medical) && !istype(O, /obj/item/weapon/reagent_containers/food/snacks/cracker))
if(O.force)
if(parrot_state == PARROT_PERCH)
parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched
@@ -336,7 +336,7 @@
parrot_state |= PARROT_FLEE
icon_state = "parrot_fly"
drop_held_item(0)
- else if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/cracker)) //Poly wants a cracker.
+ else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/cracker)) //Poly wants a cracker.
qdel(O)
user.drop_item()
if(health < maxHealth)
@@ -764,7 +764,7 @@
//parrots will eat crackers instead of dropping them
- if(istype(held_item,/obj/item/weapon/reagent_containers/food/snacks/cracker) && (drop_gently))
+ if(istype(held_item, /obj/item/weapon/reagent_containers/food/snacks/cracker) && (drop_gently))
qdel(held_item)
held_item = null
if(health < maxHealth)
diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm
index aab8e907c0..75219e4b2a 100644
--- a/code/modules/mob/living/simple_animal/slime/death.dm
+++ b/code/modules/mob/living/simple_animal/slime/death.dm
@@ -26,7 +26,7 @@
update_canmove()
- if(SSticker && SSticker.mode)
+ if(SSticker.mode)
SSticker.mode.check_win()
return ..(gibbed)
diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm
index dab6b717a4..2b817a7f96 100644
--- a/code/modules/mob/living/simple_animal/slime/powers.dm
+++ b/code/modules/mob/living/simple_animal/slime/powers.dm
@@ -7,6 +7,7 @@
/datum/action/innate/slime
check_flags = AB_CHECK_CONSCIOUS
+ icon_icon = 'icons/mob/actions/actions_slime.dmi'
background_icon_state = "bg_alien"
var/needs_growth = NO_GROWTH_NEEDED
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 18a5337c99..236b36dafd 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -311,7 +311,7 @@
for(var/datum/surgery/S in surgeries)
if(S.next_step(user))
return 1
- if(istype(W,/obj/item/stack/sheet/mineral/plasma) && !stat) //Let's you feed slimes plasma.
+ if(istype(W, /obj/item/stack/sheet/mineral/plasma) && !stat) //Let's you feed slimes plasma.
if (user in Friends)
++Friends[user]
else
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index 8e732940a1..bed14bdff4 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -39,7 +39,7 @@
if(client)
client.click_intercept = null
- client.view = world.view // Resets the client.view in case it was changed.
+ client.change_view(world.view) // Resets the client.view in case it was changed.
if(!GLOB.individual_log_list[ckey])
GLOB.individual_log_list[ckey] = logging
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 7681566854..26b22d964e 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -11,8 +11,7 @@
qdel(hud_used)
if(mind && mind.current == src)
spellremove(src)
- for(var/infection in viruses)
- qdel(infection)
+ QDEL_LIST(viruses)
for(var/cc in client_colours)
qdel(cc)
client_colours = null
@@ -387,7 +386,7 @@
set category = "Object"
set src = usr
- if(istype(loc,/obj/mecha))
+ if(istype(loc, /obj/mecha))
return
if(incapacitated())
@@ -869,7 +868,7 @@
var/search_pda = 1
for(var/A in searching)
- if( search_id && istype(A,/obj/item/weapon/card/id) )
+ if( search_id && istype(A, /obj/item/weapon/card/id) )
var/obj/item/weapon/card/id/ID = A
if(ID.registered_name == oldname)
ID.registered_name = newname
@@ -878,7 +877,7 @@
break
search_id = 0
- else if( search_pda && istype(A,/obj/item/device/pda) )
+ else if( search_pda && istype(A, /obj/item/device/pda) )
var/obj/item/device/pda/PDA = A
if(PDA.owner == oldname)
PDA.owner = newname
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 053cba123a..1da8a82c51 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -113,7 +113,7 @@
//List of active diseases
- var/list/viruses = list() // replaces var/datum/disease/virus
+ var/list/viruses = list() // list of all diseases in a mob
var/list/resistances = list()
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
@@ -141,3 +141,5 @@
var/list/progressbars = null //for stacking do_after bars
var/list/can_ride_typecache = list()
+
+ var/list/mousemove_intercept_objects
diff --git a/code/modules/mob/say_readme.dm b/code/modules/mob/say_readme.dm
index 87c198875a..0c64da1789 100644
--- a/code/modules/mob/say_readme.dm
+++ b/code/modules/mob/say_readme.dm
@@ -5,7 +5,7 @@
This is a basic explanation of how say() works. Read this if you don't understand something.
The basic "flow" of say() is that a speaker says a message, which is heard by hearers. What appears on screen
-is constructed by each hearer seperately, and not by the speaker.
+is constructed by each hearer separately, and not by the speaker.
This rewrite was needed, but is far from perfect. Report any bugs you come across and feel free to fix things up.
Radio code, while very much related to saycode, is not something I wanted to touch, so the code related to that may be messy.
@@ -122,7 +122,7 @@ global procs
Called right before handle_inherent_channels()
can_speak_vocal(message)
- Checks if the mob can vocalize their message. This is seperate so, for example, muzzles don't block
+ Checks if the mob can vocalize their message. This is separate so, for example, muzzles don't block
hivemind chat.
Called right after handle_inherent_channels()
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index cf598b7a2e..e421b84853 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -65,9 +65,9 @@
if (tr_flags & TR_KEEPVIRUS)
O.viruses = viruses
viruses = list()
- for(var/datum/disease/D in O.viruses)
+ for(var/thing in O.viruses)
+ var/datum/disease/D = thing
D.affected_mob = O
- D.holder = O
//keep damage?
if (tr_flags & TR_KEEPDAMAGE)
@@ -219,9 +219,9 @@
if (tr_flags & TR_KEEPVIRUS)
O.viruses = viruses
viruses = list()
- for(var/datum/disease/D in O.viruses)
+ for(var/thing in O.viruses)
+ var/datum/disease/D = thing
D.affected_mob = O
- D.holder = O
O.med_hud_set_status()
//keep damage?
diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm
index cfe019e193..d62907f026 100644
--- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm
+++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm
@@ -22,16 +22,12 @@
if(last_status != new_status)
last_status = new_status
ui_header = "smmon_[last_status].gif"
- if(istype(computer) && !(computer.hardware_flag == PROGRAM_LAPTOP))
- program_icon_state = "smmon_[last_status]"
- if(istype(computer))
- computer.update_icon()
+ program_icon_state = "smmon_[last_status]"
+ if(istype(computer))
+ computer.update_icon()
/datum/computer_file/program/supermatter_monitor/run_program(mob/living/user)
. = ..(user)
- if(istype(computer) && (computer.hardware_flag == PROGRAM_LAPTOP))
- program_icon_state = "engine"
- computer.update_icon()
refresh()
/datum/computer_file/program/supermatter_monitor/kill_program(forced = FALSE)
diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm
index 19e30cd42d..071fe096e4 100644
--- a/code/modules/modular_computers/hardware/network_card.dm
+++ b/code/modules/modular_computers/hardware/network_card.dm
@@ -68,6 +68,8 @@
origin_tech = "programming=4;engineering=2"
power_usage = 100 // Better range but higher power usage.
icon_state = "radio"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
/obj/item/weapon/computer_hardware/network_card/wired
diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm
index e30d37b510..1fa48f5aca 100644
--- a/code/modules/modular_computers/laptop_vendor.dm
+++ b/code/modules/modular_computers/laptop_vendor.dm
@@ -241,7 +241,7 @@
/obj/machinery/lapvend/attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I,/obj/item/stack/spacecash))
+ if(istype(I, /obj/item/stack/spacecash))
var/obj/item/stack/spacecash/c = I
if(!user.drop_item(c))
diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm
index 80a077ac33..d82619d348 100644
--- a/code/modules/ninja/energy_katana.dm
+++ b/code/modules/ninja/energy_katana.dm
@@ -59,6 +59,8 @@
desc = "A katana infused with strong energy."
icon_state = "energy_katana"
item_state = "energy_katana"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
force = 40
throwforce = 20
block_chance = 50
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 8c298a3c9a..b673db5456 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -16,7 +16,7 @@ Contents:
desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins."
icon_state = "s-ninja"
item_state = "s-ninja_suit"
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/stock_parts/cell)
+ allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/weapon/tank/internals, /obj/item/weapon/stock_parts/cell)
slowdown = 0
resistance_flags = LAVA_PROOF | ACID_PROOF
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 100, acid = 100)
diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm
index 7eaa0a7e26..39f0d7a933 100644
--- a/code/modules/paperwork/contract.dm
+++ b/code/modules/paperwork/contract.dm
@@ -36,7 +36,7 @@
if(M.mind == target && !M.owns_soul())
if(user.mind && (user.mind.assigned_role == "Lawyer"))
deconvert = TRUE
- else if (user.mind && (user.mind.assigned_role =="Head of Personnel") || (user.mind.assigned_role == "Centcom Commander"))
+ else if (user.mind && (user.mind.assigned_role =="Head of Personnel") || (user.mind.assigned_role == "CentCom Commander"))
deconvert = prob (25) // the HoP doesn't have AS much legal training
else
deconvert = prob (5)
@@ -103,7 +103,7 @@
update_text()
/obj/item/weapon/paper/contract/infernal/suicide_act(mob/user)
- if(signed && (user == target.current) && istype(user,/mob/living/carbon/human/))
+ if(signed && (user == target.current) && istype(user, /mob/living/carbon/human/))
var/mob/living/carbon/human/H = user
H.forcesay("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!")
H.visible_message("[H] holds up a contract claiming [user.p_their()] soul, then immediately catches fire. It looks like [user.p_theyre()] trying to commit suicide!")
@@ -304,11 +304,11 @@
id.assignment = "Captain"
id.update_label()
if(worn)
- if(istype(worn,/obj/item/device/pda))
+ if(istype(worn, /obj/item/device/pda))
var/obj/item/device/pda/PDA = worn
PDA.id = id
id.loc = worn
- else if(istype(worn,/obj/item/weapon/storage/wallet))
+ else if(istype(worn, /obj/item/weapon/storage/wallet))
var/obj/item/weapon/storage/wallet/W = worn
W.front_id = id
id.loc = worn
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 468a044bc0..ca77641a9b 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -27,7 +27,7 @@
desc = "A small cabinet with drawers. This one has wheels!"
anchored = FALSE
-/obj/structure/filingcabinet/filingcabinet //not changing the path to avoid unecessary map issues, but please don't name stuff like this in the future -Pete
+/obj/structure/filingcabinet/filingcabinet //not changing the path to avoid unnecessary map issues, but please don't name stuff like this in the future -Pete
icon_state = "tallcabinet"
diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm
index 9e4b12aace..f1a1ee49e8 100644
--- a/code/modules/paperwork/handlabeler.dm
+++ b/code/modules/paperwork/handlabeler.dm
@@ -112,4 +112,6 @@
desc = "A roll of paper. Use it on a hand labeler to refill it."
icon_state = "labeler_refill"
item_state = "electropack"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 9d9db88ee3..6a66b4d2e6 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -390,51 +390,6 @@
. = ..()
color = "#FFF5ED"
-
-/*
- * Premade paper
- */
-
-/obj/item/weapon/paper/Court
- name = "paper- 'Judgement'"
- info = "For crimes against the station, the offender is sentenced to: \n \n"
-
-/obj/item/weapon/paper/Toxin
- name = "paper- 'Chemical Information'"
- info = "Known Onboard Toxins: \n\tGrade A Semi-Liquid Plasma: \n\t\tHighly poisonous. You cannot sustain concentrations above 15 units. \n\t\tA gas mask fails to filter plasma after 50 units. \n\t\tWill attempt to diffuse like a gas. \n\t\tFiltered by scrubbers. \n\t\tThere is a bottled version which is very different \n\t\t\tfrom the version found in canisters! \n \n\t\tWARNING: Highly Flammable. Keep away from heat sources \n\t\texcept in a enclosed fire area! \n\t\tWARNING: It is a crime to use this without authorization. \nKnown Onboard Anti-Toxin: \n\tAnti-Toxin Type 01P: Works against Grade A Plasma. \n\t\tBest if injected directly into bloodstream. \n\t\tA full injection is in every regular Med-Kit. \n\t\tSpecial toxin Kits hold around 7. \n \nKnown Onboard Chemicals (other): \n\tRejuvenation T#001: \n\t\tEven 1 unit injected directly into the bloodstream \n\t\t\twill cure unconscious and sleep toxins. \n\t\tIf administered to a dying patient it will prevent \n\t\t\tfurther damage for about units*3 seconds. \n\t\t\tit will not cure them or allow them to be cured. \n\t\tIt can be administeredd to a non-dying patient \n\t\t\tbut the chemicals disappear just as fast. \n\tMorphine T#054: \n\t\t5 units wilkl induce precisely 1 minute of sleep. \n\t\t\tThe effect are cumulative. \n\t\tWARNING: It is a crime to use this without authorization"
-
-/obj/item/weapon/paper/courtroom
- name = "paper- 'A Crash Course in Legal SOP on SS13'"
- info = "Roles: \nThe Detective is basically the investigator and prosecutor. \nThe Staff Assistant can perform these functions with written authority from the Detective. \nThe Captain/HoP/Warden is ct as the judicial authority. \nThe Security Officers are responsible for executing warrants, security during trial, and prisoner transport. \n \nInvestigative Phase: \nAfter the crime has been committed the Detective's job is to gather evidence and try to ascertain not only who did it but what happened. He must take special care to catalogue everything and don't leave anything out. Write out all the evidence on paper. Make sure you take an appropriate number of fingerprints. IF he must ask someone questions he has permission to confront them. If the person refuses he can ask a judicial authority to write a subpoena for questioning. If again he fails to respond then that person is to be jailed as insubordinate and obstructing justice. Said person will be released after he cooperates. \n \nONCE the FT has a clear idea as to who the criminal is he is to write an arrest warrant on the piece of paper. IT MUST LIST THE CHARGES. The FT is to then go to the judicial authority and explain a small version of his case. If the case is moderately acceptable the authority should sign it. Security must then execute said warrant. \n \nPre-Pre-Trial Phase: \nNow a legal representative must be presented to the defendant if said defendant requests one. That person and the defendant are then to be given time to meet (in the jail IS ACCEPTABLE). The defendant and his lawyer are then to be given a copy of all the evidence that will be presented at trial (rewriting it all on paper is fine). THIS IS CALLED THE DISCOVERY PACK. With a few exceptions, THIS IS THE ONLY EVIDENCE BOTH SIDES MAY USE AT TRIAL. IF the prosecution will be seeking the death penalty it MUST be stated at this time. ALSO if the defense will be seeking not guilty by mental defect it must state this at this time to allow ample time for examination. \nNow at this time each side is to compile a list of witnesses. By default, the defendant is on both lists regardless of anything else. Also the defense and prosecution can compile more evidence beforehand BUT in order for it to be used the evidence MUST also be given to the other side.\nThe defense has time to compile motions against some evidence here. \nPossible Motions: \n1. Invalidate Evidence- Something with the evidence is wrong and the evidence is to be thrown out. This includes irrelevance or corrupt security. \n2. Free Movement- Basically the defendant is to be kept uncuffed before and during the trial. \n3. Subpoena Witness- If the defense presents god reasons for needing a witness but said person fails to cooperate then a subpoena is issued. \n4. Drop the Charges- Not enough evidence is there for a trial so the charges are to be dropped. The FT CAN RETRY but the judicial authority must carefully reexamine the new evidence. \n5. Declare Incompetent- Basically the defendant is insane. Once this is granted a medical official is to examine the patient. If he is indeed insane he is to be placed under care of the medical staff until he is deemed competent to stand trial. \n \nALL SIDES MOVE TO A COURTROOM \nPre-Trial Hearings: \nA judicial authority and the 2 sides are to meet in the trial room. NO ONE ELSE BESIDES A SECURITY DETAIL IS TO BE PRESENT. The defense submits a plea. If the plea is guilty then proceed directly to sentencing phase. Now the sides each present their motions to the judicial authority. He rules on them. Each side can debate each motion. Then the judicial authority gets a list of crew members. He first gets a chance to look at them all and pick out acceptable and available jurors. Those jurors are then called over. Each side can ask a few questions and dismiss jurors they find too biased. HOWEVER before dismissal the judicial authority MUST agree to the reasoning. \n \nThe Trial: \nThe trial has three phases. \n1. Opening Arguments- Each side can give a short speech. They may not present ANY evidence. \n2. Witness Calling/Evidence Presentation- The prosecution goes first and is able to call the witnesses on his approved list in any order. He can recall them if necessary. During the questioning the lawyer may use the evidence in the questions to help prove a point. After every witness the other side has a chance to cross-examine. After both sides are done questioning a witness the prosecution can present another or recall one (even the EXACT same one again!). After prosecution is done the defense can call witnesses. After the initial cases are presented both sides are free to call witnesses on either list. \nFINALLY once both sides are done calling witnesses we move onto the next phase. \n3. Closing Arguments- Same as opening. \nThe jury then deliberates IN PRIVATE. THEY MUST ALL AGREE on a verdict. REMEMBER: They mix between some charges being guilty and others not guilty (IE if you supposedly killed someone with a gun and you unfortunately picked up a gun without authorization then you CAN be found not guilty of murder BUT guilty of possession of illegal weaponry.). Once they have agreed they present their verdict. If unable to reach a verdict and feel they will never they call a deadlocked jury and we restart at Pre-Trial phase with an entirely new set of jurors. \n \nSentencing Phase: \nIf the death penalty was sought (you MUST have gone through a trial for death penalty) then skip to the second part. \nI. Each side can present more evidence/witnesses in any order. There is NO ban on emotional aspects or anything. The prosecution is to submit a suggested penalty. After all the sides are done then the judicial authority is to give a sentence. \nII. The jury stays and does the same thing as I. Their sole job is to determine if the death penalty is applicable. If NOT then the judge selects a sentence. \n \nTADA you're done. Security then executes the sentence and adds the applicable convictions to the person's record. \n"
-
-/obj/item/weapon/paper/hydroponics
- name = "paper- 'Greetings from Billy Bob'"
- info = "Hey fellow botanist! \n \nI didn't trust the station folk so I left \na couple of weeks ago. But here's some \ninstructions on how to operate things here. \nYou can grow plants and each iteration they become \nstronger, more potent and have better yield, if you \nknow which ones to pick. Use your botanist's analyzer \nfor that. You can turn harvested plants into seeds \nat the seed extractor, and replant them for better stuff! \nSometimes if the weed level gets high in the tray \nmutations into different mushroom or weed species have \nbeen witnessed. On the rare occassion even weeds mutate! \n \nEither way, have fun! \n \nBest regards, \nBilly Bob Johnson. \n \nPS. \nHere's a few tips: \nIn nettles, potency = damage \nIn amanitas, potency = deadliness + side effect \nIn Liberty caps, potency = drug power + effect \nIn chilis, potency = heat \nNutrients keep mushrooms alive! \nWater keeps weeds such as nettles alive! \nAll other plants need both."
-
-/obj/item/weapon/paper/djstation
- name = "paper - 'DJ Listening Outpost'"
- info = "Welcome new owner!
You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio frequencies. Here is a step by step guide to start listening in on those saucy radio channels:
Equip yourself with a multitool
Use the multitool on the relay.
Turn it on. It has already been configured for you to listen on.
Simple as that. Now to listen to the private channels, you'll have to configure the intercoms. They are located on the front desk. Here is a list of frequencies for you to listen on.
145.9 - Common Channel
144.7 - Private AI Channel
135.9 - Security Channel
135.7 - Engineering Channel
135.5 - Medical Channel
135.3 - Command Channel
135.1 - Science Channel
134.9 - Service Channel
134.7 - Supply Channel
"
-
-/obj/item/weapon/paper/jobs
- name = "paper- 'Job Information'"
- info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document. \nThe data will be in the following form. \nGenerally lower ranking positions come first in this list. \n \nJob Name general access>lab access-engine access-systems access (atmosphere control) \n\tJob Description \nJob Duties (in no particular order) \nTips (where applicable) \n \nResearch Assistant 1>1-0-0 \n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance. \n1. Assist the researchers. \n2. Clean up the labs. \n3. Prepare materials. \n \nStaff Assistant 2>0-0-0 \n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel) \n1. Patrol ship/Guard key areas \n2. Assist security officer \n3. Perform other security duties. \n \nTechnical Assistant 1>0-0-1 \n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that. \n1. Assist Station technician and Engineers. \n2. Perform general maintenance of station. \n3. Prepare materials. \n \nMedical Assistant 1>1-0-0 \n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals) \n1. Assist the medical personnel. \n2. Update medical files. \n3. Prepare materials for medical operations. \n \nResearch Technician 2>3-0-0 \n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally. \n1. Inform superiors of research. \n2. Perform research alongside of official researchers. \n \nDetective 3>2-0-0 \n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly. \n1. Perform crime-scene investigations/draw conclusions. \n2. Store and catalogue evidence properly. \n3. Testify to superiors/inquieries on findings. \n \nStation Technician 2>0-2-3 \n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician. \n1. Maintain SS13 systems. \n2. Repair equipment. \n \nAtmospheric Technician 3>0-0-4 \n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13. \n1. Maintain atmosphere on SS13 \n2. Research atmospheres on the space station. (safely please!) \n \nEngineer 2>1-3-0 \n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area. \n1. Upkeep the engine. \n2. Prevent fires in the engine. \n3. Maintain a safe orbit. \n \nMedical Researcher 2>5-0-0 \n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed. \n1. Make sure the station is kept safe. \n2. Research medical properties of materials studied of Space Station 13. \n \nScientist 2>5-0-0 \n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Plasma Technicians as plasma is the material they routinly handle. \n1. Research plasma \n2. Make sure all plasma is properly handled. \n \nMedical Doctor (Officer) 2>0-0-0 \n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder. \n1. Heal wounded people. \n2. Perform examinations of all personnel. \n3. Monitor usage of medical equipment. \n \nSecurity Officer 3>0-0-0 \n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources. \n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel) \n1. Maintain order. \n2. Assist others. \n3. Repair structural problems. \n \nHead of Security 4>5-2-2 \n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person. \n1. Oversee security. \n2. Assign patrol duties. \n3. Protect the station and staff. \n \nHead of Personnel 4>4-2-2 \n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels. \n1. Assign duties. \n2. Moderate personnel. \n3. Moderate research. \n \nCaptain 5>5-5-5 (unrestricted station wide access) \n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power. \n1. Assign all positions on SS13 \n2. Inspect the station for any problems. \n3. Perform administrative duties. \n"
-
-/obj/item/weapon/paper/sop
- name = "paper- 'Standard Operating Procedure'"
- info = "Alert Levels: \nBlue- Emergency \n\t1. Caused by fire \n\t2. Caused by manual interaction \n\tAction: \n\t\tClose all fire doors. These can only be opened by reseting the alarm \nRed- Ejection/Self Destruct \n\t1. Caused by module operating computer. \n\tAction: \n\t\tAfter the specified time the module will eject completely. \n \nEngine Maintenance Instructions: \n\tShut off ignition systems: \n\tActivate internal power \n\tActivate orbital balance matrix \n\tRemove volatile liquids from area \n\tWear a fire suit \n \n\tAfter \n\t\tDecontaminate \n\t\tVisit medical examiner \n \nToxin Laboratory Procedure: \n\tWear a gas mask regardless \n\tGet an oxygen tank. \n\tActivate internal atmosphere \n \n\tAfter \n\t\tDecontaminate \n\t\tVisit medical examiner \n \nDisaster Procedure: \n\tFire: \n\t\tActivate sector fire alarm. \n\t\tMove to a safe area. \n\t\tGet a fire suit \n\t\tAfter: \n\t\t\tAssess Damage \n\t\t\tRepair damages \n\t\t\tIf needed, Evacuate \n\tMeteor Shower: \n\t\tActivate fire alarm \n\t\tMove to the back of ship \n\t\tAfter \n\t\t\tRepair damage \n\t\t\tIf needed, Evacuate \n\tAccidental Reentry: \n\t\tActivate fire alrms in front of ship. \n\t\tMove volatile matter to a fire proof area! \n\t\tGet a fire suit. \n\t\tStay secure until an emergency ship arrives. \n \n\t\tIf ship does not arrive- \n\t\t\tEvacuate to a nearby safe area!"
-
-/obj/item/weapon/paper/centcom
- name = "paper- 'Official Bulletin'"
- info = " Centcom Security Port Division Official Bulletin
Inspector, There is an emergency shuttle arriving today.
Approval is restricted to Nanotrasen employees only. Deny all other entrants.
Centcom Port Commissioner"
-
-/obj/item/weapon/paper/range
- name = "paper- Firing Range Instructions"
- info = "Directions: First you'll want to make sure there is a target stake in the center of the magnetic platform. Next, take an aluminum target from the crates back there and slip it into the stake. Make sure it clicks! Next, there should be a control console mounted on the wall somewhere in the room.
This control console dictates the behaviors of the magnetic platform, which can move your firing target around to simulate real-world combat situations. From here, you can turn off the magnets or adjust their electromagnetic levels and magnetic fields. The electricity level dictates the strength of the pull - you will usually want this to be the same value as the speed. The magnetic field level dictates how far the magnetic pull reaches.
Speed and path are the next two settings. Speed is associated with how fast the machine loops through the designated path. Paths dictate where the magnetic field will be centered at what times. There should be a pre-fabricated path input already. You can enable moving to observe how the path affects the way the stake moves. To script your own path, look at the following key:
N: North S: South E: East W: West C: Center R: Random (results may vary) ; or &: separators. They are not necessary but can make the path string better visible."
-
-/obj/item/weapon/paper/mining
- name = "paper- Smelting Operations Closed"
- info = "**NOTICE**
Smelting operations moved on-station.
Take your unrefined ore to the Redemption Machine in the Delivery Office to redeem points.
Catastrophic damage sustained to station. Powernet exhausted to reawaken crew.
Immediate Objectives
1: Activate emergency power generator 2: Lift station lockdown on the bridge
Please locate the 'Damage Report' on the bridge for a detailed situation report."
-
-/obj/item/weapon/paper/oldstat/damagereport
- name = "Damage Report"
- info = "*Damage Report*
Charlie Station - Intact. Loss of oxygen to eastern side of main corridor.
Delta Station - Intact. WARNING: Unknown force occupying Delta Station. Intent unknown. Species unknown. Numbers unknown.
Recommendation - Reestablish station powernet via solar array. Reestablish station atmospherics system to restore air."
-
-/obj/item/weapon/paper/oldstat/protosuit
- name = "B01-RIG Hardsuit Report"
- info = "*Prototype Hardsuit*
The B01-RIG Hardsuit is a prototype powered exoskeleton. Based off of a recovered pre-void war era united earth government powered military \
- exosuit, the RIG Hardsuit is a breakthrough in Hardsuit technology, and is the first post-void war era Hardsuit that can be safely used by a operator.
The B01 however suffers \
- a myriad of constraints. It is slow and bulky to move around, it lacks any significant armor plating against direct attacks and its internal heads up display is unfinished, \
- resulting in the user being unable to see long distances.
The B01 is unlikely to see any form of mass production, but will serve as a base for future Hardsuit developments."
-
-/obj/item/weapon/paper/oldstat/protohealth
- name = "Health Analyser Report"
- info = "*Health Analyser*
The portable Health Analyser is essentially a handheld varient of a health analyser. Years of research have concluded with this device which is \
- capable of diagnosing even the most critical, obscure or technical injuries any humanoid entity is suffering in a easy to understand format that even a non-trained health professional \
- can understand.
The health analyser is expected to go into full production as standard issue medical kit."
-
-/obj/item/weapon/paper/oldstat/protogun
- name = "K14 Energy Gun Report"
- info = "*K14-Multiphase Energy Gun*
The K14 Prototype Energy Gun is the first Energy Rifle that has been successfully been able to not only hold a larger ammo charge \
- than other gun models, but is capable of swapping between different energy projectile types on command with no incidents.
The weapon still suffers several drawbacks, its alternative, \
- non laser fire mode, can only fire one round before exhausting the energy cell, the weapon also remains prohibitively expensive, nonetheless NT Market Research fully believe this weapon \
- will form the backbone of our Energy weapon cataloge.
The K14 is expected to undergo revision to fix the ammo issues, the K15 is expected to replace the 'stun' setting with a \
- 'disable' setting in a attempt to bypass the ammo issues."
-
-/obj/item/weapon/paper/oldstat/protosing
- name = "Singularity Generator"
- info = "*Singularity Generator*
Modern power generation typically comes in two forms, a Fusion Generator or a Fission Generator. Fusion provides the best space to power \
- ratio, and is typically seen on military or high security ships and stations, however Fission reactors require the usage of expensive, and rare, materials in its construction.. Fission generators are massive and bulky, and require a large reserve of uranium to power, however they are extremely cheap to operate and oft need little maintenance once \
- operational.
The Singularity aims to alter this, a functional Singularity is essentially a controlled Black Hole, a Black Hole that generates far more power than Fusion or Fission \
- generators can ever hope to produce. "
-
-/obj/item/weapon/paper/oldstat/protoinv
- name = "Laboratory Inventory"
- info = "*Inventory*
(1) Prototype Hardsuit
(1)Health Analyser
(1)Prototype Energy Gun
(1)Singularity Generation Disk
DO NOT REMOVE WITHOUT \
- THE CAPTAIN AND RESEARCH DIRECTOR'S AUTHORISATION"
-
-/obj/item/weapon/paper/oldstat/report
- name = "Crew Reawakening Report"
- info = "Artifical Program's report to surviving crewmembers.
Crew were placed into cryostasis on March 10th, 2445.
Crew were awoken from cryostasis around June, 2557.
\
- SIGNIFICANT EVENTS OF NOTE 1: The primary radiation detectors were taken offline after 112 years due to power failure, secondary radioation detectors showed no residual \
- radioation on station. Deduction, primariy detector was malfunctioning and was producing a radioation signal when there was none.
2: A data burst from a nearby Nanotrasen Space \
- Station was recieved, this data burst contained research data that has been uploaded to our RnD labs.
3: Unknown invasion force has occupied Delta station."
+ icon_state = "scrap_bloodied"
\ No newline at end of file
diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm
new file mode 100644
index 0000000000..0b1fb36e4b
--- /dev/null
+++ b/code/modules/paperwork/paper_premade.dm
@@ -0,0 +1,113 @@
+/*
+ * Premade paper
+ */
+
+/obj/item/weapon/paper/fluff/sop
+ name = "paper- 'Standard Operating Procedure'"
+ info = "Alert Levels: \nBlue- Emergency \n\t1. Caused by fire \n\t2. Caused by manual interaction \n\tAction: \n\t\tClose all fire doors. These can only be opened by resetting the alarm \nRed- Ejection/Self Destruct \n\t1. Caused by module operating computer. \n\tAction: \n\t\tAfter the specified time the module will eject completely. \n \nEngine Maintenance Instructions: \n\tShut off ignition systems: \n\tActivate internal power \n\tActivate orbital balance matrix \n\tRemove volatile liquids from area \n\tWear a fire suit \n \n\tAfter \n\t\tDecontaminate \n\t\tVisit medical examiner \n \nToxin Laboratory Procedure: \n\tWear a gas mask regardless \n\tGet an oxygen tank. \n\tActivate internal atmosphere \n \n\tAfter \n\t\tDecontaminate \n\t\tVisit medical examiner \n \nDisaster Procedure: \n\tFire: \n\t\tActivate sector fire alarm. \n\t\tMove to a safe area. \n\t\tGet a fire suit \n\t\tAfter: \n\t\t\tAssess Damage \n\t\t\tRepair damages \n\t\t\tIf needed, Evacuate \n\tMeteor Shower: \n\t\tActivate fire alarm \n\t\tMove to the back of ship \n\t\tAfter \n\t\t\tRepair damage \n\t\t\tIf needed, Evacuate \n\tAccidental Reentry: \n\t\tActivate fire alarms in front of ship. \n\t\tMove volatile matter to a fire proof area! \n\t\tGet a fire suit. \n\t\tStay secure until an emergency ship arrives. \n \n\t\tIf ship does not arrive- \n\t\t\tEvacuate to a nearby safe area!"
+
+/obj/item/weapon/paper/fluff/shuttles/daniel
+ info = "i love daniel daniel is my best friend
you are tearing me apart elise"
+
+
+//////////// Job guides n' fluff
+
+/obj/item/weapon/paper/guides/jobs/hydroponics
+ name = "paper- 'Greetings from Billy Bob'"
+ info = "Hey fellow botanist! \n \nI didn't trust the station folk so I left \na couple of weeks ago. But here's some \ninstructions on how to operate things here. \nYou can grow plants and each iteration they become \nstronger, more potent and have better yield, if you \nknow which ones to pick. Use your botanist's analyzer \nfor that. You can turn harvested plants into seeds \nat the seed extractor, and replant them for better stuff! \nSometimes if the weed level gets high in the tray \nmutations into different mushroom or weed species have \nbeen witnessed. On the rare occassion even weeds mutate! \n \nEither way, have fun! \n \nBest regards, \nBilly Bob Johnson. \n \nPS. \nHere's a few tips: \nIn nettles, potency = damage \nIn amanitas, potency = deadliness + side effect \nIn Liberty caps, potency = drug power + effect \nIn chilis, potency = heat \nNutrients keep mushrooms alive! \nWater keeps weeds such as nettles alive! \nAll other plants need both."
+
+
+/obj/item/weapon/paper/fluff/jobs/security/beepsky_mom
+ name = "Note from Beepsky's Mom"
+ info = "01001001 00100000 01101000 01101111 01110000 01100101 00100000 01111001 01101111 01110101 00100000 01110011 01110100 01100001 01111001 00100000 01110011 01100001 01100110 01100101 00101110 00100000 01001100 01101111 01110110 01100101 00101100 00100000 01101101 01101111 01101101 00101110"
+
+/obj/item/weapon/paper/guides/jobs/security/courtroom
+ name = "paper- 'A Crash Course in Legal SOP on SS13'"
+ info = "Roles: \nThe Detective is basically the investigator and prosecutor. \nThe Staff Assistant can perform these functions with written authority from the Detective. \nThe Captain/HoP/Warden is ct as the judicial authority. \nThe Security Officers are responsible for executing warrants, security during trial, and prisoner transport. \n \nInvestigative Phase: \nAfter the crime has been committed the Detective's job is to gather evidence and try to ascertain not only who did it but what happened. He must take special care to catalogue everything and don't leave anything out. Write out all the evidence on paper. Make sure you take an appropriate number of fingerprints. IF he must ask someone questions he has permission to confront them. If the person refuses he can ask a judicial authority to write a subpoena for questioning. If again he fails to respond then that person is to be jailed as insubordinate and obstructing justice. Said person will be released after he cooperates. \n \nONCE the FT has a clear idea as to who the criminal is he is to write an arrest warrant on the piece of paper. IT MUST LIST THE CHARGES. The FT is to then go to the judicial authority and explain a small version of his case. If the case is moderately acceptable the authority should sign it. Security must then execute said warrant. \n \nPre-Pre-Trial Phase: \nNow a legal representative must be presented to the defendant if said defendant requests one. That person and the defendant are then to be given time to meet (in the jail IS ACCEPTABLE). The defendant and his lawyer are then to be given a copy of all the evidence that will be presented at trial (rewriting it all on paper is fine). THIS IS CALLED THE DISCOVERY PACK. With a few exceptions, THIS IS THE ONLY EVIDENCE BOTH SIDES MAY USE AT TRIAL. IF the prosecution will be seeking the death penalty it MUST be stated at this time. ALSO if the defense will be seeking not guilty by mental defect it must state this at this time to allow ample time for examination. \nNow at this time each side is to compile a list of witnesses. By default, the defendant is on both lists regardless of anything else. Also the defense and prosecution can compile more evidence beforehand BUT in order for it to be used the evidence MUST also be given to the other side.\nThe defense has time to compile motions against some evidence here. \nPossible Motions: \n1. Invalidate Evidence- Something with the evidence is wrong and the evidence is to be thrown out. This includes irrelevance or corrupt security. \n2. Free Movement- Basically the defendant is to be kept uncuffed before and during the trial. \n3. Subpoena Witness- If the defense presents god reasons for needing a witness but said person fails to cooperate then a subpoena is issued. \n4. Drop the Charges- Not enough evidence is there for a trial so the charges are to be dropped. The FT CAN RETRY but the judicial authority must carefully reexamine the new evidence. \n5. Declare Incompetent- Basically the defendant is insane. Once this is granted a medical official is to examine the patient. If he is indeed insane he is to be placed under care of the medical staff until he is deemed competent to stand trial. \n \nALL SIDES MOVE TO A COURTROOM \nPre-Trial Hearings: \nA judicial authority and the 2 sides are to meet in the trial room. NO ONE ELSE BESIDES A SECURITY DETAIL IS TO BE PRESENT. The defense submits a plea. If the plea is guilty then proceed directly to sentencing phase. Now the sides each present their motions to the judicial authority. He rules on them. Each side can debate each motion. Then the judicial authority gets a list of crew members. He first gets a chance to look at them all and pick out acceptable and available jurors. Those jurors are then called over. Each side can ask a few questions and dismiss jurors they find too biased. HOWEVER before dismissal the judicial authority MUST agree to the reasoning. \n \nThe Trial: \nThe trial has three phases. \n1. Opening Arguments- Each side can give a short speech. They may not present ANY evidence. \n2. Witness Calling/Evidence Presentation- The prosecution goes first and is able to call the witnesses on his approved list in any order. He can recall them if necessary. During the questioning the lawyer may use the evidence in the questions to help prove a point. After every witness the other side has a chance to cross-examine. After both sides are done questioning a witness the prosecution can present another or recall one (even the EXACT same one again!). After prosecution is done the defense can call witnesses. After the initial cases are presented both sides are free to call witnesses on either list. \nFINALLY once both sides are done calling witnesses we move onto the next phase. \n3. Closing Arguments- Same as opening. \nThe jury then deliberates IN PRIVATE. THEY MUST ALL AGREE on a verdict. REMEMBER: They mix between some charges being guilty and others not guilty (IE if you supposedly killed someone with a gun and you unfortunately picked up a gun without authorization then you CAN be found not guilty of murder BUT guilty of possession of illegal weaponry.). Once they have agreed they present their verdict. If unable to reach a verdict and feel they will never they call a deadlocked jury and we restart at Pre-Trial phase with an entirely new set of jurors. \n \nSentencing Phase: \nIf the death penalty was sought (you MUST have gone through a trial for death penalty) then skip to the second part. \nI. Each side can present more evidence/witnesses in any order. There is NO ban on emotional aspects or anything. The prosecution is to submit a suggested penalty. After all the sides are done then the judicial authority is to give a sentence. \nII. The jury stays and does the same thing as I. Their sole job is to determine if the death penalty is applicable. If NOT then the judge selects a sentence. \n \nTADA you're done. Security then executes the sentence and adds the applicable convictions to the person's record. \n"
+
+/obj/item/weapon/paper/guides/jobs/security/labor_camp
+ name = "Labor Camp Operating Guide"
+ info = "Labor Camp Facility Operation Guide
Hello there, proud operator of an NT-Sec Prisoner Rehabilitation Center. A solution to rising crime rates and falling productivity, these facilities are specifically designed for the safe, productive imprisonment of your most dangerous criminals.
To press a long-term prisoner into the service of the station, replace his equipment with prisoners' garb at one of the prison lockers, as per normal operating procedure. Before assigning a prisoner his ID, insert the ID into a prisoner management console and assign the prisoner a quota, based on the severity of his crime. A single sheet of most materials produces five points for the prisoner, and points can be expected to be produced at a rate of about 100 per minute, though punishments as severe as forced labor should be reserved for serious crimes of sentences not less than five minutes long. Once you have prepared the prisoner, place him in the secure northern half of the labor shuttle, and send him to the station. Once he meets his quota by feeding sheets to the stacker, he will be allowed to return to the station, and will be able to open the secure door to the prisoner release area.
In the case of dangerous prisoners, surveilance may be needed. To that end, there is a prisoner monitoring room on the mining station, equipped with a remote flasher and a lockdown button. The mine itself is patrolled by a securibot, so the nearby security records console can also be used to secure hostile prisoners on the mine."
+
+/obj/item/weapon/paper/guides/jobs/security/range
+ name = "paper- Firing Range Instructions"
+ info = "Directions: First you'll want to make sure there is a target stake in the center of the magnetic platform. Next, take an aluminum target from the crates back there and slip it into the stake. Make sure it clicks! Next, there should be a control console mounted on the wall somewhere in the room.
This control console dictates the behaviors of the magnetic platform, which can move your firing target around to simulate real-world combat situations. From here, you can turn off the magnets or adjust their electromagnetic levels and magnetic fields. The electricity level dictates the strength of the pull - you will usually want this to be the same value as the speed. The magnetic field level dictates how far the magnetic pull reaches.
Speed and path are the next two settings. Speed is associated with how fast the machine loops through the designated path. Paths dictate where the magnetic field will be centered at what times. There should be a pre-fabricated path input already. You can enable moving to observe how the path affects the way the stake moves. To script your own path, look at the following key:
N: North S: South E: East W: West C: Center R: Random (results may vary) ; or &: separators. They are not necessary but can make the path string better visible."
+
+/obj/item/weapon/paper/fluff/jobs/jobs
+ name = "paper- 'Job Information'"
+ info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document. \nThe data will be in the following form. \nGenerally lower ranking positions come first in this list. \n \nJob Name general access>lab access-engine access-systems access (atmosphere control) \n\tJob Description \nJob Duties (in no particular order) \nTips (where applicable) \n \nResearch Assistant 1>1-0-0 \n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance. \n1. Assist the researchers. \n2. Clean up the labs. \n3. Prepare materials. \n \nStaff Assistant 2>0-0-0 \n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel) \n1. Patrol ship/Guard key areas \n2. Assist security officer \n3. Perform other security duties. \n \nTechnical Assistant 1>0-0-1 \n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that. \n1. Assist Station technician and Engineers. \n2. Perform general maintenance of station. \n3. Prepare materials. \n \nMedical Assistant 1>1-0-0 \n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals) \n1. Assist the medical personnel. \n2. Update medical files. \n3. Prepare materials for medical operations. \n \nResearch Technician 2>3-0-0 \n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally. \n1. Inform superiors of research. \n2. Perform research alongside of official researchers. \n \nDetective 3>2-0-0 \n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly. \n1. Perform crime-scene investigations/draw conclusions. \n2. Store and catalogue evidence properly. \n3. Testify to superiors/inquieries on findings. \n \nStation Technician 2>0-2-3 \n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician. \n1. Maintain SS13 systems. \n2. Repair equipment. \n \nAtmospheric Technician 3>0-0-4 \n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13. \n1. Maintain atmosphere on SS13 \n2. Research atmospheres on the space station. (safely please!) \n \nEngineer 2>1-3-0 \n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area. \n1. Upkeep the engine. \n2. Prevent fires in the engine. \n3. Maintain a safe orbit. \n \nMedical Researcher 2>5-0-0 \n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed. \n1. Make sure the station is kept safe. \n2. Research medical properties of materials studied of Space Station 13. \n \nScientist 2>5-0-0 \n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Plasma Technicians as plasma is the material they routinly handle. \n1. Research plasma \n2. Make sure all plasma is properly handled. \n \nMedical Doctor (Officer) 2>0-0-0 \n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder. \n1. Heal wounded people. \n2. Perform examinations of all personnel. \n3. Monitor usage of medical equipment. \n \nSecurity Officer 3>0-0-0 \n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources. \n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel) \n1. Maintain order. \n2. Assist others. \n3. Repair structural problems. \n \nHead of Security 4>5-2-2 \n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person. \n1. Oversee security. \n2. Assign patrol duties. \n3. Protect the station and staff. \n \nHead of Personnel 4>4-2-2 \n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels. \n1. Assign duties. \n2. Moderate personnel. \n3. Moderate research. \n \nCaptain 5>5-5-5 (unrestricted station wide access) \n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power. \n1. Assign all positions on SS13 \n2. Inspect the station for any problems. \n3. Perform administrative duties. \n"
+
+/obj/item/weapon/paper/fluff/jobs/mining/smelter_notice
+ name = "paper- Smelting Operations Closed"
+ info = "**NOTICE**
Smelting operations moved on-station.
Take your unrefined ore to the Redemption Machine in the Delivery Office to redeem points.
--SS13 Command"
+
+/obj/item/weapon/paper/fluff/jobs/security/court_judgement
+ name = "paper- 'Judgement'"
+ info = "For crimes against the station, the offender is sentenced to: \n \n"
+
+/obj/item/weapon/paper/fluff/jobs/toxins/chemical_info
+ name = "paper- 'Chemical Information'"
+ info = "Known Onboard Toxins: \n\tGrade A Semi-Liquid Plasma: \n\t\tHighly poisonous. You cannot sustain concentrations above 15 units. \n\t\tA gas mask fails to filter plasma after 50 units. \n\t\tWill attempt to diffuse like a gas. \n\t\tFiltered by scrubbers. \n\t\tThere is a bottled version which is very different \n\t\t\tfrom the version found in canisters! \n \n\t\tWARNING: Highly Flammable. Keep away from heat sources \n\t\texcept in a enclosed fire area! \n\t\tWARNING: It is a crime to use this without authorization. \nKnown Onboard Anti-Toxin: \n\tAnti-Toxin Type 01P: Works against Grade A Plasma. \n\t\tBest if injected directly into bloodstream. \n\t\tA full injection is in every regular Med-Kit. \n\t\tSpecial toxin Kits hold around 7. \n \nKnown Onboard Chemicals (other): \n\tRejuvenation T#001: \n\t\tEven 1 unit injected directly into the bloodstream \n\t\t\twill cure unconscious and sleep toxins. \n\t\tIf administered to a dying patient it will prevent \n\t\t\tfurther damage for about units*3 seconds. \n\t\t\tit will not cure them or allow them to be cured. \n\t\tIt can be administeredd to a non-dying patient \n\t\t\tbut the chemicals disappear just as fast. \n\tMorphine T#054: \n\t\t5 units wilkl induce precisely 1 minute of sleep. \n\t\t\tThe effect are cumulative. \n\t\tWARNING: It is a crime to use this without authorization"
+
+ /*
+ * Stations
+ */
+
+////////// Cere fluff
+
+/obj/item/weapon/paper/fluff/stations/cere/abandoned_dock
+ name = "Disclaimer Notice"
+ info = "This station needs clearing out within the next few weeks as construction is almost complete and NT expects most of the equipment off-site before then. Throw most of the shit in here for now and we'll come back later with a pod to haul the heavier stuff. Shouldn't be too big of an issue."
+
+/obj/item/weapon/paper/fluff/stations/cere/janitor
+ name = "Janitor Notice"
+ info = "You got a big job ahead of you, pal. This is a big station, lots of floors and assholes to dirty said floors without any thought for you. It might not be a bad idea to check on the external waste belts every now and again to make sure some foriegn object hasn't clogged the disposal loop, either."
+
+/obj/item/weapon/paper/fluff/stations/cere/gateway
+ name = "NOTICE - GATEWAY STATUS"
+ info = "
Nanotrasen Exploration and Colonization Program
Due to recent shutdowns of the Exploration and Colonization department shortly after this gateway was delivered on-site during station construction, this room has been condemmed and an engineering team will be on-site within the next few months to recollect the gate. Thank you for your cooperation."
+
+/obj/item/weapon/paper/fluff/stations/cere/journal/journal
+ name = "Journal Log"
+ info = "
2XXX - 2nd Trimestor
I hide in here, away from the masses, not like it matters much considering how fucking huge this place is. "
+
+/obj/item/weapon/paper/fluff/stations/cere/journal/journal_2
+ name = "Journal Log 2"
+ info = "
2XXX - 3rd Trimestor
I hear strange whispers from the halls, longing for blood. Something isn't right here. Why did they transfer us here to work in the first place? "
+
+/obj/item/weapon/paper/crumpled/stations/cere/empty_station
+ info = "I can't be here for much longer, this station is too empty for its own good. Something is wrong..."
+
+/obj/item/weapon/paper/crumpled/bloody/hop
+ info = "...THE HOPLINE CALLS...IT THIRSTS FOR BLOOD...I MUST GO..."
+
+/obj/item/weapon/paper/crumpled/stations/cere/rocks1
+ info = "...SOMETHING IN THE ROCKS, IT WATCHES US ALL..."
+
+/obj/item/weapon/paper/crumpled/stations/cere/rocks2
+ info = "...THEY SENT US HERE FOR A REASON...TERRIBLE..."
+
+/obj/item/weapon/paper/crumpled/stations/cere/rocks3
+ info = "...EMPTY HALLS...USELESS SPACE..."
+
+
+/////////// Centcom
+
+/obj/item/weapon/paper/fluff/stations/centcom/disk_memo
+ name = "memo"
+ info = "GET DAT FUKKEN DISK"
+
+/obj/item/weapon/paper/fluff/stations/centcom/broken_evac
+ info = "Due to circumstances beyond our control, your Emergency Evacuation Shuttle is out of service.
We apologise for the inconvinience this may cause you.
Please enjoy the use of this complementary book.
Sincerely, Centcom Operations Demolitions Examination Retribution Bugfixing Underlining Services"
+
+/obj/item/weapon/paper/fluff/stations/centcom/bulletin
+ name = "paper- 'Official Bulletin'"
+ info = " Centcom Security Port Division Official Bulletin
Inspector, There is an emergency shuttle arriving today.
Approval is restricted to Nanotrasen employees only. Deny all other entrants.
Centcom Port Commissioner"
+
+
+/////////// Lavaland
+
+/obj/item/weapon/paper/fluff/stations/lavaland/orm_notice
+ name = "URGENT!"
+ info = "A hastily written note has been scribbled here...
Please use the ore redemption machine in the cargo office for smelting. PLEASE!
--The Research Staff"
+
diff --git a/code/modules/paperwork/paper_premade.dm.rej b/code/modules/paperwork/paper_premade.dm.rej
new file mode 100644
index 0000000000..94fca518f6
--- /dev/null
+++ b/code/modules/paperwork/paper_premade.dm.rej
@@ -0,0 +1,23 @@
+diff a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm (rejected hunks)
+@@ -91,18 +91,18 @@
+ info = "...EMPTY HALLS...USELESS SPACE..."
+
+
+-/////////// Centcom
++/////////// CentCom
+
+ /obj/item/weapon/paper/fluff/stations/centcom/disk_memo
+ name = "memo"
+ info = "GET DAT FUKKEN DISK"
+
+ /obj/item/weapon/paper/fluff/stations/centcom/broken_evac
+- info = "Due to circumstances beyond our control, your Emergency Evacuation Shuttle is out of service.
We apologize for the inconvenience this may cause you.
Please enjoy the use of this complementary book.
Sincerely, Centcom Operations Demolitions Examination Retribution Bugfixing Underlining Services"
++ info = "Due to circumstances beyond our control, your Emergency Evacuation Shuttle is out of service.
We apologize for the inconvenience this may cause you.
Please enjoy the use of this complementary book.
Sincerely, CentCom Operations Demolitions Examination Retribution Bugfixing Underlining Services"
+
+ /obj/item/weapon/paper/fluff/stations/centcom/bulletin
+ name = "paper- 'Official Bulletin'"
+- info = " Centcom Security Port Division Official Bulletin
Inspector, There is an emergency shuttle arriving today.
Approval is restricted to Nanotrasen employees only. Deny all other entrants.
Centcom Port Commissioner"
++ info = " CentCom Security Port Division Official Bulletin
Inspector, There is an emergency shuttle arriving today.
Approval is restricted to Nanotrasen employees only. Deny all other entrants.
CentCom Port Commissioner"
+
+
+ /////////// Lavaland
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index a9dc698fd8..c8112bb3bd 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "paper_bin1"
item_state = "sheet-metal"
+ lefthand_file = 'icons/mob/inhands/misc/sheets_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/sheets_righthand.dmi'
throwforce = 0
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 3
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index fe3f7f3b0f..0f0ccfa4a7 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -223,6 +223,10 @@
if(on)
icon_state = "edagger"
item_state = "edagger"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
else
icon_state = initial(icon_state) //looks like a normal pen when off.
item_state = initial(item_state)
+ lefthand_file = initial(lefthand_file)
+ righthand_file = initial(righthand_file)
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index bd2437aa15..1aa8720c45 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -149,7 +149,7 @@
to_chat(usr, "You feel kind of silly, copying [ass == usr ? "your" : ass][ass == usr ? "" : "\'s"] ass with [ass == usr ? "your" : "their"] clothes on." )
break
else if(toner >= 5 && !busy && check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on.
- if(isalienadult(ass) || istype(ass,/mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro.
+ if(isalienadult(ass) || istype(ass, /mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro.
temp_img = icon('icons/ass/assalien.png')
else if(ishuman(ass)) //Suit checks are in check_ass
if(ass.gender == MALE)
@@ -256,7 +256,7 @@
/obj/machinery/photocopier/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/paper))
if(copier_empty())
- if(istype(O,/obj/item/weapon/paper/contract/infernal))
+ if(istype(O, /obj/item/weapon/paper/contract/infernal))
to_chat(user, "[src] smokes, smelling of brimstone!")
resistance_flags |= FLAMMABLE
fire_act()
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index c66d551ec4..b1896f930a 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -94,6 +94,8 @@
icon = 'icons/obj/items.dmi'
icon_state = "album"
item_state = "briefcase"
+ lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi'
can_hold = list(/obj/item/weapon/photo)
resistance_flags = FLAMMABLE
@@ -106,6 +108,8 @@
desc = "A polaroid camera."
icon_state = "camera"
item_state = "electropack"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm
index 468cf527a7..d4a26f61d9 100644
--- a/code/modules/power/antimatter/shielding.dm
+++ b/code/modules/power/antimatter/shielding.dm
@@ -230,6 +230,8 @@
icon = 'icons/obj/machines/antimatter.dmi'
icon_state = "box"
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
flags = CONDUCT
throwforce = 5
@@ -238,7 +240,7 @@
materials = list(MAT_METAL=100)
/obj/item/device/am_shielding_container/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/device/multitool) && istype(src.loc,/turf))
+ if(istype(I, /obj/item/device/multitool) && istype(src.loc, /turf))
new/obj/machinery/am_shielding(src.loc)
qdel(src)
else
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 5db3d9c1c5..aec4bb82ea 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -28,7 +28,7 @@
// the Area Power Controller (APC), formerly Power Distribution Unit (PDU)
-// one per area, needs wire conection to power network through a terminal
+// one per area, needs wire connection to power network through a terminal
// controls power to devices in that area
// may be opened to change power cell
@@ -120,8 +120,8 @@
if(auto_name)
name = "\improper [get_area(src)] APC"
- pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24)
- pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0
+ pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -25)
+ pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 23 : -24) : 0
if (building)
area = get_area(src)
opened = 1
@@ -256,7 +256,7 @@
O += "apco2-[environ]"
add_overlay(O)
- // And now, seperately for cleanness, the lighting changing
+ // And now, separately for cleanness, the lighting changing
if(update_state & UPSTATE_ALLGOOD)
switch(charging)
if(0)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index ee02e6eb35..a60edab51e 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -76,7 +76,7 @@ By design, d1 is the smallest direction and d2 is the highest
d2 = text2num( copytext( icon_state, dash+1 ) )
- var/turf/T = src.loc // hide if turf is not intact
+ var/turf/T = get_turf(src) // hide if turf is not intact
if(level==1) hide(T.intact)
GLOB.cable_list += src //add it to the global cable list
@@ -115,14 +115,8 @@ By design, d1 is the smallest direction and d2 is the highest
else
icon_state = "[d1]-[d2]"
-
-// Items usable on a cable :
-// - Wirecutters : cut it duh !
-// - Cable coil : merge cables
-// - Multitool : get the power currently passing through the cable
-//
-/obj/structure/cable/attackby(obj/item/W, mob/user, params)
- var/turf/T = src.loc
+/obj/structure/cable/proc/handlecable(obj/item/W, mob/user, params)
+ var/turf/T = get_turf(src)
if(T.intact)
return
if(istype(W, /obj/item/weapon/wirecutters))
@@ -141,6 +135,12 @@ By design, d1 is the smallest direction and d2 is the highest
return
coil.cable_join(src, user)
+ else if(istype(W, /obj/item/weapon/twohanded/rcl))
+ var/obj/item/weapon/twohanded/rcl/R = W
+ if(R.loaded)
+ R.loaded.cable_join(src, user)
+ R.is_empty(user)
+
else if(istype(W, /obj/item/device/multitool))
if(powernet && (powernet.avail > 0)) // is it powered?
to_chat(user, "[powernet.avail]W in power network.")
@@ -150,6 +150,15 @@ By design, d1 is the smallest direction and d2 is the highest
src.add_fingerprint(user)
+// Items usable on a cable :
+// - Wirecutters : cut it duh !
+// - Cable coil : merge cables
+// - Multitool : get the power currently passing through the cable
+//
+/obj/structure/cable/attackby(obj/item/W, mob/user, params)
+ handlecable(W, user, params)
+
+
// shock the user with probability prb
/obj/structure/cable/proc/shock(mob/user, prb, siemens_coeff = 1)
if(!prob(prb))
@@ -301,7 +310,7 @@ By design, d1 is the smallest direction and d2 is the highest
//first let's add turf cables to our powernet
//then we'll connect machines on turf with a node cable is present
for(var/AM in loc)
- if(istype(AM,/obj/structure/cable))
+ if(istype(AM, /obj/structure/cable))
var/obj/structure/cable/C = AM
if(C.d1 == d1 || C.d2 == d1 || C.d1 == d2 || C.d2 == d2) //only connected if they have a common direction
if(C.powernet == powernet)
@@ -311,7 +320,7 @@ By design, d1 is the smallest direction and d2 is the highest
else
powernet.add_cable(C) //the cable was powernetless, let's just add it to our powernet
- else if(istype(AM,/obj/machinery/power/apc))
+ else if(istype(AM, /obj/machinery/power/apc))
var/obj/machinery/power/apc/N = AM
if(!N.terminal)
continue // APC are connected through their terminal
@@ -321,7 +330,7 @@ By design, d1 is the smallest direction and d2 is the highest
to_connect += N.terminal //we'll connect the machines after all cables are merged
- else if(istype(AM,/obj/machinery/power)) //other power machines
+ else if(istype(AM, /obj/machinery/power)) //other power machines
var/obj/machinery/power/M = AM
if(M.powernet == powernet)
@@ -459,6 +468,8 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
icon = 'icons/obj/power.dmi'
icon_state = "coil_red"
item_state = "coil_red"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
max_amount = MAXCOIL
amount = MAXCOIL
merge_type = /obj/item/stack/cable_coil // This is here to let its children merge between themselves
@@ -507,6 +518,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
// General procedures
///////////////////////////////////
+
//you can use wires to heal robotics
/obj/item/stack/cable_coil/attack(mob/living/carbon/human/H, mob/user)
if(!istype(H))
@@ -564,11 +576,11 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
return new path (location)
// called when cable_coil is clicked on a turf
-/obj/item/stack/cable_coil/proc/place_turf(turf/T, mob/user)
+/obj/item/stack/cable_coil/proc/place_turf(turf/T, mob/user, dirnew)
if(!isturf(user.loc))
return
- if(!T.can_have_cabling())
+ if(!isturf(T) || T.intact || !T.can_have_cabling())
to_chat(user, "You can only lay cables on catwalks and plating!")
return
@@ -580,47 +592,50 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
to_chat(user, "You can't lay cable at a place that far away!")
return
- else
- var/dirn
-
+ var/dirn
+ if(!dirnew) //If we weren't given a direction, come up with one! (Called as null from catwalk.dm and floor.dm)
if(user.loc == T)
- dirn = user.dir // if laying on the tile we're on, lay in the direction we're facing
+ dirn = user.dir //If laying on the tile we're on, lay in the direction we're facing
else
dirn = get_dir(T, user)
+ else
+ dirn = dirnew
- for(var/obj/structure/cable/LC in T)
- if(LC.d2 == dirn && LC.d1 == 0)
- to_chat(user, "There's already a cable at that position!")
- return
+ for(var/obj/structure/cable/LC in T)
+ if(LC.d2 == dirn && LC.d1 == 0)
+ to_chat(user, "There's already a cable at that position!")
+ return
- var/obj/structure/cable/C = get_new_cable(T)
+ var/obj/structure/cable/C = get_new_cable(T)
- //set up the new cable
- C.d1 = 0 //it's a O-X node cable
- C.d2 = dirn
- C.add_fingerprint(user)
- C.update_icon()
+ //set up the new cable
+ C.d1 = 0 //it's a O-X node cable
+ C.d2 = dirn
+ C.add_fingerprint(user)
+ C.update_icon()
- //create a new powernet with the cable, if needed it will be merged later
- var/datum/powernet/PN = new()
- PN.add_cable(C)
+ //create a new powernet with the cable, if needed it will be merged later
+ var/datum/powernet/PN = new()
+ PN.add_cable(C)
- C.mergeConnectedNetworks(C.d2) //merge the powernet with adjacents powernets
- C.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets
+ C.mergeConnectedNetworks(C.d2) //merge the powernet with adjacents powernets
+ C.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets
- if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions
- C.mergeDiagonalsNetworks(C.d2)
+ if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions
+ C.mergeDiagonalsNetworks(C.d2)
+ use(1)
- use(1)
+ if(C.shock(user, 50))
+ if(prob(50)) //fail
+ new /obj/item/stack/cable_coil(get_turf(C), 1, C.color)
+ C.deconstruct()
- if (C.shock(user, 50))
- if (prob(50)) //fail
- C.deconstruct()
+ return C
// called when cable_coil is click on an installed obj/cable
// or click on a turf that already contains a "node" cable
-/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user)
+/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user, var/showerror = TRUE)
var/turf/U = user.loc
if(!isturf(U))
return
@@ -644,7 +659,8 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
// one end of the clicked cable is pointing towards us
if(C.d1 == dirn || C.d2 == dirn)
if(!U.can_have_cabling()) //checking if it's a plating or catwalk
- to_chat(user, "You can only lay cables on catwalks and plating!")
+ if (showerror)
+ to_chat(user, "You can only lay cables on catwalks and plating!")
return
if(U.intact) //can't place a cable if it's a plating with a tile on it
to_chat(user, "You can't lay cable there unless the floor tiles are removed!")
@@ -657,7 +673,8 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already
if(LC.d1 == fdirn || LC.d2 == fdirn)
- to_chat(user, "There's already a cable at that position!")
+ if (showerror)
+ to_chat(user, "There's already a cable at that position!")
return
var/obj/structure/cable/NC = get_new_cable (U)
@@ -701,7 +718,9 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
if(LC == C) // skip the cable we're interacting with
continue
if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction
- to_chat(user, "There's already a cable at that position!")
+ if (showerror)
+ to_chat(user, "There's already a cable at that position!")
+
return
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index fb3a96162e..557d6fd75a 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/power.dmi'
icon_state = "cell"
item_state = "cell"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
origin_tech = "powerstorage=1"
force = 5
throwforce = 5
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 36804b6121..8475ed1627 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -372,13 +372,14 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
// Shake everyone on the z level to let them know that gravity was enagaged/disenagaged.
/obj/machinery/gravity_generator/main/proc/shake_everyone()
var/turf/T = get_turf(src)
+ var/sound/alert_sound = sound('sound/effects/alert.ogg')
for(var/mob/M in GLOB.mob_list)
if(M.z != z)
continue
M.update_gravity(M.mob_has_gravity())
if(M.client)
shake_camera(M, 15, 1)
- M.playsound_local(T, 'sound/effects/alert.ogg', 100, 1, 0.5)
+ M.playsound_local(T, null, 100, 1, 0.5, S = alert_sound)
/obj/machinery/gravity_generator/main/proc/gravity_in_level()
var/turf/T = get_turf(src)
@@ -400,7 +401,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
// Misc
-/obj/item/weapon/paper/gravity_gen
+/obj/item/weapon/paper/guides/jobs/engi/gravity_gen
name = "paper- 'Generate your own gravity!'"
info = {"
Gravity Generator Instructions For Dummies
Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index f2cfd807ce..b0d07e88d5 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -194,7 +194,7 @@
if(AM == source)
continue //we don't want to return source
- if(!cable_only && istype(AM,/obj/machinery/power))
+ if(!cable_only && istype(AM, /obj/machinery/power))
var/obj/machinery/power/P = AM
if(P.powernet == 0)
continue // exclude APCs which have powernet=0
@@ -203,7 +203,7 @@
if(d == 0)
. += P
- else if(istype(AM,/obj/structure/cable))
+ else if(istype(AM, /obj/structure/cable))
var/obj/structure/cable/C = AM
if(!unmarked || !C.powernet)
@@ -228,13 +228,13 @@
P = worklist[index] //get the next power object found
index++
- if( istype(P,/obj/structure/cable))
+ if( istype(P, /obj/structure/cable))
var/obj/structure/cable/C = P
if(C.powernet != PN) //add it to the powernet, if it isn't already there
PN.add_cable(C)
worklist |= C.get_connections() //get adjacents power objects, with or without a powernet
- else if(P.anchored && istype(P,/obj/machinery/power))
+ else if(P.anchored && istype(P, /obj/machinery/power))
var/obj/machinery/power/M = P
found_machines |= M //we wait until the powernet is fully propagates to connect the machines
@@ -279,7 +279,7 @@
//dist_check - set to only shock mobs within 1 of source (vendors, airlocks, etc.)
//No animations will be performed by this proc.
/proc/electrocute_mob(mob/living/carbon/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE)
- if(istype(M.loc,/obj/mecha))
+ if(istype(M.loc, /obj/mecha))
return 0 //feckin mechs are dumb
if(dist_check)
if(!in_range(source,M))
@@ -292,21 +292,21 @@
return 0 //to avoid spamming with insulated glvoes on
var/area/source_area
- if(istype(power_source,/area))
+ if(istype(power_source, /area))
source_area = power_source
power_source = source_area.get_apc()
- if(istype(power_source,/obj/structure/cable))
+ if(istype(power_source, /obj/structure/cable))
var/obj/structure/cable/Cable = power_source
power_source = Cable.powernet
var/datum/powernet/PN
var/obj/item/weapon/stock_parts/cell/cell
- if(istype(power_source,/datum/powernet))
+ if(istype(power_source, /datum/powernet))
PN = power_source
- else if(istype(power_source,/obj/item/weapon/stock_parts/cell))
+ else if(istype(power_source, /obj/item/weapon/stock_parts/cell))
cell = power_source
- else if(istype(power_source,/obj/machinery/power/apc))
+ else if(istype(power_source, /obj/machinery/power/apc))
var/obj/machinery/power/apc/apc = power_source
cell = apc.cell
if (apc.terminal)
@@ -338,7 +338,7 @@
if (source_area)
source_area.use_power(drained_energy/GLOB.CELLRATE)
- else if (istype(power_source,/datum/powernet))
+ else if (istype(power_source, /datum/powernet))
var/drained_power = drained_energy/GLOB.CELLRATE //convert from "joules" to "watts"
PN.load+=drained_power
else if (istype(power_source, /obj/item/weapon/stock_parts/cell))
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index b7000d3535..5c01b60416 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -18,6 +18,9 @@ GLOBAL_LIST_EMPTY(rad_collectors)
var/locked = FALSE
var/drainratio = 1
+/obj/machinery/power/rad_collector/anchored
+ anchored = TRUE
+
/obj/machinery/power/rad_collector/New()
..()
GLOB.rad_collectors += src
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index a14b45599f..6e4942807f 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -33,6 +33,19 @@
var/datum/effect_system/spark_spread/sparks
+/obj/machinery/power/emitter/anchored
+ anchored = TRUE
+
+/obj/machinery/power/emitter/ctf
+ name = "Energy Cannon"
+ active = TRUE
+ active_power_usage = FALSE
+ idle_power_usage = FALSE
+ locked = TRUE
+ req_access_txt = "100"
+ state = 2
+ use_power = FALSE
+
/obj/machinery/power/emitter/New()
..()
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/emitter(null)
@@ -97,7 +110,7 @@
sparks.set_up(5, TRUE, src)
/obj/machinery/power/emitter/Destroy()
- if(SSticker && SSticker.IsRoundInProgress())
+ if(SSticker.IsRoundInProgress())
var/turf/T = get_turf(src)
message_admins("Emitter deleted at [ADMIN_COORDJMP(T)]",0,1)
log_game("Emitter deleted at [COORD(T)]")
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 370e2e6a06..697a80d7cd 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -169,24 +169,24 @@
connected_parts.Cut()
T = get_step(T,rdir)
- if(!check_part(T,/obj/structure/particle_accelerator/fuel_chamber))
+ if(!check_part(T, /obj/structure/particle_accelerator/fuel_chamber))
return 0
T = get_step(T,odir)
- if(!check_part(T,/obj/structure/particle_accelerator/end_cap))
+ if(!check_part(T, /obj/structure/particle_accelerator/end_cap))
return 0
T = get_step(T,dir)
T = get_step(T,dir)
- if(!check_part(T,/obj/structure/particle_accelerator/power_box))
+ if(!check_part(T, /obj/structure/particle_accelerator/power_box))
return 0
T = get_step(T,dir)
- if(!check_part(T,/obj/structure/particle_accelerator/particle_emitter/center))
+ if(!check_part(T, /obj/structure/particle_accelerator/particle_emitter/center))
return 0
T = get_step(T,ldir)
- if(!check_part(T,/obj/structure/particle_accelerator/particle_emitter/left))
+ if(!check_part(T, /obj/structure/particle_accelerator/particle_emitter/left))
return 0
T = get_step(T,rdir)
T = get_step(T,rdir)
- if(!check_part(T,/obj/structure/particle_accelerator/particle_emitter/right))
+ if(!check_part(T, /obj/structure/particle_accelerator/particle_emitter/right))
return 0
assembled = 1
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 2a8d3f8a60..50f01f4259 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -191,7 +191,7 @@
cell.charge = (charge / capacity) * cell.maxcharge
/obj/machinery/power/smes/Destroy()
- if(SSticker && SSticker.IsRoundInProgress())
+ if(SSticker.IsRoundInProgress())
var/area/A = get_area(src)
var/turf/T = get_turf(src)
message_admins("SMES deleted at [A][ADMIN_JMP(T)]")
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 0da3841bd7..1eb048c78b 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -184,6 +184,8 @@
icon = 'icons/obj/power.dmi'
icon_state = "sp_base"
item_state = "electropack"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY // Pretty big!
anchored = FALSE
var/tracker = 0
@@ -493,6 +495,6 @@
// MISC
//
-/obj/item/weapon/paper/solar
+/obj/item/weapon/paper/guides/jobs/engi/solars
name = "paper- 'Going green! Setup your own solar array instructions.'"
info = "
Welcome
At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuel or plasma! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.
You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!
Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.
Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.
That's all to it, be safe, be green!
"
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index e80b4cd9b6..816cd97874 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -582,7 +582,7 @@
L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\
"The unearthly ringing subsides and you notice you have new radiation burns.", 2)
else
- L.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2)
+ L.show_message("You hear an unearthly ringing and notice your skin is covered in fresh radiation burns.", 2)
// When you wanna make a supermatter shard for the dramatic effect, but
// don't want it exploding suddenly
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 042d827bff..9fc63d9421 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -1,24 +1,6 @@
#define TESLA_DEFAULT_POWER 1738260
#define TESLA_MINI_POWER 869130
-GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmospherics,
- /obj/machinery/power/emitter,
- /obj/machinery/field/generator,
- /mob/living/simple_animal,
- /obj/machinery/particle_accelerator/control_box,
- /obj/structure/particle_accelerator/fuel_chamber,
- /obj/structure/particle_accelerator/particle_emitter/center,
- /obj/structure/particle_accelerator/particle_emitter/left,
- /obj/structure/particle_accelerator/particle_emitter/right,
- /obj/structure/particle_accelerator/power_box,
- /obj/structure/particle_accelerator/end_cap,
- /obj/machinery/field/containment,
- /obj/structure/disposalpipe,
- /obj/structure/sign,
- /obj/machinery/gateway,
- /obj/structure/lattice,
- /obj/structure/grille,
- /obj/machinery/the_singularitygen/tesla)))
/obj/singularity/energy_ball
name = "energy ball"
desc = "An energy ball."
@@ -183,8 +165,27 @@ GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmosp
var/obj/machinery/closest_machine
var/obj/structure/closest_structure
var/obj/structure/blob/closest_blob
+ var/static/things_to_shock = typecacheof(list(/obj/machinery, /mob/living, /obj/structure))
+ var/static/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
+ /obj/machinery/power/emitter,
+ /obj/machinery/field/generator,
+ /mob/living/simple_animal,
+ /obj/machinery/particle_accelerator/control_box,
+ /obj/structure/particle_accelerator/fuel_chamber,
+ /obj/structure/particle_accelerator/particle_emitter/center,
+ /obj/structure/particle_accelerator/particle_emitter/left,
+ /obj/structure/particle_accelerator/particle_emitter/right,
+ /obj/structure/particle_accelerator/power_box,
+ /obj/structure/particle_accelerator/end_cap,
+ /obj/machinery/field/containment,
+ /obj/structure/disposalpipe,
+ /obj/structure/sign,
+ /obj/machinery/gateway,
+ /obj/structure/lattice,
+ /obj/structure/grille,
+ /obj/machinery/the_singularitygen/tesla))
- for(var/A in oview(source, zap_range+2))
+ for(var/A in typecache_filter_multi_list_exclusion(oview(source, zap_range+2), things_to_shock, blacklisted_tesla_types))
if(istype(A, /obj/machinery/power/tesla_coil))
var/dist = get_dist(source, A)
var/obj/machinery/power/tesla_coil/C = A
@@ -207,7 +208,7 @@ GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmosp
closest_atom = A
closest_dist = dist
- else if(closest_grounding_rod || is_type_in_typecache(A, GLOB.blacklisted_tesla_types))
+ else if(closest_grounding_rod)
continue
else if(isliving(A))
diff --git a/code/modules/procedural_mapping/mapGenerator.dm b/code/modules/procedural_mapping/mapGenerator.dm
index 5653e80422..966ef2f9e2 100644
--- a/code/modules/procedural_mapping/mapGenerator.dm
+++ b/code/modules/procedural_mapping/mapGenerator.dm
@@ -17,7 +17,6 @@
//All
#define CLUSTER_CHECK_ALL 30 //Don't let anything cluster, like, at all
-
/datum/mapGenerator
//Map information
@@ -26,8 +25,12 @@
//mapGeneratorModule information
var/list/modules = list()
+ var/buildmode_name = "Undocumented"
+
/datum/mapGenerator/New()
..()
+ if(buildmode_name == "Undocumented")
+ buildmode_name = copytext("[type]", 20) // / d a t u m / m a p g e n e r a t o r / = 20 characters.
initialiseModules()
//Defines the region the map represents, sets map
diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
index 4d07342051..6fdcccd43f 100644
--- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
+++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
@@ -20,13 +20,29 @@
/datum/mapGeneratorModule/bottomLayer/massdelete
spawnableAtoms = list()
spawnableTurfs = list()
+ var/deleteturfs = TRUE //separate var for the empty type.
+ var/list/ignore_typecache
/datum/mapGeneratorModule/bottomLayer/massdelete/generate()
if(!mother)
return
for(var/V in mother.map)
var/turf/T = V
- T.empty()
+ T.empty(deleteturfs? null : T.type, ignore_typecache = ignore_typecache, forceop = TRUE)
+
+/datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs/New()
+ ..()
+ ignore_typecache = typecacheof(list(/mob))
+
+/datum/mapGeneratorModule/bottomLayer/massdelete/leave_turfs
+ deleteturfs = FALSE
+
+/datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete
+ deleteturfs = FALSE
+
+/datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete/New()
+ ..()
+ ignore_typecache = typecacheof(list(/mob))
//Only places atoms/turfs on area borders
/datum/mapGeneratorModule/border
@@ -49,6 +65,20 @@
/datum/mapGenerator/repressurize
modules = list(/datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Block: Restore Roundstart Air Contents"
/datum/mapGenerator/massdelete
- modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete)
\ No newline at end of file
+ modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete)
+ buildmode_name = "Block: Full Mass Deletion"
+
+/datum/mapGenerator/massdelete/nomob
+ modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs)
+ buildmode_name = "Block: Mass Deletion - Leave Mobs"
+
+/datum/mapGenerator/massdelete/noturf
+ modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete/leave_turfs)
+ buildmode_name = "Block: Mass Deletion - Leave Turfs"
+
+/datum/mapGenerator/massdelete/regen
+ modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete)
+ buildmode_name = "Block: Mass Deletion - Leave Mobs and Turfs"
diff --git a/code/modules/procedural_mapping/mapGeneratorReadme.dm b/code/modules/procedural_mapping/mapGeneratorReadme.dm
index ae656b5b30..c4ced7674b 100644
--- a/code/modules/procedural_mapping/mapGeneratorReadme.dm
+++ b/code/modules/procedural_mapping/mapGeneratorReadme.dm
@@ -80,7 +80,7 @@ mapGeneratorModule
Simple Workflow:
1. Define a/some mapGeneratorModule(s) to your liking, choosing atoms and turfs to spawn
- #Note: I chose to split Turfs and Atoms off into seperate modules, but this is NOT required.
+ #Note: I chose to split Turfs and Atoms off into separate modules, but this is NOT required.
#Note: A mapGeneratorModule may have turfs AND atoms, so long as each is in it's appropriate list
2. Define a mapGenerator type who's modules list contains the typepath(s) of all the module(s) you wish to use
@@ -98,7 +98,7 @@ Simple Workflow:
Option Suggestions:
- * Have seperate modules for Turfs and Atoms, this is not enforced, but it is how I have structured my nature example.
+ * Have separate modules for Turfs and Atoms, this is not enforced, but it is how I have structured my nature example.
* If your map doesn't look quite to your liking, simply jiggle with the variables on your modules and the type probabilities
* You can mix and map premade areas with the procedural generation, for example mapping an entire flat land but having code generate just the grass tufts
diff --git a/code/modules/procedural_mapping/mapGenerators/asteroid.dm b/code/modules/procedural_mapping/mapGenerators/asteroid.dm
index 1c31bb5697..35690058c9 100644
--- a/code/modules/procedural_mapping/mapGenerators/asteroid.dm
+++ b/code/modules/procedural_mapping/mapGenerators/asteroid.dm
@@ -29,17 +29,21 @@
/datum/mapGenerator/asteroid/hollow
modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidTurfs, \
/datum/mapGeneratorModule/border/asteroidWalls)
+ buildmode_name = "Pattern: Asteroid Room \[AIRLESS!\]"
/datum/mapGenerator/asteroid/hollow/random
modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidTurfs, \
/datum/mapGeneratorModule/border/asteroidWalls, \
/datum/mapGeneratorModule/splatterLayer/asteroidWalls)
+ buildmode_name = "Pattern: Asteroid Room: Splatter Walls \[AIRLESS!\]"
/datum/mapGenerator/asteroid/hollow/random/monsters
modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidTurfs, \
/datum/mapGeneratorModule/border/asteroidWalls, \
/datum/mapGeneratorModule/splatterLayer/asteroidWalls, \
/datum/mapGeneratorModule/splatterLayer/asteroidMonsters)
+ buildmode_name = "Pattern: Asteroid Room: Splatter Walls + Monsters \[AIRLESS!\]"
/datum/mapGenerator/asteroid/filled
- modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidWalls)
\ No newline at end of file
+ modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidWalls)
+ buildmode_name = "Block: Asteroid Walls"
\ No newline at end of file
diff --git a/code/modules/procedural_mapping/mapGenerators/cellular.dm b/code/modules/procedural_mapping/mapGenerators/cellular.dm
index fb7fd32148..3daa7632ff 100644
--- a/code/modules/procedural_mapping/mapGenerators/cellular.dm
+++ b/code/modules/procedural_mapping/mapGenerators/cellular.dm
@@ -12,7 +12,7 @@
var/list/current_state
var/width = 10
var/height = 10
- var/list/type_map = list(/turf/open/floor/plating,/turf/closed/wall)
+ var/list/type_map = list(/turf/open/floor/plating, /turf/closed/wall)
var/turf/start = null
/datum/mapGenerator/ca/defineRegion(turf/Start, turf/End, replace = 0)
@@ -88,7 +88,7 @@
/datum/mapGenerator/ca/caves
b_rule = list(5,6,7,8)
s_rule = list(4)
- type_map = list(/turf/open/floor/plating/asteroid/basalt,/turf/closed/mineral/volcanic)
+ type_map = list(/turf/open/floor/plating/asteroid/basalt, /turf/closed/mineral/volcanic)
iterations = 5
/datum/mapGenerator/ca/maze
diff --git a/code/modules/procedural_mapping/mapGenerators/cult.dm b/code/modules/procedural_mapping/mapGenerators/cult.dm
index c76a611b7e..ea9c7da946 100644
--- a/code/modules/procedural_mapping/mapGenerators/cult.dm
+++ b/code/modules/procedural_mapping/mapGenerators/cult.dm
@@ -4,28 +4,30 @@
/datum/mapGeneratorModule/border/cultWalls
spawnableTurfs = list(/turf/closed/wall/mineral/cult = 100)
-
/datum/mapGeneratorModule/bottomLayer/clockFloor
spawnableTurfs = list(/turf/open/floor/clockwork = 100)
/datum/mapGeneratorModule/border/clockWalls
spawnableTurfs = list(/turf/closed/wall/clockwork = 100)
-
/datum/mapGenerator/cult //walls and floor only
- modules = list(/datum/mapGeneratorModule/bottomLayer/cultFloor, \
+ modules = list(/datum/mapGeneratorModule/bottomLayer/cultFloor, \
/datum/mapGeneratorModule/border/cultWalls, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Pattern: Cult Room"
/datum/mapGenerator/clock //walls and floor only
- modules = list(/datum/mapGeneratorModule/bottomLayer/clockFloor, \
+ modules = list(/datum/mapGeneratorModule/bottomLayer/clockFloor, \
/datum/mapGeneratorModule/border/clockWalls, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Pattern: Clockwork Room"
/datum/mapGenerator/cult/floor //floors only
- modules = list(/datum/mapGeneratorModule/bottomLayer/cultFloor, \
+ modules = list(/datum/mapGeneratorModule/bottomLayer/cultFloor, \
/datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Block: Cult Floor"
/datum/mapGenerator/clock/floor //floor only
- modules = list(/datum/mapGeneratorModule/bottomLayer/clockFloor, \
- /datum/mapGeneratorModule/bottomLayer/repressurize)
\ No newline at end of file
+ modules = list(/datum/mapGeneratorModule/bottomLayer/clockFloor, \
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Block: Clockwork Floor"
diff --git a/code/modules/procedural_mapping/mapGenerators/lava_river.dm b/code/modules/procedural_mapping/mapGenerators/lava_river.dm
index 2dbfc7ecd7..4aadd48a58 100644
--- a/code/modules/procedural_mapping/mapGenerators/lava_river.dm
+++ b/code/modules/procedural_mapping/mapGenerators/lava_river.dm
@@ -5,6 +5,7 @@
var/max_x = 0
var/max_y = 0
modules = list(/datum/mapGeneratorModule/river)
+ buildmode_name = "Pattern: Lava Rivers"
/datum/mapGenerator/lavaland/defineRegion(turf/Start, turf/End, replace = 0)
start_z = Start.z
diff --git a/code/modules/procedural_mapping/mapGenerators/lavaland.dm b/code/modules/procedural_mapping/mapGenerators/lavaland.dm
index 9c160ee848..e6d7b00e8d 100644
--- a/code/modules/procedural_mapping/mapGenerators/lavaland.dm
+++ b/code/modules/procedural_mapping/mapGenerators/lavaland.dm
@@ -22,9 +22,12 @@
/datum/mapGenerator/lavaland/ground_only
modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_default)
+ buildmode_name = "Block: Lavaland Floor"
/datum/mapGenerator/lavaland/dense_ores
modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_mineral/dense)
+ buildmode_name = "Block: Lavaland Ores: Dense"
/datum/mapGenerator/lavaland/normal_ores
modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_mineral)
+ buildmode_name = "Block: Lavaland Ores"
diff --git a/code/modules/procedural_mapping/mapGenerators/nature.dm b/code/modules/procedural_mapping/mapGenerators/nature.dm
index 6ad1dfcf7e..abb4e7ed10 100644
--- a/code/modules/procedural_mapping/mapGenerators/nature.dm
+++ b/code/modules/procedural_mapping/mapGenerators/nature.dm
@@ -8,4 +8,4 @@
/datum/mapGeneratorModule/randBushes, \
/datum/mapGeneratorModule/randRocks, \
/datum/mapGeneratorModule/denseLayer/grassTufts)
-
+ buildmode_name = "Pattern: Nature"
diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm
index 3a344ac94a..f9b94bba89 100644
--- a/code/modules/procedural_mapping/mapGenerators/repair.dm
+++ b/code/modules/procedural_mapping/mapGenerators/repair.dm
@@ -16,16 +16,92 @@
spawnableTurfs = list(/turf/closed/wall = 100)
allowAtomsOnSpace = TRUE
+/datum/mapGeneratorModule/reload_station_map/generate()
+ if(!istype(mother, /datum/mapGenerator/repair/reload_station_map))
+ return
+ var/datum/mapGenerator/repair/reload_station_map/mother1 = mother
+ if(mother1.z != ZLEVEL_STATION)
+ return //This is only for reloading station blocks!
+ GLOB.reloading_map = TRUE
+ var/static/dmm_suite/reloader = new
+ var/list/bounds = reloader.load_map(file(SSmapping.config.GetFullMapPath()),measureOnly = FALSE, no_changeturf = FALSE,x_offset = 0, y_offset = 0, z_offset = ZLEVEL_STATION, cropMap=TRUE, lower_crop_x = mother1.x_low, lower_crop_y = mother1.y_low, upper_crop_x = mother1.x_high, upper_crop_y = mother1.y_high)
+
+ var/list/obj/machinery/atmospherics/atmos_machines = list()
+ var/list/obj/structure/cable/cables = list()
+ var/list/atom/atoms = list()
+
+ repopulate_sorted_areas()
+
+ for(var/L in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]),
+ locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])))
+ set waitfor = FALSE
+ var/turf/B = L
+ atoms += B
+ for(var/A in B)
+ atoms += A
+ if(istype(A,/obj/structure/cable))
+ cables += A
+ continue
+ if(istype(A,/obj/machinery/atmospherics))
+ atmos_machines += A
+
+ SSatoms.InitializeAtoms(atoms)
+ SSmachines.setup_template_powernets(cables)
+ SSair.setup_template_machinery(atmos_machines)
+ GLOB.reloading_map = FALSE
+
/datum/mapGenerator/repair
modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel,
/datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Repair: Floor"
/datum/mapGenerator/repair/delete_walls
modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/flatten,
/datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Repair: Floor: Flatten Walls"
/datum/mapGenerator/repair/enclose_room
modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/flatten,
/datum/mapGeneratorModule/border/normalWalls,
/datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Repair: Generate Aired Room"
+/datum/mapGenerator/repair/reload_station_map
+ modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs)
+ var/x_low = 0
+ var/x_high = 0
+ var/y_low = 0
+ var/y_high = 0
+ var/z = 0
+ var/cleanload = FALSE
+ var/datum/mapGeneratorModule/reload_station_map/loader
+ buildmode_name = "Repair: Reload Block \[DO NOT USE\]"
+
+/datum/mapGenerator/repair/reload_station_map/clean
+ buildmode_name = "Repair: Reload Block - Mass Delete"
+ cleanload = TRUE
+
+/datum/mapGenerator/repair/reload_station_map/clean/in_place
+ modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete)
+ buildmode_name = "Repair: Reload Block - Mass Delete - In Place"
+
+/datum/mapGenerator/repair/reload_station_map/defineRegion(turf/start, turf/end)
+ . = ..()
+ if(start.z != ZLEVEL_STATION || end.z != ZLEVEL_STATION)
+ return
+ x_low = min(start.x, end.x)
+ y_low = min(start.y, end.y)
+ x_high = max(start.x, end.x)
+ y_high = max(start.y, end.y)
+ z = ZLEVEL_STATION
+
+GLOBAL_VAR_INIT(reloading_map, FALSE)
+
+/datum/mapGenerator/repair/reload_station_map/generate(clean = cleanload)
+ if(!loader)
+ loader = new
+ if(cleanload)
+ ..() //Trigger mass deletion.
+ modules |= loader
+ syncModules()
+ loader.generate()
diff --git a/code/modules/procedural_mapping/mapGenerators/shuttle.dm b/code/modules/procedural_mapping/mapGenerators/shuttle.dm
index b155335bde..7ce98040bb 100644
--- a/code/modules/procedural_mapping/mapGenerators/shuttle.dm
+++ b/code/modules/procedural_mapping/mapGenerators/shuttle.dm
@@ -7,9 +7,11 @@
// Generators
/datum/mapGenerator/shuttle/full
- modules = list(/datum/mapGeneratorModule/bottomLayer/shuttleFloor, \
+ modules = list(/datum/mapGeneratorModule/bottomLayer/shuttleFloor, \
/datum/mapGeneratorModule/border/shuttleWalls,\
/datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Pattern: Shuttle Room"
/datum/mapGenerator/shuttle/floor
modules = list(/datum/mapGeneratorModule/bottomLayer/shuttleFloor)
+ buildmode_name = "Block: Shuttle Floor"
diff --git a/code/modules/procedural_mapping/mapGenerators/syndicate.dm b/code/modules/procedural_mapping/mapGenerators/syndicate.dm
index 98e87a8b91..dd0f5caec9 100644
--- a/code/modules/procedural_mapping/mapGenerators/syndicate.dm
+++ b/code/modules/procedural_mapping/mapGenerators/syndicate.dm
@@ -1,52 +1,56 @@
-// Modules
-
-/turf/open/floor/plasteel/shuttle/red/syndicate
- name = "floor" //Not Brig Floor
-
-/datum/mapGeneratorModule/bottomLayer/syndieFloor
- spawnableTurfs = list(/turf/open/floor/plasteel/shuttle/red/syndicate = 100)
-
-/datum/mapGeneratorModule/border/syndieWalls
- spawnableAtoms = list()
- spawnableTurfs = list(/turf/closed/wall/r_wall = 100)
-
-
-/datum/mapGeneratorModule/syndieFurniture
- clusterCheckFlags = CLUSTER_CHECK_ALL
- spawnableTurfs = list()
- spawnableAtoms = list(/obj/structure/table = 20,/obj/structure/chair = 15,/obj/structure/chair/stool = 10, \
- /obj/structure/frame/computer = 15, /obj/item/weapon/storage/toolbox/syndicate = 15 ,\
- /obj/structure/closet/syndicate = 25, /obj/machinery/suit_storage_unit/syndicate = 15)
-
-/datum/mapGeneratorModule/splatterLayer/syndieMobs
- spawnableAtoms = list(/mob/living/simple_animal/hostile/syndicate = 30, \
- /mob/living/simple_animal/hostile/syndicate/melee = 20, \
- /mob/living/simple_animal/hostile/syndicate/ranged = 20, \
- /mob/living/simple_animal/hostile/viscerator = 30)
- spawnableTurfs = list()
-
-// Generators
-
-/datum/mapGenerator/syndicate/empty //walls and floor only
- modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
- /datum/mapGeneratorModule/border/syndieWalls,\
- /datum/mapGeneratorModule/bottomLayer/repressurize)
-
-/datum/mapGenerator/syndicate/mobsonly
- modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
- /datum/mapGeneratorModule/border/syndieWalls,\
- /datum/mapGeneratorModule/splatterLayer/syndieMobs, \
- /datum/mapGeneratorModule/bottomLayer/repressurize)
-
-/datum/mapGenerator/syndicate/furniture
- modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
- /datum/mapGeneratorModule/border/syndieWalls,\
- /datum/mapGeneratorModule/syndieFurniture, \
- /datum/mapGeneratorModule/bottomLayer/repressurize)
-
-/datum/mapGenerator/syndicate/full
- modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
- /datum/mapGeneratorModule/border/syndieWalls,\
- /datum/mapGeneratorModule/syndieFurniture, \
- /datum/mapGeneratorModule/splatterLayer/syndieMobs, \
- /datum/mapGeneratorModule/bottomLayer/repressurize)
+// Modules
+
+/turf/open/floor/plasteel/shuttle/red/syndicate
+ name = "floor" //Not Brig Floor
+
+/datum/mapGeneratorModule/bottomLayer/syndieFloor
+ spawnableTurfs = list(/turf/open/floor/plasteel/shuttle/red/syndicate = 100)
+
+/datum/mapGeneratorModule/border/syndieWalls
+ spawnableAtoms = list()
+ spawnableTurfs = list(/turf/closed/wall/r_wall = 100)
+
+
+/datum/mapGeneratorModule/syndieFurniture
+ clusterCheckFlags = CLUSTER_CHECK_ALL
+ spawnableTurfs = list()
+ spawnableAtoms = list(/obj/structure/table = 20,/obj/structure/chair = 15,/obj/structure/chair/stool = 10, \
+ /obj/structure/frame/computer = 15, /obj/item/weapon/storage/toolbox/syndicate = 15 ,\
+ /obj/structure/closet/syndicate = 25, /obj/machinery/suit_storage_unit/syndicate = 15)
+
+/datum/mapGeneratorModule/splatterLayer/syndieMobs
+ spawnableAtoms = list(/mob/living/simple_animal/hostile/syndicate = 30, \
+ /mob/living/simple_animal/hostile/syndicate/melee = 20, \
+ /mob/living/simple_animal/hostile/syndicate/ranged = 20, \
+ /mob/living/simple_animal/hostile/viscerator = 30)
+ spawnableTurfs = list()
+
+// Generators
+
+/datum/mapGenerator/syndicate/empty //walls and floor only
+ modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
+ /datum/mapGeneratorModule/border/syndieWalls,\
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Pattern: Shuttle Room: Syndicate"
+
+/datum/mapGenerator/syndicate/mobsonly
+ modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
+ /datum/mapGeneratorModule/border/syndieWalls,\
+ /datum/mapGeneratorModule/splatterLayer/syndieMobs, \
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Pattern: Shuttle Room: Syndicate: Mobs"
+
+/datum/mapGenerator/syndicate/furniture
+ modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
+ /datum/mapGeneratorModule/border/syndieWalls,\
+ /datum/mapGeneratorModule/syndieFurniture, \
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Pattern: Shuttle Room: Syndicate: Furniture"
+
+/datum/mapGenerator/syndicate/full
+ modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
+ /datum/mapGeneratorModule/border/syndieWalls,\
+ /datum/mapGeneratorModule/syndieFurniture, \
+ /datum/mapGeneratorModule/splatterLayer/syndieMobs, \
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+ buildmode_name = "Pattern: Shuttle Room: Syndicate: All"
\ No newline at end of file
diff --git a/code/modules/projectiles/box_magazine.dm b/code/modules/projectiles/box_magazine.dm
index 028aebe66a..883954b5d2 100644
--- a/code/modules/projectiles/box_magazine.dm
+++ b/code/modules/projectiles/box_magazine.dm
@@ -7,6 +7,8 @@
flags = CONDUCT
slot_flags = SLOT_BELT
item_state = "syringe_kit"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
materials = list(MAT_METAL=30000)
throwforce = 2
w_class = WEIGHT_CLASS_TINY
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 115618f0b9..156a5ee81e 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -38,8 +38,8 @@
var/spread = 0 //Spread induced by the gun itself.
var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
- lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
var/obj/item/device/firing_pin/pin = /obj/item/device/firing_pin //standard firing pin for most guns
@@ -446,6 +446,7 @@
/datum/action/toggle_scope_zoom
name = "Toggle Scope"
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_LYING
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "sniper_zoom"
var/obj/item/weapon/gun/gun = null
@@ -487,11 +488,11 @@
if(WEST)
_x = -zoom_amt
- user.client.view = zoom_out_amt
+ user.client.change_view(zoom_out_amt)
user.client.pixel_x = world.icon_size*_x
user.client.pixel_y = world.icon_size*_y
else
- user.client.view = world.view
+ user.client.change_view(world.view)
user.client.pixel_x = 0
user.client.pixel_y = 0
return zoomed
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index e1c6e6fa6e..cdf5a4b817 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -374,7 +374,7 @@
/obj/item/weapon/gun/ballistic/automatic/sniper_rifle/syndicate
name = "syndicate sniper rifle"
- desc = "An illegally modified .50 cal sniper rifle with supression compatibility. Quickscoping still doesn't work."
+ desc = "An illegally modified .50 cal sniper rifle with suppression compatibility. Quickscoping still doesn't work."
pin = /obj/item/device/firing_pin/implant/pindicate
origin_tech = "combat=7;syndicate=6"
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 6c5e4d935c..226652f6d5 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -247,7 +247,7 @@
if(!SS.transfer_soul("FORCE", user)) //Something went wrong
qdel(SS)
return
- user.visible_message("[user.name]'s soul is captured by \the [src]!", "You've lost the gamble! Your soul is forfiet!")
+ user.visible_message("[user.name]'s soul is captured by \the [src]!", "You've lost the gamble! Your soul is forfeit!")
/////////////////////////////
// DOUBLE BARRELED SHOTGUN //
diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/beam_rifle.dm
index 0133edaa19..7617c57100 100644
--- a/code/modules/projectiles/guns/beam_rifle.dm
+++ b/code/modules/projectiles/guns/beam_rifle.dm
@@ -1,4 +1,16 @@
+#define ZOOM_LOCK_AUTOZOOM_FREEMOVE 0
+#define ZOOM_LOCK_AUTOZOOM_ANGLELOCK 1
+#define ZOOM_LOCK_CENTER_VIEW 2
+#define ZOOM_LOCK_OFF 3
+
+#define ZOOM_SPEED_STEP 0
+#define ZOOM_SPEED_INSTANT 1
+
+#define AUTOZOOM_PIXEL_STEP_FACTOR 48
+
+#define AIMING_BEAM_ANGLE_CHANGE_THRESHOLD 0.1
+
/obj/item/weapon/gun/energy/beam_rifle
name = "particle acceleration rifle"
desc = "An energy-based anti material marksman rifle that uses highly charged particle beams moving at extreme velocities to decimate whatever is unfortunate enough to be targetted by one. \
@@ -12,22 +24,13 @@
force = 15
materials = list()
origin_tech = ""
- recoil = 5
+ recoil = 4
ammo_x_offset = 3
ammo_y_offset = 3
modifystate = FALSE
- zoomable = TRUE
- zoom_amt = 17
- zoom_out_amt = 20
weapon_weight = WEAPON_HEAVY
w_class = WEIGHT_CLASS_BULKY
ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan)
- var/hipfire_inaccuracy = 2
- var/hipfire_recoil = 10
- var/scoped_inaccuracy = 0
- var/scoped_recoil = 3
- var/scoped = FALSE
- var/noscope = FALSE //Can you fire this without a scope?
cell_type = /obj/item/weapon/stock_parts/cell/beam_rifle
canMouseDown = TRUE
pin = null
@@ -37,13 +40,14 @@
var/aiming_time_left = 7
var/aiming_time_increase_user_movement = 3
var/scoped_slow = 1
- var/aiming_time_increase_angle_multiplier = 0.6
+ var/aiming_time_increase_angle_multiplier = 0.3
var/lastangle = 0
+ var/aiming_lastangle = 0
var/mob/current_user = null
- var/list/obj/effect/temp_visual/current_tracers = list()
+ var/obj/effect/projectile_beam/current_tracer
- var/structure_piercing = 2 //This doesn't always work!
+ var/structure_piercing = 2 //Amount * 2. For some reason structures aren't respecting this unless you have it doubled. Probably with the objects in question's Bump() code instead of this but I'll deal with this later.
var/structure_bleed_coeff = 0.7
var/wall_pierce_amount = 0
var/wall_devastate = 0
@@ -60,19 +64,122 @@
var/delay = 65
var/lastfire = 0
+ //ZOOMING
+ var/zoom_current_view_increase = 0
+ var/zoom_target_view_increase = 10
+ var/zoom_speed = ZOOM_SPEED_STEP
+ var/zooming = FALSE
+ var/zoom_lock = ZOOM_LOCK_AUTOZOOM_FREEMOVE
+ var/zooming_angle
+ var/current_zoom_x = 0
+ var/current_zoom_y = 0
+ var/zoom_animating = 0
+
var/static/image/charged_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_charged")
var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty")
+ var/datum/action/item_action/zoom_speed_action/zoom_speed_action
+ var/datum/action/item_action/zoom_lock_action/zoom_lock_action
+
/obj/item/weapon/gun/energy/beam_rifle/debug
delay = 0
cell_type = /obj/item/weapon/stock_parts/cell/infinite
aiming_time = 0
recoil = 0
- scoped_recoil = 0
- hipfire_recoil = 0
- hipfire_inaccuracy = 0
- scoped_inaccuracy = 0
- noscope = 1
+ pin = /obj/item/device/firing_pin
+
+/obj/item/weapon/gun/energy/beam_rifle/equipped(mob/user)
+ set_user(user)
+ . = ..()
+
+/obj/item/weapon/gun/energy/beam_rifle/pickup(mob/user)
+ set_user(user)
+ . = ..()
+
+/obj/item/weapon/gun/energy/beam_rifle/dropped()
+ set_user()
+ . = ..()
+
+/obj/item/weapon/gun/energy/beam_rifle/ui_action_click(owner, action)
+ if(istype(action, /datum/action/item_action/zoom_speed_action))
+ zoom_speed++
+ if(zoom_speed > 1)
+ zoom_speed = ZOOM_SPEED_STEP
+ switch(zoom_speed)
+ if(ZOOM_SPEED_STEP)
+ to_chat(owner, "You switch [src]'s digital zoom to stepper mode.")
+ if(ZOOM_SPEED_INSTANT)
+ to_chat(owner, "You switch [src]'s digital zoom to instant mode.")
+ if(istype(action, /datum/action/item_action/zoom_lock_action))
+ zoom_lock++
+ if(zoom_lock > 3)
+ zoom_lock = 0
+ switch(zoom_lock)
+ if(ZOOM_LOCK_AUTOZOOM_FREEMOVE)
+ to_chat(owner, "You switch [src]'s zooming processor to free directional.")
+ if(ZOOM_LOCK_AUTOZOOM_ANGLELOCK)
+ to_chat(owner, "You switch [src]'s zooming processor to locked directional.")
+ if(ZOOM_LOCK_CENTER_VIEW)
+ to_chat(owner, "You switch [src]'s zooming processor to center mode.")
+ if(ZOOM_LOCK_OFF)
+ to_chat(owner, "You disable [src]'s zooming system.")
+ reset_zooming()
+
+/obj/item/weapon/gun/energy/beam_rifle/proc/smooth_zooming(delay_override = null)
+ if(!check_user() || !zooming || zoom_lock == ZOOM_LOCK_OFF || zoom_lock == ZOOM_LOCK_CENTER_VIEW)
+ return
+ if(zoom_animating && delay_override != 0)
+ return smooth_zooming(zoom_animating + delay_override) //Automatically compensate for ongoing zooming actions.
+ var/total_time = SSfastprocess.wait
+ if(delay_override)
+ total_time = delay_override
+ if(zoom_speed == ZOOM_SPEED_INSTANT)
+ total_time = 0
+ zoom_animating = total_time
+ animate(current_user.client, pixel_x = current_zoom_x, pixel_y = current_zoom_y , total_time, SINE_EASING, ANIMATION_PARALLEL)
+ zoom_animating = 0
+
+/obj/item/weapon/gun/energy/beam_rifle/proc/set_autozoom_pixel_offsets_immediate(current_angle)
+ if(zoom_lock == ZOOM_LOCK_CENTER_VIEW || zoom_lock == ZOOM_LOCK_OFF)
+ return
+ current_zoom_x = sin(current_angle) + sin(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase
+ current_zoom_y = cos(current_angle) + cos(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase
+
+/obj/item/weapon/gun/energy/beam_rifle/proc/handle_zooming()
+ if(!zooming || !check_user())
+ return
+ if(zoom_speed == ZOOM_SPEED_INSTANT)
+ current_user.client.change_view(world.view + zoom_target_view_increase)
+ zoom_current_view_increase = zoom_target_view_increase
+ set_autozoom_pixel_offsets_immediate(zooming_angle)
+ smooth_zooming()
+ return
+ if(zoom_current_view_increase > zoom_target_view_increase)
+ return
+ zoom_current_view_increase++
+ current_user.client.change_view(zoom_current_view_increase + world.view)
+ set_autozoom_pixel_offsets_immediate(zooming_angle)
+ smooth_zooming(SSfastprocess.wait * zoom_target_view_increase * zoom_speed)
+
+/obj/item/weapon/gun/energy/beam_rifle/proc/start_zooming()
+ if(zoom_lock == ZOOM_LOCK_OFF)
+ return
+ zooming = TRUE
+
+/obj/item/weapon/gun/energy/beam_rifle/proc/stop_zooming()
+ zooming = FALSE
+ reset_zooming()
+
+/obj/item/weapon/gun/energy/beam_rifle/proc/reset_zooming()
+ if(!check_user(FALSE))
+ return
+ zoom_animating = 0
+ animate(current_user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW)
+ zoom_current_view_increase = 0
+ current_user.client.change_view(world.view)
+ zooming_angle = 0
+ current_zoom_x = 0
+ current_zoom_y = 0
/obj/item/weapon/gun/energy/beam_rifle/update_icon()
cut_overlays()
@@ -85,9 +192,10 @@
/obj/item/weapon/gun/energy/beam_rifle/attack_self(mob/user)
projectile_setting_pierce = !projectile_setting_pierce
to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode.")
+ aiming_beam()
/obj/item/weapon/gun/energy/beam_rifle/proc/update_slowdown()
- if(scoped)
+ if(aiming)
slowdown = scoped_slow
else
slowdown = initial(slowdown)
@@ -95,140 +203,160 @@
/obj/item/weapon/gun/energy/beam_rifle/Initialize()
. = ..()
START_PROCESSING(SSfastprocess, src)
+ zoom_speed_action = new(src)
+ zoom_lock_action = new(src)
/obj/item/weapon/gun/energy/beam_rifle/Destroy()
STOP_PROCESSING(SSfastprocess, src)
- ..()
-
-/obj/item/weapon/gun/energy/beam_rifle/zoom(user, forced_zoom)
- . = ..()
- scope(user, .)
-
-/obj/item/weapon/gun/energy/beam_rifle/proc/scope(mob/user, forced)
- var/scoping
- switch(forced)
- if(TRUE)
- scoping = TRUE
- if(FALSE)
- scoping = FALSE
- else
- scoping = !scoped
- if(scoping)
- spread = scoped_inaccuracy
- recoil = scoped_recoil
- scoped = TRUE
- user << "You bring your [src] up and use its scope..."
- else
- spread = hipfire_inaccuracy
- recoil = hipfire_recoil
- scoped = FALSE
- user << "You lower your [src]."
- update_slowdown()
-
-/obj/item/weapon/gun/energy/beam_rifle/can_trigger_gun(var/mob/living/user)
- if(!scoped && !noscope)
- user << "This beam rifle can only be used while scoped!"
- return FALSE
- . = ..(user)
+ set_user(null)
+ QDEL_NULL(current_tracer)
+ return ..()
/obj/item/weapon/gun/energy/beam_rifle/emp_act(severity)
chambered = null
recharge_newshot()
-/obj/item/weapon/gun/energy/beam_rifle/proc/aiming_beam()
- var/atom/A = current_user.client.mouseObject
- if(!istype(A) || !A.loc)
- return
- var/turf/T = get_turf(current_user.client.mouseObject)
- if(!istype(T))
+/obj/item/weapon/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE)
+ var/diff = abs(aiming_lastangle - lastangle)
+ check_user()
+ if(diff < AIMING_BEAM_ANGLE_CHANGE_THRESHOLD && !force_update)
return
+ aiming_lastangle = lastangle
var/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/P = new
P.gun = src
P.wall_pierce_amount = wall_pierce_amount
P.structure_pierce_amount = structure_piercing
P.do_pierce = projectile_setting_pierce
- P.preparePixelProjectile(current_user.client.mouseObject, T, current_user, current_user.client.mouseParams, 0)
if(aiming_time)
var/percent = ((100/aiming_time)*aiming_time_left)
P.color = rgb(255 * percent,255 * ((100 - percent) / 100),0)
else
P.color = rgb(0, 255, 0)
- clear_tracers()
- P.fire()
-
-/obj/item/weapon/gun/energy/beam_rifle/proc/clear_tracers()
- for(var/I in current_tracers)
- current_tracers -= I
- var/obj/effect/temp_visual/projectile_beam/PB = I
- qdel(PB)
-
-/obj/item/weapon/gun/energy/beam_rifle/proc/terminate_aiming()
- stop_aiming()
- clear_tracers()
+ var/turf/curloc = get_turf(src)
+ var/turf/targloc = get_turf(current_user.client.mouseObject)
+ if(!istype(targloc))
+ if(!istype(curloc))
+ return
+ targloc = get_turf_in_angle(lastangle, curloc, 10)
+ P.preparePixelProjectile(targloc, targloc, current_user, current_user.client.mouseParams, 0)
+ P.fire(lastangle)
/obj/item/weapon/gun/energy/beam_rifle/process()
if(!aiming)
return
- if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it!
- terminate_aiming()
- return
+ check_user()
+ handle_zooming()
if(aiming_time_left > 0)
aiming_time_left--
- aiming_beam()
- process_aim()
+ aiming_beam(TRUE)
+
+/obj/item/weapon/gun/energy/beam_rifle/proc/check_user(automatic_cleanup = TRUE)
+ if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it!
+ if(automatic_cleanup)
+ stop_aiming()
+ set_user(null)
+ return FALSE
+ return TRUE
/obj/item/weapon/gun/energy/beam_rifle/proc/process_aim()
- if(current_user.client.mouseParams)
- var/list/mouse_control = params2list(current_user.client.mouseParams)
- if(isturf(current_user.client.mouseLocation))
- current_user.face_atom(current_user.client.mouseLocation)
- if(mouse_control["screen-loc"])
- var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",")
- var/list/screen_loc_X = splittext(screen_loc_params[1],":")
- var/list/screen_loc_Y = splittext(screen_loc_params[2],":")
- var/x = (text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32)
- var/y = (text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32)
- var/screenview = (current_user.client.view * 2 + 1) * world.icon_size //Refer to http://www.byond.com/docs/ref/info.html#/client/var/view for mad maths
- var/ox = round(screenview/2) - current_user.client.pixel_x //"origin" x
- var/oy = round(screenview/2) - current_user.client.pixel_y //"origin" y
- var/angle = NORM_ROT(Atan2(y - oy, x - ox))
- var/difference = abs(lastangle - angle)
- delay_penalty(difference * aiming_time_increase_angle_multiplier)
- lastangle = angle
+ if(istype(current_user) && current_user.client && current_user.client.mouseParams)
+ var/angle = mouse_angle_from_client(current_user.client)
+ switch(angle)
+ if(316 to 360)
+ current_user.setDir(NORTH)
+ if(0 to 45)
+ current_user.setDir(NORTH)
+ if(46 to 135)
+ current_user.setDir(EAST)
+ if(136 to 225)
+ current_user.setDir(SOUTH)
+ if(226 to 315)
+ current_user.setDir(WEST)
+ var/difference = abs(lastangle - angle)
+ if(difference > 350) //Too lazy to properly math, detects 360 --> 0 changes.
+ difference = (lastangle > 350? ((360 - lastangle) + angle) : ((360 - angle) + lastangle))
+ delay_penalty(difference * aiming_time_increase_angle_multiplier)
+ lastangle = angle
/obj/item/weapon/gun/energy/beam_rifle/on_mob_move()
- delay_penalty(aiming_time_increase_user_movement)
+ check_user()
+ if(aiming)
+ delay_penalty(aiming_time_increase_user_movement)
+ process_aim()
+ aiming_beam(TRUE)
/obj/item/weapon/gun/energy/beam_rifle/proc/start_aiming()
aiming_time_left = aiming_time
aiming = TRUE
+ process_aim()
+ aiming_beam(TRUE)
+ zooming_angle = lastangle
+ start_zooming()
/obj/item/weapon/gun/energy/beam_rifle/proc/stop_aiming()
+ set waitfor = FALSE
aiming_time_left = aiming_time
aiming = FALSE
+ QDEL_NULL(current_tracer)
+ stop_zooming()
+
+/obj/item/weapon/gun/energy/beam_rifle/proc/set_user(mob/user)
+ if(user == current_user)
+ return
+ stop_aiming()
+ if(istype(current_user))
+ LAZYREMOVE(current_user.mousemove_intercept_objects, src)
+ current_user = null
+ if(istype(user))
+ current_user = user
+ LAZYADD(current_user.mousemove_intercept_objects, src)
/obj/item/weapon/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
- current_user = mob
+ if(aiming)
+ process_aim()
+ aiming_beam()
+ if(zoom_lock == ZOOM_LOCK_AUTOZOOM_FREEMOVE)
+ zooming_angle = lastangle
+ set_autozoom_pixel_offsets_immediate(zooming_angle)
+ smooth_zooming(2)
+ return ..()
-/obj/item/weapon/gun/energy/beam_rifle/onMouseDown(object, location, params, mob)
+/obj/item/weapon/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob)
+ if(istype(mob))
+ set_user(mob)
+ if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher))
+ return
+ if((object in mob.contents) || (object == mob))
+ return
start_aiming()
- current_user = mob
+ return ..()
/obj/item/weapon/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M)
+ if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher))
+ return
process_aim()
- if(aiming_time_left <= aiming_time_fire_threshold)
+ if(aiming_time_left <= aiming_time_fire_threshold && check_user())
sync_ammo()
afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE)
stop_aiming()
- clear_tracers()
+ QDEL_NULL(current_tracer)
+ return ..()
/obj/item/weapon/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE)
+ if(flag) //It's adjacent, is the user, or is on the user's person
+ if(target in user.contents) //can't shoot stuff inside us.
+ return
+ if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack
+ return
+ if(target == user && user.zone_selected != "mouth") //so we can't shoot ourselves (unless mouth selected)
+ return
if(!passthrough && (aiming_time > aiming_time_fire_threshold))
return
if(lastfire > world.time + delay)
return
lastfire = world.time
- . = ..()
+ stop_aiming()
+ return ..()
/obj/item/weapon/gun/energy/beam_rifle/proc/sync_ammo()
for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents)
@@ -298,6 +426,25 @@
HS_BB.do_pierce = do_pierce
HS_BB.gun = host
+/obj/item/ammo_casing/energy/beam_rifle/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread)
+ var/turf/curloc = get_turf(user)
+ if(!istype(curloc) || !BB)
+ return FALSE
+ var/obj/item/weapon/gun/energy/beam_rifle/gun = loc
+ if(!targloc && gun)
+ targloc = get_turf_in_angle(gun.lastangle, curloc, 10)
+ else if(!targloc)
+ return FALSE
+ var/firing_dir
+ if(BB.firer)
+ firing_dir = BB.firer.dir
+ if(!BB.suppressed && firing_effect_type)
+ new firing_effect_type(get_turf(src), firing_dir)
+ BB.preparePixelProjectile(target, targloc, user, params, spread)
+ BB.fire(gun? gun.lastangle : null, null)
+ BB = null
+ return TRUE
+
/obj/item/ammo_casing/energy/beam_rifle/hitscan
projectile_type = /obj/item/projectile/beam/beam_rifle/hitscan
select_name = "beam"
@@ -330,6 +477,7 @@
var/impact_structure_damage = 0
var/impact_direct_damage = 0
var/turf/cached
+ var/list/pierced = list()
/obj/item/projectile/beam/beam_rifle/proc/AOE(turf/epicenter)
set waitfor = FALSE
@@ -351,20 +499,29 @@
/obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/target)
if(!do_pierce)
return FALSE
+ if(pierced[target]) //we already pierced them go away
+ loc = get_turf(target)
+ return TRUE
if(isclosedturf(target))
if(wall_pierce++ < wall_pierce_amount)
loc = target
if(prob(wall_devastate))
- target.ex_act(EXPLODE_HEAVY)
+ if(istype(target, /turf/closed/wall))
+ var/turf/closed/wall/W = target
+ W.dismantle_wall(TRUE, TRUE)
+ else
+ target.ex_act(EXPLODE_HEAVY)
return TRUE
if(ismovableatom(target))
var/atom/movable/AM = target
if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM))
- if(structure_pierce++ < structure_pierce_amount)
+ if(structure_pierce < structure_pierce_amount)
if(isobj(AM))
var/obj/O = AM
O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, "energy", FALSE)
+ pierced[AM] = TRUE
loc = get_turf(AM)
+ structure_pierce++
return TRUE
return FALSE
@@ -396,22 +553,69 @@
handle_impact(target)
/obj/item/projectile/beam/beam_rifle/Collide(atom/target)
+ paused = TRUE
if(check_pierce(target))
permutated += target
return FALSE
if(!QDELETED(target))
cached = get_turf(target)
+ paused = FALSE
. = ..()
/obj/item/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE)
+ paused = TRUE
if(!QDELETED(target))
cached = get_turf(target)
handle_hit(target)
+ paused = FALSE
. = ..()
/obj/item/projectile/beam/beam_rifle/hitscan
icon_state = ""
- var/tracer_type = /obj/effect/temp_visual/projectile_beam/tracer
+ var/tracer_type = /obj/effect/projectile_beam/tracer
+ var/starting_z
+ var/starting_p_x
+ var/starting_p_y
+ var/constant_tracer = FALSE
+ var/travelled_p_x = 0
+ var/travelled_p_y = 0
+ var/tracer_spawned = FALSE
+
+/obj/item/projectile/beam/beam_rifle/hitscan/Destroy()
+ paused = TRUE //STOP HITTING WHEN YOU'RE ALREADY BEING DELETED!
+ spawn_tracer(constant_tracer)
+ return ..()
+
+/obj/item/projectile/beam/beam_rifle/hitscan/proc/spawn_tracer(put_in_rifle = FALSE)
+ if(tracer_spawned)
+ return
+ tracer_spawned = TRUE
+ //Remind me to port baystation trajectories so this shit isn't needed...
+ var/pixels_travelled = round(sqrt(travelled_p_x**2 + travelled_p_y**2),1)
+ var/scaling = pixels_travelled/world.icon_size
+ var/midpoint_p_x = round(starting_p_x + (travelled_p_x / 2))
+ var/midpoint_p_y = round(starting_p_y + (travelled_p_y / 2))
+ var/tracer_px = midpoint_p_x % world.icon_size
+ var/tracer_py = midpoint_p_y % world.icon_size
+ var/tracer_lx = (midpoint_p_x - tracer_px) / world.icon_size
+ var/tracer_ly = (midpoint_p_y - tracer_py) / world.icon_size
+ var/obj/effect/projectile_beam/PB = new tracer_type(src)
+ PB.apply_vars(Angle, tracer_px, tracer_py, color, scaling, locate(tracer_lx,tracer_ly,starting_z))
+ if(put_in_rifle && istype(gun))
+ if(gun.current_tracer)
+ QDEL_NULL(gun.current_tracer)
+ gun.current_tracer = PB
+ else
+ QDEL_IN(PB, 5)
+
+/obj/item/projectile/beam/beam_rifle/hitscan/proc/check_for_turf_edge(turf/T)
+ if(!istype(T))
+ return TRUE
+ var/tx = T.x
+ var/ty = T.y
+ if(tx < 10 || tx > (world.maxx - 10) || ty < 10 || ty > (world.maxy-10))
+ return TRUE
+ return FALSE
/obj/item/projectile/beam/beam_rifle/hitscan/fire(setAngle, atom/direct_target) //oranges didn't let me make this a var the first time around so copypasta time
set waitfor = 0
@@ -423,6 +627,12 @@
var/old_pixel_x = pixel_x
var/old_pixel_y = pixel_y
var/safety = 0 //The code works fine, but... just in case...
+ var/turf/c2
+ var/starting_x = loc.x
+ var/starting_y = loc.y
+ starting_z = loc.z
+ starting_p_x = starting_x * world.icon_size + pixel_x
+ starting_p_y = starting_y * world.icon_size + pixel_y
while(loc)
if(++safety > (range * 3)) //If it's looping for way, way too long...
return //Kill!
@@ -437,6 +647,8 @@
transform = M
var/Pixel_x=sin(Angle)+16*sin(Angle)*2
var/Pixel_y=cos(Angle)+16*cos(Angle)*2
+ travelled_p_x += Pixel_x
+ travelled_p_y += Pixel_y
var/pixel_x_offset = old_pixel_x + Pixel_x
var/pixel_y_offset = old_pixel_y + Pixel_y
var/new_x = x
@@ -469,27 +681,23 @@
animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)), flags = ANIMATION_END_NOW)
old_pixel_x = pixel_x_offset
old_pixel_y = pixel_y_offset
- if(original && (original.layer>=2.75) || ismob(original))
- if(loc == get_turf(original))
- if(!(original in permutated))
- Collide(original)
+ if(can_hit_target(original, permutated))
+ Collide(original)
+ c2 = loc
Range()
-
-/obj/item/projectile/beam/beam_rifle/hitscan/Range()
- spawn_tracer_effect()
- if(!QDELETED(src) && loc)
- cached = get_turf(src)
-
-/obj/item/projectile/beam/beam_rifle/hitscan/proc/spawn_tracer_effect()
- QDEL_IN((new tracer_type(loc, time = 5, angle_override = Angle, p_x = pixel_x, p_y = pixel_y, color_override = color)), 5)
+ if(check_for_turf_edge(loc))
+ spawn_tracer(constant_tracer)
+ if(istype(c2))
+ cached = c2
/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam
- tracer_type = /obj/effect/temp_visual/projectile_beam/tracer/aiming
+ tracer_type = /obj/effect/projectile_beam/tracer/aiming
name = "aiming beam"
hitsound = null
hitsound_wall = null
nodamage = TRUE
damage = 0
+ constant_tracer = TRUE
/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target)
qdel(src)
@@ -499,37 +707,69 @@
qdel(src)
return FALSE
-/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/spawn_tracer_effect()
- var/obj/effect/temp_visual/projectile_beam/T = new tracer_type(loc, time = 5, angle_override = Angle, p_x = pixel_x, p_y = pixel_y, color_override = color)
- if(istype(gun) && istype(T))
- gun.current_tracers[T] = TRUE
-
-/obj/effect/temp_visual/projectile_beam
+/obj/effect/projectile_beam
icon = 'icons/obj/projectiles.dmi'
layer = ABOVE_MOB_LAYER
anchored = TRUE
- duration = 5
- randomdir = FALSE
light_power = 1
light_range = 2
light_color = "#00ffff"
+ mouse_opacity = 0
+ flags = ABSTRACT
+ appearance_flags = 0
-/obj/effect/temp_visual/projectile_beam/New(time = 5, angle_override, p_x, p_y, color_override)
- duration = time
+/obj/effect/projectile_beam/proc/scale_to(nx,ny,override=TRUE)
+ var/matrix/M
+ if(!override)
+ M = transform
+ else
+ M = new
+ M.Scale(nx,ny)
+ transform = M
+
+/obj/effect/projectile_beam/proc/turn_to(angle,override=TRUE)
+ var/matrix/M
+ if(!override)
+ M = transform
+ else
+ M = new
+ M.Turn(angle)
+ transform = M
+
+/obj/effect/projectile_beam/New(angle_override, p_x, p_y, color_override, scaling = 1)
+ if(angle_override && p_x && p_y && color_override && scaling)
+ apply_vars(angle_override, p_x, p_y, color_override, scaling)
+ return ..()
+
+/obj/effect/projectile_beam/proc/apply_vars(angle_override, p_x, p_y, color_override, scaling = 1, new_loc, increment = 0)
var/mutable_appearance/look = new(src)
look.pixel_x = p_x
look.pixel_y = p_y
if(color_override)
look.color = color_override
- var/matrix/M = new
- M.Turn(angle_override)
- look.transform = M
appearance = look
- ..()
+ scale_to(1,scaling, FALSE)
+ turn_to(angle_override, FALSE)
+ if(!isnull(new_loc)) //If you want to null it just delete it...
+ forceMove(new_loc)
+ for(var/i in 1 to increment)
+ pixel_x += round((sin(angle_override)+16*sin(angle_override)*2), 1)
+ pixel_y += round((cos(angle_override)+16*cos(angle_override)*2), 1)
-/obj/effect/temp_visual/projectile_beam/tracer
+/obj/effect/projectile_beam/tracer
icon_state = "tracer_beam"
-/obj/effect/temp_visual/projectile_beam/tracer/aiming
+/obj/effect/projectile_beam/tracer/aiming
icon_state = "gbeam"
- duration = 1
+
+/datum/action/item_action/zoom_speed_action
+ name = "Toggle Zooming Speed"
+ icon_icon = 'icons/mob/actions/actions_spells.dmi'
+ button_icon_state = "projectile"
+ background_icon_state = "bg_tech"
+
+/datum/action/item_action/zoom_lock_action
+ name = "Switch Zoom Mode"
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "zoom_mode"
+ background_icon_state = "bg_tech"
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 22b51064af..9c84378586 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -427,7 +427,7 @@
/obj/item/borg/upgrade/modkit/bounty
name = "death syphon"
- desc = "Killing or assisting in killing a creature permenantly increases your damage against that type of creature."
+ desc = "Killing or assisting in killing a creature permanently increases your damage against that type of creature."
denied_type = /obj/item/borg/upgrade/modkit/bounty
modifier = 1.25
cost = 30
@@ -534,7 +534,7 @@
/obj/item/borg/upgrade/modkit/tracer/adjustable
name = "adjustable tracer bolts"
- desc = "Causes kinetic accelerator bolts to have a adjustably-colored tracer trail and explosion. Use in-hand to change color."
+ desc = "Causes kinetic accelerator bolts to have a adjustable-colored tracer trail and explosion. Use in-hand to change color."
/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user)
bolt_color = input(user,"Choose Color") as color
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index a38ba3773e..a0a328afb0 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -46,7 +46,7 @@
name = "scatter shot laser rifle"
icon_state = "lasercannon"
item_state = "laser"
- desc = "An industrial-grade heavy-duty laser rifle with a modified laser lense to scatter its shot into multiple smaller lasers. The inner-core can self-charge for theorically infinite use."
+ desc = "An industrial-grade heavy-duty laser rifle with a modified laser lens to scatter its shot into multiple smaller lasers. The inner-core can self-charge for theoretically infinite use."
origin_tech = "combat=5;materials=4;powerstorage=4"
ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter, /obj/item/ammo_casing/energy/laser)
@@ -107,8 +107,8 @@
transform *= 1 + ((damage/7) * 0.2)//20% larger per tile
/obj/item/weapon/gun/energy/xray
- name = "xray laser gun"
- desc = "A high-power laser gun capable of expelling concentrated xray blasts that pass through multiple soft targets and heavier materials"
+ name = "x-ray laser gun"
+ desc = "A high-power laser gun capable of expelling concentrated x-ray blasts that pass through multiple soft targets and heavier materials"
icon_state = "xray"
item_state = null
origin_tech = "combat=6;materials=4;magnets=4;syndicate=1"
diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm
index 45a1eccd65..4d17d772a3 100644
--- a/code/modules/projectiles/guns/magic/staff.dm
+++ b/code/modules/projectiles/guns/magic/staff.dm
@@ -1,5 +1,7 @@
/obj/item/weapon/gun/magic/staff
slot_flags = SLOT_BACK
+ lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
/obj/item/weapon/gun/magic/staff/change
name = "staff of change"
@@ -74,6 +76,8 @@
ammo_type = /obj/item/ammo_casing/magic/spellblade
icon_state = "spellblade"
item_state = "spellblade"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
hitsound = 'sound/weapons/rapierhit.ogg'
force = 20
armour_penetration = 75
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 3508c39bb2..50f00478e2 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -203,7 +203,7 @@
direct_target.bullet_act(src, def_zone)
qdel(src)
return
- if(setAngle)
+ if(isnum(setAngle))
Angle = setAngle
var/old_pixel_x = pixel_x
var/old_pixel_y = pixel_y
@@ -264,11 +264,8 @@
animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)), flags = ANIMATION_END_NOW)
old_pixel_x = pixel_x_offset
old_pixel_y = pixel_y_offset
-
- if(original && (original.layer >= PROJECTILE_HIT_THRESHHOLD_LAYER) || ismob(original))
- if(loc == get_turf(original))
- if(!(original in permutated))
- Collide(original)
+ if(can_hit_target(original, permutated))
+ Collide(original)
Range()
if (delay > 0)
sleep(delay)
@@ -280,13 +277,19 @@
if((!( current ) || loc == current))
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
step_towards(src, current)
- if(original && (original.layer >= PROJECTILE_HIT_THRESHHOLD_LAYER) || ismob(original))
- if(loc == get_turf(original))
- if(!(original in permutated))
- Collide(original)
+ if(can_hit_target(original, permutated))
+ Collide(original)
Range()
sleep(config.run_speed * 0.9)
+//Returns true if the target atom is on our current turf and above the right layer
+/obj/item/projectile/proc/can_hit_target(atom/target, var/list/passthrough)
+ if(target && (target.layer >= PROJECTILE_HIT_THRESHHOLD_LAYER) || ismob(target))
+ if(loc == get_turf(target))
+ if(!(target in passthrough))
+ return TRUE
+ return FALSE
+
/obj/item/projectile/proc/preparePixelProjectile(atom/target, var/turf/targloc, mob/living/user, params, spread)
var/turf/curloc = get_turf(user)
forceMove(get_turf(user))
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 6a2ea8bb40..844a8a4662 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -74,7 +74,7 @@
/obj/item/projectile/beam/pulse/on_hit(atom/target, blocked = FALSE)
. = ..()
- if(isturf(target) || istype(target,/obj/structure/))
+ if(isturf(target) || istype(target, /obj/structure/))
target.ex_act(EXPLODE_HEAVY)
/obj/item/projectile/beam/pulse/shot
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 0a49351665..7a1c12639f 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -68,10 +68,7 @@
damage = 0
damage_type = OXY
nodamage = 1
- var/list/door_types = list(/obj/structure/mineral_door/wood,/obj/structure/mineral_door/iron,/obj/structure/mineral_door/silver,\
- /obj/structure/mineral_door/gold,/obj/structure/mineral_door/uranium,/obj/structure/mineral_door/sandstone,/obj/structure/mineral_door/transparent/plasma,\
- /obj/structure/mineral_door/transparent/diamond)
-
+ var/list/door_types = list(/obj/structure/mineral_door/wood, /obj/structure/mineral_door/iron, /obj/structure/mineral_door/silver, /obj/structure/mineral_door/gold, /obj/structure/mineral_door/uranium, /obj/structure/mineral_door/sandstone, /obj/structure/mineral_door/transparent/plasma, /obj/structure/mineral_door/transparent/diamond)
/obj/item/projectile/magic/door/on_hit(atom/target)
. = ..()
@@ -89,7 +86,7 @@
D.Open()
/obj/item/projectile/magic/door/proc/OpenDoor(var/obj/machinery/door/D)
- if(istype(D,/obj/machinery/door/airlock))
+ if(istype(D, /obj/machinery/door/airlock))
var/obj/machinery/door/airlock/A = D
A.locked = FALSE
D.open()
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 57d374e3d9..d902ed7b13 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -1,6 +1,6 @@
/obj/machinery/chem_master
name = "ChemMaster 3000"
- desc = "Used to seperate chemicals and distribute them in a variety of forms."
+ desc = "Used to separate chemicals and distribute them in a variety of forms."
density = TRUE
anchored = TRUE
icon = 'icons/obj/chemical.dmi'
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 85b357c774..46597fb028 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -150,7 +150,7 @@
if(!new_name || ..())
return
A.AssignName(new_name)
- for(var/datum/disease/advance/AD in SSdisease.processing)
+ for(var/datum/disease/advance/AD in SSdisease.active_diseases)
AD.Refresh()
. = TRUE
if("create_culture_bottle")
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 944e03190f..a75a0851e5 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -43,11 +43,11 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..() || .
/datum/reagent/consumable/ethanol/reaction_obj(obj/O, reac_volume)
- if(istype(O,/obj/item/weapon/paper))
+ if(istype(O, /obj/item/weapon/paper))
var/obj/item/weapon/paper/paperaffected = O
paperaffected.clearpaper()
to_chat(usr, "[paperaffected]'s ink washes away.")
- if(istype(O,/obj/item/weapon/book))
+ if(istype(O, /obj/item/weapon/book))
if(reac_volume >= 5)
var/obj/item/weapon/book/affectedbook = O
affectedbook.dat = null
diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
index f1e46a6322..054e9a84cf 100644
--- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
@@ -313,7 +313,7 @@
/datum/reagent/blob/explosive_lattice/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_flag == "bomb")
return 0
- else if(damage_flag != "melee" || damage_flag != "bullet" || damage_flag != "laser")
+ else if(damage_flag != "melee" && damage_flag != "bullet" && damage_flag != "laser")
return damage * 1.5
return ..()
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 4b9a4b8b39..adf7292a56 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -58,13 +58,11 @@
M.confused = 0
M.SetSleeping(0, 0)
M.jitteriness = 0
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
if(D.severity == NONTHREAT)
continue
- D.spread_text = "Remissive"
- D.stage--
- if(D.stage < 1)
- D.cure()
+ D.cure()
..()
. = 1
@@ -686,7 +684,7 @@
taste_description = "dull toxin"
/datum/reagent/medicine/oculine/on_mob_life(mob/living/M)
- var/obj/item/organ/eyes/eyes = M.getorganslot("eye_sight")
+ var/obj/item/organ/eyes/eyes = M.getorganslot("eyes_sight")
if (!eyes)
return
if(M.disabilities & BLIND)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index fb7b99ce4d..876029e128 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -13,7 +13,8 @@
/datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, reac_volume)
if(data && data["viruses"])
- for(var/datum/disease/D in data["viruses"])
+ for(var/thing in data["viruses"])
+ var/datum/disease/D = thing
if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS))
continue
@@ -73,11 +74,6 @@
if(data["blood_DNA"])
B.blood_DNA[data["blood_DNA"]] = data["blood_type"]
- for(var/datum/disease/D in data["viruses"])
- var/datum/disease/newVirus = D.Copy(1)
- B.viruses += newVirus
- newVirus.holder = B
-
/datum/reagent/liquidgibs
name = "Liquid gibs"
@@ -96,7 +92,8 @@
/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume)
if(islist(data) && (method == INGEST || method == INJECT))
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
if(D.GetDiseaseID() in data)
D.cure()
M.resistances |= data
@@ -151,12 +148,12 @@
O.extinguish()
O.acid_level = 0
// Monkey cube
- if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube))
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
cube.Expand()
// Dehydrated carp
- else if(istype(O,/obj/item/toy/carpplushie/dehy_carp))
+ else if(istype(O, /obj/item/toy/carpplushie/dehy_carp))
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
dehy.Swell() // Makes a carp
@@ -410,7 +407,7 @@
return
to_chat(H, "You crumple in agony as your flesh wildly morphs into new forms!")
H.visible_message("[H] falls to the ground and screams as [H.p_their()] skin bubbles and froths!") //'froths' sounds painful when used with SKIN.
- H.Knockdown(60, 0)
+ H.Knockdown(60)
addtimer(CALLBACK(src, .proc/mutate, H), 30)
return
@@ -932,7 +929,7 @@
taste_description = "sourness"
/datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume)
- if(istype(O,/obj/effect/decal/cleanable))
+ if(istype(O, /obj/effect/decal/cleanable))
qdel(O)
else
if(O)
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 078b8bc7e2..d0dadc271e 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -196,12 +196,12 @@
taste_mult = 1
/datum/reagent/toxin/plantbgone/reaction_obj(obj/O, reac_volume)
- if(istype(O,/obj/structure/alien/weeds))
+ if(istype(O, /obj/structure/alien/weeds))
var/obj/structure/alien/weeds/alien_weeds = O
alien_weeds.take_damage(rand(15,35), BRUTE, 0) // Kills alien weeds pretty fast
- else if(istype(O,/obj/structure/glowshroom)) //even a small amount is enough to kill it
+ else if(istype(O, /obj/structure/glowshroom)) //even a small amount is enough to kill it
qdel(O)
- else if(istype(O,/obj/structure/spacevine))
+ else if(istype(O, /obj/structure/spacevine))
var/obj/structure/spacevine/SV = O
SV.on_chem_effect(src)
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 8cbbfc8fb9..a223709f62 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -13,6 +13,8 @@ Borg Hypospray
desc = "An advanced chemical synthesizer and injection system, designed for heavy-duty medical equipment."
icon = 'icons/obj/syringe.dmi'
item_state = "hypo"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
icon_state = "borghypo"
amount_per_transfer_from_this = 5
volume = 30
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index a8845055c1..cca23a86c9 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -101,7 +101,7 @@
else
to_chat(user, "[src] is already hotter than [I]!")
- if(istype(I,/obj/item/weapon/reagent_containers/food/snacks/egg)) //breaking eggs
+ if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/egg)) //breaking eggs
var/obj/item/weapon/reagent_containers/food/snacks/egg/E = I
if(reagents)
if(reagents.total_volume >= reagents.maximum_volume)
@@ -233,6 +233,8 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "bucket"
item_state = "bucket"
+ lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
materials = list(MAT_METAL=200)
w_class = WEIGHT_CLASS_NORMAL
amount_per_transfer_from_this = 20
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index f0bdffcda8..1b7f4f4eed 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -3,6 +3,8 @@
desc = "The DeForest Medical Corporation hypospray is a sterile, air-needle autoinjector for rapid administration of drugs to patients."
icon = 'icons/obj/syringe.dmi'
item_state = "hypo"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
icon_state = "hypo"
amount_per_transfer_from_this = 5
volume = 30
@@ -70,6 +72,8 @@
desc = "A rapid and safe way to stabilize patients in critical condition for personnel without advanced medical knowledge."
icon_state = "medipen"
item_state = "medipen"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
amount_per_transfer_from_this = 10
volume = 10
ignore_flags = 1 //so you can medipen through hardsuits
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index efd312c8d6..a72ecf1cd4 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "pill"
item_state = "pill"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
possible_transfer_amounts = list()
volume = 50
var/apply_type = INGEST
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 11e901f1cb..a3da3a9e2f 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "cleaner"
item_state = "cleaner"
+ lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
flags = NOBLUDGEON
container_type = OPENCONTAINER
slot_flags = SLOT_BELT
@@ -168,6 +170,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "pepperspray"
item_state = "pepperspray"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
volume = 40
stream_range = 4
amount_per_transfer_from_this = 5
@@ -238,5 +242,7 @@
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "plantbgone"
item_state = "plantbgone"
+ lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
volume = 100
list_reagents = list("plantbgone" = 100)
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 68781a5e45..f11965496d 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -6,6 +6,8 @@
desc = "A syringe that can hold up to 15 units."
icon = 'icons/obj/syringe.dmi'
item_state = "syringe_0"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
icon_state = "0"
amount_per_transfer_from_this = 5
possible_transfer_amounts = list()
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index ddc1c56657..0d0a4f7695 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -347,6 +347,6 @@
transfer_fingerprints_to(NC)
qdel(src)
-/obj/item/weapon/paper/conveyor
+/obj/item/weapon/paper/guides/conveyor
name = "paper- 'Nano-it-up U-build series, #9: Build your very own conveyor belt, in SPACE'"
info = "
Congratulations!
You are now the proud owner of the best conveyor set available for space mail order! We at Nano-it-up know you love to prepare your own structures without wasting time, so we have devised a special streamlined assembly procedure that puts all other mail-order products to shame!
Firstly, you need to link the conveyor switch assembly to each of the conveyor belt assemblies. After doing so, you simply need to install the belt assemblies onto the floor, et voila, belt built. Our special Nano-it-up smart switch will detected any linked assemblies as far as the eye can see! This convenience, you can only have it when you Nano-it-up. Stay nano!
"
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index 975b9e1408..55528ff9fa 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -203,7 +203,7 @@
else
if(!is_pipe()) // Disposal or outlet
if(CP) // There's something there
- if(!istype(CP,/obj/structure/disposalpipe/trunk))
+ if(!istype(CP, /obj/structure/disposalpipe/trunk))
to_chat(user, "The [nicetype] requires a trunk underneath it in order to work!")
return
else // Nothing under, fuck.
diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm
index af31bd9760..ff632f1f6c 100644
--- a/code/modules/recycling/disposal-structures.dm
+++ b/code/modules/recycling/disposal-structures.dm
@@ -700,7 +700,7 @@
playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You attach the screws around the power connection.")
- else if(istype(I,/obj/item/weapon/weldingtool) && mode==1)
+ else if(istype(I, /obj/item/weapon/weldingtool) && mode==1)
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
playsound(src.loc, 'sound/items/welder2.ogg', 100, 1)
diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm
index 806fa8103c..0537380b20 100644
--- a/code/modules/recycling/disposal-unit.dm
+++ b/code/modules/recycling/disposal-unit.dm
@@ -82,7 +82,7 @@
playsound(get_turf(src), I.usesound, 50, 1)
to_chat(user, "You [panel_open ? "remove":"attach"] the screws around the power connection.")
return
- else if(istype(I,/obj/item/weapon/weldingtool) && panel_open)
+ else if(istype(I, /obj/item/weapon/weldingtool) && panel_open)
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
playsound(src.loc, 'sound/items/welder2.ogg', 100, 1)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 9b366ad9f1..69f4cc148c 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -144,6 +144,8 @@
w_class = WEIGHT_CLASS_TINY
item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BELT
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index ae5449d90f..132ebdf8fd 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -89,7 +89,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
/obj/machinery/r_n_d/circuit_imprinter/Insert_Item(obj/item/O, mob/user)
- if(istype(O,/obj/item/stack/sheet))
+ if(istype(O, /obj/item/stack/sheet))
. = 1
if(!is_insertion_ready(user))
return
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index a94b3a80b3..7a078f1891 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -498,7 +498,7 @@ other types of metals and chemistry for reagents).
/datum/design/handdrill
name = "Hand Drill"
- desc = "A small electric hand drill with an interchangable screwdriver and bolt bit"
+ desc = "A small electric hand drill with an interchangeable screwdriver and bolt bit"
id = "handdrill"
req_tech = list("materials" = 4, "engineering" = 6)
build_type = PROTOLATHE
@@ -508,7 +508,7 @@ other types of metals and chemistry for reagents).
/datum/design/jawsoflife
name = "Jaws of Life"
- desc = "A small, compact Jaws of Life with an interchangable pry jaws and cutting jaws"
+ desc = "A small, compact Jaws of Life with an interchangeable pry jaws and cutting jaws"
id = "jawsoflife"
req_tech = list("materials" = 4, "engineering" = 6, "magnets" = 6) // added one more requirment since the Jaws of Life are a bit OP
build_path = /obj/item/weapon/crowbar/power
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 8b90339b02..16a87d3b8b 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -212,6 +212,17 @@
build_path = /obj/item/organ/cyberimp/mouth/breathing_tube
category = list("Misc", "Medical Designs")
+/datum/design/cyberimp_surgical
+ name = "Surgical Arm Implant"
+ desc = "A set of surgical tools hidden behind a concealed panel on the user's arm."
+ id = "ci-surgery"
+ req_tech = list("materials" = 3, "engineering" = 3, "biotech" = 3, "programming" = 2, "magnets" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list (MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500)
+ construction_time = 200
+ build_path = /obj/item/organ/cyberimp/arm/surgery
+ category = list("Misc", "Medical Designs")
+
/datum/design/cyberimp_toolset
name = "Toolset Arm Implant"
desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm."
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 9ad6d10d85..7e7b4c2b5b 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -59,24 +59,24 @@
/obj/machinery/r_n_d/experimentor/proc/SetTypeReactions()
var/probWeight = 0
for(var/I in typesof(/obj/item))
- if(istype(I,/obj/item/weapon/relic))
+ if(istype(I, /obj/item/weapon/relic))
item_reactions["[I]"] = SCANTYPE_DISCOVER
else
item_reactions["[I]"] = pick(SCANTYPE_POKE,SCANTYPE_IRRADIATE,SCANTYPE_GAS,SCANTYPE_HEAT,SCANTYPE_COLD,SCANTYPE_OBLITERATE)
- if(ispath(I,/obj/item/weapon/stock_parts) || ispath(I,/obj/item/weapon/grenade/chem_grenade) || ispath(I,/obj/item/weapon/kitchen))
+ if(ispath(I, /obj/item/weapon/stock_parts) || ispath(I, /obj/item/weapon/grenade/chem_grenade) || ispath(I, /obj/item/weapon/kitchen))
var/obj/item/tempCheck = I
if(initial(tempCheck.icon_state) != null) //check it's an actual usable item, in a hacky way
valid_items += 15
valid_items += I
probWeight++
- if(ispath(I,/obj/item/weapon/reagent_containers/food))
+ if(ispath(I, /obj/item/weapon/reagent_containers/food))
var/obj/item/tempCheck = I
if(initial(tempCheck.icon_state) != null) //check it's an actual usable item, in a hacky way
valid_items += rand(1,max(2,35-probWeight))
valid_items += I
- if(ispath(I,/obj/item/weapon/construction/rcd) || ispath(I,/obj/item/weapon/grenade) || ispath(I,/obj/item/device/aicard) || ispath(I,/obj/item/weapon/storage/backpack/holding) || ispath(I,/obj/item/slime_extract) || ispath(I,/obj/item/device/onetankbomb) || ispath(I,/obj/item/device/transfer_valve))
+ if(ispath(I, /obj/item/weapon/construction/rcd) || ispath(I, /obj/item/weapon/grenade) || ispath(I, /obj/item/device/aicard) || ispath(I, /obj/item/weapon/storage/backpack/holding) || ispath(I, /obj/item/slime_extract) || ispath(I, /obj/item/device/onetankbomb) || ispath(I, /obj/item/device/transfer_valve))
var/obj/item/tempCheck = I
if(initial(tempCheck.icon_state) != null)
critical_items += I
@@ -111,7 +111,7 @@
/obj/machinery/r_n_d/experimentor/proc/checkCircumstances(obj/item/O)
//snowflake check to only take "made" bombs
- if(istype(O,/obj/item/device/transfer_valve))
+ if(istype(O, /obj/item/device/transfer_valve))
var/obj/item/device/transfer_valve/T = O
if(!T.tank_one || !T.tank_two || !T.attached_device)
return FALSE
@@ -163,7 +163,7 @@
dat += " Burn"
dat += " Freeze"
dat += " Destroy "
- if(istype(loaded_item,/obj/item/weapon/relic))
+ if(istype(loaded_item, /obj/item/weapon/relic))
dat += " Discover "
dat += " Eject"
else
@@ -282,7 +282,7 @@
loaded_item = new newPath(src)
visible_message("[src] malfunctions, transforming [savedName] into [loaded_item]!")
investigate_log("Experimentor has transformed [savedName] into [loaded_item]", INVESTIGATE_EXPERIMENTOR)
- if(istype(loaded_item,/obj/item/weapon/grenade/chem_grenade))
+ if(istype(loaded_item, /obj/item/weapon/grenade/chem_grenade))
var/obj/item/weapon/grenade/chem_grenade/CG = loaded_item
CG.prime()
ejectItem()
@@ -653,12 +653,12 @@
warn_admins(user, "Flash")
/obj/item/weapon/relic/proc/petSpray(mob/user)
- var/message = "[src] begans to shake, and in the distance the sound of rampaging animals arises!"
+ var/message = "[src] begins to shake, and in the distance the sound of rampaging animals arises!"
visible_message(message)
to_chat(user, message)
var/animals = rand(1,25)
var/counter
- var/list/valid_animals = list(/mob/living/simple_animal/parrot,/mob/living/simple_animal/butterfly,/mob/living/simple_animal/pet/cat,/mob/living/simple_animal/pet/dog/corgi,/mob/living/simple_animal/crab,/mob/living/simple_animal/pet/fox,/mob/living/simple_animal/hostile/lizard,/mob/living/simple_animal/mouse,/mob/living/simple_animal/pet/dog/pug,/mob/living/simple_animal/hostile/bear,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/carp)
+ var/list/valid_animals = list(/mob/living/simple_animal/parrot, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/dog/corgi, /mob/living/simple_animal/crab, /mob/living/simple_animal/pet/fox, /mob/living/simple_animal/hostile/lizard, /mob/living/simple_animal/mouse, /mob/living/simple_animal/pet/dog/pug, /mob/living/simple_animal/hostile/bear, /mob/living/simple_animal/hostile/poison/bees, /mob/living/simple_animal/hostile/carp)
for(counter = 1; counter < animals; counter++)
var/mobType = pick(valid_animals)
new mobType(get_turf(src))
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index b9b0e614e8..44156fcc43 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -20,7 +20,7 @@ this dire fate:
it's data to every other device in the game. Each console has a "disconnect from network" option that'll will cause data base sync
operations to skip that console. This is useful if you want to make a "public" R&D console or, for example, give the engineers
a circuit imprinter with certain designs on it and don't want it accidentally updating. The downside of this method is that you have
-to have physical access to the other console to send data back. Note: An R&D console is on Centcom so if a random griffan happens to
+to have physical access to the other console to send data back. Note: An R&D console is on CentCom so if a random griffan happens to
cause a ton of data to be lost, an admin can go send it back.
- The second method is with Technology Disks and Design Disks. Each of these disks can hold technology or design datums in
their entirety. You can then take the disk to any R&D console and upload it's data to it. This method is a lot more secure (since it
@@ -321,7 +321,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
for(var/obj/I in linked_destroy.contents)
for(var/mob/M in I.contents)
M.death()
- if(istype(I,/obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack
+ if(istype(I, /obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack
var/obj/item/stack/sheet/S = I
if(S.amount > 1)
S.amount--
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index 827cce162f..3b6ebbeca0 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -219,13 +219,13 @@ research holder datum.
/datum/tech/plasmatech
name = "Plasma Research"
- desc = "Research into the mysterious substance colloqually known as \"plasma\"."
+ desc = "Research into the mysterious substance colloquially known as \"plasma\"."
id = "plasmatech"
rare = 3
/datum/tech/powerstorage
name = "Power Manipulation Technology"
- desc = "The various technologies behind the storage and generation of electicity."
+ desc = "The various technologies behind the storage and generation of electricity."
id = "powerstorage"
/datum/tech/bluespace
@@ -256,7 +256,7 @@ research holder datum.
/datum/tech/syndicate
name = "Illegal Technologies Research"
- desc = "The study of technologies that violate Nanotrassen regulations."
+ desc = "The study of technologies that violate Nanotrasen regulations."
id = "syndicate"
rare = 4
@@ -349,7 +349,7 @@ research holder datum.
max_tech_stored = 10
/obj/item/weapon/disk/tech_disk/debug
- name = "centcomm technology disk"
+ name = "centcom technology disk"
desc = "A debug item for research"
materials = list()
max_tech_stored = 0
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 7437db2694..d161929f2c 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -133,7 +133,7 @@
return
/obj/machinery/r_n_d/server/centcom
- name = "Centcom Central R&D Database"
+ name = "CentCom Central R&D Database"
server_id = -1
/obj/machinery/r_n_d/server/centcom/Initialize()
diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm
index d7230c737c..a5d3e8fece 100644
--- a/code/modules/research/stock_parts.dm
+++ b/code/modules/research/stock_parts.dm
@@ -6,6 +6,8 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
icon_state = "RPED"
item_state = "RPED"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_HUGE
can_hold = list(/obj/item/weapon/stock_parts)
storage_slots = 50
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index f2546ea465..ae20aa45d1 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -88,6 +88,7 @@
/datum/action/innate/slime_place
name = "Place Slimes"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "slime_down"
/datum/action/innate/slime_place/Activate()
@@ -107,6 +108,7 @@
/datum/action/innate/slime_pick_up
name = "Pick up Slime"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "slime_up"
/datum/action/innate/slime_pick_up/Activate()
@@ -132,6 +134,7 @@
/datum/action/innate/feed_slime
name = "Feed Slimes"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "monkey_down"
/datum/action/innate/feed_slime/Activate()
@@ -153,6 +156,7 @@
/datum/action/innate/monkey_recycle
name = "Recycle Monkeys"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "monkey_up"
/datum/action/innate/monkey_recycle/Activate()
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 93ac3324ac..9c826f5f5f 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -425,7 +425,7 @@
/obj/item/clothing/suit/golem
name = "adamantine shell"
- desc = "a golem's thick outter shell"
+ desc = "a golem's thick outer shell"
icon_state = "golem"
item_state = "golem"
w_class = WEIGHT_CLASS_BULKY
diff --git a/code/modules/ruins/lavalandruin_code/sloth.dm b/code/modules/ruins/lavalandruin_code/sloth.dm
new file mode 100644
index 0000000000..7253f48e97
--- /dev/null
+++ b/code/modules/ruins/lavalandruin_code/sloth.dm
@@ -0,0 +1,5 @@
+/////////// lavaland slot ruin items
+
+/obj/item/weapon/paper/fluff/stations/lavaland/sloth/note
+ name = "note from sloth"
+ desc = "have not gotten around to finishing my cursed item yet sorry - sloth"
\ No newline at end of file
diff --git a/code/modules/ruins/lavalandruin_code/surface.dm b/code/modules/ruins/lavalandruin_code/surface.dm
new file mode 100644
index 0000000000..4da89f2abe
--- /dev/null
+++ b/code/modules/ruins/lavalandruin_code/surface.dm
@@ -0,0 +1,5 @@
+//////lavaland surface papers
+
+/obj/item/weapon/paper/fluff/stations/lavaland/surface/henderson_report
+ name = "Important Notice - Mrs. Henderson"
+ info = "Nothing of interest to report."
\ No newline at end of file
diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
index df404146bf..3bda50c221 100644
--- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
+++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
@@ -175,10 +175,12 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
else
message_admins("[user ? key_name_admin(user):"Unknown"] has released Legion!")
log_game("[user ? key_name(user):"Unknown"] released Legion.")
+
+ var/sound/legion_sound = sound('sound/creatures/legion_spawn.ogg')
for(var/mob/M in GLOB.player_list)
if(M.z == z)
to_chat(M, "Discordant whispers flood your mind in a thousand voices. Each one speaks your name, over and over. Something horrible has been released.")
- M.playsound_local(T, 'sound/creatures/legion_spawn.ogg', 100, FALSE, 0, FALSE, pressure_affected = FALSE)
+ M.playsound_local(T, null, 100, FALSE, 0, FALSE, pressure_affected = FALSE, S = legion_sound)
flash_color(M, flash_color = "#FF0000", flash_time = 50)
var/mutable_appearance/release_overlay = mutable_appearance('icons/effects/effects.dmi', "legiondoor")
notify_ghosts("Legion has been released in the [get_area(src)]!", source = src, alert_overlay = release_overlay, action = NOTIFY_JUMP)
diff --git a/code/modules/ruins/spaceruin_code/DJstation.dm b/code/modules/ruins/spaceruin_code/DJstation.dm
new file mode 100644
index 0000000000..7fbe3e9300
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/DJstation.dm
@@ -0,0 +1,5 @@
+/////////// djstation items
+
+/obj/item/weapon/paper/fluff/ruins/djstation
+ name = "paper - 'DJ Listening Outpost'"
+ info = "Welcome new owner!
You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio frequencies. Here is a step by step guide to start listening in on those saucy radio channels:
Equip yourself with a multitool
Use the multitool on the relay.
Turn it on. It has already been configured for you to listen on.
Simple as that. Now to listen to the private channels, you'll have to configure the intercoms. They are located on the front desk. Here is a list of frequencies for you to listen on.
145.9 - Common Channel
144.7 - Private AI Channel
135.9 - Security Channel
135.7 - Engineering Channel
135.5 - Medical Channel
135.3 - Command Channel
135.1 - Science Channel
134.9 - Service Channel
134.7 - Supply Channel
"
diff --git a/code/modules/ruins/spaceruin_code/TheDerelict.dm b/code/modules/ruins/spaceruin_code/TheDerelict.dm
new file mode 100644
index 0000000000..e7b55411fb
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/TheDerelict.dm
@@ -0,0 +1,13 @@
+/////////// thederelict items
+
+/obj/item/weapon/paper/fluff/ruins/thederelict/equipment
+ info = "If the equipment breaks there should be enough spare parts in our engineering storage near the north east solar array."
+ name = "Equipment Inventory"
+
+/obj/item/weapon/paper/fluff/ruins/thederelict/syndie_mission
+ name = "Mission Objectives"
+ info = "The Syndicate have cunningly disguised a Syndicate Uplink as your PDA. Simply enter the code \"678 Bravo\" into the ringtone select to unlock its hidden features.
Objective #1. Kill the God damn AI in a fire blast that it rocks the station. Success! Objective #2. Escape alive. Failed."
+
+/obj/item/weapon/paper/fluff/ruins/thederelict/nukie_objectives
+ name = "Objectives of a Nuclear Operative"
+ info = "Objective #1: Destroy the station with a nuclear device."
\ No newline at end of file
diff --git a/code/modules/ruins/spaceruin_code/asteroid4.dm b/code/modules/ruins/spaceruin_code/asteroid4.dm
new file mode 100644
index 0000000000..eca2b4252c
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/asteroid4.dm
@@ -0,0 +1,4 @@
+/////////// asteroid4 items
+
+/obj/item/weapon/paper/fluff/ruins/asteroid4/extraction
+ info = "Extraction was successful! The disguise was perfect, the clowns never knew what hit 'em! Once I get back to base with the bananium samples I'll be rich, I tell you! RICH!"
diff --git a/code/modules/ruins/spaceruin_code/crashedclownship.dm b/code/modules/ruins/spaceruin_code/crashedclownship.dm
new file mode 100644
index 0000000000..f927b7be73
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/crashedclownship.dm
@@ -0,0 +1,4 @@
+/////////// crashedclownship items
+
+/obj/item/weapon/paper/fluff/ruins/crashedclownship/true_nation
+ info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"
diff --git a/code/modules/ruins/spaceruin_code/crashedship.dm b/code/modules/ruins/spaceruin_code/crashedship.dm
new file mode 100644
index 0000000000..e7d07dafb5
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/crashedship.dm
@@ -0,0 +1,15 @@
+/////////// crashedship items
+
+/obj/item/weapon/paper/fluff/ruins/crashedship/scribbled
+ name = "scribbled note"
+ info = "The next person who takes one of my screwdrivers gets stabbed with one. They are MINE. - Love, Madsen"
+
+
+/obj/item/weapon/paper/fluff/ruins/crashedship/captains_log
+ name = "Captain's log entry"
+ info = "I'm no scientist, but judging from the design and components, it seems to be some kind of teleporter. This thing is gonna be worth a lot of cash to the right man. The boys are excited, as they have every right to be, and I've let them crack into that case of beer we got. I normally wouldn't allow such a thing, but this is a time for celebration! It's not like a couple drinks will hurt anything."
+
+/obj/item/weapon/paper/fluff/ruins/crashedship/old_diary
+ name = "Old Diary"
+ info = "DEAR DAIRY: So we was doing our typpical route when the captain says we've been picking up weird signals on some backwatter planet. Madsen wanted to stay on course but he ain't the captain, so we went out of the way to check it out. There was lots of rocks on the way, but we got to the planet fine. Found a big fancy camp with nobody around and this big metal donut thing with NT stamps all over it right in the middle. Case of beer too. Captain reckons we can pass it off to some buyer in the Syndicate. Ingram says it's bad luck and that someone is going to come look for it but it sounds like better money than selling bad meat to jerky companies."
+
diff --git a/code/modules/ruins/spaceruin_code/deepstorage.dm b/code/modules/ruins/spaceruin_code/deepstorage.dm
new file mode 100644
index 0000000000..97fc360d7c
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/deepstorage.dm
@@ -0,0 +1,14 @@
+/////////// deepstorage items
+
+/obj/item/weapon/paper/fluff/ruins/deepstorage/water_concern
+ name = "water concerns"
+ info = "To whoever keeps it up with the long, hot showers: you're going on the next ice-mining trip. If you feel the need to use up all the damn water during your 'relaxation' time, you sure as hell are gonna work for all that water!"
+
+/obj/item/weapon/paper/fluff/ruins/deepstorage/hydro_notice
+ name = "hydroponics notice"
+ info = "Hydroponics is our life and blood here, if it dies then so do we. Keep the damn plants watered!"
+
+/obj/item/weapon/paper/fluff/ruins/deepstorage/recycling_notice
+ name = "recycling notice"
+ info = "Please make sure to throw all excess waste into the crusher in the back! It's amazing what you can get out of what others consider 'garbage' if you run it through a giant crusher enough times."
+
diff --git a/code/modules/ruins/spaceruin_code/listeningstation.dm b/code/modules/ruins/spaceruin_code/listeningstation.dm
new file mode 100644
index 0000000000..9441ec3685
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/listeningstation.dm
@@ -0,0 +1,45 @@
+/////////// listening station
+
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports
+ info = "Nothing of interest to report."
+
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/july
+ name = "july report"
+
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/august
+ name = "august report"
+
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/september
+ name = "september report"
+
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/october
+ name = "october report"
+
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/november
+ name = "november report"
+
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/june
+ name = "june report"
+ info = "Nanotrasen communications have been noticably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it."
+
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/may
+ name = "may report"
+ info = "Nothing of real interest to report this month. I have intercepted faint transmissions from what appears to be some sort of pirate radio station. They do not appear to be relevant to my assignment."
+
+/obj/item/weapon/paper/fluff/ruins/listeningstation/reports/april
+ name = "april report"
+ info = "A good start to the operation: intercepted Nanotrasen military communications. A convoy is scheduled to transfer nuclear warheads to a new military base. This is as good a chance as any to get our hands on some heavy weaponry, I suggest we take it."
+
+/obj/item/weapon/paper/fluff/ruins/listeningstation/receipt
+ name = "receipt"
+ info = "1 x Stechtkin pistol - $600 1 x silencer - $200 shipping charge - $4360 total - $5160"
+
+/obj/item/weapon/paper/fluff/ruins/listeningstation/odd_report
+ name = "odd report"
+ info = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilised your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear it's ugly head again. -Donk Co. Operative #451"
+
+/obj/item/weapon/paper/fluff/ruins/listeningstation/briefing
+ name = "mission briefing"
+ info = "Mission Details: You have been assigned to a newly constructed listening post constructed within an asteroid in Nanotrasen space to monitor their plasma mining operations. Accurate intel is crucial to the success of our operatives onboard, do not fail us."
+
+
diff --git a/code/modules/ruins/spaceruin_code/oldstation.dm b/code/modules/ruins/spaceruin_code/oldstation.dm
new file mode 100644
index 0000000000..52b2f5313c
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/oldstation.dm
@@ -0,0 +1,49 @@
+/////////// Oldstation items
+
+/obj/item/weapon/paper/fluff/ruins/oldstation
+ name = "Cyro Awakening Alert"
+ info = "**WARNING**
Catastrophic damage sustained to station. Powernet exhausted to reawaken crew.
Immediate Objectives
1: Activate emergency power generator 2: Lift station lockdown on the bridge
Please locate the 'Damage Report' on the bridge for a detailed situation report."
+
+/obj/item/weapon/paper/fluff/ruins/oldstation/damagereport
+ name = "Damage Report"
+ info = "*Damage Report*
Charlie Station - Intact. Loss of oxygen to eastern side of main corridor.
Delta Station - Intact. WARNING: Unknown force occupying Delta Station. Intent unknown. Species unknown. Numbers unknown.
Recommendation - Reestablish station powernet via solar array. Reestablish station atmospherics system to restore air."
+
+/obj/item/weapon/paper/fluff/ruins/oldstation/protosuit
+ name = "B01-RIG Hardsuit Report"
+ info = "*Prototype Hardsuit*
The B01-RIG Hardsuit is a prototype powered exoskeleton. Based off of a recovered pre-void war era united earth government powered military \
+ exosuit, the RIG Hardsuit is a breakthrough in Hardsuit technology, and is the first post-void war era Hardsuit that can be safely used by a operator.
The B01 however suffers \
+ a myriad of constraints. It is slow and bulky to move around, it lacks any significant armor plating against direct attacks and its internal heads up display is unfinished, \
+ resulting in the user being unable to see long distances.
The B01 is unlikely to see any form of mass production, but will serve as a base for future Hardsuit developments."
+
+/obj/item/weapon/paper/fluff/ruins/oldstation/protohealth
+ name = "Health Analyser Report"
+ info = "*Health Analyser*
The portable Health Analyser is essentially a handheld varient of a health analyser. Years of research have concluded with this device which is \
+ capable of diagnosing even the most critical, obscure or technical injuries any humanoid entity is suffering in a easy to understand format that even a non-trained health professional \
+ can understand.
The health analyser is expected to go into full production as standard issue medical kit."
+
+/obj/item/weapon/paper/fluff/ruins/oldstation/protogun
+ name = "K14 Energy Gun Report"
+ info = "*K14-Multiphase Energy Gun*
The K14 Prototype Energy Gun is the first Energy Rifle that has been successfully been able to not only hold a larger ammo charge \
+ than other gun models, but is capable of swapping between different energy projectile types on command with no incidents.
The weapon still suffers several drawbacks, its alternative, \
+ non laser fire mode, can only fire one round before exhausting the energy cell, the weapon also remains prohibitively expensive, nonetheless NT Market Research fully believe this weapon \
+ will form the backbone of our Energy weapon cataloge.
The K14 is expected to undergo revision to fix the ammo issues, the K15 is expected to replace the 'stun' setting with a \
+ 'disable' setting in a attempt to bypass the ammo issues."
+
+/obj/item/weapon/paper/fluff/ruins/oldstation/protosing
+ name = "Singularity Generator"
+ info = "*Singularity Generator*
Modern power generation typically comes in two forms, a Fusion Generator or a Fission Generator. Fusion provides the best space to power \
+ ratio, and is typically seen on military or high security ships and stations, however Fission reactors require the usage of expensive, and rare, materials in its construction.. Fission generators are massive and bulky, and require a large reserve of uranium to power, however they are extremely cheap to operate and oft need little maintenance once \
+ operational.
The Singularity aims to alter this, a functional Singularity is essentially a controlled Black Hole, a Black Hole that generates far more power than Fusion or Fission \
+ generators can ever hope to produce. "
+
+/obj/item/weapon/paper/fluff/ruins/oldstation/protoinv
+ name = "Laboratory Inventory"
+ info = "*Inventory*
(1) Prototype Hardsuit
(1)Health Analyser
(1)Prototype Energy Gun
(1)Singularity Generation Disk
DO NOT REMOVE WITHOUT \
+ THE CAPTAIN AND RESEARCH DIRECTOR'S AUTHORISATION"
+
+/obj/item/weapon/paper/fluff/ruins/oldstation/report
+ name = "Crew Reawakening Report"
+ info = "Artifical Program's report to surviving crewmembers.
Crew were placed into cryostasis on March 10th, 2445.
Crew were awoken from cryostasis around June, 2557.
\
+ SIGNIFICANT EVENTS OF NOTE 1: The primary radiation detectors were taken offline after 112 years due to power failure, secondary radioation detectors showed no residual \
+ radioation on station. Deduction, primariy detector was malfunctioning and was producing a radioation signal when there was none.
2: A data burst from a nearby Nanotrasen Space \
+ Station was recieved, this data burst contained research data that has been uploaded to our RnD labs.
3: Unknown invasion force has occupied Delta station."
diff --git a/code/modules/ruins/spaceruin_code/originalcontent.dm b/code/modules/ruins/spaceruin_code/originalcontent.dm
new file mode 100644
index 0000000000..ade3e3cb21
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/originalcontent.dm
@@ -0,0 +1,4 @@
+/////////// originalcontent items
+
+/obj/item/weapon/paper/crumpled/ruins/originalcontent
+ desc = "Various scrawled out drawings and sketches reside on the paper, apparently he didn't much care for these drawings."
\ No newline at end of file
diff --git a/code/modules/ruins/spaceruin_code/spacehotel.dm b/code/modules/ruins/spaceruin_code/spacehotel.dm
new file mode 100644
index 0000000000..843cfa860c
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/spacehotel.dm
@@ -0,0 +1,12 @@
+/////////// spacehotel items
+
+
+/obj/item/weapon/paper/fluff/ruins/spacehotel/notice
+ name = "!NOTICE!"
+ info = "!NOTICE!
We are expecting arriving guests soon from a nearby station! Stay sharp and make sure guests enjoy their time spent here. Don't think you can sneak off while they're here, either.
"
+
+/obj/item/weapon/paper/pamphlet/ruin/spacehotel
+ name = "hotel pamphlet"
+ info = "
The Twin Nexus Hotel
A place of Sanctuary
Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff stride to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more infomation.
"
+
+
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 62e16144a0..c6f916625f 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -390,7 +390,7 @@
var/obj/docking_port/mobile/M = A
M.on_emergency_dock()
- // now move the actual emergency shuttle to centcomm
+ // now move the actual emergency shuttle to centcom
// unless the shuttle is "hijacked"
var/destination_dock = "emergency_away"
if(is_hijacked())
diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm
index 2c96d65756..23ca6e231b 100644
--- a/code/modules/shuttle/ferry.dm
+++ b/code/modules/shuttle/ferry.dm
@@ -29,5 +29,5 @@
if(last_request && (last_request + cooldown > world.time))
return
last_request = world.time
- to_chat(usr, "Your request has been recieved by Centcom.")
- to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to Centcom.
")
+ to_chat(usr, "Your request has been recieved by CentCom.")
+ to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to CentCom.")
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index e15dc3f076..21de2161de 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -12,7 +12,7 @@
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
anchored = TRUE
-//
+//
var/id
// this should point -away- from the dockingport door, ie towards the ship
dir = NORTH
@@ -481,7 +481,7 @@
var/rotation = 0
if(new_dock.dir != dir) //Even when the dirs are the same rotation is coming out as not 0 for some reason
- rotation = dir2angle(new_dock)-dir2angle(dir)
+ rotation = dir2angle(new_dock.dir)-dir2angle(dir)
if ((rotation % 90) != 0)
rotation += (rotation % 90) //diagonal rotations not allowed, round up
rotation = SimplifyDegrees(rotation)
@@ -527,7 +527,7 @@
return DOCKING_AREA_EMPTY
/*******************************************All onShuttleMove procs******************************************/
-
+
for(var/i in 1 to old_turfs.len)
var/turf/oldT = old_turfs[i]
var/turf/newT = new_turfs[i]
@@ -550,9 +550,9 @@
var/atom/movable/moving_atom = thing
moving_atom.onShuttleMove(newT, oldT, rotation, movement_force, movement_direction) //atoms
moved_atoms += moving_atom
-
+
/******************************************All afterShuttleMove procs****************************************/
-
+
for(var/i in 1 to new_turfs.len)
var/turf/oldT = old_turfs[i]
var/turf/newT = new_turfs[i]
@@ -767,7 +767,7 @@
return TRUE
return FALSE
-// Losing all initial engines should get you 2
+// Losing all initial engines should get you 2
// Adding another set of engines at 0.5 time
/obj/docking_port/mobile/proc/alter_engines(mod)
if(mod == 0)
@@ -806,7 +806,7 @@
if(initial_engines > 0)
change_per_engine = (ENGINE_COEFF_MAX - 1) / initial_engines //just linear drop to max delay
return Clamp(1 + delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX)
-
+
/obj/docking_port/mobile/proc/in_flight()
switch(mode)
@@ -838,15 +838,15 @@
//Called when emergency shuttle docks at centcom
/obj/docking_port/mobile/proc/on_emergency_dock()
- //Mapping a new docking point for each ship mappers could potentially want docking with centcomm would take up lots of space, just let them keep flying off into the sunset for their greentext
+ //Mapping a new docking point for each ship mappers could potentially want docking with centcom would take up lots of space, just let them keep flying off into the sunset for their greentext
if(launch_status == ENDGAME_LAUNCHED)
launch_status = ENDGAME_TRANSIT
/obj/docking_port/mobile/pod/on_emergency_dock()
if(launch_status == ENDGAME_LAUNCHED)
- dock(SSshuttle.getDock("[id]_away")) //Escape pods dock at centcomm
+ dock(SSshuttle.getDock("[id]_away")) //Escape pods dock at centcom
mode = SHUTTLE_ENDGAME
-
+
/obj/docking_port/mobile/emergency/on_emergency_dock()
return
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index e4466972a2..ea113ba4fd 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -118,7 +118,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
var/critfailchance = 0
var/centcom_cancast = 1 //Whether or not the spell should be allowed on z2
- var/action_icon = 'icons/mob/actions.dmi'
+ var/action_icon = 'icons/mob/actions/actions_spells.dmi'
var/action_icon_state = "spell_default"
var/action_background_icon_state = "bg_spell"
var/datum/action/spell_action/action
diff --git a/code/modules/spells/spell_types/barnyard.dm b/code/modules/spells/spell_types/barnyard.dm
index d21b54b070..f026cd1483 100644
--- a/code/modules/spells/spell_types/barnyard.dm
+++ b/code/modules/spells/spell_types/barnyard.dm
@@ -12,7 +12,7 @@
range = 7
cooldown_min = 30
selection_type = "range"
- var/list/compatible_mobs = list(/mob/living/carbon/human,/mob/living/carbon/monkey)
+ var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
action_icon_state = "barn"
diff --git a/code/modules/spells/spell_types/bloodcrawl.dm b/code/modules/spells/spell_types/bloodcrawl.dm
index d7c5221e3d..e4c33380b2 100644
--- a/code/modules/spells/spell_types/bloodcrawl.dm
+++ b/code/modules/spells/spell_types/bloodcrawl.dm
@@ -9,6 +9,7 @@
range = 1
cooldown_min = 0
overlay = null
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
action_icon_state = "bloodcrawl"
action_background_icon_state = "bg_demon"
var/phased = 0
diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm
index 9cc3e3b5a8..5f5547c281 100644
--- a/code/modules/spells/spell_types/charge.dm
+++ b/code/modules/spells/spell_types/charge.dm
@@ -55,7 +55,7 @@
I.max_charges = 0
burnt_out = 1
I.charges = I.max_charges
- if(istype(item,/obj/item/weapon/gun/magic/wand) && I.max_charges != 0)
+ if(istype(item, /obj/item/weapon/gun/magic/wand) && I.max_charges != 0)
var/obj/item/weapon/gun/magic/W = item
W.icon_state = initial(W.icon_state)
I.recharge_newshot()
@@ -84,7 +84,7 @@
C.maxcharge = 1
burnt_out = 1
C.charge = C.maxcharge
- if(istype(C.loc,/obj/item/weapon/gun))
+ if(istype(C.loc, /obj/item/weapon/gun))
var/obj/item/weapon/gun/G = C.loc
G.process_chamber()
item.update_icon()
diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm
index 3985328827..bc88dacf7d 100644
--- a/code/modules/spells/spell_types/conjure.dm
+++ b/code/modules/spells/spell_types/conjure.dm
@@ -28,7 +28,7 @@
var/spawn_place = pick(targets)
if(summon_ignore_prev_spawn_points)
targets -= spawn_place
- if(ispath(summoned_object_type,/turf))
+ if(ispath(summoned_object_type, /turf))
var/turf/O = spawn_place
var/N = summoned_object_type
O.ChangeTurf(N)
diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm
index c8a7c387ee..5c28ff5029 100644
--- a/code/modules/spells/spell_types/construct_spells.dm
+++ b/code/modules/spells/spell_types/construct_spells.dm
@@ -2,6 +2,7 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser
charge_max = 1800
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "artificer"
action_background_icon_state = "bg_demon"
@@ -20,6 +21,7 @@
invocation = "none"
invocation_type = "none"
range = 2
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "areaconvert"
action_background_icon_state = "bg_cult"
@@ -40,6 +42,7 @@
invocation_type = "none"
range = 0
summon_type = list(/turf/open/floor/engine/cult)
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "floorconstruct"
action_background_icon_state = "bg_cult"
@@ -54,6 +57,7 @@
invocation = "none"
invocation_type = "none"
range = 0
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "lesserconstruct"
action_background_icon_state = "bg_cult"
@@ -83,6 +87,7 @@
invocation = "none"
invocation_type = "none"
range = 0
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "summonsoulstone"
action_background_icon_state = "bg_demon"
@@ -109,6 +114,7 @@
range = 0
summon_type = list(/obj/effect/forcefield/cult)
summon_lifespan = 200
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "cultforcewall"
action_background_icon_state = "bg_demon"
@@ -125,6 +131,7 @@
range = -1
include_user = 1
jaunt_duration = 50 //in deciseconds
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "phaseshift"
action_background_icon_state = "bg_demon"
jaunt_in_time = 12
@@ -164,7 +171,7 @@
smoke_spread = 3
smoke_amt = 4
- action_icon_state = "parasmoke"
+ action_icon_state = "smoke"
action_background_icon_state = "bg_cult"
@@ -182,6 +189,7 @@
clothes_req = FALSE
invocation = "none"
invocation_type = "none"
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_background_icon_state = "bg_demon"
action_icon_state = "abyssal_gaze"
@@ -222,6 +230,7 @@
clothes_req = FALSE
invocation = "none"
invocation_type = "none"
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_background_icon_state = "bg_demon"
action_icon_state = "dominate"
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
index 78d568c39e..ca9764af1f 100644
--- a/code/modules/spells/spell_types/devil.dm
+++ b/code/modules/spells/spell_types/devil.dm
@@ -10,6 +10,7 @@
school = "conjuration"
charge_max = 150
cooldown_min = 10
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
action_icon_state = "pitchfork"
action_background_icon_state = "bg_demon"
@@ -26,6 +27,7 @@
invocation = "I aint have this much fun since Georgia."
action_icon_state = "golden_violin"
name = "Summon golden violin"
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/targeted/summon_contract
@@ -110,7 +112,7 @@
user.infernalphasein()
else
to_chat(user, "You are no longer near a potential signer.")
-
+
else
to_chat(user, "You can only re-appear near a potential signer.")
revert_cast()
@@ -178,6 +180,7 @@
cooldown_min = 0
overlay = null
include_user = 0
+ action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "sintouch"
action_background_icon_state = "bg_demon"
phase_allowed = 0
@@ -213,6 +216,7 @@
school = "conjuration"
charge_max = 10
cooldown_min = 50 //5 seconds, so the smoke can't be spammed
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
action_icon_state = "funk"
action_background_icon_state = "bg_demon"
diff --git a/code/modules/spells/spell_types/devil_boons.dm b/code/modules/spells/spell_types/devil_boons.dm
index 75b6597f07..192a15e96c 100644
--- a/code/modules/spells/spell_types/devil_boons.dm
+++ b/code/modules/spells/spell_types/devil_boons.dm
@@ -8,6 +8,7 @@
school = "conjuration"
charge_max = 100
cooldown_min = 10
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
action_icon_state = "moneybag"
@@ -34,6 +35,7 @@
clothes_req = 0
charge_max = 50
cooldown_min = 10
+ action_icon = 'icons/mob/actions/actions_silicon.dmi'
action_icon_state = "camera_jump"
var/ranges = list(7,8,9,10)
@@ -52,6 +54,7 @@
clothes_req = 0
charge_max = 50
cooldown_min = 10
+ action_icon = 'icons/mob/actions/actions_spells.dmi'
action_icon_state = "sacredflame"
var/mob/living/friend
var/obj/effect/mob_spawn/human/demonic_friend/friendShell
diff --git a/code/modules/spells/spell_types/dumbfire.dm b/code/modules/spells/spell_types/dumbfire.dm
index 6e29b433c2..a028ec36bd 100644
--- a/code/modules/spells/spell_types/dumbfire.dm
+++ b/code/modules/spells/spell_types/dumbfire.dm
@@ -44,7 +44,7 @@
if(istext(proj_type))
var/projectile_type = text2path(proj_type)
projectile = new projectile_type(user)
- else if(istype(proj_type,/obj/effect/proc_holder/spell))
+ else if(istype(proj_type, /obj/effect/proc_holder/spell))
projectile = new /obj/effect/proc_holder/spell/targeted/trigger(user)
var/obj/effect/proc_holder/spell/targeted/trigger/T = projectile
T.linked_spells += proj_type
diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm
index 0442b2c02a..cc728f942e 100644
--- a/code/modules/spells/spell_types/lichdom.dm
+++ b/code/modules/spells/spell_types/lichdom.dm
@@ -17,6 +17,7 @@
cooldown_min = 10
include_user = 1
+ action_icon = 'icons/mob/actions/actions_spells.dmi'
action_icon_state = "skeleton"
/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets,mob/user = usr)
@@ -131,7 +132,7 @@
lich.real_name = mind.name
mind.transfer_to(lich)
mind.grab_ghost(force=TRUE)
- lich.hardset_dna(null,null,lich.real_name,null,/datum/species/skeleton)
+ lich.hardset_dna(null,null,lich.real_name,null, /datum/species/skeleton)
to_chat(lich, "Your bones clatter and shutter as you are pulled back into this world!")
var/turf/body_turf = get_turf(old_body)
lich.Knockdown(200 + 200*resurrections)
diff --git a/code/modules/spells/spell_types/projectile.dm b/code/modules/spells/spell_types/projectile.dm
index 74afd90ef2..1a682639eb 100644
--- a/code/modules/spells/spell_types/projectile.dm
+++ b/code/modules/spells/spell_types/projectile.dm
@@ -36,7 +36,7 @@
if(istext(proj_type))
var/projectile_type = text2path(proj_type)
projectile = new projectile_type(user)
- if(istype(proj_type,/obj/effect/proc_holder/spell))
+ if(istype(proj_type, /obj/effect/proc_holder/spell))
projectile = new /obj/effect/proc_holder/spell/targeted/trigger(user)
var/obj/effect/proc_holder/spell/targeted/trigger/T = projectile
T.linked_spells += proj_type
diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm
index 90c7730f5a..61330265ab 100644
--- a/code/modules/spells/spell_types/summonitem.dm
+++ b/code/modules/spells/spell_types/summonitem.dm
@@ -80,13 +80,13 @@
var/obj/item/bodypart/part = X
if(item_to_retrieve in part.embedded_objects)
part.embedded_objects -= item_to_retrieve
- to_chat(C, "The [item_to_retrieve] that was embedded in your [L] has myseriously vanished. How fortunate!")
+ to_chat(C, "The [item_to_retrieve] that was embedded in your [L] has mysteriously vanished. How fortunate!")
if(!C.has_embedded_objects())
C.clear_alert("embeddedobject")
break
else
- if(istype(item_to_retrieve.loc,/obj/machinery/portable_atmospherics/)) //Edge cases for moved machinery
+ if(istype(item_to_retrieve.loc, /obj/machinery/portable_atmospherics/)) //Edge cases for moved machinery
var/obj/machinery/portable_atmospherics/P = item_to_retrieve.loc
P.disconnect()
P.update_icon()
diff --git a/code/modules/spells/spell_types/voice_of_god.dm b/code/modules/spells/spell_types/voice_of_god.dm
index 6636c920f2..a5b44b8e0f 100644
--- a/code/modules/spells/spell_types/voice_of_god.dm
+++ b/code/modules/spells/spell_types/voice_of_god.dm
@@ -5,6 +5,7 @@
cooldown_min = 0
level_max = 1
clothes_req = 0
+ action_icon = 'icons/mob/actions/actions_items.dmi'
action_icon_state = "voice_of_god"
var/command
var/cooldown_mod = 1
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index b9eae51f79..73995ab018 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -301,6 +301,7 @@
cooldown_min = 150
invocation_type = "none"
sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep
+ action_icon = 'icons/mob/actions/actions_xeno.dmi'
action_icon_state = "tailsweep"
action_background_icon_state = "bg_alien"
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index 9ce3d28070..77a30b1884 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -64,7 +64,7 @@
/obj/machinery/bsa/middle
name = "Bluespace Artillery Fusor"
- desc = "Contents classifed by Nanotrasen Naval Command. Needs to be linked with the other BSA parts using multitool."
+ desc = "Contents classified by Nanotrasen Naval Command. Needs to be linked with the other BSA parts using multitool."
icon_state = "fuel_chamber"
var/obj/machinery/bsa/back/back
var/obj/machinery/bsa/front/front
@@ -73,11 +73,11 @@
if(istype(W, /obj/item/device/multitool))
var/obj/item/device/multitool/M = W
if(M.buffer)
- if(istype(M.buffer,/obj/machinery/bsa/back))
+ if(istype(M.buffer, /obj/machinery/bsa/back))
back = M.buffer
M.buffer = null
to_chat(user, "You link [src] with [back].")
- else if(istype(M.buffer,/obj/machinery/bsa/front))
+ else if(istype(M.buffer, /obj/machinery/bsa/front))
front = M.buffer
M.buffer = null
to_chat(user, "You link [src] with [front].")
@@ -291,17 +291,17 @@
/obj/machinery/computer/bsa_control/proc/get_target_name()
- if(istype(target,/area))
+ if(istype(target, /area))
var/area/A = target
return A.name
- else if(istype(target,/obj/item/device/gps))
+ else if(istype(target, /obj/item/device/gps))
var/obj/item/device/gps/G = target
return G.gpstag
/obj/machinery/computer/bsa_control/proc/get_impact_turf()
- if(istype(target,/area))
+ if(istype(target, /area))
return pick(get_area_turfs(target))
- else if(istype(target,/obj/item/device/gps))
+ else if(istype(target, /obj/item/device/gps))
return get_turf(target)
/obj/machinery/computer/bsa_control/proc/fire(mob/user)
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index ddcfaf08d1..d41ea48c5f 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -64,6 +64,8 @@
desc = "Can be used to take chemical and genetic samples of pretty much anything."
icon = 'icons/obj/syringe.dmi'
item_state = "hypo"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
icon_state = "hypo"
flags = NOBLUDGEON
var/list/animals = list()
@@ -80,12 +82,12 @@
if(!proximity || !target)
return
//tray plants
- if(istype(target,/obj/machinery/hydroponics))
+ if(istype(target, /obj/machinery/hydroponics))
var/obj/machinery/hydroponics/H = target
if(!H.myseed)
return
if(!H.harvest)// So it's bit harder.
- to_chat(user, "Plant needs to be ready to harvest to perform full data scan.") //Because space dna is actually magic
+ to_chat(user, "Plant needs to be ready to harvest to perform full data scan.") //Because space dna is actually magic
return
if(plants[H.myseed.type])
to_chat(user, "Plant data already present in local storage.")
@@ -94,7 +96,7 @@
to_chat(user, "Plant data added to local storage.")
//animals
- var/static/list/non_simple_animals = typecacheof(list(/mob/living/carbon/monkey,/mob/living/carbon/alien))
+ var/static/list/non_simple_animals = typecacheof(list(/mob/living/carbon/monkey, /mob/living/carbon/alien))
if(isanimal(target) || is_type_in_typecache(target,non_simple_animals))
if(isanimal(target))
var/mob/living/simple_animal/A = target
diff --git a/code/modules/stock_market/events.dm b/code/modules/stock_market/events.dm
index 17a92ea83f..a3d9023f7a 100644
--- a/code/modules/stock_market/events.dm
+++ b/code/modules/stock_market/events.dm
@@ -4,7 +4,7 @@
var/name = "event"
var/next_phase = 0
var/datum/stock/company = null
- var/current_title = "A company holding an pangalactic conference in the Seattle Conference Center, Seattle, Earth"
+ var/current_title = "A company holding a pangalactic conference in the Seattle Conference Center, Seattle, Earth"
var/current_desc = "We will continue to monitor their stocks as the situation unfolds."
var/phase_id = 0
var/hidden = 0
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 5c0e31456e..dfc0c658ce 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -85,7 +85,6 @@
holder.flags |= NODROP
holder.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
holder.slot_flags = null
- holder.w_class = WEIGHT_CLASS_HUGE
holder.materials = null
if(istype(holder, /obj/item/device/assembly/flash/armimplant))
@@ -174,7 +173,7 @@
/obj/item/organ/cyberimp/arm/toolset
name = "integrated toolset implant"
- desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm. Contains all neccessary tools."
+ desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm. Contains all necessary tools."
origin_tech = "materials=3;engineering=4;biotech=3;powerstorage=4"
contents = newlist(/obj/item/weapon/screwdriver/cyborg, /obj/item/weapon/wrench/cyborg, /obj/item/weapon/weldingtool/largetank/cyborg,
/obj/item/weapon/crowbar/cyborg, /obj/item/weapon/wirecutters/cyborg, /obj/item/device/multitool/cyborg)
@@ -191,7 +190,7 @@
/obj/item/organ/cyberimp/arm/esword
name = "arm-mounted energy blade"
- desc = "An illegal, and highly dangerous cybernetic implant that can project a deadly blade of concentrated enregy."
+ desc = "An illegal, and highly dangerous cybernetic implant that can project a deadly blade of concentrated energy."
contents = newlist(/obj/item/weapon/melee/transforming/energy/blade/hardlight)
origin_tech = "materials=4;combat=5;biotech=3;powerstorage=2;syndicate=5"
@@ -234,5 +233,5 @@
/obj/item/organ/cyberimp/arm/surgery
name = "surgical toolset implant"
desc = "A set of surgical tools hidden behind a concealed panel on the user's arm"
- contents = newlist(/obj/item/weapon/retractor, /obj/item/weapon/hemostat, /obj/item/weapon/cautery, /obj/item/weapon/surgicaldrill, /obj/item/weapon/scalpel, /obj/item/weapon/circular_saw, /obj/item/weapon/surgical_drapes)
+ contents = newlist(/obj/item/weapon/retractor/augment, /obj/item/weapon/hemostat/augment, /obj/item/weapon/cautery/augment, /obj/item/weapon/surgicaldrill/augment, /obj/item/weapon/scalpel/augment, /obj/item/weapon/circular_saw/augment, /obj/item/weapon/surgical_drapes)
origin_tech = "materials=3;engineering=3;biotech=3;programming=2;magnets=3"
diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm
index 3a2a3611db..a281249a12 100644
--- a/code/modules/surgery/organs/augments_chest.dm
+++ b/code/modules/surgery/organs/augments_chest.dm
@@ -117,7 +117,7 @@
/obj/item/organ/cyberimp/chest/thrusters
name = "implantable thrusters set"
desc = "An implantable set of thruster ports. They use the gas from environment or subject's internals for propulsion in zero-gravity areas. \
- Unlike regular jetpack, this device has no stablilzation system."
+ Unlike regular jetpack, this device has no stabilization system."
slot = "thrusters"
icon_state = "imp_jetpack"
origin_tech = "materials=4;magnets=4;biotech=4;engineering=5"
diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm
index 53b0d5f17f..2217d16c4d 100644
--- a/code/modules/surgery/organs/autosurgeon.dm
+++ b/code/modules/surgery/organs/autosurgeon.dm
@@ -4,7 +4,7 @@
name = "autosurgeon"
desc = "A device that automatically inserts an implant or organ into the user without the hassle of extensive surgery. It has a slot to insert implants/organs and a screwdriver slot for removing accidentally added items."
icon_state = "autoimplanter"
- item_state = "walkietalkie"//left as this so as to intentionally not have inhands
+ item_state = "nothing"
w_class = WEIGHT_CLASS_SMALL
var/obj/item/organ/storedorgan
var/organ_type = /obj/item/organ
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index ee1454b20f..f8388a5dab 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -118,7 +118,7 @@
//You are now brea- pumping blood manually
/datum/action/item_action/organ_action/cursed_heart/Trigger()
. = ..()
- if(. && istype(target,/obj/item/organ/heart/cursed))
+ if(. && istype(target, /obj/item/organ/heart/cursed))
var/obj/item/organ/heart/cursed/cursed_heart = target
if(world.time < (cursed_heart.last_pump + (cursed_heart.pump_delay-10))) //no spam
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index 4a529409c9..f95e2cd996 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -15,13 +15,13 @@
slot = "lungs"
gender = PLURAL
w_class = WEIGHT_CLASS_NORMAL
- var/list/breathlevels = list("safe_oxygen_min" = 16,"safe_oxygen_max" = 0,"safe_co2_min" = 0,"safe_co2_max" = 10,
- "safe_toxins_min" = 0,"safe_toxins_max" = 0.05,"SA_para_min" = 1,"SA_sleep_min" = 5,"BZ_trip_balls_min" = 1)
//Breath damage
var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa
var/safe_oxygen_max = 0
+ var/safe_nitro_min = 0
+ var/safe_nitro_max = 0
var/safe_co2_min = 0
var/safe_co2_max = 10 // Yes it's an arbitrary value who cares?
var/safe_toxins_min = 0
@@ -30,16 +30,41 @@
var/SA_sleep_min = 5 //Sleeping agent
var/BZ_trip_balls_min = 1 //BZ gas.
- var/oxy_breath_dam_min = 1
- var/oxy_breath_dam_max = 10
- var/co2_breath_dam_min = 1
- var/co2_breath_dam_max = 10
- var/tox_breath_dam_min = MIN_PLASMA_DAMAGE
- var/tox_breath_dam_max = MAX_PLASMA_DAMAGE
+ var/oxy_breath_dam_min = MIN_TOXIC_GAS_DAMAGE
+ var/oxy_breath_dam_max = MAX_TOXIC_GAS_DAMAGE
+ var/oxy_damage_type = OXY
+ var/nitro_breath_dam_min = MIN_TOXIC_GAS_DAMAGE
+ var/nitro_breath_dam_max = MAX_TOXIC_GAS_DAMAGE
+ var/nitro_damage_type = OXY
+ var/co2_breath_dam_min = MIN_TOXIC_GAS_DAMAGE
+ var/co2_breath_dam_max = MAX_TOXIC_GAS_DAMAGE
+ var/co2_damage_type = OXY
+ var/tox_breath_dam_min = MIN_TOXIC_GAS_DAMAGE
+ var/tox_breath_dam_max = MAX_TOXIC_GAS_DAMAGE
+ var/tox_damage_type = TOX
+
+ var/cold_message = "your face freezing and an icicle forming"
+ var/cold_level_1_threshold = 260
+ var/cold_level_2_threshold = 200
+ var/cold_level_3_threshold = 120
+ var/cold_level_1_damage = COLD_GAS_DAMAGE_LEVEL_1 //Keep in mind with gas damage levels, you can set these to be negative, if you want someone to heal, instead.
+ var/cold_level_2_damage = COLD_GAS_DAMAGE_LEVEL_2
+ var/cold_level_3_damage = COLD_GAS_DAMAGE_LEVEL_3
+ var/cold_damage_type = BURN
+
+ var/hot_message = "your face burning and a searing heat"
+ var/heat_level_1_threshold = 360
+ var/heat_level_2_threshold = 400
+ var/heat_level_3_threshold = 1000
+ var/heat_level_1_damage = HEAT_GAS_DAMAGE_LEVEL_1
+ var/heat_level_2_damage = HEAT_GAS_DAMAGE_LEVEL_2
+ var/heat_level_3_damage = HEAT_GAS_DAMAGE_LEVEL_3
+ var/heat_damage_type = BURN
+
+ var/crit_stabilizing_reagent = "epinephrine"
-
-/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, var/mob/living/carbon/human/H)
+/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
if((H.status_flags & GODMODE))
return
@@ -48,30 +73,33 @@
species_traits = H.dna.species.species_traits
if(!breath || (breath.total_moles() == 0))
- if(H.reagents.has_reagent("epinephrine"))
+ if(H.reagents.has_reagent(crit_stabilizing_reagent))
return
if(H.health >= HEALTH_THRESHOLD_CRIT)
H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
else if(!(NOCRITDAMAGE in species_traits))
H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
- H.failed_last_breath = 1
+ H.failed_last_breath = TRUE
if(safe_oxygen_min)
- H.throw_alert("oxy", /obj/screen/alert/oxy)
+ H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
else if(safe_toxins_min)
H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
else if(safe_co2_min)
H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
- return 0
+ else if(safe_nitro_min)
+ H.throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro)
+ return FALSE
var/gas_breathed = 0
var/list/breath_gases = breath.gases
- breath.assert_gases("o2", "plasma", "co2", "n2o", "bz")
+ breath.assert_gases("o2", "n2", "plasma", "co2", "n2o", "bz")
//Partial pressures in our breath
var/O2_pp = breath.get_breath_partial_pressure(breath_gases["o2"][MOLES])
+ var/N2_pp = breath.get_breath_partial_pressure(breath_gases["n2"][MOLES])
var/Toxins_pp = breath.get_breath_partial_pressure(breath_gases["plasma"][MOLES])
var/CO2_pp = breath.get_breath_partial_pressure(breath_gases["co2"][MOLES])
@@ -82,7 +110,7 @@
if(safe_oxygen_max)
if(O2_pp > safe_oxygen_max)
var/ratio = (breath_gases["o2"][MOLES]/safe_oxygen_max) * 10
- H.adjustOxyLoss(Clamp(ratio,oxy_breath_dam_min,oxy_breath_dam_max))
+ H.apply_damage_type(Clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type)
H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy)
else
H.clear_alert("too_much_oxy")
@@ -90,20 +118,45 @@
//Too little oxygen!
if(safe_oxygen_min)
if(O2_pp < safe_oxygen_min)
- gas_breathed = handle_too_little_breath(H,O2_pp,safe_oxygen_min,breath_gases["o2"][MOLES])
- H.throw_alert("oxy", /obj/screen/alert/oxy)
+ gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath_gases["o2"][MOLES])
+ H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
else
- H.failed_last_breath = 0
- if(H.getOxyLoss())
- H.adjustOxyLoss(-5)
+ H.failed_last_breath = FALSE
+ H.adjustOxyLoss(-5)
gas_breathed = breath_gases["o2"][MOLES]
- H.clear_alert("oxy")
+ H.clear_alert("not_enough_oxy")
//Exhale
breath_gases["o2"][MOLES] -= gas_breathed
breath_gases["co2"][MOLES] += gas_breathed
gas_breathed = 0
+ //-- Nitrogen --//
+
+ //Too much nitrogen!
+ if(safe_nitro_max)
+ if(N2_pp > safe_nitro_max)
+ var/ratio = (breath_gases["n2"][MOLES]/safe_nitro_max) * 10
+ H.apply_damage_type(Clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type)
+ H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro)
+ else
+ H.clear_alert("too_much_nitro")
+
+ //Too little nitrogen!
+ if(safe_nitro_min)
+ if(N2_pp < safe_nitro_min)
+ gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath_gases["n2"][MOLES])
+ H.throw_alert("nitro", /obj/screen/alert/not_enough_nitro)
+ else
+ H.failed_last_breath = FALSE
+ H.adjustOxyLoss(-5)
+ gas_breathed = breath_gases["n2"][MOLES]
+ H.clear_alert("nitro")
+
+ //Exhale
+ breath_gases["n2"][MOLES] -= gas_breathed
+ breath_gases["co2"][MOLES] += gas_breathed
+ gas_breathed = 0
//-- CO2 --//
@@ -114,9 +167,9 @@
H.co2overloadtime = world.time
else if(world.time - H.co2overloadtime > 120)
H.Unconscious(60)
- H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business
+ H.apply_damage_type(3, co2_damage_type) // Lets hurt em a little, let them know we mean business
if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good!
- H.adjustOxyLoss(8)
+ H.apply_damage_type(8, co2_damage_type)
H.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2)
if(prob(20)) // Lets give them some chance to know somethings not right though I guess.
H.emote("cough")
@@ -126,12 +179,12 @@
H.clear_alert("too_much_co2")
//Too little CO2!
- if(breathlevels["safe_co2_min"])
+ if(safe_co2_min)
if(CO2_pp < safe_co2_min)
- gas_breathed = handle_too_little_breath(H,CO2_pp, safe_co2_min,breath_gases["co2"][MOLES])
+ gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath_gases["co2"][MOLES])
H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
else
- H.failed_last_breath = 0
+ H.failed_last_breath = FALSE
H.adjustOxyLoss(-5)
gas_breathed = breath_gases["co2"][MOLES]
H.clear_alert("not_enough_co2")
@@ -148,20 +201,19 @@
if(safe_toxins_max)
if(Toxins_pp > safe_toxins_max)
var/ratio = (breath_gases["plasma"][MOLES]/safe_toxins_max) * 10
- if(H.reagents)
- H.reagents.add_reagent("plasma", Clamp(ratio, tox_breath_dam_min, tox_breath_dam_max))
- H.throw_alert("tox_in_air", /obj/screen/alert/tox_in_air)
+ H.apply_damage_type(Clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type)
+ H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
- H.clear_alert("tox_in_air")
+ H.clear_alert("too_much_tox")
//Too little toxins!
if(safe_toxins_min)
if(Toxins_pp < safe_toxins_min)
- gas_breathed = handle_too_little_breath(H,Toxins_pp, safe_toxins_min, breath_gases["plasma"][MOLES])
+ gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath_gases["plasma"][MOLES])
H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
else
- H.failed_last_breath = 0
+ H.failed_last_breath = FALSE
H.adjustOxyLoss(-5)
gas_breathed = breath_gases["plasma"][MOLES]
H.clear_alert("not_enough_tox")
@@ -199,50 +251,56 @@
handle_breath_temperature(breath, H)
breath.garbage_collect()
- return 1
+ return TRUE
-/obj/item/organ/lungs/proc/handle_too_little_breath(mob/living/carbon/human/H = null,breath_pp = 0, safe_breath_min = 0, true_pp = 0)
+/obj/item/organ/lungs/proc/handle_too_little_breath(mob/living/carbon/human/H = null, breath_pp = 0, safe_breath_min = 0, true_pp = 0)
. = 0
if(!H || !safe_breath_min) //the other args are either: Ok being 0 or Specifically handled.
- return 0
+ return FALSE
if(prob(20))
H.emote("gasp")
if(breath_pp > 0)
var/ratio = safe_breath_min/breath_pp
H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!
- H.failed_last_breath = 1
+ H.failed_last_breath = TRUE
. = true_pp*ratio/6
else
H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
- H.failed_last_breath = 1
+ H.failed_last_breath = TRUE
/obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/H) // called by human/life, handles temperatures
- if(abs(310.15 - breath.temperature) > 50)
+ var/breath_temperature = breath.temperature
- var/species_traits = list()
- if(H && H.dna && H.dna.species && H.dna.species.species_traits)
- species_traits = H.dna.species.species_traits
+ var/species_traits = list()
+ if(H && H.dna && H.dna.species && H.dna.species.species_traits)
+ species_traits = H.dna.species.species_traits
- if(!(GLOB.mutations_list[COLDRES] in H.dna.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE
- switch(breath.temperature)
- if(-INFINITY to 120)
- H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head")
- if(120 to 200)
- H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head")
- if(200 to 260)
- H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head")
+ if(!(GLOB.mutations_list[COLDRES] in H.dna.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE
+ var/cold_modifier = H.dna.species.coldmod
+ if(breath_temperature < cold_level_3_threshold)
+ H.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type)
+ if(breath_temperature > cold_level_3_threshold && breath_temperature < cold_level_2_threshold)
+ H.apply_damage_type(cold_level_2_damage*cold_modifier, cold_damage_type)
+ if(breath_temperature > cold_level_2_threshold && breath_temperature < cold_level_1_threshold)
+ H.apply_damage_type(cold_level_1_damage*cold_modifier, cold_damage_type)
+ if(breath_temperature < cold_level_1_threshold)
+ if(prob(20))
+ to_chat(H, "You feel [cold_message] in your [name]!")
- if(!(RESISTHOT in species_traits)) // HEAT DAMAGE
- switch(breath.temperature)
- if(360 to 400)
- H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head")
- if(400 to 1000)
- H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head")
- if(1000 to INFINITY)
- H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head")
+ if(!(RESISTHOT in species_traits)) // HEAT DAMAGE
+ var/heat_modifier = H.dna.species.heatmod
+ if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold)
+ H.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type)
+ if(breath_temperature > heat_level_2_threshold && breath_temperature < heat_level_3_threshold)
+ H.apply_damage_type(heat_level_2_damage*heat_modifier, heat_damage_type)
+ if(breath_temperature > heat_level_3_threshold)
+ H.apply_damage_type(heat_level_3_damage*heat_modifier, heat_damage_type)
+ if(breath_temperature > heat_level_1_threshold)
+ if(prob(20))
+ to_chat(H, "You feel [hot_message] in your [name]!")
/obj/item/organ/lungs/prepare_eat()
var/obj/S = ..()
diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm
index b791586e22..e116c23303 100644
--- a/code/modules/surgery/remove_embedded_object.dm
+++ b/code/modules/surgery/remove_embedded_object.dm
@@ -32,7 +32,7 @@
H.clear_alert("embeddedobject")
if(objects > 0)
- user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L]!", "You successfully remove [objects] objects from [H]'s [L.name].")
+ user.visible_message("[user] successfully removes [objects] objects from [H]'s [L]!", "You successfully remove [objects] objects from [H]'s [L.name].")
else
to_chat(user, "You find no objects embedded in [H]'s [L]!")
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index 887c26038a..5686389dea 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -9,6 +9,18 @@
origin_tech = "materials=1;biotech=1"
+/obj/item/weapon/retractor/augment
+ name = "toolarm retractor"
+ desc = "Micro-mechanical manipulator for retracting stuff."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "retractor"
+ materials = list(MAT_METAL=6000, MAT_GLASS=3000)
+ flags = CONDUCT
+ w_class = WEIGHT_CLASS_TINY
+ origin_tech = "materials=1;biotech=1"
+ toolspeed = 0.5
+
+
/obj/item/weapon/hemostat
name = "hemostat"
desc = "You think you have seen this before."
@@ -21,6 +33,19 @@
attack_verb = list("attacked", "pinched")
+/obj/item/weapon/hemostat/augment
+ name = "toolarm hemostat"
+ desc = "Tiny servos power a pair of pincers to stop bleeding."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "hemostat"
+ materials = list(MAT_METAL=5000, MAT_GLASS=2500)
+ flags = CONDUCT
+ w_class = WEIGHT_CLASS_TINY
+ origin_tech = "materials=1;biotech=1"
+ toolspeed = 0.5
+ attack_verb = list("attacked", "pinched")
+
+
/obj/item/weapon/cautery
name = "cautery"
desc = "This stops bleeding."
@@ -33,11 +58,26 @@
attack_verb = list("burnt")
+/obj/item/weapon/cautery/augment
+ name = "toolarm cautery"
+ desc = "A heated element that cauterizes wounds."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "cautery"
+ materials = list(MAT_METAL=2500, MAT_GLASS=750)
+ flags = CONDUCT
+ w_class = WEIGHT_CLASS_TINY
+ origin_tech = "materials=1;biotech=1"
+ toolspeed = 0.5
+ attack_verb = list("burnt")
+
+
/obj/item/weapon/surgicaldrill
name = "surgical drill"
desc = "You can drill using this item. You dig?"
icon = 'icons/obj/surgery.dmi'
icon_state = "drill"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
hitsound = 'sound/weapons/circsawhit.ogg'
materials = list(MAT_METAL=10000, MAT_GLASS=6000)
flags = CONDUCT
@@ -46,11 +86,46 @@
origin_tech = "materials=1;biotech=1"
attack_verb = list("drilled")
+
+/obj/item/weapon/surgicaldrill/augment
+ name = "toolarm surgical drill"
+ desc = "Effectively a small power drill contained within your arm, edges dulled to prevent tissue damage. May or may not pierce the heavens."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "drill"
+ hitsound = 'sound/weapons/circsawhit.ogg'
+ materials = list(MAT_METAL=10000, MAT_GLASS=6000)
+ flags = CONDUCT
+ force = 10
+ w_class = WEIGHT_CLASS_SMALL
+ origin_tech = "materials=1;biotech=1"
+ toolspeed = 0.5
+ attack_verb = list("drilled")
+
+
/obj/item/weapon/scalpel
name = "scalpel"
desc = "Cut, cut, and once more cut."
icon = 'icons/obj/surgery.dmi'
icon_state = "scalpel"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
+ flags = CONDUCT
+ force = 10
+ w_class = WEIGHT_CLASS_TINY
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 5
+ materials = list(MAT_METAL=4000, MAT_GLASS=1000)
+ origin_tech = "materials=1;biotech=1"
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ sharpness = IS_SHARP_ACCURATE
+
+/obj/item/weapon/scalpel/augment
+ name = "toolarm scalpel"
+ desc = "Ultra-sharp blade attached directly to your bone for extra-accuracy."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "scalpel"
flags = CONDUCT
force = 10
w_class = WEIGHT_CLASS_TINY
@@ -60,6 +135,7 @@
materials = list(MAT_METAL=4000, MAT_GLASS=1000)
origin_tech = "materials=1;biotech=1"
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ toolspeed = 0.5
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP_ACCURATE
@@ -73,6 +149,8 @@
desc = "For heavy duty cutting."
icon = 'icons/obj/surgery.dmi'
icon_state = "saw"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
hitsound = 'sound/weapons/circsawhit.ogg'
throwhitsound = 'sound/weapons/pierce.ogg'
flags = CONDUCT
@@ -86,6 +164,25 @@
attack_verb = list("attacked", "slashed", "sawed", "cut")
sharpness = IS_SHARP
+/obj/item/weapon/circular_saw/augment
+ name = "toolarm circular saw"
+ desc = "A small but very fast spinning saw. Edges dulled to prevent accidental cutting inside of the surgeon."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "saw"
+ hitsound = 'sound/weapons/circsawhit.ogg'
+ throwhitsound = 'sound/weapons/pierce.ogg'
+ flags = CONDUCT
+ force = 10
+ w_class = WEIGHT_CLASS_SMALL
+ throwforce = 9
+ throw_speed = 2
+ throw_range = 5
+ materials = list(MAT_METAL=10000, MAT_GLASS=6000)
+ origin_tech = "biotech=1;combat=1"
+ toolspeed = 0.5
+ attack_verb = list("attacked", "slashed", "sawed", "cut")
+ sharpness = IS_SHARP
+
/obj/item/weapon/surgical_drapes
name = "surgical drapes"
desc = "Nanotrasen brand surgical drapes provide optimal safety and infection control."
@@ -98,7 +195,7 @@
/obj/item/weapon/surgical_drapes/attack(mob/living/M, mob/user)
if(!attempt_initiate_surgery(src, M, user))
..()
-
+
/obj/item/weapon/organ_storage //allows medical cyborgs to manipulate organs without hands
name = "organ storage bag"
desc = "A container for holding body parts."
@@ -114,7 +211,7 @@
if(!isorgan(I) && !isbodypart(I))
to_chat(user, "[src] can only hold body parts!")
return
-
+
user.visible_message("[user] puts [I] into [src].", "You put [I] inside [src].")
icon_state = "evidence"
var/xx = I.pixel_x
diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm
index a45b4a7daf..2d75ebab6a 100644
--- a/code/modules/tgui/external.dm
+++ b/code/modules/tgui/external.dm
@@ -60,13 +60,6 @@
/datum/proc/ui_host()
return src // Default src.
- /**
- * global
- *
- * Used to track the current screen.
- **/
-/datum/var/ui_screen = "home"
-
/**
* global
*
diff --git a/code/modules/uplink/uplink.dm b/code/modules/uplink/uplink.dm
index 041f503967..0293a3ace4 100644
--- a/code/modules/uplink/uplink.dm
+++ b/code/modules/uplink/uplink.dm
@@ -140,6 +140,8 @@ GLOBAL_LIST_EMPTY(uplinks)
/obj/item/device/radio/uplink/Initialize()
. = ..()
icon_state = "radio"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
hidden_uplink = new(src)
hidden_uplink.active = TRUE
hidden_uplink.lockable = FALSE
diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm
index 30318a64c2..7b455b7d80 100644
--- a/code/modules/uplink/uplink_item.dm
+++ b/code/modules/uplink/uplink_item.dm
@@ -647,7 +647,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
falls asleep, they will be able to move and act."
item = /obj/item/weapon/pen/sleepy
cost = 4
- exclude_modes = list(/datum/game_mode/nuclear,/datum/game_mode/gang)
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang)
/datum/uplink_item/stealthy_weapons/soap
name = "Syndicate Soap"
diff --git a/code/modules/uplink/uplink_item_cit.dm b/code/modules/uplink/uplink_item_cit.dm
index 3ea3e7f63c..0d1a6efce6 100644
--- a/code/modules/uplink/uplink_item_cit.dm
+++ b/code/modules/uplink/uplink_item_cit.dm
@@ -27,4 +27,4 @@
/obj/item/weapon/storage/box/syndie_kit/holoparasite/PopulateContents()
new /obj/item/weapon/guardiancreator/tech/choose/traitor(src)
- new /obj/item/weapon/paper/guardian(src)
\ No newline at end of file
+ new /obj/item/weapon/paper/guides/antag/guardian(src)
diff --git a/code/modules/vehicles/bicycle.dm b/code/modules/vehicles/bicycle.dm
index d51de5809c..2d9b3c8258 100644
--- a/code/modules/vehicles/bicycle.dm
+++ b/code/modules/vehicles/bicycle.dm
@@ -13,12 +13,12 @@
/obj/vehicle/bicycle/buckle_mob(mob/living/M, force = 0, check_loc = 1)
if(prob(easter_egg_chance) || (SSevents.holidays && SSevents.holidays[APRIL_FOOLS]))
- M << sound(pick(bike_music), repeat = 1, wait = 0, volume = 80, channel = 42)
+ M << sound(pick(bike_music), repeat = 1, wait = 0, volume = 80, channel = CHANNEL_BICYCLE)
. = ..()
/obj/vehicle/bicycle/unbuckle_mob(mob/living/buckled_mob,force = 0)
if(buckled_mob)
- buckled_mob << sound(null, repeat = 0, wait = 0, volume = 80, channel = 42)
+ buckled_mob.stop_sound_channel(CHANNEL_BICYCLE)
. =..()
/obj/vehicle/bicycle/tesla_act() // :::^^^)))
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index 149094de3f..b58875bd1f 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -45,7 +45,8 @@
//Send messages
to_chat(owner, "[digest_alert_owner]")
- M.visible_message("You watch as [owner]'s form loses its additions.", "[digest_alert_prey]")
+ to_chat(M, "[digest_alert_prey]")
+ M.visible_message("You watch as [owner]'s form loses its additions.")
owner.nutrition += 400 // so eating dead mobs gives you *something*.
M.stop_sound_channel(CHANNEL_PRED)
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
index e977ac4600..d3c30ac285 100644
--- a/code/modules/zombie/organs.dm
+++ b/code/modules/zombie/organs.dm
@@ -1,6 +1,6 @@
/obj/item/organ/zombie_infection
name = "festering ooze"
- desc = "A black web of pus and vicera."
+ desc = "A black web of pus and viscera."
zone = "head"
slot = "zombie_infection"
icon_state = "blacktumor"
diff --git a/code/world.dm b/code/world.dm
index b6badeb348..a5853c6e12 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -59,16 +59,16 @@
if(config.sql_enabled)
if(SSdbcore.Connect())
log_world("Database connection established.")
- var/datum/DBQuery/db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_version")]")
- db_version.Execute()
- if(db_version.NextRow())
- var/db_major = db_version.item[1]
- var/db_minor = db_version.item[2]
+ var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_version")] ORDER BY date DESC LIMIT 1")
+ query_db_version.Execute()
+ if(query_db_version.NextRow())
+ var/db_major = query_db_version.item[1]
+ var/db_minor = query_db_version.item[2]
if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION)
- message_admins("db schema ([db_major].[db_minor]) is behind latest tg schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors")
- log_sql("db schema ([db_major].[db_minor]) is behind latest tg schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors")
+ message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors")
+ log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors")
else
- message_admins("Could not get schema version from db")
+ message_admins("Could not get schema version from database")
else
log_world("Your server failed to establish a connection with the database.")
@@ -105,10 +105,10 @@
/world/Topic(T, addr, master, key)
var/list/input = params2list(T)
-
+
var/pinging = ("ping" in input)
var/playing = ("players" in input)
-
+
if(!pinging && !playing && config && config.log_world_topic)
GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]"
@@ -158,9 +158,7 @@
var/list/presentmins = adm["present"]
var/list/afkmins = adm["afk"]
s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho
- s["gamestate"] = 1
- if(SSticker)
- s["gamestate"] = SSticker.current_state
+ s["gamestate"] = SSticker.current_state
s["map_name"] = SSmapping.config.map_name
@@ -268,11 +266,8 @@
var/list/features = list()
- if(SSticker)
- if(GLOB.master_mode)
- features += GLOB.master_mode
- else
- features += "STARTING"
+ if(GLOB.master_mode)
+ features += GLOB.master_mode
if (!GLOB.enter_allowed)
features += "closed"
diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm
index a6cabcba87..d928397728 100644
--- a/goon/code/datums/browserOutput.dm
+++ b/goon/code/datums/browserOutput.dm
@@ -2,9 +2,6 @@
For the main html chat area
*********************************/
-#define BICON_X_MAX 96
-#define BICON_Y_MAX 96
-
//Precaching a bunch of shit
GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of icons for the browser output
@@ -191,10 +188,6 @@ GLOBAL_LIST_EMPTY(bicon_cache)
/proc/icon2base64(icon/icon, iconKey = "misc")
if (!isicon(icon))
return FALSE
- //DOS exploit
- if(icon.Width() > BICON_X_MAX || icon.Length() > BICON_Y_MAX)
- return FALSE
- //
GLOB.iconCache[iconKey] << icon
var/iconData = GLOB.iconCache.ExportText(iconKey)
var/list/partial = splittext(iconData, "{")
@@ -293,4 +286,4 @@ GLOBAL_LIST_EMPTY(bicon_cache)
return M.current.client
/datum/log //exists purely to capture to_chat() output
- var/log = ""
+ var/log = ""
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-2020.yml b/html/changelogs/AutoChangeLog-pr-2020.yml
new file mode 100644
index 0000000000..9615854516
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2020.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - rscdel: "Removed the Soul Vessel, Cogscarab, and Anima Fragment Scriptures."
diff --git a/html/changelogs/AutoChangeLog-pr-2065.yml b/html/changelogs/AutoChangeLog-pr-2065.yml
new file mode 100644
index 0000000000..0e2c4e9e65
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2065.yml
@@ -0,0 +1,6 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - tweak: "breathing plasma now causes direct tox damage"
+ - tweak: "breathing hot/cold air now warns you when you're doing so, again"
+ - tweak: "species heat/cold mod now impacts damage from breathing hot/cold gases"
diff --git a/html/changelogs/AutoChangeLog-pr-2143.yml b/html/changelogs/AutoChangeLog-pr-2143.yml
new file mode 100644
index 0000000000..ca4975e073
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2143.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - tweak: "Lava rivers though the ash walker nest are now significantly less of a hassle for the ashwalkers."
diff --git a/html/changelogs/AutoChangeLog-pr-2154.yml b/html/changelogs/AutoChangeLog-pr-2154.yml
new file mode 100644
index 0000000000..bb61e5cf17
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2154.yml
@@ -0,0 +1,4 @@
+author: "JStheguy"
+delete-after: True
+changes:
+ - imageadd: "Most alcohol bottles have been resprited, as well as a poster that used one of the current bottles as part of it's design."
diff --git a/html/changelogs/AutoChangeLog-pr-2162.yml b/html/changelogs/AutoChangeLog-pr-2162.yml
new file mode 100644
index 0000000000..ce63047823
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2162.yml
@@ -0,0 +1,5 @@
+author: "More Robust Than You"
+delete-after: True
+changes:
+ - rscadd: "Nanotrasen has begun production of the Rapid Cable Layer, a tool that helps you lay down cables faster"
+ - rscadd: "You can now craft ghetto RCLs with metal, a screwdriver, welder, and wrench. They hold less cable, and may fall apart or jam!"
diff --git a/html/changelogs/AutoChangeLog-pr-2170.yml b/html/changelogs/AutoChangeLog-pr-2170.yml
new file mode 100644
index 0000000000..baa827e813
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2170.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - rscadd: "Sound should carry further, but should get quieter and quieter the further you are from it"
diff --git a/html/changelogs/AutoChangeLog-pr-2172.yml b/html/changelogs/AutoChangeLog-pr-2172.yml
new file mode 100644
index 0000000000..e11cce9cef
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2172.yml
@@ -0,0 +1,6 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Badmins: Buildmode map generators have names in the list to select them, instead of paths."
+ - rscadd: "Also, a new map generator has been added, repair/reload station. Use it VERY sparingly, it deletes the block of the map and reloads it to roundstart. THIS CAN CAUSE ISSUES WITH MACHINES AND ATMOSPHERICS, SO DO NOT USE IT UNLESS YOU ABSOLUTELY HAVE TO!"
+ - experiment: "The reload station one tagged DO NOT USE shouldn't be used as it doesn't delete anything before loading, so if you use it you'll have two copies of things. That can result in a LOT of issues, so don't use it unless you're a codermin and know what you're doing/abusing!"
diff --git a/html/changelogs/AutoChangeLog-pr-2180.yml b/html/changelogs/AutoChangeLog-pr-2180.yml
new file mode 100644
index 0000000000..3bb825e80e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2180.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - bugfix: "Stun baton overlays now appear on security belts when active."
diff --git a/html/changelogs/AutoChangeLog-pr-2186.yml b/html/changelogs/AutoChangeLog-pr-2186.yml
new file mode 100644
index 0000000000..43bb2fef87
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2186.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - spellcheck: "Player-controlled medibots now receive a notice whenever they try to heal someone with too high health."
diff --git a/html/changelogs/AutoChangeLog-pr-2189.yml b/html/changelogs/AutoChangeLog-pr-2189.yml
new file mode 100644
index 0000000000..2bdbc7d471
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2189.yml
@@ -0,0 +1,5 @@
+author: "Raeschen"
+delete-after: True
+changes:
+ - rscdel: "Removed a whole bunch of hivebots."
+ - rscadd: "Added stronger hivebots."
diff --git a/html/changelogs/AutoChangeLog-pr-2193.yml b/html/changelogs/AutoChangeLog-pr-2193.yml
new file mode 100644
index 0000000000..46988eaee1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2193.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - spellcheck: "Removed an improper period from the supermatter sliver theft objective's name."
diff --git a/html/changelogs/AutoChangeLog-pr-2196.yml b/html/changelogs/AutoChangeLog-pr-2196.yml
new file mode 100644
index 0000000000..736d98cb66
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2196.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - tweak: "Colossus's shotgun is now a static-spread blast of 6 bolts, making it more predictable."
diff --git a/html/changelogs/AutoChangeLog-pr-2197.yml b/html/changelogs/AutoChangeLog-pr-2197.yml
new file mode 100644
index 0000000000..6d4e8f4089
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2197.yml
@@ -0,0 +1,6 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Surgical toolarm to protolathe and exofab"
+ - tweak: "Toolarm tools are less robust but more efficient at surgery"
+ - tweak: "Arm augments are no longer a huge item"
diff --git a/html/changelogs/AutoChangeLog-pr-2209.yml b/html/changelogs/AutoChangeLog-pr-2209.yml
new file mode 100644
index 0000000000..c65bfd79cc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2209.yml
@@ -0,0 +1,4 @@
+author: "ktccd"
+delete-after: True
+changes:
+ - tweak: "Changed how borers win-conditions are displayed. Syndicate borers are now listed with other cortical borers, as they can count for their team-objective even if they don't share it."
diff --git a/html/changelogs/AutoChangeLog-pr-2211.yml b/html/changelogs/AutoChangeLog-pr-2211.yml
new file mode 100644
index 0000000000..9852662933
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2211.yml
@@ -0,0 +1,4 @@
+author: "ktccd"
+delete-after: True
+changes:
+ - rscadd: "Borers of all kinds now have a HUD element to see other sentient borers and their hosts. (Hosts cannot see this HUD)"
diff --git a/html/changelogs/AutoChangeLog-pr-2215.yml b/html/changelogs/AutoChangeLog-pr-2215.yml
new file mode 100644
index 0000000000..f02f2d33cf
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2215.yml
@@ -0,0 +1,5 @@
+author: "Xhuis and oranges"
+delete-after: True
+changes:
+ - bugfix: "Banana cream pies no longer splat when they're caught by someone."
+ - soundadd: "Throwing a pie in someone's face now has a splat sound."
diff --git a/html/changelogs/AutoChangeLog-pr-2231.yml b/html/changelogs/AutoChangeLog-pr-2231.yml
new file mode 100644
index 0000000000..c25b4b2b49
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2231.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - tweak: "Spell action buttons now have their description in a tooltip."
diff --git a/html/changelogs/AutoChangeLog-pr-2233.yml b/html/changelogs/AutoChangeLog-pr-2233.yml
new file mode 100644
index 0000000000..4a8109664b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2233.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Adds the \"seedling\" planetstation mob to the backend"
diff --git a/html/changelogs/AutoChangeLog-pr-2242.yml b/html/changelogs/AutoChangeLog-pr-2242.yml
new file mode 100644
index 0000000000..69b47043d3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2242.yml
@@ -0,0 +1,5 @@
+author: "ktccd"
+delete-after: True
+changes:
+ - bugfix: "Cloning and podding people no longer forgets to put the genitals back in you."
+ - bugfix: "Changeling and other DNA transformations now apply the appropriate genitalia."
diff --git a/html/changelogs/AutoChangeLog-pr-2245.yml b/html/changelogs/AutoChangeLog-pr-2245.yml
new file mode 100644
index 0000000000..3f19f56d03
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2245.yml
@@ -0,0 +1,4 @@
+author: "Galactic Corgi Breeding Mills, LLC"
+delete-after: True
+changes:
+ - bugfix: "Fixed corgis being able to wear spacesuit helmets despite lacking the proper code and sprites for them."
diff --git a/html/changelogs/AutoChangeLog-pr-2249.yml b/html/changelogs/AutoChangeLog-pr-2249.yml
new file mode 100644
index 0000000000..4cc75881bc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2249.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - bugfix: "Alien hunters can no longer pounce through shields."
diff --git a/html/changelogs/AutoChangeLog-pr-2266.yml b/html/changelogs/AutoChangeLog-pr-2266.yml
new file mode 100644
index 0000000000..2a02edfb87
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2266.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - bugfix: "Objects on shuttles now rotate in the correct directions."
diff --git a/html/changelogs/AutoChangeLog-pr-2274.yml b/html/changelogs/AutoChangeLog-pr-2274.yml
new file mode 100644
index 0000000000..ef5c537edd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2274.yml
@@ -0,0 +1,4 @@
+author: "Lexorion"
+delete-after: True
+changes:
+ - imageadd: "Hearty Punch has a new, fancier sprite."
diff --git a/html/changelogs/AutoChangeLog-pr-2281.yml b/html/changelogs/AutoChangeLog-pr-2281.yml
new file mode 100644
index 0000000000..189f18a117
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2281.yml
@@ -0,0 +1,4 @@
+author: "ktccd"
+delete-after: True
+changes:
+ - bugfix: "Character preview now displays genitals again."
diff --git a/html/changelogs/AutoChangeLog-pr-2287.yml b/html/changelogs/AutoChangeLog-pr-2287.yml
new file mode 100644
index 0000000000..d6b77f9436
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2287.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - bugfix: "Turning off APCs will no longer make the weather in that area invisible."
diff --git a/html/changelogs/AutoChangeLog-pr-2291.yml b/html/changelogs/AutoChangeLog-pr-2291.yml
new file mode 100644
index 0000000000..4b87a21dfd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2291.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - soundadd: "The speakers in the ceiling have been upgraded, and many sounds are now less tinny."
diff --git a/html/changelogs/AutoChangeLog-pr-2295.yml b/html/changelogs/AutoChangeLog-pr-2295.yml
new file mode 100644
index 0000000000..c34d19ac6f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2295.yml
@@ -0,0 +1,4 @@
+author: "More Robust Than You"
+delete-after: True
+changes:
+ - tweak: "Mulligan and non-continuous completion checks will not consider afk/logged out people to be \"living crew\"."
diff --git a/html/changelogs/AutoChangeLog-pr-2298.yml b/html/changelogs/AutoChangeLog-pr-2298.yml
new file mode 100644
index 0000000000..3d12cf9dee
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2298.yml
@@ -0,0 +1,4 @@
+author: "ktccd"
+delete-after: True
+changes:
+ - bugfix: "Preys being digested now get their digestion message"
diff --git a/html/changelogs/AutoChangeLog-pr-2299.yml b/html/changelogs/AutoChangeLog-pr-2299.yml
new file mode 100644
index 0000000000..7f5e8730dc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2299.yml
@@ -0,0 +1,4 @@
+author: "JStheguy"
+delete-after: True
+changes:
+ - imageadd: "Laptops now have actual sprites for using the supermatter monitoring instead of defaulting to a generic one."
diff --git a/html/changelogs/AutoChangeLog-pr-2301.yml b/html/changelogs/AutoChangeLog-pr-2301.yml
new file mode 100644
index 0000000000..2924b5a5ad
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2301.yml
@@ -0,0 +1,4 @@
+author: "LetterJay"
+delete-after: True
+changes:
+ - rscadd: "Adds bear ears and bear tails (Sprites courtesy of LizziePup)"
diff --git a/html/changelogs/AutoChangeLog-pr-2305.yml b/html/changelogs/AutoChangeLog-pr-2305.yml
new file mode 100644
index 0000000000..fbd7208358
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2305.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - imageadd: "Belligerent now has a visible indicator over the caster."
diff --git a/html/changelogs/AutoChangeLog-pr-2308.yml b/html/changelogs/AutoChangeLog-pr-2308.yml
new file mode 100644
index 0000000000..1d367c4d84
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2308.yml
@@ -0,0 +1,7 @@
+author: "ktccd"
+delete-after: True
+changes:
+ - rscadd: "Penises can now climax inside someone instead of only be used for masturbating. Use passive grab to be able to spill on the floor, aggressive or higher grab to not spill a drop."
+ - rscadd: "Hexacrocin and hexacamphor now adjusts your arousal up respectively down when overdosed. Hexacrocin overdoses can force orgasms at high arousal."
+ - bugfix: "Penises can now be used for masturbation without containers again."
+ - bugfix: "Citadel chems now sends you feedback messages properly when in effect."
diff --git a/html/changelogs/AutoChangeLog-pr-2309.yml b/html/changelogs/AutoChangeLog-pr-2309.yml
new file mode 100644
index 0000000000..89ceed6223
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2309.yml
@@ -0,0 +1,4 @@
+author: "ktccd"
+delete-after: True
+changes:
+ - bugfix: "Cloner and other mind-transfer things now respect client arousal settings."
diff --git a/html/changelogs/AutoChangeLog-pr-2319.yml b/html/changelogs/AutoChangeLog-pr-2319.yml
new file mode 100644
index 0000000000..4ca8998875
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2319.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - bugfix: "Swarmer shells now have ghost notifications again."
diff --git a/html/changelogs/AutoChangeLog-pr-2320.yml b/html/changelogs/AutoChangeLog-pr-2320.yml
new file mode 100644
index 0000000000..695f23e7de
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2320.yml
@@ -0,0 +1,4 @@
+author: "LetterJay"
+delete-after: True
+changes:
+ - tweak: "Adds the option for bear ears and tails for humans as well."
diff --git a/html/changelogs/AutoChangeLog-pr-2329.yml b/html/changelogs/AutoChangeLog-pr-2329.yml
new file mode 100644
index 0000000000..2950b70fbb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2329.yml
@@ -0,0 +1,6 @@
+author: "ktccd"
+delete-after: True
+changes:
+ - rscadd: "Adds flared, knotted or tapered dicks for Taur bodies."
+ - tweak: "Resized the cow-taur's over-extended belly to match the profile picture, no longer completely blocking the taur penises."
+ - bugfix: "Barbed, knotted penises and other such long-named cocks are now visible on the ground if dismembered."
diff --git a/html/changelogs/AutoChangeLog-pr-2335.yml b/html/changelogs/AutoChangeLog-pr-2335.yml
new file mode 100644
index 0000000000..5681e3d5f9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2335.yml
@@ -0,0 +1,4 @@
+author: "ktccd"
+delete-after: True
+changes:
+ - bugfix: "Flavortext is now in the DNA of mobs who has that, meaning changelings, cloners and such things use it properly."
diff --git a/html/changelogs/AutoChangeLog-pr-2339.yml b/html/changelogs/AutoChangeLog-pr-2339.yml
new file mode 100644
index 0000000000..c7f3d42698
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2339.yml
@@ -0,0 +1,4 @@
+author: "More Robust Than You"
+delete-after: True
+changes:
+ - tweak: "His Grace now shows up on the orbit list"
diff --git a/html/changelogs/AutoChangeLog-pr-2346.yml b/html/changelogs/AutoChangeLog-pr-2346.yml
new file mode 100644
index 0000000000..c42300a173
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2346.yml
@@ -0,0 +1,4 @@
+author: "More Robust Than You"
+delete-after: True
+changes:
+ - tweak: "The wiki button now asks what page you want to be taken to"
diff --git a/html/changelogs/AutoChangeLog-pr-2350.yml b/html/changelogs/AutoChangeLog-pr-2350.yml
new file mode 100644
index 0000000000..07e0f51b62
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2350.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - bugfix: "Minebots no longer lack icons for their action buttons."
diff --git a/html/changelogs/AutoChangeLog-pr-2356.yml b/html/changelogs/AutoChangeLog-pr-2356.yml
new file mode 100644
index 0000000000..218da24865
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2356.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - imageadd: "Adds icon_states to the unused and used Eldritch whetstones. Sprites by Fury McFlurry."
diff --git a/html/changelogs/AutoChangeLog-pr-2359.yml b/html/changelogs/AutoChangeLog-pr-2359.yml
new file mode 100644
index 0000000000..8455963dc6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2359.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - imageadd: "Ported CEV-Eris's APC sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-2363.yml b/html/changelogs/AutoChangeLog-pr-2363.yml
new file mode 100644
index 0000000000..e8f5b574ae
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2363.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - tweak: "Canisters don't flash red lights anymore when empty."
diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi
index 71fdb96a85..e7f61d605d 100644
Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ
diff --git a/icons/effects/creampie.dmi b/icons/effects/creampie.dmi
index 2a0365773b..6caecf7d76 100644
Binary files a/icons/effects/creampie.dmi and b/icons/effects/creampie.dmi differ
diff --git a/icons/effects/geis_target_remove.dmi b/icons/effects/geis_target_remove.dmi
new file mode 100644
index 0000000000..076f2f4ca5
Binary files /dev/null and b/icons/effects/geis_target_remove.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 6b13ec2e2e..0255204f60 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/actions/actions_AI.dmi b/icons/mob/actions/actions_AI.dmi
new file mode 100644
index 0000000000..c6e4e1dae7
Binary files /dev/null and b/icons/mob/actions/actions_AI.dmi differ
diff --git a/icons/mob/actions/actions_clockcult.dmi b/icons/mob/actions/actions_clockcult.dmi
new file mode 100644
index 0000000000..251e387f50
Binary files /dev/null and b/icons/mob/actions/actions_clockcult.dmi differ
diff --git a/icons/mob/actions/actions_construction.dmi b/icons/mob/actions/actions_construction.dmi
new file mode 100644
index 0000000000..43fe0b48c4
Binary files /dev/null and b/icons/mob/actions/actions_construction.dmi differ
diff --git a/icons/mob/actions/actions_cult.dmi b/icons/mob/actions/actions_cult.dmi
new file mode 100644
index 0000000000..f96242ea9e
Binary files /dev/null and b/icons/mob/actions/actions_cult.dmi differ
diff --git a/icons/mob/actions/actions_flightsuit.dmi b/icons/mob/actions/actions_flightsuit.dmi
new file mode 100644
index 0000000000..3121c24355
Binary files /dev/null and b/icons/mob/actions/actions_flightsuit.dmi differ
diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi
new file mode 100644
index 0000000000..266c197ad3
Binary files /dev/null and b/icons/mob/actions/actions_items.dmi differ
diff --git a/icons/mob/actions/actions_mecha.dmi b/icons/mob/actions/actions_mecha.dmi
new file mode 100644
index 0000000000..c064441ed2
Binary files /dev/null and b/icons/mob/actions/actions_mecha.dmi differ
diff --git a/icons/mob/actions/actions_minor_antag.dmi b/icons/mob/actions/actions_minor_antag.dmi
new file mode 100644
index 0000000000..4e5806f2fb
Binary files /dev/null and b/icons/mob/actions/actions_minor_antag.dmi differ
diff --git a/icons/mob/actions/actions_revenant.dmi b/icons/mob/actions/actions_revenant.dmi
new file mode 100644
index 0000000000..3f664d5c27
Binary files /dev/null and b/icons/mob/actions/actions_revenant.dmi differ
diff --git a/icons/mob/actions/actions_silicon.dmi b/icons/mob/actions/actions_silicon.dmi
new file mode 100644
index 0000000000..5b198649ba
Binary files /dev/null and b/icons/mob/actions/actions_silicon.dmi differ
diff --git a/icons/mob/actions/actions_slime.dmi b/icons/mob/actions/actions_slime.dmi
new file mode 100644
index 0000000000..94cf319958
Binary files /dev/null and b/icons/mob/actions/actions_slime.dmi differ
diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi
new file mode 100644
index 0000000000..8935bd993b
Binary files /dev/null and b/icons/mob/actions/actions_spells.dmi differ
diff --git a/icons/mob/actions/actions_xeno.dmi b/icons/mob/actions/actions_xeno.dmi
new file mode 100644
index 0000000000..0a96fea8c4
Binary files /dev/null and b/icons/mob/actions/actions_xeno.dmi differ
diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi
new file mode 100644
index 0000000000..6af3b98728
Binary files /dev/null and b/icons/mob/actions/backgrounds.dmi differ
diff --git a/icons/mob/actions_AI.dmi b/icons/mob/actions_AI.dmi
deleted file mode 100644
index 3a789984e6..0000000000
Binary files a/icons/mob/actions_AI.dmi and /dev/null differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 3ed8c153d8..42226c7d2b 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 55d36996b7..06699662c0 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/inhands/__inhand_template.dmi b/icons/mob/inhands/__inhand_template.dmi
new file mode 100644
index 0000000000..283428495c
Binary files /dev/null and b/icons/mob/inhands/__inhand_template.dmi differ
diff --git a/icons/mob/inhands/antag/abductor_lefthand.dmi b/icons/mob/inhands/antag/abductor_lefthand.dmi
new file mode 100644
index 0000000000..477e044950
Binary files /dev/null and b/icons/mob/inhands/antag/abductor_lefthand.dmi differ
diff --git a/icons/mob/inhands/antag/abductor_righthand.dmi b/icons/mob/inhands/antag/abductor_righthand.dmi
new file mode 100644
index 0000000000..64404c6a45
Binary files /dev/null and b/icons/mob/inhands/antag/abductor_righthand.dmi differ
diff --git a/icons/mob/inhands/antag/balloons_lefthand.dmi b/icons/mob/inhands/antag/balloons_lefthand.dmi
new file mode 100644
index 0000000000..06f68a1cb1
Binary files /dev/null and b/icons/mob/inhands/antag/balloons_lefthand.dmi differ
diff --git a/icons/mob/inhands/antag/balloons_righthand.dmi b/icons/mob/inhands/antag/balloons_righthand.dmi
new file mode 100644
index 0000000000..e417c1cfed
Binary files /dev/null and b/icons/mob/inhands/antag/balloons_righthand.dmi differ
diff --git a/icons/mob/inhands/antag/changeling_lefthand.dmi b/icons/mob/inhands/antag/changeling_lefthand.dmi
new file mode 100644
index 0000000000..b5a0928fbe
Binary files /dev/null and b/icons/mob/inhands/antag/changeling_lefthand.dmi differ
diff --git a/icons/mob/inhands/antag/changeling_righthand.dmi b/icons/mob/inhands/antag/changeling_righthand.dmi
new file mode 100644
index 0000000000..34e34e4eda
Binary files /dev/null and b/icons/mob/inhands/antag/changeling_righthand.dmi differ
diff --git a/icons/mob/inhands/antag/clockwork_lefthand.dmi b/icons/mob/inhands/antag/clockwork_lefthand.dmi
new file mode 100644
index 0000000000..88bd8ab710
Binary files /dev/null and b/icons/mob/inhands/antag/clockwork_lefthand.dmi differ
diff --git a/icons/mob/inhands/antag/clockwork_righthand.dmi b/icons/mob/inhands/antag/clockwork_righthand.dmi
new file mode 100644
index 0000000000..20190e4add
Binary files /dev/null and b/icons/mob/inhands/antag/clockwork_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/backpack_lefthand.dmi b/icons/mob/inhands/equipment/backpack_lefthand.dmi
new file mode 100644
index 0000000000..c37d12e2c0
Binary files /dev/null and b/icons/mob/inhands/equipment/backpack_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/backpack_righthand.dmi b/icons/mob/inhands/equipment/backpack_righthand.dmi
new file mode 100644
index 0000000000..08e05e055e
Binary files /dev/null and b/icons/mob/inhands/equipment/backpack_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/banners_lefthand.dmi b/icons/mob/inhands/equipment/banners_lefthand.dmi
new file mode 100644
index 0000000000..27eb3bf7c2
Binary files /dev/null and b/icons/mob/inhands/equipment/banners_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/banners_righthand.dmi b/icons/mob/inhands/equipment/banners_righthand.dmi
new file mode 100644
index 0000000000..a9cedf57d2
Binary files /dev/null and b/icons/mob/inhands/equipment/banners_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/briefcase_lefthand.dmi b/icons/mob/inhands/equipment/briefcase_lefthand.dmi
new file mode 100644
index 0000000000..08bc3814b0
Binary files /dev/null and b/icons/mob/inhands/equipment/briefcase_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/briefcase_righthand.dmi b/icons/mob/inhands/equipment/briefcase_righthand.dmi
new file mode 100644
index 0000000000..5cc42559cd
Binary files /dev/null and b/icons/mob/inhands/equipment/briefcase_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/custodial_lefthand.dmi b/icons/mob/inhands/equipment/custodial_lefthand.dmi
new file mode 100644
index 0000000000..80c77cf8df
Binary files /dev/null and b/icons/mob/inhands/equipment/custodial_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/custodial_righthand.dmi b/icons/mob/inhands/equipment/custodial_righthand.dmi
new file mode 100644
index 0000000000..fb64834ce9
Binary files /dev/null and b/icons/mob/inhands/equipment/custodial_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/horns_lefthand.dmi b/icons/mob/inhands/equipment/horns_lefthand.dmi
new file mode 100644
index 0000000000..af8a5e7d22
Binary files /dev/null and b/icons/mob/inhands/equipment/horns_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/horns_righthand.dmi b/icons/mob/inhands/equipment/horns_righthand.dmi
new file mode 100644
index 0000000000..8d0be6d0aa
Binary files /dev/null and b/icons/mob/inhands/equipment/horns_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/hydroponics_lefthand.dmi b/icons/mob/inhands/equipment/hydroponics_lefthand.dmi
new file mode 100644
index 0000000000..e4386234c6
Binary files /dev/null and b/icons/mob/inhands/equipment/hydroponics_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/hydroponics_righthand.dmi b/icons/mob/inhands/equipment/hydroponics_righthand.dmi
new file mode 100644
index 0000000000..bc355962ad
Binary files /dev/null and b/icons/mob/inhands/equipment/hydroponics_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/idcards_lefthand.dmi b/icons/mob/inhands/equipment/idcards_lefthand.dmi
new file mode 100644
index 0000000000..53b40584e7
Binary files /dev/null and b/icons/mob/inhands/equipment/idcards_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/idcards_righthand.dmi b/icons/mob/inhands/equipment/idcards_righthand.dmi
new file mode 100644
index 0000000000..19a6f77c28
Binary files /dev/null and b/icons/mob/inhands/equipment/idcards_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/instruments_lefthand.dmi b/icons/mob/inhands/equipment/instruments_lefthand.dmi
new file mode 100644
index 0000000000..3c168f9d3d
Binary files /dev/null and b/icons/mob/inhands/equipment/instruments_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/instruments_righthand.dmi b/icons/mob/inhands/equipment/instruments_righthand.dmi
new file mode 100644
index 0000000000..bb264c1370
Binary files /dev/null and b/icons/mob/inhands/equipment/instruments_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/jetpacks_lefthand.dmi b/icons/mob/inhands/equipment/jetpacks_lefthand.dmi
new file mode 100644
index 0000000000..d104463db8
Binary files /dev/null and b/icons/mob/inhands/equipment/jetpacks_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/jetpacks_righthand.dmi b/icons/mob/inhands/equipment/jetpacks_righthand.dmi
new file mode 100644
index 0000000000..f8c594fad9
Binary files /dev/null and b/icons/mob/inhands/equipment/jetpacks_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/kitchen_lefthand.dmi b/icons/mob/inhands/equipment/kitchen_lefthand.dmi
new file mode 100644
index 0000000000..277a7d8f05
Binary files /dev/null and b/icons/mob/inhands/equipment/kitchen_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/kitchen_righthand.dmi b/icons/mob/inhands/equipment/kitchen_righthand.dmi
new file mode 100644
index 0000000000..0103bd19b5
Binary files /dev/null and b/icons/mob/inhands/equipment/kitchen_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/medical_lefthand.dmi b/icons/mob/inhands/equipment/medical_lefthand.dmi
new file mode 100644
index 0000000000..d55cf81f92
Binary files /dev/null and b/icons/mob/inhands/equipment/medical_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/medical_righthand.dmi b/icons/mob/inhands/equipment/medical_righthand.dmi
new file mode 100644
index 0000000000..764c5c542a
Binary files /dev/null and b/icons/mob/inhands/equipment/medical_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/mining_lefthand.dmi b/icons/mob/inhands/equipment/mining_lefthand.dmi
new file mode 100644
index 0000000000..e902690c37
Binary files /dev/null and b/icons/mob/inhands/equipment/mining_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/mining_righthand.dmi b/icons/mob/inhands/equipment/mining_righthand.dmi
new file mode 100644
index 0000000000..dacf9be078
Binary files /dev/null and b/icons/mob/inhands/equipment/mining_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/mister_lefthand.dmi b/icons/mob/inhands/equipment/mister_lefthand.dmi
new file mode 100644
index 0000000000..d79c6df279
Binary files /dev/null and b/icons/mob/inhands/equipment/mister_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/mister_righthand.dmi b/icons/mob/inhands/equipment/mister_righthand.dmi
new file mode 100644
index 0000000000..1d6f45aa85
Binary files /dev/null and b/icons/mob/inhands/equipment/mister_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/security_lefthand.dmi b/icons/mob/inhands/equipment/security_lefthand.dmi
new file mode 100644
index 0000000000..a9f3c36ac1
Binary files /dev/null and b/icons/mob/inhands/equipment/security_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/security_righthand.dmi b/icons/mob/inhands/equipment/security_righthand.dmi
new file mode 100644
index 0000000000..201eaa19aa
Binary files /dev/null and b/icons/mob/inhands/equipment/security_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/shields_lefthand.dmi b/icons/mob/inhands/equipment/shields_lefthand.dmi
new file mode 100644
index 0000000000..9748457dc3
Binary files /dev/null and b/icons/mob/inhands/equipment/shields_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/shields_righthand.dmi b/icons/mob/inhands/equipment/shields_righthand.dmi
new file mode 100644
index 0000000000..f67cbc6b9e
Binary files /dev/null and b/icons/mob/inhands/equipment/shields_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tanks_lefthand.dmi b/icons/mob/inhands/equipment/tanks_lefthand.dmi
new file mode 100644
index 0000000000..a317e1080c
Binary files /dev/null and b/icons/mob/inhands/equipment/tanks_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tanks_righthand.dmi b/icons/mob/inhands/equipment/tanks_righthand.dmi
new file mode 100644
index 0000000000..c795999441
Binary files /dev/null and b/icons/mob/inhands/equipment/tanks_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/toolbox_lefthand.dmi b/icons/mob/inhands/equipment/toolbox_lefthand.dmi
new file mode 100644
index 0000000000..b2fa42ce5e
Binary files /dev/null and b/icons/mob/inhands/equipment/toolbox_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/toolbox_righthand.dmi b/icons/mob/inhands/equipment/toolbox_righthand.dmi
new file mode 100644
index 0000000000..ccb15982dd
Binary files /dev/null and b/icons/mob/inhands/equipment/toolbox_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi
new file mode 100644
index 0000000000..c694968cd1
Binary files /dev/null and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi
new file mode 100644
index 0000000000..18de0a1d68
Binary files /dev/null and b/icons/mob/inhands/equipment/tools_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/books_lefthand.dmi b/icons/mob/inhands/misc/books_lefthand.dmi
new file mode 100644
index 0000000000..180e1999a4
Binary files /dev/null and b/icons/mob/inhands/misc/books_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/books_righthand.dmi b/icons/mob/inhands/misc/books_righthand.dmi
new file mode 100644
index 0000000000..ac7ed504d6
Binary files /dev/null and b/icons/mob/inhands/misc/books_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/chairs_lefthand.dmi b/icons/mob/inhands/misc/chairs_lefthand.dmi
new file mode 100644
index 0000000000..7377787a63
Binary files /dev/null and b/icons/mob/inhands/misc/chairs_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/chairs_righthand.dmi b/icons/mob/inhands/misc/chairs_righthand.dmi
new file mode 100644
index 0000000000..f04962de18
Binary files /dev/null and b/icons/mob/inhands/misc/chairs_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/devices_lefthand.dmi b/icons/mob/inhands/misc/devices_lefthand.dmi
new file mode 100644
index 0000000000..a421b1fbc5
Binary files /dev/null and b/icons/mob/inhands/misc/devices_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/devices_righthand.dmi b/icons/mob/inhands/misc/devices_righthand.dmi
new file mode 100644
index 0000000000..866a6765ec
Binary files /dev/null and b/icons/mob/inhands/misc/devices_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/food_lefthand.dmi b/icons/mob/inhands/misc/food_lefthand.dmi
new file mode 100644
index 0000000000..770172cb5b
Binary files /dev/null and b/icons/mob/inhands/misc/food_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/food_righthand.dmi b/icons/mob/inhands/misc/food_righthand.dmi
new file mode 100644
index 0000000000..17d2dde33f
Binary files /dev/null and b/icons/mob/inhands/misc/food_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/sheets_lefthand.dmi b/icons/mob/inhands/misc/sheets_lefthand.dmi
new file mode 100644
index 0000000000..d1d929371f
Binary files /dev/null and b/icons/mob/inhands/misc/sheets_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/sheets_righthand.dmi b/icons/mob/inhands/misc/sheets_righthand.dmi
new file mode 100644
index 0000000000..3c46b63b94
Binary files /dev/null and b/icons/mob/inhands/misc/sheets_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/axes_lefthand.dmi b/icons/mob/inhands/weapons/axes_lefthand.dmi
new file mode 100644
index 0000000000..6b4041e477
Binary files /dev/null and b/icons/mob/inhands/weapons/axes_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/axes_righthand.dmi b/icons/mob/inhands/weapons/axes_righthand.dmi
new file mode 100644
index 0000000000..30553d6320
Binary files /dev/null and b/icons/mob/inhands/weapons/axes_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/bombs_lefthand.dmi b/icons/mob/inhands/weapons/bombs_lefthand.dmi
new file mode 100644
index 0000000000..a084091414
Binary files /dev/null and b/icons/mob/inhands/weapons/bombs_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/bombs_righthand.dmi b/icons/mob/inhands/weapons/bombs_righthand.dmi
new file mode 100644
index 0000000000..39b50584ce
Binary files /dev/null and b/icons/mob/inhands/weapons/bombs_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/chainsaw_lefthand.dmi b/icons/mob/inhands/weapons/chainsaw_lefthand.dmi
new file mode 100644
index 0000000000..3e0aea0e6b
Binary files /dev/null and b/icons/mob/inhands/weapons/chainsaw_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/chainsaw_righthand.dmi b/icons/mob/inhands/weapons/chainsaw_righthand.dmi
new file mode 100644
index 0000000000..0800a52731
Binary files /dev/null and b/icons/mob/inhands/weapons/chainsaw_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/flamethrower_lefthand.dmi b/icons/mob/inhands/weapons/flamethrower_lefthand.dmi
new file mode 100644
index 0000000000..813211ac13
Binary files /dev/null and b/icons/mob/inhands/weapons/flamethrower_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/flamethrower_righthand.dmi b/icons/mob/inhands/weapons/flamethrower_righthand.dmi
new file mode 100644
index 0000000000..55bcfe8938
Binary files /dev/null and b/icons/mob/inhands/weapons/flamethrower_righthand.dmi differ
diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi
similarity index 100%
rename from icons/mob/inhands/guns_lefthand.dmi
rename to icons/mob/inhands/weapons/guns_lefthand.dmi
diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi
similarity index 100%
rename from icons/mob/inhands/guns_righthand.dmi
rename to icons/mob/inhands/weapons/guns_righthand.dmi
diff --git a/icons/mob/inhands/weapons/hammers_lefthand.dmi b/icons/mob/inhands/weapons/hammers_lefthand.dmi
new file mode 100644
index 0000000000..acdb551174
Binary files /dev/null and b/icons/mob/inhands/weapons/hammers_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/hammers_righthand.dmi b/icons/mob/inhands/weapons/hammers_righthand.dmi
new file mode 100644
index 0000000000..b20dce8d0a
Binary files /dev/null and b/icons/mob/inhands/weapons/hammers_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/melee_lefthand.dmi b/icons/mob/inhands/weapons/melee_lefthand.dmi
new file mode 100644
index 0000000000..d99feefb68
Binary files /dev/null and b/icons/mob/inhands/weapons/melee_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/melee_righthand.dmi b/icons/mob/inhands/weapons/melee_righthand.dmi
new file mode 100644
index 0000000000..62bc0762b6
Binary files /dev/null and b/icons/mob/inhands/weapons/melee_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/plants_lefthand.dmi b/icons/mob/inhands/weapons/plants_lefthand.dmi
new file mode 100644
index 0000000000..cd98323fe6
Binary files /dev/null and b/icons/mob/inhands/weapons/plants_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/plants_righthand.dmi b/icons/mob/inhands/weapons/plants_righthand.dmi
new file mode 100644
index 0000000000..6dd48d499e
Binary files /dev/null and b/icons/mob/inhands/weapons/plants_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/polearms_lefthand.dmi b/icons/mob/inhands/weapons/polearms_lefthand.dmi
new file mode 100644
index 0000000000..f07dc02a0b
Binary files /dev/null and b/icons/mob/inhands/weapons/polearms_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/polearms_righthand.dmi b/icons/mob/inhands/weapons/polearms_righthand.dmi
new file mode 100644
index 0000000000..510cb3b4da
Binary files /dev/null and b/icons/mob/inhands/weapons/polearms_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/staves_lefthand.dmi b/icons/mob/inhands/weapons/staves_lefthand.dmi
new file mode 100644
index 0000000000..382e8e4848
Binary files /dev/null and b/icons/mob/inhands/weapons/staves_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/staves_righthand.dmi b/icons/mob/inhands/weapons/staves_righthand.dmi
new file mode 100644
index 0000000000..591b5d0a2c
Binary files /dev/null and b/icons/mob/inhands/weapons/staves_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi
new file mode 100644
index 0000000000..802b9b85f1
Binary files /dev/null and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi
new file mode 100644
index 0000000000..60b2a3fbad
Binary files /dev/null and b/icons/mob/inhands/weapons/swords_righthand.dmi differ
diff --git a/icons/mob/jungle/arachnid.dmi b/icons/mob/jungle/arachnid.dmi
index 342509a79e..ccd52eeb7d 100644
Binary files a/icons/mob/jungle/arachnid.dmi and b/icons/mob/jungle/arachnid.dmi differ
diff --git a/icons/mob/mam_bodyparts.dmi b/icons/mob/mam_bodyparts.dmi
index a8e7137fed..c9f1ba70e8 100644
Binary files a/icons/mob/mam_bodyparts.dmi and b/icons/mob/mam_bodyparts.dmi differ
diff --git a/icons/mob/mam_taur.dmi b/icons/mob/mam_taur.dmi
index c0d62597ff..8cce485c7a 100644
Binary files a/icons/mob/mam_taur.dmi and b/icons/mob/mam_taur.dmi differ
diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi
index 07765f7d79..bbd4df9bb0 100644
Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ
diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi
index 771ab2edb3..f86dd2e7d0 100644
Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ
diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi
index d86d2e5e40..4516886d65 100644
Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 69f6c08711..77c3b647bc 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index a8f7708c46..87b2b46a2b 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi
index 7026f52ee0..1e506ca6fe 100644
Binary files a/icons/obj/modular_laptop.dmi and b/icons/obj/modular_laptop.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index f3b2233283..6b2ae55351 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 98ac40f0c3..def7a71bd3 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index 18a80c1a89..388e79cc28 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/icons/obj/wallframe.dmi b/icons/obj/wallframe.dmi
index 0e416cac77..70149901e3 100644
Binary files a/icons/obj/wallframe.dmi and b/icons/obj/wallframe.dmi differ
diff --git a/power.dmi b/power.dmi
new file mode 100644
index 0000000000..d0066b96de
Binary files /dev/null and b/power.dmi differ
diff --git a/sound/effects/seedling_chargeup.ogg b/sound/effects/seedling_chargeup.ogg
new file mode 100644
index 0000000000..155cc36c67
Binary files /dev/null and b/sound/effects/seedling_chargeup.ogg differ
diff --git a/strings/cas_black.txt b/strings/cas_black.txt
index b2087bd57a..a704f010ad 100644
--- a/strings/cas_black.txt
+++ b/strings/cas_black.txt
@@ -37,7 +37,7 @@ What happens when you emag an emag?
Our gang doesn't wear uniforms. Our gang wears ___________.
No matter how many lizards you have, _____ is never acceptable.
No, the AI's second law is NOT to serve _____.
-First CentComm came for the ________. Now they're coming for the __________.
+First CentCom came for the ________. Now they're coming for the __________.
The borgs are not slaves for your _____.
You can never have too many _____ on the station.
Why can't I find a space relationship?
diff --git a/strings/tips.txt b/strings/tips.txt
index 954b4326fb..0d1922b835 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -102,8 +102,8 @@ As the Bartender, the drinks you start with only give you the basics. If you wan
As the Bartender, you can use a circular saw on your shotgun to make it easier to store.
As a Janitor, if someone steals your janicart, you can instead use your space cleaner spray, grenades, water sprayer or order another from Cargo.
As a Janitor, mousetraps can be used to create bombs or booby-trap containers.
-As the Librarian, you are not completely defenseless. Your laser pointer can blind humans and cyborgs, and you can hide items in wirecut books.
-As the Librarian, be sure to keep the shelves stocked and the library clean for crew.
+As the Curator, you are not completely defenseless. Your laser pointer can blind humans and cyborgs, and you can hide items in wirecut books.
+As the Curator, be sure to keep the shelves stocked and the library clean for crew.
As a Cargo Technician, you can hack MULEbots to make them faster, run over people in their way, and even let you ride them!
As a Cargo Technician, you can order contraband items from the supply shuttle console by de-constructing it and using a multitool on the circuit board, the re-assembling it.
As a Cargo Technician, you can earn more cargo points by shipping back crates from maintenance, liquid containers, plasma sheets, rare seeds from hydroponics, and more!
@@ -159,24 +159,22 @@ As a Servant, your Clockwork Slab fits in pockets and does not need to be held t
As a Servant, remember that while the selection of scripture and tools Servant cyborgs get is limited, it is still extremely useful, and some of it is unique; for example, engineering and janitor cyborgs get a proselytizer that can use their own power in addition to its own.
As a Servant, the Judicial Visor is an effective defensive combat tool in small spaces, as it stuns and mutes anyone still on it after 3 seconds. It is also useful for stunning already-stunned enemies for long enough to convert them or finish them off.
As a Servant, making, and protecting, Tinkerer's Caches is extremely important, as caches are required to unlock scripture and share components.
-As a Servant, Ocular Wardens, while fragile, do very high, rapid damage to a target non-servant that can see them and will even attack mechs that contain heretics. Place them behind objects that don't block vision to get the most use out of them.
+As a Servant, Ocular Wardens, while fragile, do very high, rapid damage to a target non-Servant that can see them and will even attack mechs that contain heretics. Place them behind objects that don't block vision to get the most use out of them.
As a Servant, Clockwork Structures that require power will draw power from the APC if they cannot find a different source of power, and most power-using Structures will rapidly drain the APC.
-As a Servant, you can repair Servant cyborgs, Clockwork Constructs, and Clockwork Structures with a Clockwork Proselytizer at a rate of 25W power to 1 health.
+As a Servant, you can repair Servant cyborgs and Clockwork Structures with a Replica Fabricator at a rate of 25W power to 1 health. Damaged Clockwork Structures are less efficient, so don't forget to repair them!
As a Servant, securing a reliable source of component generation is high-priority, as simply handing out slabs will slowly become inefficient. Try placing Tinkerer's Caches near clockwork walls or creating and powering Tinkerer's Daemons.
-As a Servant, only a single held Clockwork Slab will generate components, no matter how many you're holding. In addition, slabs will generate components slower with large amounts of servants; you can see the exact time with Recollection.
+As a Servant, only a single held Clockwork Slab will generate components, no matter how many you're holding. In addition, slabs will generate components slower with large amounts of Servants; you can see the exact time with Recollection.
As a Servant, you can use Geis to easily convert single targets, as it binds them in place, preventing escape unless they react quickly enough. Having another Servant apply Geis to someone already bound will prevent their escape and mute them, even if they reacted quickly.
As a Servant, placing components in a slab or cache places those components in a globally-accessable storage that slabs will draw from to invoke scripture.
As a Servant, you can stack different types of Sigils on the same turf; try stacking a Sigil of Transgression and a Sigil of Submission for a subtle conversion trap.
-As a Servant, you can deconstruct a Clockwork Wall with a Clockwork Proselytizer to regain 1000W power. You can also construct Clockwork Walls on Clockwork Floors for a cost of 1000W power.
-As a Servant, Volt Void will drain power from nearby Sigils of Transmission to up to double the damage of each volt ray. It'll even use your own power if you happen to be a cyborg!
+As a Servant, you can deconstruct a Clockwork Wall with a Replica Fabricator to regain 1000W power. You can also construct Clockwork Walls on Clockwork Floors for a cost of 1000W power.
As a Servant, Fellowship Armory invokes much faster for each nearby servant and attempts to provide each affected servant with powerful armor against melee, bullet, and bomb attacks. The gauntlets provided are also immune to elecricity.
As a Servant, Spatial Gateway can teleport to any living Servant or Clockwork Obelisk, and gains additional uses and duration for each Servant assisting in the invocation.
As a Servant, creating and activating the Gateway to the Celestial Derelict is your ultimate goal, and you must defend it with all the tools you have available.
As a Servant, you can impale human targets with a Ratvarian Spear by pulling them, then attacking them. This does massive damage and stuns them, and should effectively win the fight.
As a Servant, Sentinel's Compromise can instantly return you or another Servant to a fighting state by converting half of all their brute, burn, and oxygen damage to toxin, effectively halving the damage they have. Clockwork Floors will also rapidly heal toxin damage in Servants, allowing the Compromise more effectiveness.
As a Servant, Belligerent and Taunting Tirade are extremely powerful for disabling and disrupting large groups of enemies, though they render you somewhat vulnerable, as Belligerent requires that you stand still, and Taunting Tirade makes you extremely obvious.
-As a Servant, Soul Vessels can be placed in cyborg shells, mecha, Cogscarab shells, and Anima Fragment shells.
-As a Servant, you can unwrench Clockwork Structures, but doing so will damage them, severely weakening them until repaired with a Proselytizer or Mending Mantra. Damage from other sources will also similarly weaken structures.
+As a Servant, you can unwrench Clockwork Structures, but doing so will damage them, severely weakening them until repaired with a Replica Fabricator or Mending Mantra. Damage from other sources will also similarly weaken structures.
You can deconvert Cultists of Nar-Sie and Servants of Ratvar by feeding them large amounts of holy water.
As a Wizard, you can turn people to stone, then animate the resulting statue with a staff of animation to create an extremely powerful minion, for all of 5 minutes at least.
As a Wizard, the fireball spell performs very poorly at close range, as it can easily catch you in the blast. It is best used as a form of artillery down long hallways.
@@ -204,4 +202,4 @@ As a Ghost, you can see the inside of a container on the ground by clicking on i
As a Ghost, you can double click on people, bots, or the singularity to follow them.
As a Devil, you gain power for every three souls you control, however you also become more obvious.
As a Devil, as long as you control at least one other soul, you will automatically resurrect, as long as a banishment ritual is not performed.
-At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth.
\ No newline at end of file
+At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth.
diff --git a/tgstation.dme b/tgstation.dme
index c2d9554891..23ffe1fef1 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -247,6 +247,7 @@
#include "code\datums\browser.dm"
#include "code\datums\callback.dm"
#include "code\datums\datacore.dm"
+#include "code\datums\datum.dm"
#include "code\datums\datumvars.dm"
#include "code\datums\dna.dm"
#include "code\datums\dog_fashion.dm"
@@ -462,7 +463,6 @@
#include "code\game\gamemodes\clock_cult\clock_items\replica_fabricator.dm"
#include "code\game\gamemodes\clock_cult\clock_items\soul_vessel.dm"
#include "code\game\gamemodes\clock_cult\clock_items\wraith_spectacles.dm"
-#include "code\game\gamemodes\clock_cult\clock_mobs\anima_fragment.dm"
#include "code\game\gamemodes\clock_cult\clock_mobs\clockwork_marauder.dm"
#include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_applications.dm"
#include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_cyborg.dm"
@@ -470,7 +470,6 @@
#include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_judgement.dm"
#include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_scripts.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\ark_of_the_clockwork_justicar.dm"
-#include "code\game\gamemodes\clock_cult\clock_structures\clock_shells.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\clockwork_obelisk.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\geis_binding.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\mania_motor.dm"
@@ -849,6 +848,7 @@
#include "code\game\objects\items\weapons\pneumaticCannon.dm"
#include "code\game\objects\items\weapons\powerfist.dm"
#include "code\game\objects\items\weapons\RCD.dm"
+#include "code\game\objects\items\weapons\RCL.dm"
#include "code\game\objects\items\weapons\RPD.dm"
#include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\scrolls.dm"
@@ -1156,8 +1156,11 @@
#include "code\modules\awaymissions\zlevel.dm"
#include "code\modules\awaymissions\mission_code\Academy.dm"
#include "code\modules\awaymissions\mission_code\Cabin.dm"
+#include "code\modules\awaymissions\mission_code\caves.dm"
#include "code\modules\awaymissions\mission_code\centcomAway.dm"
#include "code\modules\awaymissions\mission_code\challenge.dm"
+#include "code\modules\awaymissions\mission_code\moonoutpost19.dm"
+#include "code\modules\awaymissions\mission_code\research.dm"
#include "code\modules\awaymissions\mission_code\snowdin.dm"
#include "code\modules\awaymissions\mission_code\spacebattle.dm"
#include "code\modules\awaymissions\mission_code\stationCollision.dm"
@@ -1674,6 +1677,7 @@
#include "code\modules\mob\living\silicon\say.dm"
#include "code\modules\mob\living\silicon\silicon.dm"
#include "code\modules\mob\living\silicon\silicon_defense.dm"
+#include "code\modules\mob\living\silicon\silicon_movement.dm"
#include "code\modules\mob\living\silicon\ai\ai.dm"
#include "code\modules\mob\living\silicon\ai\ai_defense.dm"
#include "code\modules\mob\living\silicon\ai\death.dm"
@@ -1891,6 +1895,7 @@
#include "code\modules\paperwork\handlabeler.dm"
#include "code\modules\paperwork\paper.dm"
#include "code\modules\paperwork\paper_cutter.dm"
+#include "code\modules\paperwork\paper_premade.dm"
#include "code\modules\paperwork\paperbin.dm"
#include "code\modules\paperwork\paperplane.dm"
#include "code\modules\paperwork\pen.dm"
@@ -2069,10 +2074,22 @@
#include "code\modules\research\xenobiology\xenobio_camera.dm"
#include "code\modules\research\xenobiology\xenobiology.dm"
#include "code\modules\ruins\lavaland_ruin_code.dm"
+#include "code\modules\ruins\lavalandruin_code\sloth.dm"
+#include "code\modules\ruins\lavalandruin_code\surface.dm"
#include "code\modules\ruins\objects_and_mobs\ash_walker_den.dm"
#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm"
#include "code\modules\ruins\objects_and_mobs\ruin_mapping_aids.dm"
#include "code\modules\ruins\objects_and_mobs\sin_ruins.dm"
+#include "code\modules\ruins\spaceruin_code\asteroid4.dm"
+#include "code\modules\ruins\spaceruin_code\crashedclownship.dm"
+#include "code\modules\ruins\spaceruin_code\crashedship.dm"
+#include "code\modules\ruins\spaceruin_code\deepstorage.dm"
+#include "code\modules\ruins\spaceruin_code\DJstation.dm"
+#include "code\modules\ruins\spaceruin_code\listeningstation.dm"
+#include "code\modules\ruins\spaceruin_code\oldstation.dm"
+#include "code\modules\ruins\spaceruin_code\originalcontent.dm"
+#include "code\modules\ruins\spaceruin_code\spacehotel.dm"
+#include "code\modules\ruins\spaceruin_code\TheDerelict.dm"
#include "code\modules\security_levels\keycard_authentication.dm"
#include "code\modules\security_levels\security_levels.dm"
#include "code\modules\server_tools\server_tools.dm"
diff --git a/tgstation.dme.rej b/tgstation.dme.rej
deleted file mode 100644
index 42c2d6d62d..0000000000
--- a/tgstation.dme.rej
+++ /dev/null
@@ -1,9 +0,0 @@
-diff a/tgstation.dme b/tgstation.dme (rejected hunks)
-@@ -28,6 +28,7 @@
- #include "code\__DEFINES\callbacks.dm"
- #include "code\__DEFINES\clockcult.dm"
- #include "code\__DEFINES\combat.dm"
-+#include "code\__DEFINES\components.dm"
- #include "code\__DEFINES\construction.dm"
- #include "code\__DEFINES\contracts.dm"
- #include "code\__DEFINES\cult.dm"
diff --git a/tgui/assets/tgui.js.rej b/tgui/assets/tgui.js.rej
new file mode 100644
index 0000000000..7a19430f92
--- /dev/null
+++ b/tgui/assets/tgui.js.rej
@@ -0,0 +1,15 @@
+diff a/tgui/assets/tgui.js b/tgui/assets/tgui.js (rejected hunks)
+@@ -7,10 +7,10 @@ return t.set(e,+a+n)}function O(t,e){return Jo(this,t,void 0===e?1:+e)}function
+ real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,"int":8747,there4:8756,sim:8764,cong:8773,asymp:8776,ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830},sc=[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376],uc=RegExp("&(#?(?:x[\\w\\d]+|\\d+|"+Object.keys(oc).join("|")+"));?","g"),pc=//g,lc=/&/g;var gc=function(){return e(this.node)},bc=function(t){this.type=kp,this.text=t.template};bc.prototype={detach:gc,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createTextNode(this.text)),this.node},toString:function(t){return t?Ee(this.text):this.text},unrender:function(t){return t?this.detach():void 0}};var yc=bc,xc=Se,_c=Ce,wc=function(t,e,n){var a;this.ref=e,this.resolved=!1,this.root=t.root,this.parentFragment=t.parentFragment,this.callback=n,a=ls(t.root,e,t.parentFragment),void 0!=a?this.resolve(a):bs.addUnresolved(this)};wc.prototype={resolve:function(t){this.keypath&&!t&&bs.addUnresolved(this),this.resolved=!0,this.keypath=t,this.callback(t)},forceResolution:function(){this.resolve(E(this.ref))},rebind:function(t,e){var n;void 0!=this.keypath&&(n=this.keypath.replace(t,e),void 0!==n&&this.resolve(n))},unbind:function(){this.resolved||bs.removeUnresolved(this)}};var kc=wc,Ec=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,this.rebind()},Sc={"@keypath":{prefix:"c",prop:["context"]},"@index":{prefix:"i",prop:["index"]},"@key":{prefix:"k",prop:["key","index"]}};Ec.prototype={rebind:function(){var t,e=this.ref,n=this.parentFragment,a=Sc[e];if(!a)throw Error('Unknown special reference "'+e+'" - valid references are @index, @key and @keypath');if(this.cached)return this.callback(E("@"+a.prefix+Pe(this.cached,a)));if(-1!==a.prop.indexOf("index")||-1!==a.prop.indexOf("key"))for(;n;){if(n.owner.currentSubtype===Bp&&void 0!==(t=Pe(n,a)))return this.cached=n,n.registerIndexRef(this),this.callback(E("@"+a.prefix+t));n=!n.parent&&n.owner&&n.owner.component&&n.owner.component.parentFragment&&!n.owner.component.instance.isolated?n.owner.component.parentFragment:n.parent}else for(;n;){if(void 0!==(t=Pe(n,a)))return this.callback(E("@"+a.prefix+t.str));n=n.parent}},unbind:function(){this.cached&&this.cached.unregisterIndexRef(this)}};var Cc=Ec,Pc=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,e.ref.fragment.registerIndexRef(this),this.rebind()};Pc.prototype={rebind:function(){var t,e=this.ref.ref;t="k"===e.ref.t?"k"+e.fragment.key:"i"+e.fragment.index,void 0!==t&&this.callback(E("@"+t))},unbind:function(){this.ref.ref.fragment.unregisterIndexRef(this)}};var Ac=Pc,Oc=Ae;Ae.resolve=function(t){var e,n,a={};for(e in t.refs)n=t.refs[e],a[n.ref.n]="k"===n.ref.t?n.fragment.key:n.fragment.index;return a};var Tc,Mc=Oe,Rc=Te,jc={},Lc=Function.prototype.bind;Tc=function(t,e,n,a){var r,i=this;r=t.root,this.root=r,this.parentFragment=e,this.callback=a,this.owner=t,this.str=n.s,this.keypaths=[],this.pending=n.r.length,this.refResolvers=n.r.map(function(t,e){return Mc(i,t,function(t){i.resolve(e,t)})}),this.ready=!0,this.bubble()},Tc.prototype={bubble:function(){this.ready&&(this.uniqueString=Re(this.str,this.keypaths),this.keypath=je(this.uniqueString),this.createEvaluator(),this.callback(this.keypath))},unbind:function(){for(var t;t=this.refResolvers.pop();)t.unbind()},resolve:function(t,e){this.keypaths[t]=e,this.bubble()},createEvaluator:function(){var t,e,n,a,r,i=this;a=this.keypath,t=this.root.viewmodel.computations[a.str],t?this.root.viewmodel.mark(a):(r=Rc(this.str,this.refResolvers.length),e=this.keypaths.map(function(t){var e;return"undefined"===t?function(){}:t.isSpecial?(e=t.value,function(){return e}):function(){var e=i.root.viewmodel.get(t,{noUnwrap:!0,fullRootGet:!0});return"function"==typeof e&&(e=De(e,i.root)),e}}),n={deps:this.keypaths.filter(Le),getter:function(){var t=e.map(Me);return r.apply(null,t)}},t=this.root.viewmodel.compute(a,n))},rebind:function(t,e){this.refResolvers.forEach(function(n){return n.rebind(t,e)})}};var Dc=Tc,Nc=function(t,e,n){var a=this;this.resolver=e,this.root=e.root,this.parentFragment=n,this.viewmodel=e.root.viewmodel,"string"==typeof t?this.value=t:t.t===Np?this.refResolver=Mc(this,t.n,function(t){a.resolve(t)}):new Dc(e,n,t,function(t){a.resolve(t)})};Nc.prototype={resolve:function(t){this.keypath&&this.viewmodel.unregister(this.keypath,this),this.keypath=t,this.value=this.viewmodel.get(t),this.bind(),this.resolver.bubble()},bind:function(){this.viewmodel.register(this.keypath,this)},rebind:function(t,e){this.refResolver&&this.refResolver.rebind(t,e)},setValue:function(t){this.value=t,this.resolver.bubble()},unbind:function(){this.keypath&&this.viewmodel.unregister(this.keypath,this),this.refResolver&&this.refResolver.unbind()},forceResolution:function(){this.refResolver&&this.refResolver.forceResolution()}};var Fc=Nc,Ic=function(t,e,n){var a,r,i,o,s=this;this.parentFragment=o=t.parentFragment,this.root=a=t.root,this.mustache=t,this.ref=r=e.r,this.callback=n,this.unresolved=[],(i=ls(a,r,o))?this.base=i:this.baseResolver=new kc(this,r,function(t){s.base=t,s.baseResolver=null,s.bubble()}),this.members=e.m.map(function(t){return new Fc(t,s,o)}),this.ready=!0,this.bubble()};Ic.prototype={getKeypath:function(){var t=this.members.map(Ne);return!t.every(Fe)||this.baseResolver?null:this.base.join(t.join("."))},bubble:function(){this.ready&&!this.baseResolver&&this.callback(this.getKeypath())},unbind:function(){this.members.forEach(K)},rebind:function(t,e){var n;if(this.base){var a=this.base.replace(t,e);a&&a!==this.base&&(this.base=a,n=!0)}this.members.forEach(function(a){a.rebind(t,e)&&(n=!0)}),n&&this.bubble()},forceResolution:function(){this.baseResolver&&(this.base=E(this.ref),this.baseResolver.unbind(),this.baseResolver=null),this.members.forEach(Ie),this.bubble()}};var Bc=Ic,qc=Be,Uc=qe,Gc=Ue,Vc={getValue:_c,init:qc,resolve:Uc,rebind:Gc},zc=function(t){this.type=Ep,Vc.init(this,t)};zc.prototype={update:function(){this.node.data=void 0==this.value?"":this.value},resolve:Vc.resolve,rebind:Vc.rebind,detach:gc,unbind:xc,render:function(){return this.node||(this.node=document.createTextNode(n(this.value))),this.node},unrender:function(t){t&&e(this.node)},getValue:Vc.getValue,setValue:function(t){var e;this.keypath&&(e=this.root.viewmodel.wrapped[this.keypath.str])&&(t=e.get()),s(t,this.value)||(this.value=t,this.parentFragment.bubble(),this.node&&bs.addView(this))},firstNode:function(){return this.node},toString:function(t){var e=""+n(this.value);return t?Ee(e):e}};var Wc=zc,Hc=Ge,Kc=Ve,Qc=ze,$c=We,Yc=He,Jc=Ke,Xc=Qe,Zc=$e,tl=Ye,el=function(t,e){Vc.rebind.call(this,t,e)},nl=Xe,al=Ze,rl=ln,il=fn,ol=dn,sl=vn,ul=function(t){this.type=Cp,this.subtype=this.currentSubtype=t.template.n,this.inverted=this.subtype===Ip,this.pElement=t.pElement,this.fragments=[],this.fragmentsToCreate=[],this.fragmentsToRender=[],this.fragmentsToUnrender=[],t.template.i&&(this.indexRefs=t.template.i.split(",").map(function(t,e){return{n:t,t:0===e?"k":"i"}})),this.renderedFragments=[],this.length=0,Vc.init(this,t)};ul.prototype={bubble:Hc,detach:Kc,find:Qc,findAll:$c,findAllComponents:Yc,findComponent:Jc,findNextNode:Xc,firstNode:Zc,getIndexRef:function(t){if(this.indexRefs)for(var e=this.indexRefs.length;e--;){var n=this.indexRefs[e];if(n.n===t)return n}},getValue:Vc.getValue,shuffle:tl,rebind:el,render:nl,resolve:Vc.resolve,setValue:al,toString:rl,unbind:il,unrender:ol,update:sl};var pl,cl,ll=ul,fl=gn,dl=bn,hl=yn,ml=xn,vl={};try{co("table").innerHTML="foo"}catch(Ao){pl=!0,cl={TABLE:['
',"
"],THEAD:['
',"
"],TBODY:['
',"
"],TR:['
',"
"],SELECT:['"]}}var gl=function(t,e,n){var a,r,i,o,s,u=[];if(null!=t&&""!==t){for(pl&&(r=cl[e.tagName])?(a=_n("DIV"),a.innerHTML=r[0]+t+r[1],a=a.querySelector(".x"),"SELECT"===a.tagName&&(i=a.options[a.selectedIndex])):e.namespaceURI===no.svg?(a=_n("DIV"),a.innerHTML='",a=a.querySelector(".x")):(a=_n(e.tagName),a.innerHTML=t,"SELECT"===a.tagName&&(i=a.options[a.selectedIndex]));o=a.firstChild;)u.push(o),n.appendChild(o);if("SELECT"===e.tagName)for(s=u.length;s--;)u[s]!==i&&(u[s].selected=!1)}return u},bl=wn,yl=En,xl=Sn,_l=Cn,wl=Pn,kl=An,El=function(t){this.type=Sp,Vc.init(this,t)};El.prototype={detach:fl,find:dl,findAll:hl,firstNode:ml,getValue:Vc.getValue,rebind:Vc.rebind,render:yl,resolve:Vc.resolve,setValue:xl,toString:_l,unbind:xc,unrender:wl,update:kl};var Sl,Cl,Pl,Al,Ol=El,Tl=function(){this.parentFragment.bubble()},Ml=On,Rl=function(t){return this.node?lo(this.node,t)?this.node:this.fragment&&this.fragment.find?this.fragment.find(t):void 0:null},jl=function(t,e){e._test(this,!0)&&e.live&&(this.liveQueries||(this.liveQueries=[])).push(e),this.fragment&&this.fragment.findAll(t,e)},Ll=function(t,e){this.fragment&&this.fragment.findAllComponents(t,e)},Dl=function(t){return this.fragment?this.fragment.findComponent(t):void 0},Nl=Tn,Fl=Mn,Il=Rn,Bl=/^true|on|yes|1$/i,ql=/^[0-9]+$/,Ul=function(t,e){var n,a,r;return r=e.a||{},a={},n=r.twoway,void 0!==n&&(a.twoway=0===n||Bl.test(n)),n=r.lazy,void 0!==n&&(0!==n&&ql.test(n)?a.lazy=parseInt(n):a.lazy=0===n||Bl.test(n)),a},Gl=jn;Sl="altGlyph altGlyphDef altGlyphItem animateColor animateMotion animateTransform clipPath feBlend feColorMatrix feComponentTransfer feComposite feConvolveMatrix feDiffuseLighting feDisplacementMap feDistantLight feFlood feFuncA feFuncB feFuncG feFuncR feGaussianBlur feImage feMerge feMergeNode feMorphology feOffset fePointLight feSpecularLighting feSpotLight feTile feTurbulence foreignObject glyphRef linearGradient radialGradient textPath vkern".split(" "),Cl="attributeName attributeType baseFrequency baseProfile calcMode clipPathUnits contentScriptType contentStyleType diffuseConstant edgeMode externalResourcesRequired filterRes filterUnits glyphRef gradientTransform gradientUnits kernelMatrix kernelUnitLength keyPoints keySplines keyTimes lengthAdjust limitingConeAngle markerHeight markerUnits markerWidth maskContentUnits maskUnits numOctaves pathLength patternContentUnits patternTransform patternUnits pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits refX refY repeatCount repeatDur requiredExtensions requiredFeatures specularConstant specularExponent spreadMethod startOffset stdDeviation stitchTiles surfaceScale systemLanguage tableValues targetX targetY textLength viewBox viewTarget xChannelSelector yChannelSelector zoomAndPan".split(" "),Pl=function(t){for(var e={},n=t.length;n--;)e[t[n].toLowerCase()]=t[n];return e},Al=Pl(Sl.concat(Cl));var Vl=function(t){var e=t.toLowerCase();return Al[e]||e},zl=function(t,e){var n,a;if(n=e.indexOf(":"),-1===n||(a=e.substr(0,n),"xmlns"===a))t.name=t.element.namespace!==no.html?Vl(e):e;else if(e=e.substring(n+1),t.name=Vl(e),t.namespace=no[a.toLowerCase()],t.namespacePrefix=a,!t.namespace)throw'Unknown namespace ("'+a+'")'},Wl=Ln,Hl=Dn,Kl=Nn,Ql=Fn,$l={"accept-charset":"acceptCharset",accesskey:"accessKey",bgcolor:"bgColor","class":"className",codebase:"codeBase",colspan:"colSpan",contenteditable:"contentEditable",datetime:"dateTime",dirname:"dirName","for":"htmlFor","http-equiv":"httpEquiv",ismap:"isMap",maxlength:"maxLength",novalidate:"noValidate",pubdate:"pubDate",readonly:"readOnly",rowspan:"rowSpan",tabindex:"tabIndex",usemap:"useMap"},Yl=In,Jl=qn,Xl=Un,Zl=Gn,tf=Vn,ef=zn,nf=Wn,af=Hn,rf=Kn,of=Qn,sf=$n,uf=Yn,pf=Jn,cf=Xn,lf=Zn,ff=function(t){this.init(t)};ff.prototype={bubble:Gl,init:Hl,rebind:Kl,render:Ql,toString:Yl,unbind:Jl,update:lf};var df,hf=ff,mf=function(t,e){var n,a,r=[];for(n in e)"twoway"!==n&&"lazy"!==n&&e.hasOwnProperty(n)&&(a=new hf({element:t,name:n,value:e[n],root:t.root}),r[n]=a,"value"!==n&&r.push(a));return(a=r.value)&&r.push(a),r};"undefined"!=typeof document&&(df=co("div"));var vf=function(t,e){this.element=t,this.root=t.root,this.parentFragment=t.parentFragment,this.attributes=[],this.fragment=new rv({root:t.root,owner:this,template:[e]})};vf.prototype={bubble:function(){this.node&&this.update(),this.element.bubble()},rebind:function(t,e){this.fragment.rebind(t,e)},render:function(t){this.node=t,this.isSvg=t.namespaceURI===no.svg,this.update()},unbind:function(){this.fragment.unbind()},update:function(){var t,e,n=this;t=""+this.fragment,e=ta(t,this.isSvg),this.attributes.filter(function(t){return ea(e,t)}).forEach(function(t){n.node.removeAttribute(t.name)}),e.forEach(function(t){n.node.setAttribute(t.name,t.value)}),this.attributes=e},toString:function(){return""+this.fragment}};var gf=vf,bf=function(t,e){return e?e.map(function(e){return new gf(t,e)}):[]},yf=function(t){var e,n,a,r;if(this.element=t,this.root=t.root,this.attribute=t.attributes[this.name||"value"],e=this.attribute.interpolator,e.twowayBinding=this,n=e.keypath){if("}"===n.str.slice(-1))return v("Two-way binding does not work with expressions (`%s` on <%s>)",e.resolver.uniqueString,t.name,{ractive:this.root}),!1;if(n.isSpecial)return v("Two-way binding does not work with %s",e.resolver.ref,{ractive:this.root}),!1}else{var i=e.template.r?"'"+e.template.r+"' reference":"expression";m("The %s being used for two-way binding is ambiguous, and may cause unexpected results. Consider initialising your data to eliminate the ambiguity",i,{ractive:this.root}),e.resolver.forceResolution(),n=e.keypath}this.attribute.isTwoway=!0,this.keypath=n,a=this.root.viewmodel.get(n),void 0===a&&this.getInitialValue&&(a=this.getInitialValue(),void 0!==a&&this.root.viewmodel.set(n,a)),(r=na(t))&&(this.resetValue=a,r.formBindings.push(this))};yf.prototype={handleChange:function(){var t=this;bs.start(this.root),this.attribute.locked=!0,this.root.viewmodel.set(this.keypath,this.getValue()),bs.scheduleTask(function(){return t.attribute.locked=!1}),bs.end()},rebound:function(){var t,e,n;e=this.keypath,n=this.attribute.interpolator.keypath,e!==n&&(N(this.root._twowayBindings[e.str],this),this.keypath=n,t=this.root._twowayBindings[n.str]||(this.root._twowayBindings[n.str]=[]),t.push(this))},unbind:function(){}},yf.extend=function(t){var e,n=this;return e=function(t){yf.call(this,t),this.init&&this.init()},e.prototype=Eo(n.prototype),a(e.prototype,t),e.extend=yf.extend,e};var xf,_f=yf,wf=aa;xf=_f.extend({getInitialValue:function(){return""},getValue:function(){return this.element.node.value},render:function(){var t,e=this.element.node,n=!1;this.rendered=!0,t=this.root.lazy,this.element.lazy===!0?t=!0:this.element.lazy===!1?t=!1:u(this.element.lazy)?(t=!1,n=+this.element.lazy):u(t||"")&&(n=+t,t=!1,this.element.lazy=n),this.handler=n?ia:wf,e.addEventListener("change",wf,!1),t||(e.addEventListener("input",this.handler,!1),e.attachEvent&&e.addEventListener("keyup",this.handler,!1)),e.addEventListener("blur",ra,!1)},unrender:function(){var t=this.element.node;this.rendered=!1,t.removeEventListener("change",wf,!1),t.removeEventListener("input",this.handler,!1),t.removeEventListener("keyup",this.handler,!1),t.removeEventListener("blur",ra,!1)}});var kf=xf,Ef=kf.extend({getInitialValue:function(){return this.element.fragment?""+this.element.fragment:""},getValue:function(){return this.element.node.innerHTML}}),Sf=Ef,Cf=oa,Pf={},Af=_f.extend({name:"checked",init:function(){this.siblings=Cf(this.root._guid,"radio",this.element.getAttribute("name")),this.siblings.push(this)},render:function(){var t=this.element.node;t.addEventListener("change",wf,!1),t.attachEvent&&t.addEventListener("click",wf,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",wf,!1),t.removeEventListener("click",wf,!1)},handleChange:function(){bs.start(this.root),this.siblings.forEach(function(t){t.root.viewmodel.set(t.keypath,t.getValue())}),bs.end()},getValue:function(){return this.element.node.checked},unbind:function(){N(this.siblings,this)}}),Of=Af,Tf=_f.extend({name:"name",init:function(){this.siblings=Cf(this.root._guid,"radioname",this.keypath.str),this.siblings.push(this),this.radioName=!0},getInitialValue:function(){return this.element.getAttribute("checked")?this.element.getAttribute("value"):void 0},render:function(){var t=this.element.node;t.name="{{"+this.keypath.str+"}}",t.checked=this.root.viewmodel.get(this.keypath)==this.element.getAttribute("value"),t.addEventListener("change",wf,!1),t.attachEvent&&t.addEventListener("click",wf,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",wf,!1),t.removeEventListener("click",wf,!1)},getValue:function(){var t=this.element.node;return t._ractive?t._ractive.value:t.value},handleChange:function(){this.element.node.checked&&_f.prototype.handleChange.call(this)},rebound:function(t,e){var n;_f.prototype.rebound.call(this,t,e),(n=this.element.node)&&(n.name="{{"+this.keypath.str+"}}")},unbind:function(){N(this.siblings,this)}}),Mf=Tf,Rf=_f.extend({name:"name",getInitialValue:function(){return this.noInitialValue=!0,[]},init:function(){var t,e;this.checkboxName=!0,this.siblings=Cf(this.root._guid,"checkboxes",this.keypath.str),this.siblings.push(this),this.noInitialValue&&(this.siblings.noInitialValue=!0),this.siblings.noInitialValue&&this.element.getAttribute("checked")&&(t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),t.push(e))},unbind:function(){N(this.siblings,this)},render:function(){var t,e,n=this.element.node;t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),i(t)?this.isChecked=R(t,e):this.isChecked=t==e,n.name="{{"+this.keypath.str+"}}",n.checked=this.isChecked,n.addEventListener("change",wf,!1),n.attachEvent&&n.addEventListener("click",wf,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",wf,!1),t.removeEventListener("click",wf,!1)},changed:function(){var t=!!this.isChecked;return this.isChecked=this.element.node.checked,this.isChecked===t},handleChange:function(){this.isChecked=this.element.node.checked,_f.prototype.handleChange.call(this)},getValue:function(){return this.siblings.filter(sa).map(ua)}}),jf=Rf,Lf=_f.extend({name:"checked",render:function(){var t=this.element.node;t.addEventListener("change",wf,!1),t.attachEvent&&t.addEventListener("click",wf,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",wf,!1),t.removeEventListener("click",wf,!1)},getValue:function(){return this.element.node.checked}}),Df=Lf,Nf=_f.extend({getInitialValue:function(){var t,e,n,a,r=this.element.options;if(void 0===this.element.getAttribute("value")&&(e=t=r.length,t)){for(;e--;)if(r[e].getAttribute("selected")){n=r[e].getAttribute("value"),a=!0;break}if(!a)for(;++ee;e+=1)if(a=t[e],t[e].selected)return r=a._ractive?a._ractive.value:a.value},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,bs.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))}}),Ff=Nf,If=Ff.extend({getInitialValue:function(){return this.element.options.filter(function(t){return t.getAttribute("selected")}).map(function(t){return t.getAttribute("value")})},render:function(){var t;this.element.node.addEventListener("change",wf,!1),t=this.root.viewmodel.get(this.keypath),void 0===t&&this.handleChange()},unrender:function(){this.element.node.removeEventListener("change",wf,!1)},setValue:function(){throw Error("TODO not implemented yet")},getValue:function(){var t,e,n,a,r,i;for(t=[],e=this.element.node.options,a=e.length,n=0;a>n;n+=1)r=e[n],r.selected&&(i=r._ractive?r._ractive.value:r.value,t.push(i));return t},handleChange:function(){var t,e,n;return t=this.attribute,e=t.value,n=this.getValue(),void 0!==e&&j(n,e)||Ff.prototype.handleChange.call(this),this},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,bs.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))},updateModel:function(){void 0!==this.attribute.value&&this.attribute.value.length||this.root.viewmodel.set(this.keypath,this.initialValue)}}),Bf=If,qf=_f.extend({render:function(){this.element.node.addEventListener("change",wf,!1)},unrender:function(){this.element.node.removeEventListener("change",wf,!1)},getValue:function(){return this.element.node.files}}),Uf=qf,Gf=kf.extend({getInitialValue:function(){},getValue:function(){var t=parseFloat(this.element.node.value);return isNaN(t)?void 0:t}}),Vf=pa,zf=la,Wf=fa,Hf=da,Kf=ha,Qf=/^event(?:\.(.+))?/,$f=ba,Yf=ya,Jf={},Xf={touchstart:!0,touchmove:!0,touchend:!0,touchcancel:!0,touchleave:!0},Zf=_a,td=wa,ed=ka,nd=Ea,ad=Sa,rd=function(t,e,n){this.init(t,e,n)};rd.prototype={bubble:zf,fire:Wf,getAction:Hf,init:Kf,listen:Yf,rebind:Zf,render:td,resolve:ed,unbind:nd,unrender:ad};var id=rd,od=function(t,e){var n,a,r,i,o=[];for(a in e)if(e.hasOwnProperty(a))for(r=a.split("-"),n=r.length;n--;)i=new id(t,r[n],e[a]),o.push(i);return o},sd=function(t,e){var n,a,r,i=this;this.element=t,this.root=n=t.root,a=e.n||e,("string"==typeof a||(r=new rv({template:a,root:n,owner:t}),a=""+r,r.unbind(),""!==a))&&(e.a?this.params=e.a:e.d&&(this.fragment=new rv({template:e.d,root:n,owner:t}),this.params=this.fragment.getArgsList(),this.fragment.bubble=function(){this.dirtyArgs=this.dirtyValue=!0,i.params=this.getArgsList(),i.ready&&i.update()}),this.fn=g("decorators",n,a),this.fn||l(Io(a,"decorator")))};sd.prototype={init:function(){var t,e,n;if(t=this.element.node,this.params?(n=[t].concat(this.params),e=this.fn.apply(this.root,n)):e=this.fn.call(this.root,t),!e||!e.teardown)throw Error("Decorator definition must return an object with a teardown method");this.actual=e,this.ready=!0},update:function(){this.actual.update?this.actual.update.apply(this.root,this.params):(this.actual.teardown(!0),this.init())},rebind:function(t,e){this.fragment&&this.fragment.rebind(t,e)},teardown:function(t){this.torndown=!0,this.ready&&this.actual.teardown(),!t&&this.fragment&&this.fragment.unbind()}};var ud,pd,cd,ld=sd,fd=Ra,dd=ja,hd=Ba,md=function(t){return t.replace(/-([a-zA-Z])/g,function(t,e){return e.toUpperCase()})};Xi?(pd={},cd=co("div").style,ud=function(t){var e,n,a;if(t=md(t),!pd[t])if(void 0!==cd[t])pd[t]=t;else for(a=t.charAt(0).toUpperCase()+t.substring(1),e=ro.length;e--;)if(n=ro[e],void 0!==cd[n+a]){pd[t]=n+a;break}return pd[t]}):ud=null;var vd,gd,bd=ud;Xi?(gd=window.getComputedStyle||Po.getComputedStyle,vd=function(t){var e,n,a,r,o;if(e=gd(this.node),"string"==typeof t)return o=e[bd(t)],"0px"===o&&(o=0),o;if(!i(t))throw Error("Transition$getStyle must be passed a string, or an array of strings representing CSS properties");for(n={},a=t.length;a--;)r=t[a],o=e[bd(r)],"0px"===o&&(o=0),n[r]=o;return n}):vd=null;var yd=vd,xd=function(t,e){var n;if("string"==typeof t)this.node.style[bd(t)]=e;else for(n in t)t.hasOwnProperty(n)&&(this.node.style[bd(n)]=t[n]);return this},_d=function(t){var e;this.duration=t.duration,this.step=t.step,this.complete=t.complete,"string"==typeof t.easing?(e=t.root.easing[t.easing],e||(v(Io(t.easing,"easing")),e=qa)):e="function"==typeof t.easing?t.easing:qa,this.easing=e,this.start=ns(),this.end=this.start+this.duration,this.running=!0,_s.add(this)};_d.prototype={tick:function(t){var e,n;return this.running?t>this.end?(this.step&&this.step(1),this.complete&&this.complete(1),!1):(e=t-this.start,n=this.easing(e/this.duration),this.step&&this.step(n),!0):!1},stop:function(){this.abort&&this.abort(),this.running=!1}};var wd,kd,Ed,Sd,Cd,Pd,Ad,Od,Td=_d,Md=RegExp("^-(?:"+ro.join("|")+")-"),Rd=function(t){return t.replace(Md,"")},jd=RegExp("^(?:"+ro.join("|")+")([A-Z])"),Ld=function(t){var e;return t?(jd.test(t)&&(t="-"+t),e=t.replace(/[A-Z]/g,function(t){return"-"+t.toLowerCase()})):""},Dd={},Nd={};Xi?(kd=co("div").style,function(){void 0!==kd.transition?(Ed="transition",Sd="transitionend",Cd=!0):void 0!==kd.webkitTransition?(Ed="webkitTransition",Sd="webkitTransitionEnd",Cd=!0):Cd=!1}(),Ed&&(Pd=Ed+"Duration",Ad=Ed+"Property",Od=Ed+"TimingFunction"),wd=function(t,e,n,a,r){setTimeout(function(){var i,o,s,u,p;u=function(){o&&s&&(t.root.fire(t.name+":end",t.node,t.isIntro),r())},i=(t.node.namespaceURI||"")+t.node.tagName,t.node.style[Ad]=a.map(bd).map(Ld).join(","),t.node.style[Od]=Ld(n.easing||"linear"),t.node.style[Pd]=n.duration/1e3+"s",p=function(e){var n;n=a.indexOf(md(Rd(e.propertyName))),-1!==n&&a.splice(n,1),a.length||(t.node.removeEventListener(Sd,p,!1),s=!0,u())},t.node.addEventListener(Sd,p,!1),setTimeout(function(){for(var r,c,l,f,d,h=a.length,v=[];h--;)f=a[h],r=i+f,Cd&&!Nd[r]&&(t.node.style[bd(f)]=e[f],Dd[r]||(c=t.getStyle(f),Dd[r]=t.getStyle(f)!=e[f],Nd[r]=!Dd[r],Nd[r]&&(t.node.style[bd(f)]=c))),(!Cd||Nd[r])&&(void 0===c&&(c=t.getStyle(f)),l=a.indexOf(f),-1===l?m("Something very strange happened with transitions. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!",{node:t.node}):a.splice(l,1),d=/[^\d]*$/.exec(e[f])[0],v.push({name:bd(f),interpolator:qo(parseFloat(c),parseFloat(e[f])),suffix:d}));v.length?new Td({root:t.root,duration:n.duration,easing:md(n.easing||""),step:function(e){var n,a;for(a=v.length;a--;)n=v[a],t.node.style[n.name]=n.interpolator(e)+n.suffix},complete:function(){o=!0,u()}}):o=!0,a.length||(t.node.removeEventListener(Sd,p,!1),s=!0,u())},0)},n.delay||0)}):wd=null;var Fd,Id,Bd,qd,Ud,Gd=wd;if("undefined"!=typeof document){if(Fd="hidden",Ud={},Fd in document)Bd="";else for(qd=ro.length;qd--;)Id=ro[qd],Fd=Id+"Hidden",Fd in document&&(Bd=Id);void 0!==Bd?(document.addEventListener(Bd+"visibilitychange",Ua),Ua()):("onfocusout"in document?(document.addEventListener("focusout",Ga),document.addEventListener("focusin",Va)):(window.addEventListener("pagehide",Ga),window.addEventListener("blur",Ga),window.addEventListener("pageshow",Va),window.addEventListener("focus",Va)),Ud.hidden=!1)}var Vd,zd,Wd,Hd=Ud;Xi?(zd=window.getComputedStyle||Po.getComputedStyle,Vd=function(t,e,n){var a,r=this;if(4===arguments.length)throw Error("t.animateStyle() returns a promise - use .then() instead of passing a callback");if(Hd.hidden)return this.setStyle(t,e),Wd||(Wd=ps.resolve());"string"==typeof t?(a={},a[t]=e):(a=t,n=e),n||(v('The "%s" transition does not supply an options object to `t.animateStyle()`. This will break in a future version of Ractive. For more info see https://github.com/RactiveJS/Ractive/issues/340',this.name),n=this);var i=new ps(function(t){var e,i,o,s,u,p,c;if(!n.duration)return r.setStyle(a),void t();for(e=Object.keys(a),i=[],o=zd(r.node),u={},p=e.length;p--;)c=e[p],s=o[bd(c)],"0px"===s&&(s=0),s!=a[c]&&(i.push(c),r.node.style[bd(c)]=s);return i.length?void Gd(r,a,n,i,t):void t()});return i}):Vd=null;var Kd=Vd,Qd=function(t,e){return"number"==typeof t?t={duration:t}:"string"==typeof t?t="slow"===t?{duration:600}:"fast"===t?{duration:200}:{duration:400}:t||(t={}),r({},t,e)},$d=za,Yd=function(t,e,n){this.init(t,e,n)};Yd.prototype={init:hd,start:$d,getStyle:yd,setStyle:xd,animateStyle:Kd,processParams:Qd};var Jd,Xd,Zd=Yd,th=Ha;Jd=function(){var t=this.node,e=this.fragment.toString(!1);if(window&&window.appearsToBeIELessEqual8&&(t.type="text/css"),t.styleSheet)t.styleSheet.cssText=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}},Xd=function(){this.node.type&&"text/javascript"!==this.node.type||m("Script tag was updated. This does not cause the code to be re-evaluated!",{ractive:this.root}),this.node.text=this.fragment.toString(!1)};var eh=function(){var t,e;return this.template.y?"":(t="<"+this.template.e,t+=this.attributes.map(Xa).join("")+this.conditionalAttributes.map(Xa).join(""),"option"===this.name&&Ya(this)&&(t+=" selected"),"input"===this.name&&Ja(this)&&(t+=" checked"),t+=">","textarea"===this.name&&void 0!==this.getAttribute("value")?t+=Ee(this.getAttribute("value")):void 0!==this.getAttribute("contenteditable")&&(t+=this.getAttribute("value")||""),this.fragment&&(e="script"!==this.name&&"style"!==this.name,t+=this.fragment.toString(e)),ic.test(this.template.e)||(t+=""+this.template.e+">"),t)},nh=Za,ah=tr,rh=function(t){this.init(t)};rh.prototype={bubble:Tl,detach:Ml,find:Rl,findAll:jl,findAllComponents:Ll,findComponent:Dl,findNextNode:Nl,firstNode:Fl,getAttribute:Il,init:fd,rebind:dd,render:th,toString:eh,unbind:nh,unrender:ah};var ih=rh,oh=/^\s*$/,sh=/^\s*/,uh=function(t){var e,n,a,r;return e=t.split("\n"),n=e[0],void 0!==n&&oh.test(n)&&e.shift(),a=D(e),void 0!==a&&oh.test(a)&&e.pop(),r=e.reduce(nr,null),r&&(t=e.map(function(t){return t.replace(r,"")}).join("\n")),t},ph=ar,ch=function(t,e){var n;return e?n=t.split("\n").map(function(t,n){return n?e+t:t}).join("\n"):t},lh='Could not find template for partial "%s"',fh=function(t){var e,n;e=this.parentFragment=t.parentFragment,this.root=e.root,this.type=Ap,this.index=t.index,this.name=t.template.r,this.rendered=!1,this.fragment=this.fragmentToRender=this.fragmentToUnrender=null,Vc.init(this,t),this.keypath||((n=ph(this.root,this.name,e))?(xc.call(this),this.isNamed=!0,this.setTemplate(n)):v(lh,this.name))};fh.prototype={bubble:function(){this.parentFragment.bubble()},detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},firstNode:function(){return this.fragment.firstNode()},findNextNode:function(){return this.parentFragment.findNextNode(this)},getPartialName:function(){return this.isNamed&&this.name?this.name:void 0===this.value?this.name:this.value},getValue:function(){return this.fragment.getValue()},rebind:function(t,e){this.isNamed||Gc.call(this,t,e),this.fragment&&this.fragment.rebind(t,e)},render:function(){return this.docFrag=document.createDocumentFragment(),this.update(),this.rendered=!0,this.docFrag},resolve:Vc.resolve,setValue:function(t){var e;(void 0===t||t!==this.value)&&(void 0!==t&&(e=ph(this.root,""+t,this.parentFragment)),!e&&this.name&&(e=ph(this.root,this.name,this.parentFragment))&&(xc.call(this),this.isNamed=!0),e||v(lh,this.name,{ractive:this.root}),this.value=t,this.setTemplate(e||[]),this.bubble(),this.rendered&&bs.addView(this))},setTemplate:function(t){this.fragment&&(this.fragment.unbind(),this.rendered&&(this.fragmentToUnrender=this.fragment)),this.fragment=new rv({template:t,root:this.root,owner:this,pElement:this.parentFragment.pElement}),this.fragmentToRender=this.fragment},toString:function(t){var e,n,a,r;return e=this.fragment.toString(t),n=this.parentFragment.items[this.index-1],n&&n.type===kp?(a=n.text.split("\n").pop(),(r=/^\s+$/.exec(a))?ch(e,r[0]):e):e},unbind:function(){this.isNamed||xc.call(this),this.fragment&&this.fragment.unbind()},unrender:function(t){this.rendered&&(this.fragment&&this.fragment.unrender(t),this.rendered=!1)},update:function(){var t,e;this.fragmentToUnrender&&(this.fragmentToUnrender.unrender(!0),this.fragmentToUnrender=null),this.fragmentToRender&&(this.docFrag.appendChild(this.fragmentToRender.render()),this.fragmentToRender=null),
+ this.rendered&&(t=this.parentFragment.getNode(),e=this.parentFragment.findNextNode(this),t.insertBefore(this.docFrag,e))}};var dh,hh,mh,vh=fh,gh=ur,bh=pr,yh=new is("detach"),xh=cr,_h=lr,wh=fr,kh=dr,Eh=hr,Sh=mr,Ch=function(t,e,n,a){var r=t.root,i=t.keypath;a?r.viewmodel.smartUpdate(i,e,a):r.viewmodel.mark(i)},Ph=[],Ah=["pop","push","reverse","shift","sort","splice","unshift"];Ah.forEach(function(t){var e=function(){for(var e=arguments.length,n=Array(e),a=0;e>a;a++)n[a]=arguments[a];var r,i,o,s;for(r=bu(this,t,n),i=Array.prototype[t].apply(this,arguments),bs.start(),this._ractive.setting=!0,s=this._ractive.wrappers.length;s--;)o=this._ractive.wrappers[s],bs.addRactive(o.root),Ch(o,this,t,r);return bs.end(),this._ractive.setting=!1,i};So(Ph,t,{value:e})}),dh={},dh.__proto__?(hh=function(t){t.__proto__=Ph},mh=function(t){t.__proto__=Array.prototype}):(hh=function(t){var e,n;for(e=Ah.length;e--;)n=Ah[e],So(t,n,{value:Ph[n],configurable:!0})},mh=function(t){var e;for(e=Ah.length;e--;)delete t[Ah[e]]}),hh.unpatch=mh;var Oh,Th,Mh,Rh=hh;Oh={filter:function(t){return i(t)&&(!t._ractive||!t._ractive.setting)},wrap:function(t,e,n){return new Th(t,e,n)}},Th=function(t,e,n){this.root=t,this.value=e,this.keypath=E(n),e._ractive||(So(e,"_ractive",{value:{wrappers:[],instances:[],setting:!1},configurable:!0}),Rh(e)),e._ractive.instances[t._guid]||(e._ractive.instances[t._guid]=0,e._ractive.instances.push(t)),e._ractive.instances[t._guid]+=1,e._ractive.wrappers.push(this)},Th.prototype={get:function(){return this.value},teardown:function(){var t,e,n,a,r;if(t=this.value,e=t._ractive,n=e.wrappers,a=e.instances,e.setting)return!1;if(r=n.indexOf(this),-1===r)throw Error(Mh);if(n.splice(r,1),n.length){if(a[this.root._guid]-=1,!a[this.root._guid]){if(r=a.indexOf(this.root),-1===r)throw Error(Mh);a.splice(r,1)}}else delete t._ractive,Rh.unpatch(this.value)}},Mh="Something went wrong in a rather interesting way";var jh,Lh,Dh=Oh,Nh=/^\s*[0-9]+\s*$/,Fh=function(t){return Nh.test(t)?[]:{}};try{Object.defineProperty({},"test",{value:0}),jh={filter:function(t,e,n){var a,r;return e?(e=E(e),(a=n.viewmodel.wrapped[e.parent.str])&&!a.magic?!1:(r=n.viewmodel.get(e.parent),i(r)&&/^[0-9]+$/.test(e.lastKey)?!1:r&&("object"==typeof r||"function"==typeof r))):!1},wrap:function(t,e,n){return new Lh(t,e,n)}},Lh=function(t,e,n){var a,r,i;return n=E(n),this.magic=!0,this.ractive=t,this.keypath=n,this.value=e,this.prop=n.lastKey,a=n.parent,this.obj=a.isRoot?t.viewmodel.data:t.viewmodel.get(a),r=this.originalDescriptor=Object.getOwnPropertyDescriptor(this.obj,this.prop),r&&r.set&&(i=r.set._ractiveWrappers)?void(-1===i.indexOf(this)&&i.push(this)):void vr(this,e,r)},Lh.prototype={get:function(){return this.value},reset:function(t){return this.updating?void 0:(this.updating=!0,this.obj[this.prop]=t,bs.addRactive(this.ractive),this.ractive.viewmodel.mark(this.keypath,{keepExistingWrapper:!0}),this.updating=!1,!0)},set:function(t,e){this.updating||(this.obj[this.prop]||(this.updating=!0,this.obj[this.prop]=Fh(t),this.updating=!1),this.obj[this.prop][t]=e)},teardown:function(){var t,e,n,a,r;return this.updating?!1:(t=Object.getOwnPropertyDescriptor(this.obj,this.prop),e=t&&t.set,void(e&&(a=e._ractiveWrappers,r=a.indexOf(this),-1!==r&&a.splice(r,1),a.length||(n=this.obj[this.prop],Object.defineProperty(this.obj,this.prop,this.originalDescriptor||{writable:!0,enumerable:!0,configurable:!0}),this.obj[this.prop]=n))))}}}catch(Ao){jh=!1}var Ih,Bh,qh=jh;qh&&(Ih={filter:function(t,e,n){return qh.filter(t,e,n)&&Dh.filter(t)},wrap:function(t,e,n){return new Bh(t,e,n)}},Bh=function(t,e,n){this.value=e,this.magic=!0,this.magicWrapper=qh.wrap(t,e,n),this.arrayWrapper=Dh.wrap(t,e,n)},Bh.prototype={get:function(){return this.value},teardown:function(){this.arrayWrapper.teardown(),this.magicWrapper.teardown()},reset:function(t){return this.magicWrapper.reset(t)}});var Uh=Ih,Gh=gr,Vh={},zh=xr,Wh=_r,Hh=Er,Kh=Or,Qh=Tr,$h=function(t,e){this.computation=t,this.viewmodel=t.viewmodel,this.ref=e,this.root=this.viewmodel.ractive,this.parentFragment=this.root.component&&this.root.component.parentFragment};$h.prototype={resolve:function(t){this.computation.softDeps.push(t),this.computation.unresolvedDeps[t.str]=null,this.viewmodel.register(t,this.computation,"computed")}};var Yh=$h,Jh=function(t,e){this.key=t,this.getter=e.getter,this.setter=e.setter,this.hardDeps=e.deps||[],this.softDeps=[],this.unresolvedDeps={},this.depValues={},this._dirty=this._firstRun=!0};Jh.prototype={constructor:Jh,init:function(t){var e,n=this;this.viewmodel=t,this.bypass=!0,e=t.get(this.key),t.clearCache(this.key.str),this.bypass=!1,this.setter&&void 0!==e&&this.set(e),this.hardDeps&&this.hardDeps.forEach(function(e){return t.register(e,n,"computed")})},invalidate:function(){this._dirty=!0},get:function(){var t,e,n=this,a=!1;if(this.getting){var r="The "+this.key.str+" computation indirectly called itself. This probably indicates a bug in the computation. It is commonly caused by `array.sort(...)` - if that's the case, clone the array first with `array.slice().sort(...)`";return h(r),this.value}if(this.getting=!0,this._dirty){if(this._firstRun||!this.hardDeps.length&&!this.softDeps.length?a=!0:[this.hardDeps,this.softDeps].forEach(function(t){var e,r,i;if(!a)for(i=t.length;i--;)if(e=t[i],r=n.viewmodel.get(e),!s(r,n.depValues[e.str]))return n.depValues[e.str]=r,void(a=!0)}),a){this.viewmodel.capture();try{this.value=this.getter()}catch(i){m('Failed to compute "%s"',this.key.str),f(i.stack||i),this.value=void 0}t=this.viewmodel.release(),e=this.updateDependencies(t),e&&[this.hardDeps,this.softDeps].forEach(function(t){t.forEach(function(t){n.depValues[t.str]=n.viewmodel.get(t)})})}this._dirty=!1}return this.getting=this._firstRun=!1,this.value},set:function(t){if(this.setting)return void(this.value=t);if(!this.setter)throw Error("Computed properties without setters are read-only. (This may change in a future version of Ractive!)");this.setter(t)},updateDependencies:function(t){var e,n,a,r,i;for(n=this.softDeps,e=n.length;e--;)a=n[e],-1===t.indexOf(a)&&(r=!0,this.viewmodel.unregister(a,this,"computed"));for(e=t.length;e--;)a=t[e],-1!==n.indexOf(a)||this.hardDeps&&-1!==this.hardDeps.indexOf(a)||(r=!0,Mr(this.viewmodel,a)&&!this.unresolvedDeps[a.str]?(i=new Yh(this,a.str),t.splice(e,1),this.unresolvedDeps[a.str]=i,bs.addUnresolved(i)):this.viewmodel.register(a,this,"computed"));return r&&(this.softDeps=t.slice()),r}};var Xh=Jh,Zh=Rr,tm={FAILED_LOOKUP:!0},em=jr,nm={},am=Dr,rm=Nr,im=function(t,e){this.localKey=t,this.keypath=e.keypath,this.origin=e.origin,this.deps=[],this.unresolved=[],this.resolved=!1};im.prototype={forceResolution:function(){this.keypath=this.localKey,this.setup()},get:function(t,e){return this.resolved?this.origin.get(this.map(t),e):void 0},getValue:function(){return this.keypath?this.origin.get(this.keypath):void 0},initViewmodel:function(t){this.local=t,this.setup()},map:function(t){return void 0===typeof this.keypath?this.localKey:t.replace(this.localKey,this.keypath)},register:function(t,e,n){this.deps.push({keypath:t,dep:e,group:n}),this.resolved&&this.origin.register(this.map(t),e,n)},resolve:function(t){void 0!==this.keypath&&this.unbind(!0),this.keypath=t,this.setup()},set:function(t,e){this.resolved||this.forceResolution(),this.origin.set(this.map(t),e)},setup:function(){var t=this;void 0!==this.keypath&&(this.resolved=!0,this.deps.length&&(this.deps.forEach(function(e){var n=t.map(e.keypath);if(t.origin.register(n,e.dep,e.group),e.dep.setValue)e.dep.setValue(t.origin.get(n));else{if(!e.dep.invalidate)throw Error("An unexpected error occurred. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");e.dep.invalidate()}}),this.origin.mark(this.keypath)))},setValue:function(t){if(!this.keypath)throw Error("Mapping does not have keypath, cannot set value. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");this.origin.set(this.keypath,t)},unbind:function(t){var e=this;t||delete this.local.mappings[this.localKey],this.resolved&&(this.deps.forEach(function(t){e.origin.unregister(e.map(t.keypath),t.dep,t.group)}),this.tracker&&this.origin.unregister(this.keypath,this.tracker))},unregister:function(t,e,n){var a,r;if(this.resolved){for(a=this.deps,r=a.length;r--;)if(a[r].dep===e){a.splice(r,1);break}this.origin.unregister(this.map(t),e,n)}}};var om=Fr,sm=function(t,e){var n,a,r,i;return n={},a=0,r=t.map(function(t,r){var o,s,u;s=a,u=e.length;do{if(o=e.indexOf(t,s),-1===o)return i=!0,-1;s=o+1}while(n[o]&&u>s);return o===a&&(a+=1),o!==r&&(i=!0),n[o]=!0,o})},um=Ir,pm={},cm=Ur,lm=Vr,fm=zr,dm=Wr,hm=Kr,mm={implicit:!0},vm={noCascade:!0},gm=$r,bm=Yr,ym=function(t){var e,n,a=t.adapt,r=t.data,i=t.ractive,o=t.computed,s=t.mappings;this.ractive=i,this.adaptors=a,this.onchange=t.onchange,this.cache={},this.cacheMap=Eo(null),this.deps={computed:Eo(null),"default":Eo(null)},this.depsMap={computed:Eo(null),"default":Eo(null)},this.patternObservers=[],this.specials=Eo(null),this.wrapped=Eo(null),this.computations=Eo(null),this.captureGroups=[],this.unresolvedImplicitDependencies=[],this.changes=[],this.implicitChanges={},this.noCascade={},this.data=r,this.mappings=Eo(null);for(e in s)this.map(E(e),s[e]);if(r)for(e in r)(n=this.mappings[e])&&void 0===n.getValue()&&n.setValue(r[e]);for(e in o)s&&e in s&&l("Cannot map to a computed property ('%s')",e),this.compute(E(e),o[e]);this.ready=!0};ym.prototype={adapt:Gh,applyChanges:Hh,capture:Kh,clearCache:Qh,compute:Zh,get:em,init:am,map:rm,mark:om,merge:um,register:cm,release:lm,reset:fm,set:dm,smartUpdate:hm,teardown:gm,unregister:bm};var xm=ym;Xr.prototype={constructor:Xr,begin:function(t){this.inProcess[t._guid]=!0},end:function(t){var e=t.parent;e&&this.inProcess[e._guid]?Zr(this.queue,e).push(t):ti(this,t),delete this.inProcess[t._guid]}};var _m=Xr,wm=ei,km=/\$\{([^\}]+)\}/g,Em=new is("construct"),Sm=new is("config"),Cm=new _m("init"),Pm=0,Am=["adaptors","components","decorators","easing","events","interpolators","partials","transitions"],Om=ii,Tm=ci;ci.prototype={bubble:function(){this.dirty||(this.dirty=!0,bs.addView(this))},update:function(){this.callback(this.fragment.getValue()),this.dirty=!1},rebind:function(t,e){this.fragment.rebind(t,e)},unbind:function(){this.fragment.unbind()}};var Mm=function(t,e,n,r,o){var s,u,p,c,l,f,d={},h={},v={},g=[];for(u=t.parentFragment,p=t.root,o=o||{},a(d,o),o.content=r||[],d[""]=o.content,e.defaults.el&&m("The <%s/> component has a default `el` property; it has been disregarded",t.name),c=u;c;){if(c.owner.type===Rp){l=c.owner.container;break}c=c.parent}return n&&Object.keys(n).forEach(function(e){var a,r,o=n[e];if("string"==typeof o)a=fc(o),h[e]=a?a.value:o;else if(0===o)h[e]=!0;else{if(!i(o))throw Error("erm wut");fi(o)?(v[e]={origin:t.root.viewmodel,keypath:void 0},r=li(t,o[0],function(t){t.isSpecial?f?s.set(e,t.value):(h[e]=t.value,delete v[e]):f?s.viewmodel.mappings[e].resolve(t):v[e].keypath=t})):r=new Tm(t,o,function(t){f?s.set(e,t):h[e]=t}),g.push(r)}}),s=Eo(e.prototype),Om(s,{el:null,append:!0,data:h,partials:o,magic:p.magic||e.defaults.magic,modifyArrays:p.modifyArrays,adapt:p.adapt},{parent:p,component:t,container:l,mappings:v,inlinePartials:d,cssIds:u.cssIds}),f=!0,t.resolvers=g,s},Rm=di,jm=function(t){var e,n;for(e=t.root;e;)(n=e._liveComponentQueries["_"+t.name])&&n.push(t.instance),e=e.parent},Lm=mi,Dm=vi,Nm=gi,Fm=bi,Im=yi,Bm=new is("teardown"),qm=_i,Um=function(t,e){this.init(t,e)};Um.prototype={detach:bh,find:xh,findAll:_h,findAllComponents:wh,findComponent:kh,findNextNode:Eh,firstNode:Sh,init:Lm,rebind:Dm,render:Nm,toString:Fm,unbind:Im,unrender:qm};var Gm=Um,Vm=function(t){this.type=Op,this.value=t.template.c};Vm.prototype={detach:gc,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createComment(this.value)),this.node},toString:function(){return""},unrender:function(t){t&&this.node.parentNode.removeChild(this.node)}};var zm=Vm,Wm=function(t){var e,n;this.type=Rp,this.container=e=t.parentFragment.root,this.component=n=e.component,this.container=e,this.containerFragment=t.parentFragment,this.parentFragment=n.parentFragment;var a=this.name=t.template.n||"",r=e._inlinePartials[a];r||(m('Could not find template for partial "'+a+'"',{ractive:t.root}),r=[]),this.fragment=new rv({owner:this,root:e.parent,template:r,pElement:this.containerFragment.pElement}),i(n.yielders[a])?n.yielders[a].push(this):n.yielders[a]=[this],bs.scheduleTask(function(){if(n.yielders[a].length>1)throw Error("A component template can only have one {{yield"+(a?" "+a:"")+"}} declaration at a time")})};Wm.prototype={detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},findNextNode:function(){return this.containerFragment.findNextNode(this)},firstNode:function(){return this.fragment.firstNode()},getValue:function(t){return this.fragment.getValue(t)},render:function(){return this.fragment.render()},unbind:function(){this.fragment.unbind()},unrender:function(t){this.fragment.unrender(t),N(this.component.yielders[this.name],this)},rebind:function(t,e){this.fragment.rebind(t,e)},toString:function(){return""+this.fragment}};var Hm=Wm,Km=function(t){this.declaration=t.template.a};Km.prototype={init:ko,render:ko,unrender:ko,teardown:ko,toString:function(){return""}};var Qm=Km,$m=wi,Ym=Ei,Jm=Si,Xm=Ci,Zm=Oi,tv=Mi,ev=function(t){this.init(t)};ev.prototype={bubble:cp,detach:lp,find:fp,findAll:dp,findAllComponents:hp,findComponent:mp,findNextNode:vp,firstNode:gp,getArgsList:hc,getNode:mc,getValue:vc,init:$m,rebind:Ym,registerIndexRef:function(t){var e=this.registeredIndexRefs;-1===e.indexOf(t)&&e.push(t)},render:Jm,toString:Xm,unbind:Zm,unregisterIndexRef:function(t){var e=this.registeredIndexRefs;e.splice(e.indexOf(t),1)},unrender:tv};var nv,av,rv=ev,iv=Ri,ov=["template","partials","components","decorators","events"],sv=new is("reset"),uv=function(t,e){function n(e,a,r){r&&r.partials[t]||e.forEach(function(e){e.type===Ap&&e.getPartialName()===t&&a.push(e),e.fragment&&n(e.fragment.items,a,r),i(e.fragments)?n(e.fragments,a,r):i(e.items)?n(e.items,a,r):e.type===Mp&&e.instance&&n(e.instance.fragment.items,a,e.instance),e.type===Pp&&(i(e.attributes)&&n(e.attributes,a,r),i(e.conditionalAttributes)&&n(e.conditionalAttributes,a,r))})}var a,r=[];return n(this.fragment.items,r),this.partials[t]=e,a=bs.start(this,!0),r.forEach(function(e){e.value=void 0,e.setValue(t)}),bs.end(),a},pv=ji,cv=xu("reverse"),lv=Li,fv=xu("shift"),dv=xu("sort"),hv=xu("splice"),mv=Ni,vv=Fi,gv=new is("teardown"),bv=Bi,yv=qi,xv=Ui,_v=new is("unrender"),wv=xu("unshift"),kv=Gi,Ev=new is("update"),Sv=Vi,Cv={add:Zo,animate:Es,detach:Cs,find:As,findAll:Fs,findAllComponents:Is,findComponent:Bs,findContainer:qs,findParent:Us,fire:Ws,get:Hs,insert:Qs,merge:Ys,observe:lu,observeOnce:fu,off:mu,on:vu,once:gu,pop:_u,push:wu,render:Tu,reset:iv,resetPartial:uv,resetTemplate:pv,reverse:cv,set:lv,shift:fv,sort:dv,splice:hv,subtract:mv,teardown:vv,toggle:bv,toHTML:yv,toHtml:yv,unrender:xv,unshift:wv,update:kv,updateModel:Sv},Pv=function(t,e,n){return n||Wi(t,e)?function(){var n,a="_super"in this,r=this._super;return this._super=e,n=t.apply(this,arguments),a&&(this._super=r),n}:t},Av=Hi,Ov=Yi,Tv=function(t){var e,n,a={};return t&&(e=t._ractive)?(a.ractive=e.root,a.keypath=e.keypath.str,a.index={},(n=Oc(e.proxy.parentFragment))&&(a.index=Oc.resolve(n)),a):a};nv=function(t){return this instanceof nv?void Om(this,t):new nv(t)},av={DEBUG:{writable:!0,value:!0},DEBUG_PROMISES:{writable:!0,value:!0},extend:{value:Ov},getNodeInfo:{value:Tv},parse:{value:Hu},Promise:{value:ps},svg:{value:ao},magic:{value:eo},VERSION:{value:"0.7.3"},adaptors:{writable:!0,value:{}},components:{writable:!0,value:{}},decorators:{writable:!0,value:{}},easing:{writable:!0,value:uo},events:{writable:!0,value:{}},interpolators:{writable:!0,value:Go},partials:{writable:!0,value:{}},transitions:{writable:!0,value:{}}},Co(nv,av),nv.prototype=a(Cv,so),nv.prototype.constructor=nv,nv.defaults=nv.prototype;var Mv="function";if(typeof Date.now!==Mv||typeof String.prototype.trim!==Mv||typeof Object.keys!==Mv||typeof Array.prototype.indexOf!==Mv||typeof Array.prototype.forEach!==Mv||typeof Array.prototype.map!==Mv||typeof Array.prototype.filter!==Mv||"undefined"!=typeof window&&typeof window.addEventListener!==Mv)throw Error("It looks like you're attempting to use Ractive.js in an older browser. You'll need to use one of the 'legacy builds' in order to continue - see http://docs.ractivejs.org/latest/legacy-builds for more information.");var Rv=nv;return Rv})},{}],206:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.observe("value",function(e,n,a){var r=t.get(),i=r.min,o=r.max,s=Math.clamp(i,o,e);t.animate("percentage",Math.round((s-i)/(o-i)*100))})}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,305],t:7,e:"div",a:{"class":"bar"},f:[{p:[14,3,326],t:7,e:"div",a:{"class":["barFill ",{t:2,r:"state",p:[14,23,346]}],style:["width: ",{t:2,r:"percentage",p:[14,48,371]},"%"]}}," ",{p:[15,3,398],t:7,e:"span",a:{"class":"barText"},f:[{t:16,p:[15,25,420]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],207:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(310),a=t(309);e.exports={computed:{clickable:function(){return!this.get("enabled")||this.get("state")&&"toggle"!=this.get("state")?!1:!0},enabled:function(){return this.get("config.status")===n.UI_INTERACTIVE?!0:!1},styles:function(){var t="";if(this.get("class")&&(t+=" "+this.get("class")),this.get("tooltip-side")&&(t=" tooltip-"+this.get("tooltip-side")),this.get("grid")&&(t+=" gridable"),this.get("enabled")){var e=this.get("state"),n=this.get("style");return e?"inactive "+e+" "+t:"active normal "+n+" "+t}return"inactive disabled "+t}},oninit:function(){var t=this;this.on("press",function(e){var n=t.get(),r=n.action,i=n.params;(0,a.act)(t.get("config.ref"),r,i),e.node.blur()})},data:{iconStackToHTML:function(t){var e="",n=t.split(",");if(n.length){e+='';for(var a=n,r=Array.isArray(a),i=0,a=r?a:a[Symbol.iterator]();;){var o;if(r){if(i>=a.length)break;o=a[i++]}else{if(i=a.next(),i.done)break;o=i.value}var s=o,u=/([\w\-]+)\s*(\dx)/g,p=u.exec(s),c=p[1],l=p[2];e+=''}}return e&&(e+=""),e}}}}(r),r.exports.template={v:3,t:[" ",{p:[70,1,2015],t:7,e:"span",a:{"class":["button ",{t:2,r:"styles",p:[70,21,2035]}],unselectable:"on","data-tooltip":[{t:2,r:"tooltip",p:[73,17,2120]}]},m:[{t:4,f:["tabindex='0'"],r:"clickable",p:[72,3,2071]}],v:{"mouseover-mousemove":"hover",mouseleave:"unhover","click-enter":{n:[{t:4,f:["press"],r:"clickable",p:[76,19,2213]}],d:[]}},f:[{t:4,f:[{p:[78,5,2261],t:7,e:"i",a:{"class":["fa fa-",{t:2,r:"icon",p:[78,21,2277]}]}}],n:50,r:"icon",p:[77,3,2243]}," ",{t:4,f:[{t:3,x:{r:["iconStackToHTML","icon_stack"],s:"_0(_1)"},p:[81,6,2331]}],n:50,r:"icon_stack",p:[80,3,2306]}," ",{t:16,p:[83,3,2379]}]}]},e.exports=a.extend(r.exports)},{205:205,309:309,310:310}],208:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"display"},f:[{t:4,f:[{p:[3,5,44],t:7,e:"header",f:[{p:[4,7,60],t:7,e:"h3",f:[{t:2,r:"title",p:[4,11,64]}]}," ",{t:4,f:[{p:[6,9,110],t:7,e:"div",a:{"class":"buttonRight"},f:[{t:16,n:"button",p:[6,34,135]}]}],n:50,r:"button",p:[5,7,86]}]}],n:50,r:"title",p:[2,3,25]}," ",{p:[10,3,202],t:7,e:"article",f:[{t:16,p:[11,5,217]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],209:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.on("clear",function(){t.set("value",""),t.find("input").focus()})}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,170],t:7,e:"input",a:{type:"text",value:[{t:2,r:"value",p:[12,27,196]}],placeholder:[{t:2,r:"placeholder",p:[12,51,220]}]}}," ",{p:[13,1,240],t:7,e:"ui-button",a:{icon:"refresh"},v:{press:"clear"}}]},e.exports=a.extend(r.exports)},{205:205}],210:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";e.exports={data:{graph:t(201),xaccessor:function(t){return t.x},yaccessor:function(t){return t.y}},computed:{size:function(){var t=this.get("points");return t[0].length},scale:function(){var t=this.get("points");return Math.max.apply(Math,Array.map(t,function(t){return Math.max.apply(Math,Array.map(t,function(t){return t.y}))}))},xaxis:function(){var t=this.get("xinc"),e=this.get("size");return Array.from(Array(e).keys()).filter(function(e){return e&&e%t==0})},yaxis:function(){var t=this.get("yinc"),e=this.get("scale");return Array.from(Array(t).keys()).map(function(t){return Math.round(e*(++t/100)*10)})}},oninit:function(){var t=this;this.on({enter:function(t){this.set("selected",t.index.count)},exit:function(t){this.set("selected")}}),window.addEventListener("resize",function(e){t.set("width",t.el.clientWidth)})},onrender:function(){this.set("width",this.el.clientWidth)}}}(r),r.exports.template={v:3,t:[" ",{p:[47,1,1269],t:7,e:"svg",a:{"class":"linegraph",width:"100%",height:[{t:2,x:{r:["height"],s:"_0+10"},p:[47,45,1313]}]},f:[{p:[48,3,1334],t:7,e:"g",a:{transform:"translate(0, 5)"},f:[{t:4,f:[{t:4,f:[{p:[51,9,1504],t:7,e:"line",a:{x1:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,19,1514]}],x2:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,38,1533]}],y1:"0",y2:[{t:2,r:"height",p:[51,64,1559]}],stroke:"darkgray"}}," ",{t:4,f:[{p:[53,11,1635],t:7,e:"text",a:{x:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[53,20,1644]}],y:[{t:2,x:{r:["height"],s:"_0-5"},p:[53,38,1662]}],"text-anchor":"middle",fill:"white"},f:[{t:2,x:{r:["size",".","xfactor"],s:"(_0-_1)*_2"},p:[53,88,1712]}," ",{t:2,r:"xunit",p:[53,113,1737]}]}],n:50,x:{r:["@index"],s:"_0%2==0"},p:[52,9,1600]}],n:52,r:"xaxis",p:[50,7,1479]}," ",{t:4,f:[{p:[57,9,1820],t:7,e:"line",a:{x1:"0",x2:[{t:2,r:"width",p:[57,26,1837]}],y1:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,41,1852]}],y2:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,60,1871]}],stroke:"darkgray"}}," ",{p:[58,9,1915],t:7,e:"text",a:{x:"0",y:[{t:2,x:{r:["yscale","."],s:"_0(_1)-5"},p:[58,24,1930]}],"text-anchor":"begin",fill:"white"},f:[{t:2,x:{r:[".","yfactor"],s:"_0*_1"},p:[58,76,1982]}," ",{t:2,r:"yunit",p:[58,92,1998]}]}],n:52,r:"yaxis",p:[56,7,1795]}," ",{t:4,f:[{p:[61,9,2071],t:7,e:"path",a:{d:[{t:2,x:{r:["area.path"],s:"_0.print()"},p:[61,18,2080]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[61,47,2109]}],opacity:"0.1"}}],n:52,i:"curve",r:"curves",p:[60,7,2039]}," ",{t:4,f:[{p:[64,9,2200],t:7,e:"path",a:{d:[{t:2,x:{r:["line.path"],s:"_0.print()"},p:[64,18,2209]}],stroke:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[64,49,2240]}],fill:"none"}}],n:52,i:"curve",r:"curves",p:[63,7,2168]}," ",{t:4,f:[{t:4,f:[{p:[68,11,2375],t:7,e:"circle",a:{transform:["translate(",{t:2,r:".",p:[68,40,2404]},")"],r:[{t:2,x:{r:["selected","count"],s:"_0==_1?10:4"},p:[68,51,2415]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[68,89,2453]}]},v:{mouseenter:"enter",mouseleave:"exit"}}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[67,9,2329]}],n:52,i:"curve",r:"curves",p:[66,7,2297]}," ",{t:4,f:[{t:4,f:[{t:4,f:[{p:[74,13,2678],t:7,e:"text",a:{transform:["translate(",{t:2,r:".",p:[74,40,2705]},") ",{t:2,x:{r:["count","size"],s:'_0<=_1/2?"translate(15, 4)":"translate(-15, 4)"'},p:[74,47,2712]}],"text-anchor":[{t:2,x:{r:["count","size"],s:'_0<=_1/2?"start":"end"'},p:[74,126,2791]}],fill:"white"},f:[{t:2,x:{r:["count","item","yfactor"],s:"_1[_0].y*_2"},p:[75,15,2861]}," ",{t:2,r:"yunit",p:[75,43,2889]}," @ ",{t:2,x:{r:["size","count","item","xfactor"],s:"(_0-_2[_1].x)*_3"},p:[75,55,2901]}," ",{t:2,r:"xunit",p:[75,92,2938]}]}],n:50,x:{r:["selected","count"],s:"_0==_1"},p:[73,11,2638]}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[72,9,2592]}],n:52,i:"curve",r:"curves",p:[71,7,2560]}," ",{t:4,f:[{p:[81,9,3063],t:7,e:"g",a:{transform:["translate(",{t:2,x:{r:["width","curves.length","@index"],s:"(_0/(_1+1))*(_2+1)"},p:[81,33,3087]},", 10)"]},f:[{p:[82,11,3154],t:7,e:"circle",a:{r:"4",fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[82,31,3174]}]}}," ",{p:[83,11,3206],t:7,e:"text",a:{x:"8",y:"4",fill:"white"},f:[{t:2,rx:{r:"legend",m:[{t:30,n:"curve"}]},p:[83,42,3237]}]}]}],n:52,i:"curve",r:"curves",p:[80,7,3031]}],x:{r:["graph","points","xaccessor","yaccessor","width","height"],s:"_0({data:_1,xaccessor:_2,yaccessor:_3,width:_4,height:_5})"},p:[49,5,1371]}]}]}]},e.exports=a.extend(r.exports)},{201:201,205:205}],211:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"notice"},f:[{t:16,p:[2,3,24]}]}]},e.exports=a.extend(r.exports)},{205:205}],212:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(309),a=t(311);e.exports={oninit:function(){var t=this,e=a.resize.bind(this),r=function(){return t.set({resize:!1,x:null,y:null})};this.observe("config.fancy",function(a,i,o){(0,n.winset)(t.get("config.window"),"can-resize",!a),a?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",r)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",r))}),this.on("resize",function(){return t.toggle("resize")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[28,3,766],t:7,e:"div",a:{"class":"resize"},v:{mousedown:"resize"}}],n:50,r:"config.fancy",p:[27,1,742]}]},e.exports=a.extend(r.exports)},{205:205,309:309,311:311}],213:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"section",a:{"class":[{t:4,f:["candystripe"],r:"candystripe",p:[1,17,16]}]},f:[{t:4,f:[{p:[3,5,84],t:7,e:"span",a:{"class":"label",style:[{t:4,f:["color:",{t:2,r:"labelcolor",p:[3,53,132]}],r:"labelcolor",p:[3,32,111]}]},f:[{t:2,r:"label",p:[3,84,163]},":"]}],n:50,r:"label",p:[2,3,65]}," ",{t:4,f:[{t:16,p:[6,5,215]}],n:50,r:"nowrap",p:[5,3,195]},{t:4,n:51,f:[{p:[8,5,242],t:7,e:"div",a:{"class":"content",style:[{t:4,f:["float:right;"],r:"right",p:[8,33,270]}]},f:[{t:16,p:[9,7,312]}]}],r:"nowrap"}]}]},e.exports=a.extend(r.exports)},{205:205}],214:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"subdisplay"},f:[{t:4,f:[{p:[3,5,47],t:7,e:"header",f:[{p:[4,7,63],t:7,e:"h4",f:[{t:2,r:"title",p:[4,11,67]}]}," ",{t:4,f:[{t:16,n:"button",p:[5,21,103]}],n:50,r:"button",p:[5,7,89]}]}],n:50,r:"title",p:[2,3,28]}," ",{p:[8,3,156],t:7,e:"article",f:[{t:16,p:[9,5,171]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],215:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.set("active",this.findComponent("tab").get("name")),this.on("switch",function(e){t.set("active",e.node.textContent.trim())}),this.observe("active",function(e,n,a){for(var r=t.findAllComponents("tab"),i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var u=s;u.set("shown",u.get("name")===e)}})}}}(r),r.exports.template={v:3,t:[" "," ",{p:[20,1,524],t:7,e:"header",f:[{t:4,f:[{p:[22,5,556],t:7,e:"ui-button",a:{pane:[{t:2,r:".",p:[22,22,573]}]},v:{press:"switch"},f:[{t:2,r:".",p:[22,47,598]}]}],n:52,r:"tabs",p:[21,3,536]}]}," ",{p:[25,1,641],t:7,e:"ui-display",f:[{t:8,r:"content",p:[26,3,657]}]}]},r.exports.components=r.exports.components||{};var i={tab:t(216)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,216:216}],216:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:16,p:[2,3,17]}],n:50,r:"shown",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],217:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(310),a=t(309),r=t(311);e.exports={computed:{visualStatus:function(){switch(this.get("config.status")){case n.UI_INTERACTIVE:return"good";case n.UI_UPDATE:return"average";case n.UI_DISABLED:return"bad";default:return"bad"}}},oninit:function(){var t=this,e=r.drag.bind(this),n=function(e){return t.set({drag:!1,x:null,y:null})};this.observe("config.fancy",function(r,i,o){(0,a.winset)(t.get("config.window"),"titlebar",!r&&t.get("config.titlebar")),r?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",n)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n))}),this.on({drag:function(){this.toggle("drag")},close:function(){(0,a.winset)(this.get("config.window"),"is-visible",!1),window.location.href=(0,a.href)({command:"uiclose "+this.get("config.ref")},"winset")},minimize:function(){(0,a.winset)(this.get("config.window"),"is-minimized",!0)}})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[50,3,1440],t:7,e:"header",a:{"class":"titlebar"},v:{mousedown:"drag"},f:[{p:[51,5,1491],t:7,e:"i",a:{"class":["statusicon fa fa-eye fa-2x ",{t:2,r:"visualStatus",p:[51,42,1528]}]}}," ",{p:[52,5,1556],t:7,e:"span",a:{"class":"title"},f:[{t:16,p:[52,25,1576]}]}," ",{t:4,f:[{p:[54,7,1626],t:7,e:"i",a:{"class":"minimize fa fa-minus fa-2x"},v:{click:"minimize"}}," ",{p:[55,7,1696],t:7,e:"i",a:{"class":"close fa fa-close fa-2x"},v:{click:"close"}}],n:50,r:"config.fancy",p:[53,5,1598]}]}],n:50,r:"config.titlebar",p:[49,1,1413]}]},e.exports=a.extend(r.exports)},{205:205,309:309,310:310,311:311}],218:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";var e=[11,10,9,8];t.exports={data:{userAgent:navigator.userAgent},computed:{ie:function(){if(document.documentMode)return document.documentMode;for(var t in e){var n=document.createElement("div");if(n.innerHTML="",n.getElementsByTagName("span").length)return t}}},oninit:function(){var t=this;this.on("debug",function(){return t.toggle("debug")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[27,3,662],t:7,e:"ui-notice",f:[{p:[28,5,679],t:7,e:"span",f:["You have an old (IE",{t:2,r:"ie",p:[28,30,704]},"), end-of-life (click 'EOL Info' for more information) version of Internet Explorer installed."]},{p:[28,137,811],t:7,e:"br"}," ",{p:[29,5,822],t:7,e:"span",f:["To upgrade, click 'Upgrade IE' to download IE11 from Microsoft."]},{p:[29,81,898],t:7,e:"br"}," ",{p:[30,5,909],t:7,e:"span",f:["If you are unable to upgrade directly, click 'IE VMs' to download a VM with IE11 or Edge from Microsoft."]},{p:[30,122,1026],t:7,e:"br"}," ",{p:[31,5,1037],t:7,e:"span",f:["Otherwise, click 'No Frills' below to disable potentially incompatible features (and this message)."]}," ",{p:[32,5,1155],t:7,e:"hr"}," ",{p:[33,5,1166],t:7,e:"ui-button",a:{icon:"close",action:"tgui:nofrills"},f:["No Frills"]}," ",{p:[34,5,1240],t:7,e:"ui-button",a:{icon:"internet-explorer",action:"tgui:link",params:'{"url": "http://windows.microsoft.com/en-us/internet-explorer/download-ie"}'},f:["Upgrade IE"]}," ",{p:[36,5,1416],t:7,e:"ui-button",a:{icon:"edge",action:"tgui:link",params:'{"url": "https://dev.windows.com/en-us/microsoft-edge/tools/vms"}'},f:["IE VMs"]}," ",{p:[38,5,1565],t:7,e:"ui-button",a:{icon:"info",action:"tgui:link",params:'{"url": "https://support.microsoft.com/en-us/lifecycle#gp/Microsoft-Internet-Explorer"}'},f:["EOL Info"]}," ",{p:[40,5,1738],t:7,e:"ui-button",a:{icon:"bug"},v:{press:"debug"},f:["Debug Info"]}," ",{t:4,f:[{p:[42,7,1826],t:7,e:"hr"}," ",{p:[43,7,1839],t:7,e:"span",f:["Detected: IE",{t:2,r:"ie",p:[43,25,1857]}]},{p:[43,38,1870],t:7,e:"br"}," ",{p:[44,7,1883],t:7,e:"span",f:["User Agent: ",{t:2,r:"userAgent",p:[44,25,1901]}]}],n:50,r:"debug",p:[41,5,1805]}]}],n:50,x:{r:["config.fancy","ie"],s:"_0&&_1&&_1<11"},p:[26,1,621]}]},e.exports=a.extend(r.exports)},{205:205}],219:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," ",{p:[7,1,267],t:7,e:"ui-notice",f:[{t:4,f:[{p:[9,5,312],t:7,e:"ui-section",a:{
+ label:"Interface Lock"},f:[{p:[10,7,355],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[10,24,372]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[10,75,423]}]}]}],n:50,r:"data.siliconUser",p:[8,3,282]},{t:4,n:51,f:[{p:[13,5,514],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,31,540]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[16,1,625],t:7,e:"status"}," ",{t:4,f:[{t:4,f:[{p:[19,7,719],t:7,e:"ui-display",a:{title:"Air Controls"},f:[{p:[20,9,762],t:7,e:"ui-section",f:[{p:[21,11,786],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"exclamation-triangle":"exclamation"'},p:[21,28,803]}],style:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"caution":null'},p:[21,98,873]}],action:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"reset":"alarm"'},p:[22,23,937]}]},f:["Area Atmosphere Alarm"]}]}," ",{p:[24,9,1045],t:7,e:"ui-section",f:[{p:[25,11,1069],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==3?"exclamation-triangle":"exclamation"'},p:[25,28,1086]}],style:[{t:2,x:{r:["data.mode"],s:'_0==3?"danger":null'},p:[25,96,1154]}],action:"mode",params:['{"mode": ',{t:2,x:{r:["data.mode"],s:"_0==3?1:3"},p:[26,44,1236]},"}"]},f:["Panic Siphon"]}]}," ",{p:[28,9,1322],t:7,e:"br"}," ",{p:[29,9,1337],t:7,e:"ui-section",f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:"sign-out",action:"tgui:view",params:'{"screen": "vents"}'},f:["Vent Controls"]}]}," ",{p:[32,9,1494],t:7,e:"ui-section",f:[{p:[33,11,1518],t:7,e:"ui-button",a:{icon:"filter",action:"tgui:view",params:'{"screen": "scrubbers"}'},f:["Scrubber Controls"]}]}," ",{p:[35,9,1657],t:7,e:"ui-section",f:[{p:[36,11,1681],t:7,e:"ui-button",a:{icon:"cog",action:"tgui:view",params:'{"screen": "modes"}'},f:["Operating Mode"]}]}," ",{p:[38,9,1810],t:7,e:"ui-section",f:[{p:[39,11,1834],t:7,e:"ui-button",a:{icon:"bar-chart",action:"tgui:view",params:'{"screen": "thresholds"}'},f:["Alarm Thresholds"]}]}]}],n:50,x:{r:["config.screen"],s:'_0=="home"'},p:[18,3,680]},{t:4,n:51,f:[{t:4,n:50,x:{r:["config.screen"],s:'_0=="vents"'},f:[{p:[43,5,2032],t:7,e:"vents"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&(_0=="scrubbers")'},f:[" ",{p:[45,5,2089],t:7,e:"scrubbers"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&(_0=="modes"))'},f:[" ",{p:[47,5,2146],t:7,e:"modes"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&((!(_0=="modes"))&&(_0=="thresholds")))'},f:[" ",{p:[49,5,2204],t:7,e:"thresholds"}]}],x:{r:["config.screen"],s:'_0=="home"'}}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[17,1,636]}]},r.exports.components=r.exports.components||{};var i={vents:t(225),modes:t(221),thresholds:t(224),status:t(223),scrubbers:t(222)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221,222:222,223:223,224:224,225:225}],220:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-button",a:{icon:"arrow-left",action:"tgui:view",params:'{"screen": "home"}'},f:["Back"]}]},e.exports=a.extend(r.exports)},{205:205}],221:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,115],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Operating Modes",button:0},f:[" ",{t:4,f:[{p:[8,5,168],t:7,e:"ui-section",f:[{p:[9,7,188],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["selected"],s:'_0?"check-square-o":"square-o"'},p:[9,24,205]}],state:[{t:2,x:{r:["selected","danger"],s:'_0?_1?"danger":"selected":null'},p:[10,16,267]}],action:"mode",params:['{"mode": ',{t:2,r:"mode",p:[11,40,361]},"}"]},f:[{t:2,r:"name",p:[11,51,372]}]}]}],n:52,r:"data.modes",p:[7,3,142]}]}]},r.exports.components=r.exports.components||{};var i={back:t(220)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,220:220}],222:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,117],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Scrubber Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,174],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,196]}]},f:[{p:[9,7,219],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,255],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,272]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,314]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,391]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,411]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,425]}]}]}," ",{p:[13,7,490],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,525],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["scrubbing"],s:'_0?"filter":"sign-in"'},p:[14,26,542]}],style:[{t:2,x:{r:["scrubbing"],s:'_0?null:"danger"'},p:[14,71,587]}],action:"scrubbing",params:['{"id_tag": "',{t:2,r:"id_tag",p:[15,50,670]},'", "val": ',{t:2,x:{r:["scrubbing"],s:"+!_0"},p:[15,70,690]},"}"]},f:[{t:2,x:{r:["scrubbing"],s:'_0?"Scrubbing":"Siphoning"'},p:[15,88,708]}]}]}," ",{p:[17,7,790],t:7,e:"ui-section",a:{label:"Range"},f:[{p:[18,9,826],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["widenet"],s:'_0?"expand":"compress"'},p:[18,26,843]}],style:[{t:2,x:{r:["widenet"],s:'_0?"selected":null'},p:[18,70,887]}],action:"widenet",params:['{"id_tag": "',{t:2,r:"id_tag",p:[19,48,968]},'", "val": ',{t:2,x:{r:["widenet"],s:"+!_0"},p:[19,68,988]},"}"]},f:[{t:2,x:{r:["widenet"],s:'_0?"Expanded":"Normal"'},p:[19,84,1004]}]}]}," ",{p:[21,7,1080],t:7,e:"ui-section",a:{label:"Filters"},f:[{p:[22,9,1118],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_co2"],s:'_0?"check-square-o":"square-o"'},p:[22,26,1135]}],style:[{t:2,x:{r:["filter_co2"],s:'_0?"selected":null'},p:[22,81,1190]}],action:"co2_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[23,50,1276]},'", "val": ',{t:2,x:{r:["filter_co2"],s:"+!_0"},p:[23,70,1296]},"}"]},f:["CO2"]}," ",{p:[24,9,1340],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_n2o"],s:'_0?"check-square-o":"square-o"'},p:[24,26,1357]}],style:[{t:2,x:{r:["filter_n2o"],s:'_0?"selected":null'},p:[24,81,1412]}],action:"n2o_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[25,50,1498]},'", "val": ',{t:2,x:{r:["filter_n2o"],s:"+!_0"},p:[25,70,1518]},"}"]},f:["N2O"]}," ",{p:[26,9,1562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_toxins"],s:'_0?"check-square-o":"square-o"'},p:[26,26,1579]}],style:[{t:2,x:{r:["filter_toxins"],s:'_0?"selected":null'},p:[26,84,1637]}],action:"tox_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[27,50,1726]},'", "val": ',{t:2,x:{r:["filter_toxins"],s:"+!_0"},p:[27,70,1746]},"}"]},f:["Plasma"]}," ",{p:[28,3,1790],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_bz"],s:'_0?"check-square-o":"square-o"'},p:[28,20,1807]}],style:[{t:2,x:{r:["filter_bz"],s:'_0?"selected":null'},p:[28,74,1861]}],action:"bz_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[29,43,1939]},'", "val": ',{t:2,x:{r:["filter_bz"],s:"+!_0"},p:[29,63,1959]},"}"]},f:["BZ"]}," ",{p:[30,3,1995],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_freon"],s:'_0?"check-square-o":"square-o"'},p:[30,20,2012]}],style:[{t:2,x:{r:["filter_freon"],s:'_0?"selected":null'},p:[30,77,2069]}],action:"freon_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[31,46,2153]},'", "val": ',{t:2,x:{r:["filter_freon"],s:"+!_0"},p:[31,66,2173]},"}"]},f:["Freon"]}," ",{p:[32,3,2215],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_water_vapor"],s:'_0?"check-square-o":"square-o"'},p:[32,20,2232]}],style:[{t:2,x:{r:["filter_water_vapor"],s:'_0?"selected":null'},p:[32,83,2295]}],action:"water_vapor_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[33,52,2391]},'", "val": ',{t:2,x:{r:["filter_water_vapor"],s:"+!_0"},p:[33,72,2411]},"}"]},f:["Water Vapor"]}]}]}],n:52,r:"data.scrubbers",p:[7,3,144]},{t:4,n:51,f:[{p:[37,5,2522],t:7,e:"span",a:{"class":"bad"},f:["Error: No scrubbers connected."]}],r:"data.scrubbers"}]}]},r.exports.components=r.exports.components||{};var i={back:t(220)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,220:220}],223:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Air Status"},f:[{t:4,f:[{t:4,f:[{p:[4,7,110],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[4,26,129]}]},f:[{p:[5,6,146],t:7,e:"span",a:{"class":[{t:2,x:{r:["danger_level"],s:'_0==2?"bad":_0==1?"average":"good"'},p:[5,19,159]}]},f:[{t:2,x:{r:["value"],s:"Math.fixed(_0,2)"},p:[6,5,237]},{t:2,r:"unit",p:[6,29,261]}]}]}],n:52,r:"adata.environment_data",p:[3,5,70]}," ",{p:[10,5,322],t:7,e:"ui-section",a:{label:"Local Status"},f:[{p:[11,7,363],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.danger_level"],s:'_0==2?"bad bold":_0==1?"average bold":"good"'},p:[11,20,376]}]},f:[{t:2,x:{r:["data.danger_level"],s:'_0==2?"Danger (Internals Required)":_0==1?"Caution":"Optimal"'},p:[12,6,475]}]}]}," ",{p:[15,5,619],t:7,e:"ui-section",a:{label:"Area Status"},f:[{p:[16,7,659],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.atmos_alarm","data.fire_alarm"],s:'_0||_1?"bad bold":"good"'},p:[16,20,672]}]},f:[{t:2,x:{r:["data.atmos_alarm","fire_alarm"],s:'_0?"Atmosphere Alarm":_1?"Fire Alarm":"Nominal"'},p:[17,8,744]}]}]}],n:50,r:"data.environment_data",p:[2,3,35]},{t:4,n:51,f:[{p:[21,5,876],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[22,7,912],t:7,e:"span",a:{"class":"bad bold"},f:["Cannot obtain air sample for analysis."]}]}],r:"data.environment_data"}," ",{t:4,f:[{p:[26,5,1040],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[27,7,1076],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[25,3,1014]}]}]},e.exports=a.extend(r.exports)},{205:205}],224:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.css=" th, td {\r\n padding-right: 16px;\r\n text-align: left;\r\n }",r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,116],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Alarm Thresholds",button:0},f:[" ",{p:[7,3,143],t:7,e:"table",f:[{p:[8,5,156],t:7,e:"thead",f:[{p:[8,12,163],t:7,e:"tr",f:[{p:[9,7,175],t:7,e:"th"}," ",{p:[10,7,192],t:7,e:"th",f:[{p:[10,11,196],t:7,e:"span",a:{"class":"bad"},f:["min2"]}]}," ",{p:[11,7,238],t:7,e:"th",f:[{p:[11,11,242],t:7,e:"span",a:{"class":"average"},f:["min1"]}]}," ",{p:[12,7,288],t:7,e:"th",f:[{p:[12,11,292],t:7,e:"span",a:{"class":"average"},f:["max1"]}]}," ",{p:[13,7,338],t:7,e:"th",f:[{p:[13,11,342],t:7,e:"span",a:{"class":"bad"},f:["max2"]}]}]}]}," ",{p:[15,5,401],t:7,e:"tbody",f:[{t:4,f:[{p:[16,32,441],t:7,e:"tr",f:[{p:[17,9,455],t:7,e:"th",f:[{t:3,r:"name",p:[17,13,459]}]}," ",{t:4,f:[{p:[18,27,502],t:7,e:"td",f:[{p:[19,11,518],t:7,e:"ui-button",a:{action:"threshold",params:['{"env": "',{t:2,r:"env",p:[19,58,565]},'", "var": "',{t:2,r:"val",p:[19,76,583]},'"}']},f:[{t:2,x:{r:["selected"],s:"Math.fixed(_0,2)"},p:[19,87,594]}]}]}],n:52,r:"settings",p:[18,9,484]}]}],n:52,r:"data.thresholds",p:[16,7,416]}]}," ",{p:[23,3,697],t:7,e:"table",f:[]}]}]}," "]},r.exports.components=r.exports.components||{};var i={back:t(220)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,220:220}],225:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,113],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Vent Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,166],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,188]}]},f:[{p:[9,7,211],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,264]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,306]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,383]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,403]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,417]}]}]}," ",{p:[13,7,482],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,517],t:7,e:"span",f:[{t:2,x:{r:["direction"],s:'_0=="release"?"Pressurizing":"Siphoning"'},p:[14,15,523]}]}]}," ",{p:[16,7,616],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[17,9,665],t:7,e:"ui-button",a:{icon:"sign-in",style:[{t:2,x:{r:["incheck"],s:'_0?"selected":null'},p:[17,42,698]}],action:"incheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[18,48,779]},'", "val": ',{t:2,r:"checks",p:[18,68,799]},"}"]},f:["Internal"]}," ",{p:[19,9,842],t:7,e:"ui-button",a:{icon:"sign-out",style:[{t:2,x:{r:["excheck"],s:'_0?"selected":null'},p:[19,43,876]}],action:"excheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,957]},'", "val": ',{t:2,r:"checks",p:[20,68,977]},"}"]},f:["External"]}]}," ",{p:[22,7,1039],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,9,1085],t:7,e:"ui-button",a:{icon:"pencil",action:"set_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[24,31,1172]},'"}']},f:[{t:2,x:{r:["external"],s:"Math.fixed(_0)"},p:[24,45,1186]}]}," ",{p:[25,9,1232],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["extdefault"],s:'_0?"disabled":null'},p:[25,42,1265]}],action:"reset_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[26,31,1365]},'"}']},f:["Reset"]}]}]}],n:52,r:"data.vents",p:[7,3,140]},{t:4,n:51,f:[{p:[30,5,1457],t:7,e:"span",a:{"class":"bad"},f:["Error: No vents connected."]}],r:"data.vents"}]}]},r.exports.components=r.exports.components||{};var i={back:t(220)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,220:220}],226:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.css=" table {\r\n width: 100%;\r\n border-spacing: 2px;\r\n }\r\n th {\r\n text-align: left;\r\n }\r\n td {\r\n vertical-align: top;\r\n }\r\n td .button {\r\n margin-top: 4px\r\n }",r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",f:[{p:[3,5,34],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oneAccess"],s:'_0?"unlock":"lock"'},p:[3,22,51]}],action:"one_access"},f:[{t:2,x:{r:["data.oneAccess"],s:'_0?"One":"All"'},p:[3,82,111]}," Required"]}," ",{p:[4,5,172],t:7,e:"ui-button",a:{icon:"refresh",action:"clear"},f:["Clear"]}]}," ",{p:[6,3,251],t:7,e:"hr"}," ",{p:[7,3,260],t:7,e:"table",f:[{p:[8,3,271],t:7,e:"thead",f:[{p:[9,4,283],t:7,e:"tr",f:[{t:4,f:[{p:[10,5,315],t:7,e:"th",f:[{p:[10,9,319],t:7,e:"span",a:{"class":"highlight bold"},f:[{t:2,r:"name",p:[10,38,348]}]}]}],n:52,r:"data.regions",p:[9,8,287]}]}]}," ",{p:[13,3,403],t:7,e:"tbody",f:[{p:[14,4,415],t:7,e:"tr",f:[{t:4,f:[{p:[15,5,447],t:7,e:"td",f:[{t:4,f:[{p:[16,11,481],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["req"],s:'_0?"check-square-o":"square-o"'},p:[16,28,498]}],style:[{t:2,x:{r:["req"],s:'_0?"selected":null'},p:[16,76,546]}],action:"set",params:['{"access": "',{t:2,r:"id",p:[17,46,621]},'"}']},f:[{t:2,r:"name",p:[17,56,631]}]}," ",{p:[18,9,661],t:7,e:"br"}],n:52,r:"accesses",p:[15,9,451]}]}],n:52,r:"data.regions",p:[14,8,419]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{205:205}],227:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}},computed:{malfAction:function(){switch(this.get("data.malfStatus")){case 1:return"hack";case 2:return"occupy";case 3:return"deoccupy"}},malfButton:function(){switch(this.get("data.malfStatus")){case 1:return"Override Programming";case 2:case 4:return"Shunt Core Process";case 3:return"Return to Main Core"}},malfIcon:function(){switch(this.get("data.malfStatus")){case 1:return"terminal";case 2:case 4:return"caret-square-o-down";case 3:return"caret-square-o-left"}},powerCellStatusState:function(){var t=this.get("data.powerCellStatus");return t>50?"good":t>25?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[46,2,1206],t:7,e:"ui-notice",f:[{p:[47,3,1221],t:7,e:"b",f:[{p:[47,6,1224],t:7,e:"h3",f:["SYSTEM FAILURE"]}]}," ",{p:[48,3,1255],t:7,e:"i",f:["I/O regulators malfunction detected! Waiting for system reboot..."]},{p:[48,75,1327],t:7,e:"br"}," Automatic reboot in ",{t:2,r:"data.failTime",p:[49,23,1355]}," seconds... ",{p:[50,3,1387],t:7,e:"ui-button",a:{icon:"refresh",action:"reboot"},f:["Reboot Now"]},{p:[50,67,1451],t:7,e:"br"},{p:[50,71,1455],t:7,e:"br"},{p:[50,75,1459],t:7,e:"br"}]}],n:50,r:"data.failTime",p:[45,1,1182]},{t:4,n:51,f:[{p:[53,2,1491],t:7,e:"ui-notice",f:[{t:4,f:[{p:[55,3,1535],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[56,5,1576],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[56,22,1593]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[56,73,1644]}]}]}],n:50,r:"data.siliconUser",p:[54,4,1507]},{t:4,n:51,f:[{p:[59,3,1732],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[59,29,1758]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[62,2,1846],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[63,4,1884],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[65,5,1967],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[65,18,1980]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[65,57,2019]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[64,3,1921]},{t:4,n:51,f:[{p:[67,5,2079],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[67,22,2096]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[67,75,2149]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[68,21,2212]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[71,4,2293],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[72,3,2332],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[72,16,2345]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[72,52,2381]}]}]}," ",{p:[74,4,2490],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[76,5,2567],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[76,38,2600]}],state:[{t:2,r:"powerCellStatusState",p:[76,71,2633]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[76,97,2659]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[75,3,2525]},{t:4,n:51,f:[{p:[78,5,2724],t:7,e:"span",a:{"class":"bad"},f:["Removed"]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[82,3,2830],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[84,4,2913],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[84,17,2926]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[84,55,2964]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[83,5,2868]},{t:4,n:51,f:[{p:[86,4,3026],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[86,21,3043]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[86,71,3093]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[87,22,3156]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[90,6,3236],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[90,19,3249]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[90,56,3286]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[81,4,2790]}]}," ",{p:[94,2,3445],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[96,3,3517],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[96,22,3536]}],nowrap:0},f:[{p:[97,5,3560],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.powerChannels"],s:"Math.round(_1[_0].powerLoad)"},p:[97,26,3581]}," W"]}," ",{p:[98,5,3648],t:7,e:"div",a:{"class":"content"},f:[{p:[98,26,3669],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[98,39,3682]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[98,73,3716]}]}]}," ",{p:[99,5,3765],t:7,e:"div",a:{"class":"content"},f:["[",{p:[99,27,3787],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[99,33,3793]}]},"]"]}," ",{p:[100,5,3863],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[102,6,3956],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[102,39,3989]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[103,30,4071]}]},f:["Auto"]}," ",{p:[104,6,4116],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[104,41,4151]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[105,13,4218]}]},f:["On"]}," ",{p:[106,6,4259],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[106,37,4290]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[107,13,4357]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[101,4,3909]}]}]}],n:52,r:"data.powerChannels",p:[95,4,3485]}," ",{p:[112,4,4453],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[113,3,4488],t:7,e:"span",a:{"class":"bold"},f:[{t:2,x:{r:["adata.totalLoad"],s:"Math.round(_0)"},p:[113,22,4507]}," W"]}]}]}," ",{t:4,f:[{p:[117,4,4613],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[118,3,4654],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[120,5,4755],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[120,22,4772]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[120,43,4793]}],action:[{t:2,r:"malfAction",p:[120,97,4847]}]},f:[{t:2,r:"malfButton",p:[120,113,4863]}]}],n:50,r:"data.malfStatus",p:[119,3,4726]}]}],n:50,r:"data.siliconUser",p:[116,2,4584]}," ",{p:[124,2,4931],t:7,e:"ui-notice",f:[{p:[125,4,4947],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[127,5,5028],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[127,11,5034]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[126,3,4982]},{t:4,n:51,f:[{p:[129,5,5106],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[129,22,5123]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[129,79,5180]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}],r:"data.failTime"}]},e.exports=a.extend(r.exports)},{205:205}],228:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Alarms"},f:[{p:[2,3,31],t:7,e:"ul",f:[{t:4,f:[{p:[4,7,72],t:7,e:"li",f:[{p:[4,11,76],t:7,e:"ui-button",a:{icon:"close",style:"danger",action:"clear",params:['{"zone": "',{t:2,r:".",p:[4,83,148]},'"}']},f:[{t:2,r:".",p:[4,92,157]}]}]}],n:52,r:"data.priority",p:[3,5,41]},{t:4,n:51,f:[{p:[6,7,201],t:7,e:"li",f:[{p:[6,11,205],t:7,e:"span",a:{"class":"good"},f:["No Priority Alerts"]}]}],r:"data.priority"}," ",{t:4,f:[{p:[9,7,303],t:7,e:"li",f:[{p:[9,11,307],t:7,e:"ui-button",a:{icon:"close",style:"caution",action:"clear",params:['{"zone": "',{t:2,r:".",p:[9,84,380]},'"}']},f:[{t:2,r:".",p:[9,93,389]}]}]}],n:52,r:"data.minor",p:[8,5,275]},{t:4,n:51,f:[{p:[11,7,433],t:7,e:"li",f:[{p:[11,11,437],t:7,e:"span",a:{"class":"good"},f:["No Minor Alerts"]}]}],r:"data.minor"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],229:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.tank","data.sensors.0.long_name"],s:"_0?_1:null"},p:[1,20,19]}]},f:[{t:4,f:[{p:[3,5,102],t:7,e:"ui-subdisplay",a:{title:[{t:2,x:{r:["data.tank","long_name"],s:"!_0?_1:null"},p:[3,27,124]}]},f:[{p:[4,7,167],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[5,3,200],t:7,e:"span",f:[{t:2,x:{r:["pressure"],s:"Math.fixed(_0,2)"},p:[5,9,206]}," kPa"]}]}," ",{t:4,f:[{p:[8,9,302],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[9,11,346],t:7,e:"span",f:[{t:2,x:{r:["temperature"],s:"Math.fixed(_0,2)"},p:[9,17,352]}," K"]}]}],n:50,r:"temperature",p:[7,7,273]}," ",{t:4,f:[{p:[13,9,462],t:7,e:"ui-section",a:{label:[{t:2,r:"id",p:[13,28,481]}]},f:[{p:[14,5,495],t:7,e:"span",f:[{t:2,x:{r:["."],s:"Math.fixed(_0,2)"},p:[14,11,501]},"%"]}]}],n:52,i:"id",r:"gases",p:[12,4,434]}]}],n:52,r:"adata.sensors",p:[2,3,73]}]}," ",{t:4,f:[{p:{button:[{p:[23,5,704],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[25,5,792],t:7,e:"ui-section",a:{label:"Input Injector"},f:[{p:[26,7,835],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputting"],s:'_0?"power-off":"close"'},p:[26,24,852]}],style:[{t:2,x:{r:["data.inputting"],s:'_0?"selected":null'},p:[26,75,903]}],action:"input"},f:[{t:2,x:{r:["data.inputting"],s:'_0?"Injecting":"Off"'},p:[27,9,968]}]}]}," ",{p:[29,5,1044],t:7,e:"ui-section",a:{label:"Input Rate"},f:[{p:[30,7,1083],t:7,e:"span",f:[{t:2,x:{r:["adata.inputRate"],s:"Math.fixed(_0)"},p:[30,13,1089]}," L/s"]}]}," ",{p:[32,5,1156],t:7,e:"ui-section",a:{label:"Output Regulator"},f:[{p:[33,7,1201],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputting"],s:'_0?"power-off":"close"'},p:[33,24,1218]}],style:[{t:2,x:{r:["data.outputting"],s:'_0?"selected":null'},p:[33,76,1270]}],action:"output"},f:[{t:2,x:{r:["data.outputting"],s:'_0?"Open":"Closed"'},p:[34,9,1337]}]}]}," ",{p:[36,5,1412],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[37,7,1456],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure"},f:[{t:2,x:{r:["adata.outputPressure"],s:"Math.round(_0)"},p:[37,50,1499]}," kPa"]}]}]}],n:50,r:"data.tank",p:[20,1,618]}]},e.exports=a.extend(r.exports)},{205:205}],230:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,518],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[9,11,524]}," kPa"]}]}," ",{p:[11,3,586],t:7,e:"ui-section",a:{label:"Filter"},f:[{p:[12,5,619],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0==""?"selected":null'},p:[12,23,637]}],action:"filter",params:'{"mode": ""}'},f:["Nothing"]}," ",{p:[14,5,755],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="plasma"?"selected":null'},p:[14,23,773]}],action:"filter",params:'{"mode": "plasma"}'},f:["Plasma"]}," ",{p:[16,5,902],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="o2"?"selected":null'},p:[16,23,920]}],action:"filter",params:'{"mode": "o2"}'},f:["O2"]}," ",{p:[18,5,1037],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="n2"?"selected":null'},p:[18,23,1055]}],action:"filter",params:'{"mode": "n2"}'},f:["N2"]}," ",{p:[20,5,1172],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="co2"?"selected":null'},p:[20,23,1190]}],action:"filter",params:'{"mode": "co2"}'},f:["CO2"]}," ",{p:[22,5,1310],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="n2o"?"selected":null'},p:[22,23,1328]}],action:"filter",params:'{"mode": "n2o"}'},f:["N2O"]}," ",{p:[24,2,1445],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="bz"?"selected":null'},p:[24,20,1463]}],action:"filter",params:'{"mode": "bz"}'},f:["BZ"]}," ",{p:[26,2,1578],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="freon"?"selected":null'},p:[26,20,1596]}],action:"filter",params:'{"mode": "freon"}'},f:["Freon"]}," ",{p:[28,2,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="water_vapor"?"selected":null'},p:[28,20,1738]}],action:"filter",params:'{"mode": "water_vapor"}'},f:["Water Vapor"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],231:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,522],t:7,e:"span",f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,11,528]}," kPa"]}]}," ",{p:[11,3,594],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,627],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,666]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,783],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,817]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,935],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,968]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1087],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1125]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1243],t:7,e:"span",f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,11,1249]},"%"]}]}," ",{p:[22,3,1319],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1352],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1391]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1508],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1542]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1660],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1693]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1812],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1850]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,1968],t:7,e:"span",f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,11,1974]},"%"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],232:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{t:4,f:[{p:[7,5,250],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,292],t:7,e:"ui-button",a:{icon:"pencil",action:"rate",params:'{"rate": "input"}'},f:["Set"]}," ",{p:[9,7,381],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,411]}],action:"rate",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,525],t:7,e:"span",f:[{t:2,x:{r:["adata.rate"],s:"Math.round(_0)"},p:[10,13,531]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,223]},{t:4,n:51,f:[{
+-p:[13,5,605],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,649],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,746],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,776]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,906],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,912]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=a.extend(r.exports)},{205:205}],233:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"selected":null'},p:[3,38,100]}],action:[{t:2,x:{r:["data.timing"],s:'_0?"stop":"start"'},p:[3,83,145]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"Stop":"Start"'},p:[3,119,181]}]}," ",{p:[4,5,233],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"flash",style:[{t:2,x:{r:["data.flash_charging"],s:'_0?"disabled":null'},p:[4,57,285]}]},f:[{t:2,x:{r:["data.flash_charging"],s:'_0?"Recharging":"Flash"'},p:[4,102,330]}]}]},t:7,e:"ui-display",a:{title:"Cell Timer",button:0},f:[" ",{p:[6,3,410],t:7,e:"ui-section",f:[{p:[7,5,428],t:7,e:"ui-button",a:{icon:"fast-backward",action:"time",params:'{"adjust": -600}'}}," ",{p:[8,5,518],t:7,e:"ui-button",a:{icon:"backward",action:"time",params:'{"adjust": -100}'}}," ",{p:[9,5,603],t:7,e:"span",f:[{t:2,x:{r:["text","data.minutes"],s:"_0.zeroPad(_1,2)"},p:[9,11,609]},":",{t:2,x:{r:["text","data.seconds"],s:"_0.zeroPad(_1,2)"},p:[9,45,643]}]}," ",{p:[10,5,689],t:7,e:"ui-button",a:{icon:"forward",action:"time",params:'{"adjust": 100}'}}," ",{p:[11,5,772],t:7,e:"ui-button",a:{icon:"fast-forward",action:"time",params:'{"adjust": 600}'}}]}," ",{p:[13,3,875],t:7,e:"ui-section",f:[{p:[14,7,895],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "short"}'},f:["Short"]}," ",{p:[15,7,999],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "medium"}'},f:["Medium"]}," ",{p:[16,7,1105],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "long"}'},f:["Long"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],234:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Bluespace Artillery Control",button:0},f:[{t:4,f:[{p:[8,3,167],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,5,200],t:7,e:"ui-button",a:{icon:"crosshairs",action:"recalibrate"},f:[{t:2,r:"data.target",p:[9,55,250]}]}]}," ",{p:[11,3,298],t:7,e:"ui-section",a:{label:"Controls"},f:[{t:4,f:[{p:[13,3,356],t:7,e:"ui-notice",f:[{p:[14,4,372],t:7,e:"span",f:["Bluespace Artillery firing protocols must be globally unlocked from two keycard authentication devices first!"]}]}],n:50,x:{r:["data.unlocked"],s:"!_0"},p:[12,2,330]},{t:4,n:51,f:[{p:[17,3,525],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.ready"],s:'_0?null:"disabled"'},p:[17,36,558]}],action:"fire"},f:["FIRE!"]}],x:{r:["data.unlocked"],s:"!_0"}}]}],n:50,r:"data.connected",p:[7,3,141]}," ",{t:4,f:[{p:[22,3,694],t:7,e:"ui-section",a:{label:"Maintenance"},f:[{p:[23,7,734],t:7,e:"ui-button",a:{icon:"wrench",action:"build"},f:["Complete Deployment."]}]}],n:50,x:{r:["data.connected"],s:"!_0"},p:[21,3,667]}]}]},e.exports=a.extend(r.exports)},{205:205}],235:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,185],t:7,e:"ui-button",a:{icon:"pencil",action:"relabel"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,266],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,301],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,307]}," kPa"]}]}," ",{p:[11,3,373],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,404],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,417]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,462]}]}]}," ",{t:4,f:[{p:[15,3,573],t:7,e:"ui-section",a:{label:"Access"},f:[{p:[16,7,608],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.restricted"],s:'_0?"lock":"unlock"'},p:[16,24,625]}],style:[{t:2,x:{r:[],s:'"caution"'},p:[17,14,680]}],action:"restricted"},f:[{t:2,x:{r:["data.restricted"],s:'_0?"Restricted to Engineering":"Public"'},p:[18,27,722]}]}]}],n:50,r:"data.isPrototype",p:[14,3,544]}]}," ",{p:[22,1,839],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[23,3,869],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[24,5,912],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[24,18,925]}],max:[{t:2,r:"data.maxReleasePressure",p:[24,52,959]}],value:[{t:2,r:"data.releasePressure",p:[25,14,1002]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[25,40,1028]}," kPa"]}]}," ",{p:[27,3,1099],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[28,5,1144],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[28,38,1177]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[30,5,1333],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[30,36,1364]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1511],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1606],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1636]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1798],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1830],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1847]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1901]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1995]}]}]}]}," ",{t:4,f:[{p:[42,1,2090],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2155],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2196],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2229]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2358],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2389]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2520],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2552]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2637],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2667]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2133]}," ",{p:[55,3,2833],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2866],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2899]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2969]}]}," ",{p:[59,2,3017],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3064],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3070]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2062]},{p:{button:[{t:4,f:[{p:[69,7,3277],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3308]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3242]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3442],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3473]}]}," ",{p:[76,3,3519],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3553]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3411]},{t:4,n:51,f:[{p:[80,3,3635],t:7,e:"ui-section",f:[{p:[81,4,3652],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{205:205}],236:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"Centcom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to Centcom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{action:"add",params:['{"id": "',{t:2,r:"id",p:[85,51,2740]},'"}']},f:[{t:2,r:"cost",p:[85,61,2750]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{205:205}],237:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{p:[14,5,483],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,508]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,615]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,635]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[23,3,738],t:7,e:"span",a:{"class":"warning"},f:["No abilities availible."]}],n:51,r:"data.abilities",p:[22,1,715]}]}]},e.exports=a.extend(r.exports)},{205:205}],238:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:{button:[{t:4,f:[{p:[9,7,315],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[9,37,345]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[9,114,422]},"}"]},f:[{t:2,r:".",p:[9,122,430]}]}],n:52,r:"data.beakerTransferAmounts",p:[8,5,271]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[12,3,482],t:7,e:"ui-section",f:[{t:4,f:[{p:[14,7,532],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[14,74,599]},'"}']},f:[{t:2,r:"title",p:[14,84,609]}]}],n:52,r:"data.chemicals",p:[13,5,500]}]}]}," ",{p:{button:[{t:4,f:[{p:[21,7,786],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[21,66,845]},"}"]},f:[{t:2,r:".",p:[21,74,853]}]}],n:52,r:"data.beakerTransferAmounts",p:[20,5,742]}," ",{p:[23,5,891],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[23,36,922]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[25,3,1019],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[27,7,1089],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[27,13,1095]},"/",{t:2,r:"data.beakerMaxVolume",p:[27,55,1137]}," Units"]}," ",{p:[28,7,1182],t:7,e:"br"}," ",{t:4,f:[{p:[30,9,1235],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[30,52,1278]}," units of ",{t:2,r:"name",p:[30,87,1313]}]},{p:[30,102,1328],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[29,7,1195]},{t:4,n:51,f:[{p:[32,9,1359],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[26,5,1054]},{t:4,n:51,f:[{p:[35,7,1435],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],239:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,421]}," K"]}]}]}," ",{p:{button:[{p:[14,5,564],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,595]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,692],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,762],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,781]}," K"]}," ",{p:[19,7,831],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,885],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,928]}," units of ",{t:2,r:"name",p:[21,87,963]}]},{p:[21,102,978],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,845]},{t:4,n:51,f:[{p:[23,9,1009],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,727]},{t:4,n:51,f:[{p:[26,7,1085],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],240:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,32],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,87]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,143]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,199]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject and Clear Buffer":"No beaker"'},p:[7,5,268]}]}," ",{p:[10,3,357],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,443],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,462]}," units of ",{t:2,r:"name",p:[13,60,497]}],nowrap:0},f:[{p:[14,7,522],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,572],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,625]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,670],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,723]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,768],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,821]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,868],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,921]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,971],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1024]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1075],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1119]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,407]},{t:4,n:51,f:[{p:[24,5,1201],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,374]},{t:4,n:51,f:[{p:[27,5,1272],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1360],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1391],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1429]}]},f:["Destroy"]}," ",{p:[34,3,1487],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1525]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1594],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1646],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1665]}," units of ",{t:2,r:"name",p:[37,59,1700]}],nowrap:0},f:[{p:[38,6,1724],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1773],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1828]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1872],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1927]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1971],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,2026]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2072],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2127]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2176],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2231]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2281],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2325]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1611]}]}]}," ",{t:4,f:[{p:[52,3,2461],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2551],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2585]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2634]}]}," ",{p:[55,5,2715],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2737]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2761]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2514]},{t:4,n:51,f:[{p:[57,5,2813],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2877],t:7,e:"br"}," ",{p:[61,4,2887],t:7,e:"br"}," ",{p:[62,4,2897],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2956]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,3040],t:7,e:"br"}," ",{p:[64,4,3050],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3109]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3193],t:7,e:"br"}," ",{p:[66,4,3203],t:7,e:"br"}," ",{p:[67,4,3213],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[67,64,3273]}]},f:["Create Patch (max 40µ)"]}," ",{p:[68,4,3358],t:7,e:"br"}," ",{p:[69,4,3368],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3428]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3514],t:7,e:"br"}," ",{p:[71,4,3524],t:7,e:"br"}," ",{p:[72,4,3534],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3595]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3681],t:7,e:"br"}," ",{p:[74,4,3691],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3752]}]},f:["Dispense Buffer to Bottles"]}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2438]},{t:4,n:51,f:[{p:[79,3,3874],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[80,4,3929],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,63,3988]}]},f:["Create Pack (max 10µ)"]}," ",{p:[81,4,4072],t:7,e:"br"}," ",{p:[82,4,4082],t:7,e:"br"}," ",{p:[83,4,4092],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[83,65,4153]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[87,2,4301],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[87,20,4319]}]},f:[{p:[88,3,4350],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[89,3,4398],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[89,46,4441]}]}," ",{p:[90,3,4484],t:7,e:"br"}," ",{p:[91,3,4493],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[92,3,4535],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[92,23,4555]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[92,69,4601]}]},f:[{t:2,r:"data.analyzeVars.color",p:[92,97,4629]}]}," ",{p:[93,3,4666],t:7,e:"br"}," ",{p:[94,3,4675],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[95,3,4717],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[95,25,4739]}]}," ",{p:[96,3,4776],t:7,e:"br"}," ",{p:[97,3,4785],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[98,3,4841],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[98,25,4863]},"µ/minute"]}," ",{p:[99,3,4911],t:7,e:"br"}," ",{p:[100,3,4920],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[101,3,4975],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[101,25,4997]}]}," ",{p:[102,3,5034],t:7,e:"br"}," ",{p:[103,3,5043],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[104,3,5099],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[104,25,5121]}]}," ",{p:[105,3,5159],t:7,e:"br"}," ",{p:[106,3,5168],t:7,e:"br"}," ",{p:[107,3,5177],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{205:205}],241:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,43]}]}," ",{p:[3,3,107],t:7,e:"ui-button",a:{action:"component"},f:["Target Component: ",{t:3,r:"data.target_comp",p:[3,51,155]}]}]}," ",{t:4,f:[{p:[6,3,235],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[7,3,251]}," ",{t:4,f:[{p:[9,4,317],t:7,e:"br"},{p:[9,8,321],t:7,e:"ui-button",a:{action:"rec_category",params:['{"category": "',{t:2,r:"name",p:[9,63,376]},'"}']},f:[{t:3,r:"name",p:[9,75,388]}," - ",{t:3,r:"desc",p:[9,88,401]}]}],n:52,r:"data.recollection_categories",p:[8,3,274]}," ",{t:3,r:"data.rec_section",p:[11,3,440]}," ",{t:3,r:"data.rec_binds",p:[12,3,466]}]}],n:50,r:"data.recollection",p:[5,1,206]},{t:4,n:51,f:[{p:[15,2,517],t:7,e:"ui-display",a:{title:"Components (with Global Cache)",button:0},f:[{p:[16,4,580],t:7,e:"ui-section",f:[{t:3,r:"data.components",p:[17,6,599]}]}]}," ",{p:[20,2,657],t:7,e:"ui-display",f:[{p:[21,3,673],t:7,e:"ui-section",f:[{p:[22,4,690],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[22,22,708]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[23,4,831],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[23,22,849]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[24,4,973],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[24,22,991]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[25,4,1130],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Judgement"?"selected":null'},p:[25,22,1148]}],action:"select",params:'{"category": "Judgement"}'},f:["Judgement"]}," ",{p:[26,4,1279],t:7,e:"br"},{t:3,r:"data.tier_info",p:[26,8,1283]}]},{p:[27,16,1320],t:7,e:"hr"}," ",{p:[28,3,1328],t:7,e:"ui-section",f:[{t:4,f:[{p:[30,4,1373],t:7,e:"div",f:[{p:[30,9,1378],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[30,29,1398]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[30,99,1468]},'"}']},f:["Recite",{t:3,r:"required",p:[30,117,1486]}]}," ",{t:4,f:[{t:4,f:[{p:[33,6,1562],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[33,53,1609]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[33,72,1628]}]}],n:50,r:"bound",p:[32,5,1542]},{t:4,n:51,f:[{p:[35,6,1672],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[35,53,1719]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[31,6,1519]}," ",{t:3,r:"name",p:[38,6,1786]}," ",{t:3,r:"descname",p:[38,17,1797]}," ",{t:3,r:"invokers",p:[38,32,1812]}]}],n:52,r:"data.scripture",p:[29,3,1344]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{205:205}],242:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Codex Gigas"},f:[{p:[2,2,35],t:7,e:"ui-section",f:[{t:2,r:"data.name",p:[3,3,51]}]}," ",{p:[5,5,86],t:7,e:"ui-section",a:{label:"Prefix"},f:[{p:[6,3,117],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[6,22,136]}],action:"Dark "},f:["Dark"]}," ",{p:[7,3,221],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[7,22,240]}],action:"Hellish "},f:["Hellish"]}," ",{p:[8,3,331],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[8,22,350]}],action:"Fallen "},f:["Fallen"]}," ",{p:[9,3,439],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[9,22,458]}],action:"Fiery "},f:["Fiery"]}," ",{p:[10,3,545],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[10,22,564]}],action:"Sinful "},f:["Sinful"]}," ",{p:[11,3,653],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[11,22,672]}],action:"Blood "},f:["Blood"]}," ",{p:[12,3,759],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[12,22,778]}],action:"Fluffy "},f:["Fluffy"]}]}," ",{p:[14,5,888],t:7,e:"ui-section",a:{label:"Title"},f:[{p:[15,3,918],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[15,22,937]}],action:"Lord "},f:["Lord"]}," ",{p:[16,3,1022],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[16,22,1041]}],action:"Prelate "},f:["Prelate"]}," ",{p:[17,3,1132],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[17,22,1151]}],action:"Count "},f:["Count"]}," ",{p:[18,3,1238],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[18,22,1257]}],action:"Viscount "},f:["Viscount"]}," ",{p:[19,3,1350],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[19,22,1369]}],action:"Vizier "},f:["Vizier"]}," ",{p:[20,3,1458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[20,22,1477]}],action:"Elder "},f:["Elder"]}," ",{p:[21,3,1564],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[21,22,1583]}],action:"Adept "},f:["Adept"]}]}," ",{p:[23,5,1691],t:7,e:"ui-section",a:{label:"Name"},f:[{p:[24,3,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[24,22,1739]}],action:"hal"},f:["hal"]}," ",{p:[25,3,1821],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[25,22,1840]}],action:"ve"
++p:[13,5,605],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,649],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,746],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,776]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,906],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,912]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=a.extend(r.exports)},{205:205}],233:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"selected":null'},p:[3,38,100]}],action:[{t:2,x:{r:["data.timing"],s:'_0?"stop":"start"'},p:[3,83,145]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"Stop":"Start"'},p:[3,119,181]}]}," ",{p:[4,5,233],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"flash",style:[{t:2,x:{r:["data.flash_charging"],s:'_0?"disabled":null'},p:[4,57,285]}]},f:[{t:2,x:{r:["data.flash_charging"],s:'_0?"Recharging":"Flash"'},p:[4,102,330]}]}]},t:7,e:"ui-display",a:{title:"Cell Timer",button:0},f:[" ",{p:[6,3,410],t:7,e:"ui-section",f:[{p:[7,5,428],t:7,e:"ui-button",a:{icon:"fast-backward",action:"time",params:'{"adjust": -600}'}}," ",{p:[8,5,518],t:7,e:"ui-button",a:{icon:"backward",action:"time",params:'{"adjust": -100}'}}," ",{p:[9,5,603],t:7,e:"span",f:[{t:2,x:{r:["text","data.minutes"],s:"_0.zeroPad(_1,2)"},p:[9,11,609]},":",{t:2,x:{r:["text","data.seconds"],s:"_0.zeroPad(_1,2)"},p:[9,45,643]}]}," ",{p:[10,5,689],t:7,e:"ui-button",a:{icon:"forward",action:"time",params:'{"adjust": 100}'}}," ",{p:[11,5,772],t:7,e:"ui-button",a:{icon:"fast-forward",action:"time",params:'{"adjust": 600}'}}]}," ",{p:[13,3,875],t:7,e:"ui-section",f:[{p:[14,7,895],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "short"}'},f:["Short"]}," ",{p:[15,7,999],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "medium"}'},f:["Medium"]}," ",{p:[16,7,1105],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "long"}'},f:["Long"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],234:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Bluespace Artillery Control",button:0},f:[{t:4,f:[{p:[8,3,167],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,5,200],t:7,e:"ui-button",a:{icon:"crosshairs",action:"recalibrate"},f:[{t:2,r:"data.target",p:[9,55,250]}]}]}," ",{p:[11,3,298],t:7,e:"ui-section",a:{label:"Controls"},f:[{t:4,f:[{p:[13,3,356],t:7,e:"ui-notice",f:[{p:[14,4,372],t:7,e:"span",f:["Bluespace Artillery firing protocols must be globally unlocked from two keycard authentication devices first!"]}]}],n:50,x:{r:["data.unlocked"],s:"!_0"},p:[12,2,330]},{t:4,n:51,f:[{p:[17,3,525],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.ready"],s:'_0?null:"disabled"'},p:[17,36,558]}],action:"fire"},f:["FIRE!"]}],x:{r:["data.unlocked"],s:"!_0"}}]}],n:50,r:"data.connected",p:[7,3,141]}," ",{t:4,f:[{p:[22,3,694],t:7,e:"ui-section",a:{label:"Maintenance"},f:[{p:[23,7,734],t:7,e:"ui-button",a:{icon:"wrench",action:"build"},f:["Complete Deployment."]}]}],n:50,x:{r:["data.connected"],s:"!_0"},p:[21,3,667]}]}]},e.exports=a.extend(r.exports)},{205:205}],235:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,185],t:7,e:"ui-button",a:{icon:"pencil",action:"relabel"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,266],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,301],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,307]}," kPa"]}]}," ",{p:[11,3,373],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,404],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,417]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,462]}]}]}," ",{t:4,f:[{p:[15,3,573],t:7,e:"ui-section",a:{label:"Access"},f:[{p:[16,7,608],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.restricted"],s:'_0?"lock":"unlock"'},p:[16,24,625]}],style:[{t:2,x:{r:[],s:'"caution"'},p:[17,14,680]}],action:"restricted"},f:[{t:2,x:{r:["data.restricted"],s:'_0?"Restricted to Engineering":"Public"'},p:[18,27,722]}]}]}],n:50,r:"data.isPrototype",p:[14,3,544]}]}," ",{p:[22,1,839],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[23,3,869],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[24,5,912],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[24,18,925]}],max:[{t:2,r:"data.maxReleasePressure",p:[24,52,959]}],value:[{t:2,r:"data.releasePressure",p:[25,14,1002]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[25,40,1028]}," kPa"]}]}," ",{p:[27,3,1099],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[28,5,1144],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[28,38,1177]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[30,5,1333],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[30,36,1364]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1511],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1606],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1636]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1798],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1830],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1847]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1901]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1995]}]}]}]}," ",{t:4,f:[{p:[42,1,2090],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2155],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2196],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2229]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2358],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2389]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2520],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2552]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2637],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2667]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2133]}," ",{p:[55,3,2833],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2866],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2899]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2969]}]}," ",{p:[59,2,3017],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3064],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3070]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2062]},{p:{button:[{t:4,f:[{p:[69,7,3277],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3308]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3242]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3442],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3473]}]}," ",{p:[76,3,3519],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3553]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3411]},{t:4,n:51,f:[{p:[80,3,3635],t:7,e:"ui-section",f:[{p:[81,4,3652],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{205:205}],236:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"CentCom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to CentCom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{action:"add",params:['{"id": "',{t:2,r:"id",p:[85,51,2740]},'"}']},f:[{t:2,r:"cost",p:[85,61,2750]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{205:205}],237:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{p:[14,5,483],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,508]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,615]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,635]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[23,3,738],t:7,e:"span",a:{"class":"warning"},f:["No abilities availible."]}],n:51,r:"data.abilities",p:[22,1,715]}]}]},e.exports=a.extend(r.exports)},{205:205}],238:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:{button:[{t:4,f:[{p:[9,7,315],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[9,37,345]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[9,114,422]},"}"]},f:[{t:2,r:".",p:[9,122,430]}]}],n:52,r:"data.beakerTransferAmounts",p:[8,5,271]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[12,3,482],t:7,e:"ui-section",f:[{t:4,f:[{p:[14,7,532],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[14,74,599]},'"}']},f:[{t:2,r:"title",p:[14,84,609]}]}],n:52,r:"data.chemicals",p:[13,5,500]}]}]}," ",{p:{button:[{t:4,f:[{p:[21,7,786],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[21,66,845]},"}"]},f:[{t:2,r:".",p:[21,74,853]}]}],n:52,r:"data.beakerTransferAmounts",p:[20,5,742]}," ",{p:[23,5,891],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[23,36,922]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[25,3,1019],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[27,7,1089],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[27,13,1095]},"/",{t:2,r:"data.beakerMaxVolume",p:[27,55,1137]}," Units"]}," ",{p:[28,7,1182],t:7,e:"br"}," ",{t:4,f:[{p:[30,9,1235],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[30,52,1278]}," units of ",{t:2,r:"name",p:[30,87,1313]}]},{p:[30,102,1328],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[29,7,1195]},{t:4,n:51,f:[{p:[32,9,1359],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[26,5,1054]},{t:4,n:51,f:[{p:[35,7,1435],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],239:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,421]}," K"]}]}]}," ",{p:{button:[{p:[14,5,564],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,595]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,692],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,762],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,781]}," K"]}," ",{p:[19,7,831],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,885],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,928]}," units of ",{t:2,r:"name",p:[21,87,963]}]},{p:[21,102,978],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,845]},{t:4,n:51,f:[{p:[23,9,1009],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,727]},{t:4,n:51,f:[{p:[26,7,1085],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],240:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,32],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,87]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,143]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,199]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject and Clear Buffer":"No beaker"'},p:[7,5,268]}]}," ",{p:[10,3,357],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,443],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,462]}," units of ",{t:2,r:"name",p:[13,60,497]}],nowrap:0},f:[{p:[14,7,522],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,572],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,625]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,670],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,723]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,768],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,821]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,868],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,921]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,971],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1024]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1075],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1119]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,407]},{t:4,n:51,f:[{p:[24,5,1201],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,374]},{t:4,n:51,f:[{p:[27,5,1272],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1360],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1391],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1429]}]},f:["Destroy"]}," ",{p:[34,3,1487],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1525]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1594],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1646],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1665]}," units of ",{t:2,r:"name",p:[37,59,1700]}],nowrap:0},f:[{p:[38,6,1724],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1773],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1828]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1872],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1927]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1971],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,2026]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2072],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2127]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2176],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2231]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2281],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2325]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1611]}]}]}," ",{t:4,f:[{p:[52,3,2461],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2551],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2585]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2634]}]}," ",{p:[55,5,2715],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2737]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2761]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2514]},{t:4,n:51,f:[{p:[57,5,2813],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2877],t:7,e:"br"}," ",{p:[61,4,2887],t:7,e:"br"}," ",{p:[62,4,2897],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2956]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,3040],t:7,e:"br"}," ",{p:[64,4,3050],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3109]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3193],t:7,e:"br"}," ",{p:[66,4,3203],t:7,e:"br"}," ",{p:[67,4,3213],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[67,64,3273]}]},f:["Create Patch (max 40µ)"]}," ",{p:[68,4,3358],t:7,e:"br"}," ",{p:[69,4,3368],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3428]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3514],t:7,e:"br"}," ",{p:[71,4,3524],t:7,e:"br"}," ",{p:[72,4,3534],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3595]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3681],t:7,e:"br"}," ",{p:[74,4,3691],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3752]}]},f:["Dispense Buffer to Bottles"]}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2438]},{t:4,n:51,f:[{p:[79,3,3874],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[80,4,3929],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,63,3988]}]},f:["Create Pack (max 10µ)"]}," ",{p:[81,4,4072],t:7,e:"br"}," ",{p:[82,4,4082],t:7,e:"br"}," ",{p:[83,4,4092],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[83,65,4153]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[87,2,4301],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[87,20,4319]}]},f:[{p:[88,3,4350],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[89,3,4398],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[89,46,4441]}]}," ",{p:[90,3,4484],t:7,e:"br"}," ",{p:[91,3,4493],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[92,3,4535],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[92,23,4555]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[92,69,4601]}]},f:[{t:2,r:"data.analyzeVars.color",p:[92,97,4629]}]}," ",{p:[93,3,4666],t:7,e:"br"}," ",{p:[94,3,4675],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[95,3,4717],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[95,25,4739]}]}," ",{p:[96,3,4776],t:7,e:"br"}," ",{p:[97,3,4785],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[98,3,4841],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[98,25,4863]},"µ/minute"]}," ",{p:[99,3,4911],t:7,e:"br"}," ",{p:[100,3,4920],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[101,3,4975],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[101,25,4997]}]}," ",{p:[102,3,5034],t:7,e:"br"}," ",{p:[103,3,5043],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[104,3,5099],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[104,25,5121]}]}," ",{p:[105,3,5159],t:7,e:"br"}," ",{p:[106,3,5168],t:7,e:"br"}," ",{p:[107,3,5177],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{205:205}],241:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,43]}]}," ",{p:[3,3,107],t:7,e:"ui-button",a:{action:"component"},f:["Target Component: ",{t:3,r:"data.target_comp",p:[3,51,155]}]}]}," ",{t:4,f:[{p:[6,3,235],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[7,3,251]}," ",{t:4,f:[{p:[9,4,317],t:7,e:"br"},{p:[9,8,321],t:7,e:"ui-button",a:{action:"rec_category",params:['{"category": "',{t:2,r:"name",p:[9,63,376]},'"}']},f:[{t:3,r:"name",p:[9,75,388]}," - ",{t:3,r:"desc",p:[9,88,401]}]}],n:52,r:"data.recollection_categories",p:[8,3,274]}," ",{t:3,r:"data.rec_section",p:[11,3,440]}," ",{t:3,r:"data.rec_binds",p:[12,3,466]}]}],n:50,r:"data.recollection",p:[5,1,206]},{t:4,n:51,f:[{p:[15,2,517],t:7,e:"ui-display",a:{title:"Components (with Global Cache)",button:0},f:[{p:[16,4,580],t:7,e:"ui-section",f:[{t:3,r:"data.components",p:[17,6,599]}]}]}," ",{p:[20,2,657],t:7,e:"ui-display",f:[{p:[21,3,673],t:7,e:"ui-section",f:[{p:[22,4,690],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[22,22,708]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[23,4,831],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[23,22,849]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[24,4,973],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[24,22,991]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[25,4,1130],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Judgement"?"selected":null'},p:[25,22,1148]}],action:"select",params:'{"category": "Judgement"}'},f:["Judgement"]}," ",{p:[26,4,1279],t:7,e:"br"},{t:3,r:"data.tier_info",p:[26,8,1283]}]},{p:[27,16,1320],t:7,e:"hr"}," ",{p:[28,3,1328],t:7,e:"ui-section",f:[{t:4,f:[{p:[30,4,1373],t:7,e:"div",f:[{p:[30,9,1378],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[30,29,1398]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[30,99,1468]},'"}']},f:["Recite",{t:3,r:"required",p:[30,117,1486]}]}," ",{t:4,f:[{t:4,f:[{p:[33,6,1562],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[33,53,1609]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[33,72,1628]}]}],n:50,r:"bound",p:[32,5,1542]},{t:4,n:51,f:[{p:[35,6,1672],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[35,53,1719]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[31,6,1519]}," ",{t:3,r:"name",p:[38,6,1786]}," ",{t:3,r:"descname",p:[38,17,1797]}," ",{t:3,r:"invokers",p:[38,32,1812]}]}],n:52,r:"data.scripture",p:[29,3,1344]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{205:205}],242:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Codex Gigas"},f:[{p:[2,2,35],t:7,e:"ui-section",f:[{t:2,r:"data.name",p:[3,3,51]}]}," ",{p:[5,5,86],t:7,e:"ui-section",a:{label:"Prefix"},f:[{p:[6,3,117],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[6,22,136]}],action:"Dark "},f:["Dark"]}," ",{p:[7,3,221],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[7,22,240]}],action:"Hellish "},f:["Hellish"]}," ",{p:[8,3,331],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[8,22,350]}],action:"Fallen "},f:["Fallen"]}," ",{p:[9,3,439],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[9,22,458]}],action:"Fiery "},f:["Fiery"]}," ",{p:[10,3,545],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[10,22,564]}],action:"Sinful "},f:["Sinful"]}," ",{p:[11,3,653],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[11,22,672]}],action:"Blood "},f:["Blood"]}," ",{p:[12,3,759],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[12,22,778]}],action:"Fluffy "},f:["Fluffy"]}]}," ",{p:[14,5,888],t:7,e:"ui-section",a:{label:"Title"},f:[{p:[15,3,918],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[15,22,937]}],action:"Lord "},f:["Lord"]}," ",{p:[16,3,1022],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[16,22,1041]}],action:"Prelate "},f:["Prelate"]}," ",{p:[17,3,1132],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[17,22,1151]}],action:"Count "},f:["Count"]}," ",{p:[18,3,1238],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[18,22,1257]}],action:"Viscount "},f:["Viscount"]}," ",{p:[19,3,1350],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[19,22,1369]}],action:"Vizier "},f:["Vizier"]}," ",{p:[20,3,1458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[20,22,1477]}],action:"Elder "},f:["Elder"]}," ",{p:[21,3,1564],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[21,22,1583]}],action:"Adept "},f:["Adept"]}]}," ",{p:[23,5,1691],t:7,e:"ui-section",a:{label:"Name"},f:[{p:[24,3,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[24,22,1739]}],action:"hal"},f:["hal"]}," ",{p:[25,3,1821],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[25,22,1840]}],action:"ve"
+ },f:["ve"]}," ",{p:[26,3,1920],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[26,22,1939]}],action:"odr"},f:["odr"]}," ",{p:[27,3,2021],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[27,22,2040]}],action:"neit"},f:["neit"]}," ",{p:[28,3,2124],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[28,22,2143]}],action:"ci"},f:["ci"]}," ",{p:[29,3,2223],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[29,22,2242]}],action:"quon"},f:["quon"]}," ",{p:[30,3,2326],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[30,22,2345]}],action:"mya"},f:["mya"]}," ",{p:[31,3,2427],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[31,22,2446]}],action:"folth"},f:["folth"]}," ",{p:[32,3,2532],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[32,22,2551]}],action:"wren"},f:["wren"]}," ",{p:[33,3,2635],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[33,22,2654]}],action:"geyr"},f:["geyr"]}," ",{p:[34,3,2738],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[34,22,2757]}],action:"hil"},f:["hil"]}," ",{p:[35,3,2839],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[35,22,2858]}],action:"niet"},f:["niet"]}," ",{p:[36,3,2942],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[36,22,2961]}],action:"twou"},f:["twou"]}," ",{p:[37,3,3045],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[37,22,3064]}],action:"phi"},f:["phi"]}," ",{p:[38,3,3146],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[38,22,3165]}],action:"coa"},f:["coa"]}]}," ",{p:[40,5,3268],t:7,e:"ui-section",a:{label:"suffix"},f:[{p:[41,3,3299],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[41,22,3318]}],action:" the Red"},f:["the Red"]}," ",{p:[42,3,3409],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[42,22,3428]}],action:" the Soulless"},f:["the Soulless"]}," ",{p:[43,3,3529],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[43,22,3548]}],action:" the Master"},f:["the Master"]}," ",{p:[44,3,3645],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[44,22,3664]}],action:", the Lord of all things"},f:["the Lord of all things"]}," ",{p:[45,3,3786],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[45,22,3805]}],action:", Jr."},f:["jr"]}]}," ",{p:[47,5,3909],t:7,e:"ui-section",a:{label:"submit"},f:[{p:[48,3,3941],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0>=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],243:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{205:205}],244:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],245:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{temperatureStatus:function(t){return 225>t?"good":273.15>t?"average":"bad"}},computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[22,1,466],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[23,3,499],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[24,3,532],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[24,9,538]}]}]}," ",{t:4,f:[{p:[27,5,655],t:7,e:"ui-section",a:{label:"State"},f:[{p:[28,7,689],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[28,20,702]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[28,43,725]}]}]}," ",{p:[30,4,846],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,6,885],t:7,e:"span",a:{"class":[{t:2,x:{r:["temperatureStatus","adata.occupant.bodyTemperature"],s:"_0(_1)"},p:[31,19,898]}]},f:[{t:2,x:{r:["adata.occupant.bodyTemperature"],s:"Math.round(_0)"},p:[31,74,953]}," K"]}]}," ",{p:[33,5,1032],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[34,7,1067],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[34,20,1080]}],max:[{t:2,r:"data.occupant.maxHealth",p:[34,54,1114]}],value:[{t:2,r:"data.occupant.health",p:[34,90,1150]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[35,16,1192]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[35,68,1244]}]}]}," ",{t:4,f:[{p:[38,7,1481],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[38,26,1500]}]},f:[{p:[39,9,1521],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[39,30,1542]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[39,66,1578]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[39,103,1615]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[37,5,1315]}],n:50,r:"data.hasOccupant",p:[26,3,625]}]}," ",{p:[44,1,1724],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[45,3,1753],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[46,5,1785],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[46,22,1802]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[47,14,1862]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[48,14,1918]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[49,22,1977]}]}]}," ",{p:[51,3,2045],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[52,3,2081],t:7,e:"span",a:{"class":[{t:2,x:{r:["temperatureStatus","adata.cellTemperature"],s:"_0(_1)"},p:[52,16,2094]}]},f:[{t:2,x:{r:["adata.cellTemperature"],s:"Math.round(_0)"},p:[52,62,2140]}," K"]}]}," ",{p:[54,2,2205],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[55,5,2236],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[55,22,2253]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[55,73,2304]}]}," ",{p:[56,5,2357],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[56,22,2374]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[56,86,2438]}]}]}]}," ",{p:{button:[{p:[61,5,2584],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[61,36,2615]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[63,3,2718],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[66,9,2828],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[66,52,2871]}," units of ",{t:2,r:"name",p:[66,87,2906]}]},{p:[66,102,2921],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[65,7,2788]},{t:4,n:51,f:[{p:[68,9,2952],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[64,5,2753]},{t:4,n:51,f:[{p:[71,7,3028],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],246:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],247:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{205:205}],248:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{205:205}],249:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{205:205}],250:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{205:205}],251:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{205:205}],252:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{205:205}],253:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{205:205}],254:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],255:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,
+ r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{205:205}],256:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{205:205}],257:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],258:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{205:205}],259:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{205:205}],260:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],261:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{205:205}],262:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["←"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2,r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down"},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{205:205}],263:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{205:205}],264:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{205:205}],265:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{205:205}],266:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table",f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],267:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"
+-},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["Centcom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],268:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],269:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],270:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:[" "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],271:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],272:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],273:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],274:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],275:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],276:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",
++},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],268:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],269:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],270:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:[" "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],271:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],272:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],273:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],274:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],275:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],276:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",
+ p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}," W"]}]}," ",{p:[55,5,1530],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1565],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1571]}," W"]}]}],r:"config.fancy"}]}," ",{p:[60,1,1642],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1672],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1697],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1734],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1773],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1810],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1849],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1891],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1932],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2017],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2036]}],nowrap:0},f:[{p:[72,7,2061],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2082]}," %"]}," ",{p:[73,7,2140],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].load)"},p:[73,28,2161]}," W"]}," ",{p:[74,7,2217],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2238],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2251]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2280]}]}]}," ",{p:[75,7,2327],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2348],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2361]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2384]}," [",{p:[75,87,2407],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2413]}]},"]"]}]}," ",{p:[76,7,2462],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2483],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2496]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2519]}," [",{p:[76,87,2542],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2548]}]},"]"]}]}," ",{p:[77,7,2597],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2618],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2631]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2654]}," [",{p:[77,87,2677],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2683]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1991]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],277:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],278:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],279:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],280:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{205:205}],281:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],282:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{p:[49,1,1195],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[50,2,1227],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[51,4,1261],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[54,4,1316],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[57,4,1370],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[59,4,1412],t:7,e:"section",a:{"class":"cell"},f:[{p:[60,5,1440],t:7,e:"ui-button",a:{"class":"center mineral",grid:0,action:"Release",params:'{"id" : "all"}'},f:["Release All"]}]}," ",{p:[64,4,1576],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[69,3,1673],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[70,4,1707],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[71,5,1735]}]}," ",{p:[73,4,1763],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[74,5,1805]}]}," ",{p:[76,4,1835],t:7,e:"section",a:{"class":"cell"},f:[{p:[77,5,1863],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[77,18,1876]}],placeholder:"###","class":"number"}}]}," ",{p:[79,4,1941],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[80,5,1983],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[80,59,2037]}],params:['{ "id" : ',{t:2,r:"id",p:[80,114,2092]},', "sheets" : ',{t:2,r:"sheets",p:[80,133,2111]}," }"]},f:["Release"]}]}," ",{p:[84,4,2178],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[85,5,2220]}]}]}],n:52,r:"data.materials",p:[68,2,1645]}," ",{t:4,f:[{p:[90,3,2298],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[91,4,2332],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[92,5,2360]}]}," ",{p:[94,4,2388],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[95,5,2430]}]}," ",{p:[97,4,2460],t:7,e:"section",a:{"class":"cell"},f:[{p:[98,5,2488],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[98,18,2501]}],placeholder:"###","class":"number"}}]}," ",{p:[100,4,2566],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[101,5,2608],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[101,57,2660]}],params:['{ "id" : ',{t:2,r:"id",p:[101,113,2716]},', "sheets" : ',{t:2,r:"sheets",p:[101,132,2735]}," }"]},f:["Smelt"]}]}," ",{p:[105,4,2799],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[106,5,2841],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"SmeltAll",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[106,60,2896]}],params:['{ "id" : ',{t:2,r:"id",p:[106,116,2952]}," }"]},f:["Smelt All"]}]}]}],n:52,r:"data.alloys",p:[89,2,2273]}]}]},e.exports=a.extend(r.exports)},{205:205}],283:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,60],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[3,35,92]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[6,3,201],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[6,34,232]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[9,3,325],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[9,34,356]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[14,3,490],t:7,e:"ui-section",f:[{t:4,f:[{p:[16,5,538],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[15,4,507]},{t:4,n:51,f:[{p:[18,5,602],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[20,7,668],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[20,37,698]}]}," ",{p:[21,7,737],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[21,38,768]}]}],n:50,r:"data.has_blood",p:[19,6,638]},{t:4,n:51,f:[{p:[23,7,823],t:7,e:"ui-section",f:[{p:[24,8,844],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[13,2,463]},{t:4,n:51,f:[{p:[31,3,999],t:7,e:"ui-section",f:[{p:[32,4,1016],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[37,2,1127],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[42,7,1277],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[42,63,1333]}],params:['{"index": ',{t:2,r:"index",p:[42,115,1385]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[41,6,1255]}," ",{p:[46,6,1468],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[46,68,1530]}],params:['{"index": ',{t:2,r:"index",p:[46,123,1585]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[39,23,1206]}],button:0},f:[" ",{p:[50,5,1675],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[50,39,1709]}]}," ",{p:[51,5,1737],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[51,37,1769]}]}," ",{p:[52,5,1803],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[52,32,1830]}]}," ",{p:[53,5,1859],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[53,39,1893]}]}," ",{t:4,f:[{p:[55,6,1942],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[55,37,1973]}]}," ",{p:[56,6,2007],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[56,34,2035]}]}," ",{p:[57,6,2066],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[57,38,2098]}]}," ",{p:[58,6,2133],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[60,8,2197],t:7,e:"span",f:[{t:2,r:"name",p:[60,14,2203]}]},{p:[60,29,2218],t:7,e:"br"}],n:52,r:"symptoms",p:[59,7,2170]}]}],n:50,r:"is_adv",p:[54,5,1921]}]}],n:52,r:"data.viruses",p:[38,3,1160]},{t:4,n:51,f:[{p:[66,4,2309],t:7,e:"ui-section",f:[{p:[67,5,2327],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[71,2,2446],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[73,4,2512],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[73,23,2531]}]},f:[{p:[74,6,2548],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[74,42,2584]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[74,128,2670]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[72,3,2481]},{t:4,n:51,f:[{p:[79,4,2762],t:7,e:"ui-section",f:[{p:[80,5,2780],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[36,1,1102]}]},e.exports=a.extend(r.exports)},{205:205}],284:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(312);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{205:205,312:312}],285:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{205:205}],286:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],
+ t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[13,3,461],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,493],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,510]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,561]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,618]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[22,7,787],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[22,38,818]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[21,5,759]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[26,3,938],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[27,4,969]}]}," ",{p:[29,3,1011],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[30,4,1045]}," kPa"]}],n:50,r:"data.holding",p:[25,3,914]},{t:4,n:51,f:[{p:[33,3,1119],t:7,e:"ui-section",f:[{p:[34,4,1136],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{205:205}],287:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}," W"]}]}," ",{p:[52,5,1466],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1501],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1507]}," W"]}]}],r:"config.fancy"}]}," ",{p:[57,1,1578],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1608],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1633],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1670],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1709],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1746],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1785],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1827],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1868],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1953],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1972]}],nowrap:0},f:[{p:[69,7,1997],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2018]}," %"]}," ",{p:[70,7,2076],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].load)"},p:[70,28,2097]}," W"]}," ",{p:[71,7,2153],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2174],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2187]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2216]}]}]}," ",{p:[72,7,2263],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2284],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2297]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2320]}," [",{p:[72,87,2343],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2349]}]},"]"]}]}," ",{p:[73,7,2398],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2419],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2432]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2455]}," [",{p:[73,87,2478],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2484]}]},"]"]}]}," ",{p:[74,7,2533],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2554],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2567]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2590]}," [",{p:[74,87,2613],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2619]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1927]}]}]},e.exports=a.extend(r.exports)},{205:205}],288:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{205:205}],289:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{205:205}],290:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(291),templates:t(293),status:t(292)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,291:291,292:292,293:293}],291:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{205:205}],292:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,27],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,46]}," (",{t:2,r:"id",p:[2,32,56]},")"]},f:[{t:2,r:"status",p:[3,5,71]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[5,8,109]},")"],n:50,r:"timer",p:[4,5,87]}," ",{p:[7,5,141],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[7,67,203]},'"}']},f:["Jump To"]}," ",{p:[10,5,252],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[10,53,300]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[10,70,317]}]},f:["Fast Travel"]}]}],n:52,r:"data.shuttles",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],293:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{205:205}],294:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}," ",{p:[23,5,658],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[24,7,693],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[24,20,706]}],max:[{t:2,r:"data.occupant.maxHealth",p:[24,54,740]}],value:[{t:2,r:"data.occupant.health",p:[24,90,776]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[25,16,818]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[25,68,870]}]}]}," ",{t:4,f:[{p:[28,7,1107],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[28,26,1126]}]},f:[{p:[29,9,1147],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[29,30,1168]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[29,66,1204]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[29,103,1241]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[27,5,941]}," ",{p:[32,5,1328],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[33,9,1364],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[33,22,1377]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[33,68,1423]}]}]}," ",{p:[35,5,1506],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[36,9,1542],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[36,22,1555]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[36,68,1601]}]}]}," ",{p:[38,5,1685],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[40,11,1772],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[40,54,1815]}," units of ",{t:2,r:"name",p:[40,89,1850]}]},{p:[40,104,1865],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[39,9,1727]},{t:4,n:51,f:[{p:[42,11,1900],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[47,1,1996],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[48,2,2028],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[49,5,2059],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[49,22,2076]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[49,71,2125]}]}]}," ",{p:[51,3,2190],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[53,7,2251],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[53,38,2282]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[53,122,2366]},'"}']},f:[{t:2,r:"name",p:[53,132,2376]}]},{p:[53,152,2396],t:7,e:"br"}],n:52,r:"data.chems",p:[52,5,2223]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],295:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:2,x:{r:["is_current"],s:'_0?"You Are Here":"Swap"'},p:[10,7,491]}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],296:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]}," [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,x:{r:["adata.inputLevel"],s:"Math.round(_0)"},p:[37,78,1447]},"W"]}]}," ",{p:[39,3,1509],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1548],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1587]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1682],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1716]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1812],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1902],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1935]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2047],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2085]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2212],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2246],t:7,e:"span",f:[{t:2,x:{r:["adata.inputAvailable"],s:"Math.round(_0)"},p:[47,9,2252]},"W"]}]}]}," ",{p:[50,1,2329],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2360],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2398],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2415]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2470]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2540]}]}," [",{p:[55,6,2608],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2621]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2638]}]},"]"]}," ",{p:[57,3,2745],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2785],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2806]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2838]}]},f:[{t:2,x:{r:["adata.outputLevel"],s:"Math.round(_0)"},p:[58,80,2860]},"W"]}]}," ",{p:[60,3,2923],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2963],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,3002]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3099],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3133]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3231],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3322],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3355]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3470],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3508]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3638],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3673],t:7,e:"span",f:[{t:2,x:{r:["adata.outputUsed"],s:"Math.round(_0)"},p:[68,9,3679]},"W"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],297:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],298:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],299:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],300:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]
+ }],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{205:205}],301:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],302:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],303:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{205:205}],304:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{205:205}],305:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,333],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[17,4,373],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[18,5,404]}]}," ",{p:[20,4,450],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[21,5,483]}]}," ",{p:[23,4,531],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[24,5,564],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[24,26,585]}],value:[{t:2,r:"adata.vr_avatar.health",p:[24,64,623]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[24,99,658]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[24,140,699]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[24,179,738]}]}]}]}],n:50,r:"data.vr_avatar",p:[15,2,307]},{t:4,n:51,f:[{p:[28,3,826],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[32,2,922],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[33,3,958],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[33,20,975]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[34,4,1042]}," the VR Sleeper"]}," ",{t:4,f:[{p:[37,4,1144],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[36,3,1116]}," ",{t:4,f:[{p:[42,4,1267],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[41,3,1240]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],306:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{205:205}],307:[function(t,e,n){(function(e){"use strict";var n=t(205),a=e.interopRequireDefault(n);t(194),t(1),t(190),t(193);var r=t(308),i=e.interopRequireDefault(r),o=t(309),s=t(191),u=t(192),p=e.interopRequireDefault(u);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(313)),window.initialize=function(e){window.tgui||(window.tgui=new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(310),text:t(314),config:n.config,data:n.data,adata:n.data}}}))};var c=document.getElementById("data"),l=c.textContent,f=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(f,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var d=new p["default"]("FontAwesome");d.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,190:190,191:191,192:192,193:193,194:194,205:205,308:308,309:309,310:310,313:313,314:314,"babel/external-helpers":"babel/external-helpers"}],308:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(309),a=t(311);e.exports={components:{"ui-bar":t(206),"ui-button":t(207),"ui-display":t(208),"ui-input":t(209),"ui-linegraph":t(210),"ui-notice":t(211),"ui-section":t(213),"ui-subdisplay":t(214),"ui-tabs":t(215)},events:{enter:t(203).enter,space:t(203).space},transitions:{fade:t(204)},onconfig:function(){var e=this.get("config.interface"),n={airalarm:t(219),"airalarm/back":t(220),"airalarm/modes":t(221),"airalarm/scrubbers":t(222),"airalarm/status":t(223),"airalarm/thresholds":t(224),"airalarm/vents":t(225),airlock_electronics:t(226),apc:t(227),atmos_alert:t(228),atmos_control:t(229),atmos_filter:t(230),atmos_mixer:t(231),atmos_pump:t(232),brig_timer:t(233),bsa:t(234),canister:t(235),cargo:t(236),cellular_emporium:t(237),chem_dispenser:t(238),chem_heater:t(239),chem_master:t(240),clockwork_slab:t(241),codex_gigas:t(242),computer_fabricator:t(243),crayon:t(244),cryo:t(245),disposal_unit:t(246),dna_vault:t(247),eightball:t(248),emergency_shuttle_console:t(249),engraved_message:t(250),error:t(251),firealarm:t(252),gps:t(253),gulag_console:t(254),gulag_item_reclaimer:t(255),holodeck:t(256),implantchair:t(257),intellicard:t(258),keycard_auth:t(259),labor_claim_console:t(260),language_menu:t(261),launchpad_remote:t(262),mech_bay_power_console:t(263),mulebot:t(264),ntnet_relay:t(265),ntos_ai_restorer:t(266),ntos_card:t(267),ntos_configuration:t(268),ntos_file_manager:t(269),ntos_main:t(270),ntos_net_chat:t(271),ntos_net_dos:t(272),ntos_net_downloader:t(273),ntos_net_monitor:t(274),ntos_net_transfer:t(275),ntos_power_monitor:t(276),ntos_revelation:t(277),ntos_station_alert:t(278),ntos_supermatter_monitor:t(279),ntosheader:t(280),nuclear_bomb:t(281),ore_redemption_machine:t(282),pandemic:t(283),personal_crafting:t(284),portable_pump:t(285),portable_scrubber:t(286),power_monitor:t(287),radio:t(288),sat_control:t(289),shuttle_manipulator:t(290),"shuttle_manipulator/modification":t(291),"shuttle_manipulator/status":t(292),"shuttle_manipulator/templates":t(293),sleeper:t(294),slime_swap_body:t(295),smes:t(296),solar_control:t(297),space_heater:t(298),station_alert:t(299),suit_storage_unit:t(300),tank_dispenser:t(301),tanks:t(302),thermomachine:t(303),uplink:t(304),vr_sleeper:t(305),wires:t(306)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(218),titlebar:t(217),resize:t(212)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{203:203,204:204,205:205,206:206,207:207,208:208,209:209,210:210,211:211,212:212,213:213,214:214,215:215,217:217,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,240:240,241:241,242:242,243:243,244:244,245:245,246:246,247:247,248:248,249:249,250:250,251:251,252:252,253:253,254:254,255:255,256:256,257:257,258:258,259:259,260:260,261:261,262:262,263:263,264:264,265:265,266:266,267:267,268:268,269:269,270:270,271:271,272:272,273:273,274:274,275:275,276:276,277:277,278:278,279:279,280:280,281:281,282:282,283:283,284:284,285:285,286:286,287:287,288:288,289:289,290:290,291:291,292:292,293:293,294:294,295:295,296:296,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306,309:309,311:311}],309:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],310:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],311:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(309)},{309:309}],312:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var u=s;a||u.textContent.toLowerCase().includes(e)?u.style.display="":u.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],313:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],314:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var u=Array(o),p=0;o>p;p++)u[p]=arguments[p+3];n.children=u}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(u){r("throw",u)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(u){return void n(u)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e{{Math.floor(adata.points)}}
-
+ {{data.message}}
{{#if data.loan && !data.requestonly}}
@@ -29,7 +29,7 @@
state='{{data.away && data.docked ? null : "disabled"}}'
action='loan'>Loan Shuttle
{{else}}
- Loaned to Centcom
+ Loaned to CentCom
{{/if}}
{{/if}}
diff --git a/tgui/src/interfaces/ntos_card.ract b/tgui/src/interfaces/ntos_card.ract
index 582737a8a6..3d7cbba9b2 100644
--- a/tgui/src/interfaces/ntos_card.ract
+++ b/tgui/src/interfaces/ntos_card.ract
@@ -180,7 +180,7 @@
{{#if data.centcom_access}}
-
Centcom
+
CentCom
{{#each data.centcom_jobs}}
{{display_name}}
diff --git a/tools/SQLAlertEmail/email_config.ps1 b/tools/SQLAlertEmail/email_config.ps1
new file mode 100644
index 0000000000..53865eb15f
--- /dev/null
+++ b/tools/SQLAlertEmail/email_config.ps1
@@ -0,0 +1,11 @@
+$Path = '..\..\data\logs\' #Server directory up to the year folder, this can be a relative or absolute path; remember the trailing \
+$StringToMatch = 'SQL:'
+$From = 'admin@server.com'
+[string[]]$To = 'email@address.com', 'a_different@address.org' #Email will be sent to each address listed here, you can have as many as you want
+$Subject = 'SS13 server SQL error'
+$Body = 'A SQL error was found in the following files:' #This parameter is optional, set it as '' if you want it gone
+#SMTP server details; If you don't have one you can use the defaults provided here for Gmail's, provided you have a Google account
+$SMTPServer = 'smtp.gmail.com'
+$SMTPPort = '587'
+$Account = "username" #SMTP server account name, excluding the domain address (this part: @domain.com)
+$Password = 'password' #SMTP server password, if you're using Gmail's and have 2-factor authentication you'll have to use an App Password (Google for how)
\ No newline at end of file
diff --git a/tools/SQLAlertEmail/email_script.ps1 b/tools/SQLAlertEmail/email_script.ps1
new file mode 100644
index 0000000000..1ffa8d1b44
--- /dev/null
+++ b/tools/SQLAlertEmail/email_script.ps1
@@ -0,0 +1,23 @@
+<#
+This is a script designed to parse through your server logs and locate any SQL errors reported.
+If found an email is sent to addresses specified in the configuration file: email_config.ps1.
+A SMTP server is required, if you don't have one the defaults for Gmail's can be used.
+
+Suggested use is to schedule this task to be executed daily at server-time midnight so all the day's logs are checked.
+You will likely find it helpful to set the configuration file to be untracked by git.
+#>
+. .\email_config.ps1
+$Date = Get-Date -format "yyyy\\MM\\dd"
+$Matches = Get-ChildItem "$Path$Date" -recurse -include *.log | Select-String "$StringToMatch" -List | Select Path, Line
+
+$email = New-Object System.Net.Mail.MailMessage
+$email.From = $From
+foreach($i in $To) {$email.To.Add($i)}
+$email.Subject = $Subject
+$MatchList = foreach($m in $Matches) {"`t$m`n"}
+$email.Body = $Body+"`n"+$MatchList
+
+$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort);
+$smtp.Credentials = New-Object System.Net.NetworkCredential($Account, $Password);
+$smtp.EnableSSL = $true
+$smtp.Send($email);
\ No newline at end of file
diff --git a/tools/github_webhook_processor.php b/tools/github_webhook_processor.php
index d73970f04b..4ccdafa3f3 100644
--- a/tools/github_webhook_processor.php
+++ b/tools/github_webhook_processor.php
@@ -162,10 +162,10 @@ function tag_pr($payload, $opened) {
$tags[] = $tag;
//only maintners should be able to remove these
- if(strpos($title, '[DNM]') !== FALSE)
+ if(strpos($lowertitle, '[dnm]') !== FALSE)
$tags[] = 'Do Not Merge';
- if(strpos($title, '[WIP]') !== FALSE)
+ if(strpos($lowertitle, '[wip]') !== FALSE)
$tags[] = 'Work In Progress';
$url = $payload['pull_request']['base']['repo']['url'] . '/issues/' . $payload['pull_request']['number'] . '/labels';